![JAR search and dependency download from the Maven repository](/logo.png)
chameleon.playlist.pls.PLS Maven / Gradle / Ivy
The newest version!
/*
* Copyright (c) 2008, Christophe Delory
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY CHRISTOPHE DELORY ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL CHRISTOPHE DELORY BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package chameleon.playlist.pls;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import chameleon.content.Content;
import chameleon.playlist.Media;
import chameleon.playlist.Playlist;
import chameleon.playlist.SpecificPlaylist;
import chameleon.playlist.m3u.Resource;
import chameleon.playlist.SpecificPlaylistProvider;
/**
* PLS playlist format.
* The format is essentially that of an INI file structured as follows:
*
* - Header
*
* - "[playlist]": this tag indicates that it is a playlist file.
* - "NumberOfEntries": this variable indicates the number of tracks.
*
* - Track entry (assuming track entry #X)
*
* - "FileX": variable defining location of stream.
* - "TitleX": defines track title.
* - "LengthX": length in seconds of track. Value of -1 indicates indefinite.
*
* - Footer
*
* - "Version": playlist version. Currently only a value of 2 is valid.
*
*
* @version $Revision: 91 $
* @author Christophe Delory
*/
public class PLS implements SpecificPlaylist
{
/**
* The provider of this specific playlist.
*/
private transient SpecificPlaylistProvider _provider = null;
/**
* The list of child resources.
*/
private final List _resources = new ArrayList();
@Override
public void setProvider(final SpecificPlaylistProvider provider)
{
_provider = provider;
}
@Override
public SpecificPlaylistProvider getProvider()
{
return _provider;
}
@Override
public void writeTo(final OutputStream out, final String encoding) throws Exception
{
String enc = encoding;
if (enc == null)
{
enc = "UTF-8"; // FIXME US-ASCII?
}
final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, enc)); // Throws NullPointerException if out is null. May throw UnsupportedEncodingException.
writer.write("[Playlist]"); // May throw IOException.
writer.newLine(); // May throw IOException.
writer.write("NumberOfEntries="); // May throw IOException.
writer.write(Integer.toString(_resources.size()));
writer.newLine(); // May throw IOException.
int i = 1;
for (Resource resource : _resources)
{
writer.write("File"); // May throw IOException.
writer.write(Integer.toString(i)); // May throw IOException.
writer.write("="); // May throw IOException.
writer.write(resource.getLocation()); // May throw NullPointerException, IOException.
writer.newLine(); // May throw IOException.
if (resource.getName() != null)
{
writer.write("Title"); // May throw IOException.
writer.write(Integer.toString(i)); // May throw IOException.
writer.write("="); // May throw IOException.
writer.write(resource.getName()); // May throw IOException.
writer.newLine(); // May throw IOException.
}
if (resource.getLength() >= 0L)
{
writer.write("Length"); // May throw IOException.
writer.write(Integer.toString(i)); // May throw IOException.
writer.write("="); // May throw IOException.
writer.write(Long.toString(resource.getLength())); // May throw IOException.
writer.newLine(); // May throw IOException.
}
i++;
}
writer.write("Version=2"); // May throw IOException.
writer.newLine(); // May throw IOException.
writer.flush(); // May throw IOException.
}
@Override
public Playlist toPlaylist()
{
final Playlist ret = new Playlist();
for (Resource resource : _resources)
{
if (resource.getLocation() != null)
{
final Media media = new Media(); // NOPMD Avoid instantiating new objects inside loops
final Content content = new Content(resource.getLocation()); // NOPMD Avoid instantiating new objects inside loops
media.setSource(content);
content.setDuration(resource.getLength() * 1000L);
ret.getRootSequence().addComponent(media);
}
}
ret.normalize();
return ret;
}
/**
* Returns the list of playlist resources.
* @return a list of child resources. May be empty but not null
.
*/
public List getResources()
{
return _resources;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy