From eb5d4cc309d8a05dd0debfd28fb3472bc0cb625d Mon Sep 17 00:00:00 2001 From: John Maguire Date: Wed, 10 Mar 2010 21:39:25 +0000 Subject: [PATCH] XSPF support in the GUI --- src/mainwindow.cpp | 9 ++++++- src/songplaylistitem.cpp | 57 +++++++++++++++++++++++++++++++++++----- src/songplaylistitem.h | 5 ++++ src/xine-engine.cpp | 4 +-- src/xspfparser.cpp | 7 +++++ 5 files changed, 71 insertions(+), 11 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 36e314ab2..cfd637fcb 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -20,6 +20,7 @@ #include "stylesheetloader.h" #include "albumcovermanager.h" #include "m3uparser.h" +#include "xspfparser.h" #include "playlistsequence.h" #include "qxtglobalshortcut.h" @@ -41,7 +42,7 @@ const int MainWindow::kStateVersion = 1; const char* MainWindow::kSettingsGroup = "MainWindow"; const char* MainWindow::kMediaFilterSpec = - "Music (*.mp3 *.ogg *.flac *.mpc *.m4a *.aac *.wma);;Playlists (*.m3u)"; + "Music (*.mp3 *.ogg *.flac *.mpc *.m4a *.aac *.wma);;Playlists (*.m3u *.xspf *.xml)"; MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent) : QMainWindow(parent), @@ -637,6 +638,12 @@ void MainWindow::AddMedia() { M3UParser parser(&file, info.dir()); const SongList& songs = parser.Parse(); playlist_->InsertSongs(songs); + } else if (path.endsWith(".xspf") || path.endsWith(".xml")) { + QFile file(path); + file.open(QIODevice::ReadOnly); + XSPFParser parser(&file); + const SongList& songs = parser.Parse(); + playlist_->InsertSongs(songs); } else { QUrl url(path); if (url.scheme().isEmpty()) diff --git a/src/songplaylistitem.cpp b/src/songplaylistitem.cpp index 6f24c44df..0f5f7fc77 100644 --- a/src/songplaylistitem.cpp +++ b/src/songplaylistitem.cpp @@ -1,6 +1,7 @@ #include "songplaylistitem.h" #include +#include #include SongPlaylistItem::SongPlaylistItem() @@ -14,23 +15,65 @@ SongPlaylistItem::SongPlaylistItem(const Song& song) void SongPlaylistItem::Save(QSettings& settings) const { settings.setValue("filename", song_.filename()); - settings.setValue("library_directory", song_.directory_id()); - settings.setValue("art_automatic", song_.art_automatic()); settings.setValue("art_manual", song_.art_manual()); + + if (song_.filetype() == Song::Type_Stream) { + SaveStream(settings); + } else { + SaveFile(settings); + } +} + +void SongPlaylistItem::SaveFile(QSettings& settings) const { + settings.setValue("stream", false); + settings.setValue("library_directory", song_.directory_id()); +} + +void SongPlaylistItem::SaveStream(QSettings& settings) const { + settings.setValue("stream", true); + settings.setValue("title", song_.title()); + settings.setValue("artist", song_.artist()); + settings.setValue("album", song_.album()); + settings.setValue("length", song_.length()); } void SongPlaylistItem::Restore(const QSettings& settings) { - QString filename(settings.value("filename").toString()); - int directory_id(settings.value("library_directory", -1).toInt()); - - song_.InitFromFile(filename, directory_id); song_.set_art_automatic(settings.value("art_automatic").toString()); song_.set_art_manual(settings.value("art_manual").toString()); + + const bool stream = settings.value("stream", false).toBool(); + if (stream) { + RestoreStream(settings); + } else { + RestoreFile(settings); + } +} + +void SongPlaylistItem::RestoreFile(const QSettings& settings) { + QString filename(settings.value("filename").toString()); + + int directory_id(settings.value("library_directory", -1).toInt()); + song_.InitFromFile(filename, directory_id); +} + +void SongPlaylistItem::RestoreStream(const QSettings& settings) { + QString filename(settings.value("filename").toString()); + song_.set_filename(filename); + song_.set_filetype(Song::Type_Stream); + + song_.Init(settings.value("title", "Unknown").toString(), + settings.value("artist", "Unknown").toString(), + settings.value("album", "Unknown").toString(), + settings.value("length", -1).toInt()); } QUrl SongPlaylistItem::Url() { - return QUrl::fromLocalFile(song_.filename()); + if (QFile::exists(song_.filename())) { + return QUrl::fromLocalFile(song_.filename()); + } else { + return song_.filename(); + } } void SongPlaylistItem::Reload() { diff --git a/src/songplaylistitem.h b/src/songplaylistitem.h index 7a7417829..50827598b 100644 --- a/src/songplaylistitem.h +++ b/src/songplaylistitem.h @@ -20,6 +20,11 @@ class SongPlaylistItem : public PlaylistItem { QUrl Url(); private: + void SaveFile(QSettings& settings) const; + void SaveStream(QSettings& settings) const; + + void RestoreFile(const QSettings& settings); + void RestoreStream(const QSettings& settings); Song song_; }; diff --git a/src/xine-engine.cpp b/src/xine-engine.cpp index 800a98c11..28fd05531 100644 --- a/src/xine-engine.cpp +++ b/src/xine-engine.cpp @@ -355,9 +355,7 @@ XineEngine::determineAndShowErrorMessage() } // TODO - /*Amarok::StatusBar::instance()->longMessage( - "" + i18n("Error Loading Media") + "

" + body + "

" + m_url.prettyURL(), - KDE::StatusBar::Error );*/ + qWarning() << body; } void diff --git a/src/xspfparser.cpp b/src/xspfparser.cpp index 249ea0b60..399f0fdca 100644 --- a/src/xspfparser.cpp +++ b/src/xspfparser.cpp @@ -104,10 +104,17 @@ Song XSPFParser::ParseTrack(QXmlStreamReader* reader) const { } break; } + case QXmlStreamReader::EndElement: { + if (reader->name() == "track") { + song.Init(title, artist, album, length); + return song; + } + } default: break; } } + // At least make an effort if we never find a . song.Init(title, artist, album, length); return song; }