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 qDebug () << "Adding: " << fname;
51 items.append(PlaylistItem (PlaylistItem (fname)));
54 metaInformationResolver->setCurrentSource(items.at(index).source);
55 qDebug () << " SIZE: " << items.size ();
56 emit playlistChanged (index);
59 void PlaylistManager::addStringList(const QStringList& list)
61 int index = items.size();
62 foreach (QString string, list)
64 qDebug () << "Adding " << string;
65 items.append(PlaylistItem (string));
68 metaInformationResolver->setCurrentSource(items.at(index).source);
69 emit playlistChanged(index);
72 void PlaylistManager::metaStateChanged(Phonon::State newState, Phonon::State /* oldState */)
74 if (newState == Phonon::ErrorState)
76 // QMessageBox::warning(this, tr("Error opening files"),
77 // metaInformationResolver->errorString());
78 // while (!items.isEmpty() &&
79 // !(items.takeLast().source == metaInformationResolver->currentSource())) {} /* loop */;
80 int index = indexOf (metaInformationResolver->currentSource());
81 if (index >= 0 && items.size () > index - 1)
82 metaInformationResolver->setCurrentSource(items[index + 1].source);
83 qDebug () << "Error for item " << index;
84 /* int index = sources.indexOf(metaInformationResolver->currentSource());
87 sources.removeAt(index);
88 qDebug () << "Removing invalid file in " << index << ": " << metaInformationResolver->currentSource().fileName();
89 if (sources.size() > index)
91 metaInformationResolver->setCurrentSource(sources.at(index));
92 qDebug () << "Setting new info source " << sources.at(index).fileName();
95 // int index = sources.indexOf(metaInformationResolver->currentSource()) + 1;
96 // sources.removeAt(index - 1);
99 // metaInformationResolver->setCurrentSource(sources.at(0));
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 qDebug () << "Index of this source is " << indexOf(metaInformationResolver->currentSource());
116 QMap<QString, QString> metaData = metaInformationResolver->metaData();
118 /* QString title = metaData.value("TITLE");
120 title = metaInformationResolver->currentSource().fileName();
123 title = metaInformationResolver->currentSource().url().toString();*/
127 items[index].artist = metaData.value("ARTIST");
128 items[index].title = metaData.value("TITLE");
129 items[index].album = metaData.value("ALBUM");
130 if (metaData.isEmpty())
131 qDebug () << "Detected to be empty: " << items[index].uri;
133 items[index].playable = true;
134 emit itemUpdated (index);
135 if (index >= 0 && items.size () > index + 1)
136 metaInformationResolver->setCurrentSource(items[index + 1].source);
139 /*QTableWidgetItem *titleItem = new QTableWidgetItem(title);
140 titleItem->setFlags(titleItem->flags() ^ Qt::ItemIsEditable);
141 QTableWidgetItem *artistItem = new QTableWidgetItem(metaData.value("ARTIST"));
142 artistItem->setFlags(artistItem->flags() ^ Qt::ItemIsEditable);
143 QTableWidgetItem *albumItem = new QTableWidgetItem(metaData.value("ALBUM"));
144 albumItem->setFlags(albumItem->flags() ^ Qt::ItemIsEditable);*/
146 /* int currentRow = musicTable->rowCount();
147 musicTable->insertRow(currentRow);
148 musicTable->setItem(currentRow, 0, artistItem);
149 musicTable->setItem(currentRow, 1, titleItem);
150 musicTable->setItem(currentRow, 2, albumItem);*/
153 /* if (musicTable->selectedItems().isEmpty())
155 musicTable->selectRow(0);
156 qDebug () << "Setting current media " + metaInformationResolver->currentSource().fileName();
157 mediaObject->setCurrentSource(metaInformationResolver->currentSource());
160 Phonon::MediaSource source = metaInformationResolver->currentSource();
161 int index = sources.indexOf(metaInformationResolver->currentSource()) + 1;
162 if (sources.size() > index)
164 metaInformationResolver->setCurrentSource(sources.at(index));
168 musicTable->resizeColumnsToContents();
172 void PlaylistManager::savePlaylist(const QString& filenam)
174 QString filename = filenam;
175 if (filename.isEmpty())
177 bool writepls = false;
178 if (filename.length() < 4 || (filename.right(4).toLower() != ".m3u" && filename.right(4).toLower() != ".pls"))
183 else if (filename.right(4).toLower() == ".pls")
188 f.open(QFile::WriteOnly);
191 f.write ("[playlist]\n");
192 f.write (QString ("NumberOfEntries=%1\n").arg (items.size ()).toAscii());
194 for (int i = 0; i < items.size(); ++i)
198 f.write (QString ("File%1=%2\n").arg (i + 1).arg (items[i].uri).toAscii());
199 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());
203 f.write (items[i].uri.toAscii());
208 f.write ("Version=2\n");
213 // QMessageBox::critical(this, "Write error", "Could not write playlist file", QMessageBox::Ok);
217 void PlaylistManager::loadPlaylist(const QString& filename)
220 if (filename.right(4).toLower() == ".m3u")
221 appendPlaylist(filename);
222 else if (filename.right(4).toLower() == ".pls")
223 appendPlaylistPLS(filename);
224 if (!items.isEmpty())
226 metaInformationResolver->setCurrentSource(items.at(0).source);
228 emit playlistChanged (0);
231 void PlaylistManager::addPlaylist(const QString& filename)
233 int index = items.size();
234 if (filename.right(4).toLower() == ".m3u")
235 appendPlaylist(filename);
236 else if (filename.right(4).toLower() == ".pls")
237 appendPlaylistPLS(filename);
238 if (!items.isEmpty())
240 metaInformationResolver->setCurrentSource(items.at(index).source);
241 emit playlistChanged (index);
245 void PlaylistManager::appendPlaylist(const QString& filename)
247 qDebug () << "Attempting to load playlist: " << filename;
249 if (!f.open (QFile::ReadOnly))
251 QString tmp = f.readAll();
253 QStringList lines = tmp.split("\n");
254 foreach (QString l, lines)
256 if (l.isEmpty() || (!QFileInfo (l).exists() && (l.indexOf("http") != 0)))
260 qDebug () << "Load " << l;
261 items.append(PlaylistItem (l));
265 void PlaylistManager::appendPlaylistPLS(const QString& filename)
267 qDebug () << "Attempting to load playlist: " << filename;
269 if (!f.open (QFile::ReadOnly))
271 QString tmp = f.readAll();
273 QStringList lines = tmp.split("\n");
274 QMap<int, int> filemap;
276 foreach (QString l, lines)
278 if (l.isEmpty() || l.trimmed().toLower() == "[playlist]" || l.trimmed().toLower() == "version=2")
282 qDebug () << "PLS " << l;
283 if (l.trimmed().toLower().left(4) == "file")
285 QStringList tokens = l.split('=');
286 if (tokens.size () < 2)
288 tokens[0] = tokens[0].mid (4);
289 filemap.insert(tokens[0].toInt (), items.size ());
291 items.append(PlaylistItem (tokens[1]));
293 else if (l.trimmed().toLower().left(5) == "title")
295 QStringList tokens = l.split('=');
296 if (tokens.size () < 2)
298 tokens[0] = tokens[0].mid (5);
299 int toupdate = filemap[tokens[0].toInt()];
300 qDebug () << "Need to update " << toupdate << " for " << l;
301 QStringList metatok = tokens[1].split (" - ");
302 qDebug () << metatok;
303 if (metatok.size() > 2 && toupdate >= 0 && toupdate < items.size ())
305 items[toupdate].artist = metatok[0];
306 items[toupdate].title = metatok[1];
307 metatok = metatok.mid (2);
308 items[toupdate].album = metatok.join (" - ");
312 items[toupdate].title = metatok.join (" - ");
319 void PlaylistManager::clearPlaylist()
322 emit playlistChanged(0);
323 /* while (musicTable->rowCount())
324 musicTable->removeRow(0);
325 mediaObject->clear();*/
328 QStringList PlaylistManager::playlistStrings() const
331 for (int i = 0; i < items.size (); ++i)
333 qDebug () << "Returning playlist " << ret << " SIZE: " << items.size ();
337 void PlaylistManager::removeItem(int i)
340 emit playlistChanged(i);