javazoom.jlgui.player.amp.playlist.BasePlaylist.java Source code

Java tutorial

Introduction

Here is the source code for javazoom.jlgui.player.amp.playlist.BasePlaylist.java

Source

/*
 * BasePlaylist.
 * 
 * JavaZOOM : jlgui@javazoom.net
 *            http://www.javazoom.net
 *
 *-----------------------------------------------------------------------
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Library General Public License as published
 *   by the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU Library General Public License for more details.
 *
 *   You should have received a copy of the GNU Library General Public
 *   License along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *----------------------------------------------------------------------
 */
package javazoom.jlgui.player.amp.playlist;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Collection;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.Vector;
import javazoom.jlgui.player.amp.util.Config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * BasePlaylist implementation.
 * This class implements Playlist interface using a Vector.
 * It support .m3u and .pls playlist format.
 */
public class BasePlaylist implements Playlist {
    protected Vector _playlist = null;
    protected int _cursorPos = -1;
    protected boolean isModified;
    protected String M3UHome = null;
    protected String PLSHome = null;
    private static Log log = LogFactory.getLog(BasePlaylist.class);

    /**
     * Constructor.
     */
    public BasePlaylist() {
        _playlist = new Vector();
    }

    public boolean isModified() {
        return isModified;
    }

    /**
     * Loads playlist as M3U format.
     */
    public boolean load(String filename) {
        setModified(true);
        boolean loaded = false;
        if ((filename != null) && (filename.toLowerCase().endsWith(".m3u"))) {
            loaded = loadM3U(filename);
        } else if ((filename != null) && (filename.toLowerCase().endsWith(".pls"))) {
            loaded = loadPLS(filename);
        }
        return loaded;
    }

    /**
     * Load playlist from M3U format.
     *
     * @param filename
     * @return
     */
    protected boolean loadM3U(String filename) {
        Config config = Config.getInstance();
        _playlist = new Vector();
        boolean loaded = false;
        BufferedReader br = null;
        try {
            // Playlist from URL ? (http:, ftp:, file: ....)
            if (Config.startWithProtocol(filename)) {
                br = new BufferedReader(new InputStreamReader((new URL(filename)).openStream()));
            } else {
                br = new BufferedReader(new FileReader(filename));
            }
            String line = null;
            String songName = null;
            String songFile = null;
            String songLength = null;
            while ((line = br.readLine()) != null) {
                if (line.trim().length() == 0)
                    continue;
                if (line.startsWith("#")) {
                    if (line.toUpperCase().startsWith("#EXTINF")) {
                        int indA = line.indexOf(",", 0);
                        if (indA != -1) {
                            songName = line.substring(indA + 1, line.length());
                        }
                        int indB = line.indexOf(":", 0);
                        if (indB != -1) {
                            if (indB < indA)
                                songLength = (line.substring(indB + 1, indA)).trim();
                        }
                    }
                } else {
                    songFile = line;
                    if (songName == null)
                        songName = songFile;
                    if (songLength == null)
                        songLength = "-1";
                    PlaylistItem pli = null;
                    if (Config.startWithProtocol(songFile)) {
                        // URL.
                        pli = new PlaylistItem(songName, songFile, Long.parseLong(songLength), false);
                    } else {
                        // File.
                        File f = new File(songFile);
                        if (f.exists()) {
                            pli = new PlaylistItem(songName, songFile, Long.parseLong(songLength), true);
                        } else {
                            // Try relative path.
                            f = new File(config.getLastDir() + songFile);
                            if (f.exists()) {
                                pli = new PlaylistItem(songName, config.getLastDir() + songFile,
                                        Long.parseLong(songLength), true);
                            } else {
                                // Try optional M3U home.
                                if (M3UHome != null) {
                                    if (Config.startWithProtocol(M3UHome)) {
                                        pli = new PlaylistItem(songName, M3UHome + songFile,
                                                Long.parseLong(songLength), false);
                                    } else {
                                        pli = new PlaylistItem(songName, M3UHome + songFile,
                                                Long.parseLong(songLength), true);
                                    }
                                }
                            }
                        }
                    }
                    if (pli != null)
                        this.appendItem(pli);
                    songFile = null;
                    songName = null;
                    songLength = null;
                }
            }
            loaded = true;
        } catch (Exception e) {
            log.debug("Can't load .m3u playlist", e);
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (Exception ioe) {
                log.info("Can't close .m3u playlist", ioe);
            }
        }
        return loaded;
    }

