1 #include "playlistmanager.h"
6 PlaylistManager::PlaylistManager(QWidget* parent)
7 : parentWidget (parent)
9 metaInformationResolver = new Phonon::MediaObject(parent);
10 connect(metaInformationResolver, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
11 this, SLOT(metaStateChanged(Phonon::State,Phonon::State)));
14 int PlaylistManager::indexOf(const Phonon::MediaSource &s) const
16 for (int i = 0; i < items.size(); ++i)
18 if (items[i].source == s)
24 void PlaylistManager::parseAndAddFolder(const QString &dir, bool recursive)
27 // filters << "*.mp3";
29 QStringList files = QDir (dir).entryList(filters);
34 qDebug () << "Parsing folder " << dir;
36 //settings.setValue("LastFolder", dir);
37 int index = items.size();
38 foreach (QString string, files)
40 if (string == "." || string == "..")
42 QString fname = dir + "/" + string;
47 parseAndAddFolder(fname, true);
50 if (fileSupported(fname))
52 qDebug () << "Adding: " << fname;
53 items.append(PlaylistItem (PlaylistItem (fname)));
57 metaInformationResolver->setCurrentSource(items.at(index).source);
58 qDebug () << " SIZE: " << items.size ();
59 emit playlistChanged (index);
62 void PlaylistManager::addStringList(const QStringList& list)
64 int index = items.size();
65 foreach (QString string, list)
67 if (fileSupported(string) || string.toLower().startsWith("http"))
69 qDebug () << "Adding " << string;
70 items.append(PlaylistItem (string));
74 metaInformationResolver->setCurrentSource(items.at(index).source);
75 emit playlistChanged(index);
78 void PlaylistManager::metaStateChanged(Phonon::State newState, Phonon::State oldState)
80 qDebug () << "Meta state now " << newState << " old state " << oldState;
81 if (oldState == Phonon::ErrorState)
83 /* int index = indexOf (metaInformationResolver->currentSource());
84 metaInformationResolver->setCurrentSource(items[index].source);*/
86 if (newState == Phonon::ErrorState)
88 int index = indexOf (metaInformationResolver->currentSource());
89 if (index >= 0 && items.size () > index + 1)
91 /* metaInformationResolver->disconnect();
92 delete metaInformationResolver;
93 metaInformationResolver = new Phonon::MediaObject(parent());
94 connect(metaInformationResolver, SIGNAL(stateChanged(Phonon::State,Phonon::State)),
95 this, SLOT(metaStateChanged(Phonon::State,Phonon::State)));*/
96 metaInformationResolver->setCurrentSource(items[index + 1].source);
97 // metaInformationResolver->clear();
98 qDebug () << "Set " << items[index + 1].source.fileName() << " error type: " << metaInformationResolver->errorString() << " (" << metaInformationResolver->errorType() << ")";
100 qDebug () << "Error for item " << index;
104 if (newState != Phonon::StoppedState/* && newState != Phonon::PausedState*/)
109 if (metaInformationResolver->currentSource().type() == Phonon::MediaSource::Invalid)
111 int index = indexOf (metaInformationResolver->currentSource());
112 qDebug () << "Reading meta info of " << metaInformationResolver->currentSource().fileName() << " => " << index;
114 QMap<QString, QString> metaData = metaInformationResolver->metaData();
119 items[index].artist = metaData.value("ARTIST");
120 items[index].title = metaData.value("TITLE");
121 items[index].album = metaData.value("ALBUM");
122 qDebug () << "Info is: " << items[index].artist << " - " << items[index].title;
123 if (metaData.isEmpty())
124 qDebug () << "Detected to be empty: " << items[index].uri;
126 items[index].playable = true;
127 emit itemUpdated (index);
128 if (index >= 0 && items.size () > index + 1)
129 metaInformationResolver->setCurrentSource(items[index + 1].source);
133 void PlaylistManager::savePlaylist(const QString& filenam)
135 QString filename = filenam;
136 if (filename.isEmpty())
138 bool writepls = false;
139 if (filename.length() < 4 || (filename.right(4).toLower() != ".m3u" && filename.right(4).toLower() != ".pls"))
144 else if (filename.right(4).toLower() == ".pls")
149 f.open(QFile::WriteOnly);
152 f.write ("[playlist]\n");
153 f.write (QString ("NumberOfEntries=%1\n").arg (items.size ()).toAscii());
155 for (int i = 0; i < items.size(); ++i)
159 f.write (QString ("File%1=%2\n").arg (i + 1).arg (items[i].uri).toAscii());
160 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());
164 f.write (items[i].uri.toAscii());
169 f.write ("Version=2\n");
174 // QMessageBox::critical(this, "Write error", "Could not write playlist file", QMessageBox::Ok);
178 void PlaylistManager::loadPlaylist(const QString& filename)
181 if (filename.right(4).toLower() == ".m3u")
182 appendPlaylist(filename);
183 else if (filename.right(4).toLower() == ".pls")
184 appendPlaylistPLS(filename);
185 if (!items.isEmpty())
187 metaInformationResolver->setCurrentSource(items.at(0).source);
189 emit playlistChanged (0);
192 void PlaylistManager::addPlaylist(const QString& filename)
194 int index = items.size();
195 if (filename.right(4).toLower() == ".m3u")
196 appendPlaylist(filename);
197 else if (filename.right(4).toLower() == ".pls")
198 appendPlaylistPLS(filename);
199 if (!items.isEmpty())
201 metaInformationResolver->setCurrentSource(items.at(index).source);
202 emit playlistChanged (index);
206 void PlaylistManager::appendPlaylist(const QString& filename)
208 qDebug () << "Attempting to load playlist: " << filename;
210 if (!f.open (QFile::ReadOnly))
212 QString tmp = f.readAll();
214 QStringList lines = tmp.split("\n");
215 foreach (QString l, lines)
217 if (l.isEmpty() || (!QFileInfo (l).exists() && (l.indexOf("http") != 0)))
221 qDebug () << "Load " << l;
222 items.append(PlaylistItem (l));
226 void PlaylistManager::appendPlaylistPLS(const QString& filename)
228 qDebug () << "Attempting to load playlist: " << filename;
230 if (!f.open (QFile::ReadOnly))
232 QString tmp = f.readAll();
234 QStringList lines = tmp.split("\n");
235 QMap<int, int> filemap;
237 foreach (QString l, lines)
239 if (l.isEmpty() || l.trimmed().toLower() == "[playlist]" || l.trimmed().toLower() == "version=2")
243 qDebug () << "PLS " << l;
244 if (l.trimmed().toLower().left(4) == "file")
246 QStringList tokens = l.split('=');
247 if (tokens.size () < 2)
249 tokens[0] = tokens[0].mid (4);
250 filemap.insert(tokens[0].toInt (), items.size ());
252 items.append(PlaylistItem (tokens[1]));
254 else if (l.trimmed().toLower().left(5) == "title")
256 QStringList tokens = l.split('=');
257 if (tokens.size () < 2)
259 tokens[0] = tokens[0].mid (5);
260 int toupdate = filemap[tokens[0].toInt()];
261 qDebug () << "Need to update " << toupdate << " for " << l;
262 QStringList metatok = tokens[1].split (" - ");
263 qDebug () << metatok;
264 if (metatok.size() > 2 && toupdate >= 0 && toupdate < items.size ())
266 items[toupdate].artist = metatok[0];
267 items[toupdate].title = metatok[1];
268 metatok = metatok.mid (2);
269 items[toupdate].album = metatok.join (" - ");
273 items[toupdate].title = metatok.join (" - ");
280 void PlaylistManager::clearPlaylist()
283 emit playlistChanged(0);
284 /* while (musicTable->rowCount())
285 musicTable->removeRow(0);
286 mediaObject->clear();*/
289 QStringList PlaylistManager::playlistStrings() const
292 for (int i = 0; i < items.size (); ++i)
294 qDebug () << "Returning playlist " << ret << " SIZE: " << items.size ();
298 void PlaylistManager::removeItem(int i)
301 emit playlistChanged(i);
304 bool PlaylistManager::fileSupported (const QString& fname) const
306 QString ext = fname.right(3).toLower();