1 #include "playlistmanager.h"
6 QStringList allowedExtensions;
9 PlaylistManager::PlaylistManager(QWidget* parent)
10 : parentWidget (parent), lastMetaRead (-1)
12 allowedExtensions << "mp3" << "ogg" << "wav" << "wmv" << "wma" << "flac";
13 metaInformationResolver = new Phonon::MediaObject(parent);
14 connect(metaInformationResolver, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
15 this, SLOT(metaStateChanged(Phonon::State,Phonon::State)));
18 int PlaylistManager::indexOf(const Phonon::MediaSource &s) const
20 for (int i = 0; i < items.size(); ++i)
22 if (items[i].source == s)
28 void PlaylistManager::parseAndAddFolder(const QString &dir, bool recursive)
32 QStringList files = QDir (dir).entryList(filters);
38 int index = items.size();
39 foreach (QString string, files)
41 if (string == "." || string == "..")
43 QString fname = dir + "/" + string;
48 parseAndAddFolder(fname, true);
51 if (fileSupported(fname))
53 qDebug () << "Adding: " << fname;
54 items.append(PlaylistItem (PlaylistItem (fname)));
57 if (items.size () > index)
59 metaInformationResolver->setCurrentSource(items.at(index).source);
62 emit playlistChanged (index);
65 void PlaylistManager::addStringList(const QStringList& list)
67 int index = items.size();
68 foreach (QString string, list)
70 if (fileSupported(string) || string.toLower().startsWith("http"))
72 items.append(PlaylistItem (string));
75 if (items.size () > index)
77 metaInformationResolver->setCurrentSource(items.at(index).source);
80 emit playlistChanged(index);
83 void PlaylistManager::metaStateChanged(Phonon::State newState, Phonon::State oldState)
85 // NOTE: This is an ugly hack, since the metaInformationResolver doesn't properly load the assigned source when it's in the error state
86 // In order to properly read the next file we have to set it as current source again when the resolver entered the stopped state after the error
87 static bool wasError = false;
88 if (wasError && newState == Phonon::StoppedState)
90 metaInformationResolver->setCurrentSource(items[lastMetaRead].source);
94 if (newState == Phonon::ErrorState)
99 if (newState != Phonon::StoppedState && newState != Phonon::ErrorState)
104 int index = lastMetaRead;
106 QMap<QString, QString> metaData = metaInformationResolver->metaData();
109 if (index >= 0 && newState != Phonon::ErrorState && index < items.size ())
111 items[index].artist = metaData.value("ARTIST");
112 items[index].title = metaData.value("TITLE");
113 items[index].album = metaData.value("ALBUM");
114 /* items[index].year = metaData.value("DATE");
115 items[index].genre = metaData.value("GENRE");
116 qDebug () << "Meta " << metaData;
117 qDebug () << "Info is: " << items[index].year << " - " << items[index].genre;*/
118 if (!metaData.isEmpty())
119 items[index].playable = true;
120 emit itemUpdated (index);
122 if (index >= 0 && items.size () > index + 1)
124 metaInformationResolver->setCurrentSource(items[index + 1].source);
125 lastMetaRead = index + 1;
129 bool PlaylistManager::savePlaylist(const QString& filenam)
131 QString filename = filenam;
132 if (filename.isEmpty())
134 bool writepls = false;
135 if (filename.length() < 4 || (filename.right(4).toLower() != ".m3u" && filename.right(4).toLower() != ".pls"))
140 else if (filename.right(4).toLower() == ".pls")
145 f.open(QFile::WriteOnly);
148 f.write ("[playlist]\n");
149 f.write (QString ("NumberOfEntries=%1\n").arg (items.size ()).toAscii());
151 for (int i = 0; i < items.size(); ++i)
155 f.write (QString ("File%1=%2\n").arg (i + 1).arg (items[i].uri).toAscii());
156 f.write (QString ("Title%1=%2 - %3 - %4\n").arg (i + 1).arg (items[i].artist).arg (items[i].title).arg (items[i].album).toAscii());
160 f.write (items[i].uri.toAscii());
165 f.write ("Version=2\n");
175 void PlaylistManager::loadPlaylist(const QString& filename)
178 if (filename.right(4).toLower() == ".m3u")
179 appendPlaylist(filename);
180 else if (filename.right(4).toLower() == ".pls")
181 appendPlaylistPLS(filename);
182 if (!items.isEmpty())
184 metaInformationResolver->setCurrentSource(items.at(0).source);
187 emit playlistChanged (0);
190 void PlaylistManager::addPlaylist(const QString& filename)
192 int index = items.size();
193 if (filename.right(4).toLower() == ".m3u")
194 appendPlaylist(filename);
195 else if (filename.right(4).toLower() == ".pls")
196 appendPlaylistPLS(filename);
197 if (items.size () > index)
198 // if (!items.isEmpty())
200 metaInformationResolver->setCurrentSource(items.at(index).source);
201 lastMetaRead = index;
202 emit playlistChanged (index);
206 void PlaylistManager::appendPlaylist(const QString& filename)
209 if (!f.open (QFile::ReadOnly))
211 QString tmp = f.readAll();
213 QStringList lines = tmp.split("\n");
214 foreach (QString l, lines)
216 if (l.isEmpty() || (!QFileInfo (l).exists() && (l.indexOf("http") != 0)))
220 items.append(PlaylistItem (l));
224 void PlaylistManager::appendPlaylistPLS(const QString& filename)
227 if (!f.open (QFile::ReadOnly))
229 QString tmp = f.readAll();
231 QStringList lines = tmp.split("\n");
232 QMap<int, int> filemap;
234 foreach (QString l, lines)
236 if (l.isEmpty() || l.trimmed().toLower() == "[playlist]" || l.trimmed().toLower() == "version=2")
240 if (l.trimmed().toLower().left(4) == "file")
242 QStringList tokens = l.split('=');
243 if (tokens.size () < 2)
245 tokens[0] = tokens[0].mid (4);
246 filemap.insert(tokens[0].toInt (), items.size ());
247 items.append(PlaylistItem (tokens[1]));
249 else if (l.trimmed().toLower().left(5) == "title")
251 QStringList tokens = l.split('=');
252 if (tokens.size () < 2)
254 tokens[0] = tokens[0].mid (5);
255 int toupdate = filemap[tokens[0].toInt()];
256 QStringList metatok = tokens[1].split (" - ");
257 if (metatok.size() > 2 && toupdate >= 0 && toupdate < items.size ())
259 items[toupdate].artist = metatok[0];
260 items[toupdate].title = metatok[1];
261 metatok = metatok.mid (2);
262 items[toupdate].album = metatok.join (" - ");
266 items[toupdate].title = metatok.join (" - ");
273 void PlaylistManager::clearPlaylist()
276 emit playlistChanged(0);
279 QStringList PlaylistManager::playlistStrings() const
282 for (int i = 0; i < items.size (); ++i)
287 void PlaylistManager::removeItem(int i)
294 bool PlaylistManager::fileSupported (const QString& fname) const
296 if (fname.lastIndexOf('.') < 0)
298 QString ext = fname.right(fname.size() - fname.lastIndexOf('.') - 1).toLower();
299 foreach (QString e, allowedExtensions)
308 bool PlaylistManager::moveItemUp (int i)
312 PlaylistItem tmp = items[i - 1];
313 items[i - 1] = items[i];
320 bool PlaylistManager::moveItemDown (int i)
322 if (i < items.size () - 1)
324 PlaylistItem tmp = items[i + 1];
325 items[i + 1] = items[i];