    /**
     * Load playlist in PLS format.
     *
     * @param filename
     * @return
     */
    protected boolean loadPLS(String filename) {
        Config config = Config.getInstance();
        _playlist = new Vector();
        boolean loaded = false;
        BufferedReader br = null;
        try {
            // Playlist from URL ? (http:, ftp:, file: ....)
            if (Config.startWithProtocol(filename)) {
                br = new BufferedReader(new InputStreamReader((new URL(filename)).openStream()));
            } else {
                br = new BufferedReader(new FileReader(filename));
            }
            String line = null;
            String songName = null;
            String songFile = null;
            String songLength = null;
            while ((line = br.readLine()) != null) {
                if (line.trim().length() == 0)
                    continue;
                if ((line.toLowerCase().startsWith("file"))) {
                    StringTokenizer st = new StringTokenizer(line, "=");
                    st.nextToken();
                    songFile = st.nextToken().trim();
                } else if ((line.toLowerCase().startsWith("title"))) {
                    StringTokenizer st = new StringTokenizer(line, "=");
                    st.nextToken();
                    songName = st.nextToken().trim();
                } else if ((line.toLowerCase().startsWith("length"))) {
                    StringTokenizer st = new StringTokenizer(line, "=");
                    st.nextToken();
                    songLength = st.nextToken().trim();
                }
                // New entry ?
                if (songFile != null) {
                    PlaylistItem pli = null;
                    if (songName == null)
                        songName = songFile;
                    if (songLength == null)
                        songLength = "-1";
                    if (Config.startWithProtocol(songFile)) {
                        // URL.
                        pli = new PlaylistItem(songName, songFile, Long.parseLong(songLength), false);
                    } else {
                        // File.
                        File f = new File(songFile);
                        if (f.exists()) {
                            pli = new PlaylistItem(songName, songFile, Long.parseLong(songLength), true);
                        } else {
                            // Try relative path.
                            f = new File(config.getLastDir() + songFile);
                            if (f.exists()) {
                                pli = new PlaylistItem(songName, config.getLastDir() + songFile,
                                        Long.parseLong(songLength), true);
                            } else {
                                // Try optional PLS home.
                                if (PLSHome != null) {
                                    if (Config.startWithProtocol(PLSHome)) {
                                        pli = new PlaylistItem(songName, PLSHome + songFile,
                                                Long.parseLong(songLength), false);
                                    } else {
                                        pli = new PlaylistItem(songName, PLSHome + songFile,
                                                Long.parseLong(songLength), true);
                                    }
                                }
                            }
                        }
                    }
                    if (pli != null)
                        this.appendItem(pli);
                    songName = null;
                    songFile = null;
                    songLength = null;
                }
            }
            loaded = true;
        } catch (Exception e) {
            log.debug("Can't load .pls playlist", e);
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (Exception ioe) {
                log.info("Can't close .pls playlist", ioe);
            }
        }
        return loaded;
    }

    /**
     * Saves playlist in M3U format.
     */
    public boolean save(String filename) {
        // Implemented by C.K
        if (_playlist != null) {
            BufferedWriter bw = null;
            try {
                bw = new BufferedWriter(new FileWriter(filename));
                bw.write("#EXTM3U");
                bw.newLine();
                Iterator it = _playlist.iterator();
                while (it.hasNext()) {
                    PlaylistItem pli = (PlaylistItem) it.next();
                    bw.write("#EXTINF:" + pli.getM3UExtInf());
                    bw.newLine();
                    bw.write(pli.getLocation());
                    bw.newLine();
                }
                return true;
            } catch (IOException e) {
                log.info("Can't save playlist", e);
            } finally {
                try {
                    if (bw != null) {
                        bw.close();
                    }
                } catch (IOException ioe) {
                    log.info("Can't close playlist", ioe);
                }
            }
        }
        return false;
    }

    /**
     * Adds item at a given position in the playlist.
     */
    public void addItemAt(PlaylistItem pli, int pos) {
        _playlist.insertElementAt(pli, pos);
        setModified(true);
    }

    /**
     * Searchs and removes item from the playlist.
     */
    public void removeItem(PlaylistItem pli) {
        _playlist.remove(pli);
        setModified(true);
    }

    /**
     * Removes item at a given position from the playlist.
     */
    public void removeItemAt(int pos) {
        _playlist.removeElementAt(pos);
        setModified(true);
    }

    /**
     * Removes all items from the playlist.
     */
    public void removeAllItems() {
        _playlist.removeAllElements();
        _cursorPos = -1;
        setModified(true);
    }

    /**
     * Append item at the end of the playlist.
     */
    public void appendItem(PlaylistItem pli) {
        _playlist.addElement(pli);
        setModified(true);
    }

    /**
     * Sorts items of the playlist.
     */
    public void sortItems(int sortmode) {
        // TODO
    }

    /**
     * Shuffles items in the playlist randomly
     */
    public void shuffle() {
        int size = _playlist.size();
        if (size < 2) {
            return;
        }
        Vector v = _playlist;
        _playlist = new Vector(size);
        while ((size = v.size()) > 0) {
            _playlist.addElement(v.remove((int) (Math.random() * size)));
        }
        begin();
    }

    /**
     * Moves the cursor at the top of the playlist.
     */
    public void begin() {
        _cursorPos = -1;
        if (getPlaylistSize() > 0) {
            _cursorPos = 0;
        }
        setModified(true);
    }

    /**
     * Returns item at a given position from the playlist.
     */
    public PlaylistItem getItemAt(int pos) {
        PlaylistItem pli = null;
        pli = (PlaylistItem) _playlist.elementAt(pos);
        return pli;
    }

    /**
     * Returns a collection of playlist items.
     */
    public Collection getAllItems() {
        // TODO
        return null;
    }

    /**
     * Returns then number of items in the playlist.
     */
    public int getPlaylistSize() {
        return _playlist.size();
    }

    // Next methods will be used by the Player
    /**
     * Returns item matching to the cursor.
     */
    public PlaylistItem getCursor() {
        if ((_cursorPos < 0) || (_cursorPos >= _playlist.size())) {
            return null;
        }
        return getItemAt(_cursorPos);
    }

    /**
     * Computes cursor position (next).
     */
    public void nextCursor() {
        _cursorPos++;
    }

    /**
     * Computes cursor position (previous).
     */
    public void previousCursor() {
        _cursorPos--;
        if (_cursorPos < 0) {
            _cursorPos = 0;
        }
    }

    public boolean setModified(boolean set) {
        isModified = set;
        return isModified;
    }

    public void setCursor(int index) {
        _cursorPos = index;
    }

    /**
     * Returns selected index.
     */
    public int getSelectedIndex() {
        return _cursorPos;
    }

    /**
     * Returns index of playlist item.
     */
    public int getIndex(PlaylistItem pli) {
        int pos = -1;
        for (int i = 0; i < _playlist.size(); i++) {
            pos = i;
            PlaylistItem p = (PlaylistItem) _playlist.elementAt(i);
            if (p.equals(pli))
                break;
        }
        return pos;
    }

    /**
     * Get M3U home for relative playlist.
     *
     * @return
     */
    public String getM3UHome() {
        return M3UHome;
    }

    /**
     * Set optional M3U home for relative playlist.
     *
     * @param string
     */
    public void setM3UHome(String string) {
        M3UHome = string;
    }

    /**
     * Get PLS home for relative playlist.
     *
     * @return
     */
    public String getPLSHome() {
        return PLSHome;
    }

    /**
     * Set optional PLS home for relative playlist.
     *
     * @param string
     */
    public void setPLSHome(String string) {
        PLSHome = string;
    }
}