package org.lysty.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import net.n3.nanoxml.IXMLElement;
import net.n3.nanoxml.IXMLParser;
import net.n3.nanoxml.IXMLReader;
import net.n3.nanoxml.StdXMLReader;
import net.n3.nanoxml.XMLParserFactory;
import net.n3.nanoxml.XMLWriter;
import org.apache.log4j.Logger;
import org.lysty.dao.Song;
import org.lysty.dao.SongSelectionProfile;
import org.lysty.players.PlayerManager;
import christophedelory.content.Content;
import christophedelory.playlist.AbstractPlaylistComponent;
import christophedelory.playlist.Media;
import christophedelory.playlist.Playlist;
import christophedelory.playlist.Sequence;
import christophedelory.playlist.SpecificPlaylist;
import christophedelory.playlist.SpecificPlaylistFactory;
import christophedelory.playlist.SpecificPlaylistProvider;
public class FileUtils {
private static final String FILE_TYPE_UNKNOWN = "FILE TYPE UNKNOWN";
public static final String PARTIAL_PLAYLIST_EXT = "ppl";
public static javax.swing.filechooser.FileFilter selProfileFileFilter = new javax.swing.filechooser.FileFilter() {
@Override
public String getDescription() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean accept(File file) {
return file.getName().endsWith("." + PARTIAL_PLAYLIST_EXT);
}
};
private static Logger logger = Logger.getLogger(FileUtils.class);
private static String[] supportedPlaylistExts = new String[] { "m3u",
"pls", "m3u8", "m4u" };
public static SongSelectionProfile loadSelectionProfile(File file) {
SongSelectionProfile profile = new SongSelectionProfile();
IXMLParser parser;
try {
parser = XMLParserFactory.createDefaultXMLParser();
Scanner scan = new Scanner(file);
StringBuilder builder = new StringBuilder();
while (scan.hasNextLine()) {
builder.append(scan.nextLine());
}
IXMLReader reader = StdXMLReader.stringReader(builder.toString());
parser.setReader(reader);
IXMLElement xml = (IXMLElement) parser.parse();
profile.loadFromXml(xml);
profile.setFile(file);
} catch (Exception e) {
logger.error(
"Error loading selection profile from "
+ file.getAbsolutePath(), e);
}
return profile;
}
/**
* Saves the selection profile to the given location
*
* @param profile
* @param file
* @return success
* @throws IOException
*/
public static boolean saveSelectionProfile(SongSelectionProfile profile,
File file) throws IOException {
IXMLElement xmlSelProf = profile.getXml();
FileWriter fWriter = new FileWriter(file);
XMLWriter writer = new XMLWriter(fWriter);
writer.write(xmlSelProf);
fWriter.close();
return false;
}
public static List<Song> loadPlaylist(File file) {
List<Song> list = new ArrayList<Song>();
SpecificPlaylistProvider playlistProvider = SpecificPlaylistFactory
.getInstance().findProviderByExtension(
"." + FileUtils.getFileType(file));
try {
SpecificPlaylist playlist = playlistProvider.readFrom(
new FileInputStream(file), null, null);
Sequence seq = playlist.toPlaylist().getRootSequence();
AbstractPlaylistComponent[] comps = seq.getComponents();
Song song;
File sFile;
for (AbstractPlaylistComponent comp : comps) {
sFile = new File(((Media) comp).getSource().getURL().toURI());
song = new Song(sFile);
list.add(song);
}
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("Error loading playlist", e);
}
return list;
}
public static boolean savePlaylist(List<Song> list, File file)
throws IOException {
Playlist playlist = new Playlist();
Sequence seq = playlist.getRootSequence();
Media media;
for (Song song : list) {
media = new Media();
media.setRepeatCount(1);
media.setSource(new Content(song.getFile().getAbsolutePath()));
seq.addComponent(media);
}
SpecificPlaylistProvider playlistProvider = SpecificPlaylistFactory
.getInstance().findProviderByExtension(
"." + FileUtils.getFileType(file));
try {
SpecificPlaylist spList = playlistProvider
.toSpecificPlaylist(playlist);
BufferedOutputStream bufStream = new BufferedOutputStream(
new FileOutputStream(file));
spList.writeTo(bufStream, null);
bufStream.flush();
} catch (Exception e) {
logger.error("Error saving playlist to: " + file.getAbsolutePath(),
e);
}
return false;
}
public static String getFileType(File file) {
String name = file.getName();
int i = name.lastIndexOf(".") + 1;
if (i == 0)
return FILE_TYPE_UNKNOWN;
return name.substring(i);
}
public static IXMLElement readXml(File file) {
IXMLParser parser;
try {
parser = XMLParserFactory.createDefaultXMLParser();
Scanner scan = new Scanner(file);
StringBuilder builder = new StringBuilder();
while (scan.hasNextLine()) {
builder.append(scan.nextLine());
}
IXMLReader reader = StdXMLReader.stringReader(builder.toString());
parser.setReader(reader);
IXMLElement xml = (IXMLElement) parser.parse();
return xml;
} catch (Exception e) {
logger.error("Error reading xml from " + file.getAbsolutePath(), e);
}
return null;
}
public static void writeXml(File file, IXMLElement xml) throws IOException {
FileWriter fWriter = new FileWriter(file);
XMLWriter writer = new XMLWriter(fWriter);
writer.write(xml);
fWriter.close();
}
public static boolean isPartialPlaylistFile(File file) {
return PARTIAL_PLAYLIST_EXT.equalsIgnoreCase(getFileType(file));
}
public static boolean isSupportedSongFile(File file) {
Set<String> set = PlayerManager.getInstance().getSupportedFormats();
if (set.contains(getFileType(file).toLowerCase())) {
return true;
}
return false;
}
public static int getDistanceToCommonFolder(File from, File to) {
String fromPath = from.getAbsolutePath().toLowerCase();
String toPath = to.getAbsolutePath().toLowerCase();
int minDist = Math.min(fromPath.length(), toPath.length());
int breakPoint = minDist;
for (int i = 0; i < minDist; i++) {
if (fromPath.charAt(i) != toPath.charAt(i)) {
breakPoint = i;
break;
}
}
fromPath = fromPath.substring(breakPoint);
toPath = toPath.substring(breakPoint);
int cnt = 1;
for (int i = 0; i < fromPath.length(); i++) {
if (fromPath.charAt(i) == File.separatorChar) {
cnt++;
}
}
return cnt;
}
public static boolean isSupportedPlaylistFile(File file) {
String ext = getFileType(file);
for (String supExt : supportedPlaylistExts) {
if (supExt.equalsIgnoreCase(ext))
return true;
}
return false;
}
}