From 768bf85cd712fd008ff15979b2d9de313d4c61b7 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Sun, 7 Mar 2010 14:42:51 +0000 Subject: [PATCH] M3U support in the UI from "Add Media" \o/ --- src/m3uparser.cpp | 25 ++++++++++++++++--------- src/mainwindow.cpp | 23 ++++++++++++++++++----- src/mainwindow.h | 3 ++- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/m3uparser.cpp b/src/m3uparser.cpp index ce21558af..355540f3d 100644 --- a/src/m3uparser.cpp +++ b/src/m3uparser.cpp @@ -10,11 +10,11 @@ M3UParser::M3UParser(QIODevice* device, const QDir& directory, QObject* parent) } const QList& M3UParser::Parse() { - QString line = QString::fromLatin1(device_->readLine()); + QString line = QString::fromLatin1(device_->readLine()).trimmed(); if (line.startsWith("#EXTM3U")) { // This is in extended M3U format. type_ = EXTENDED; - line = QString::fromLatin1(device_->readLine()); + line = QString::fromLatin1(device_->readLine()).trimmed(); } forever { @@ -35,17 +35,17 @@ const QList& M3UParser::Parse() { QString location; if (!ParseTrackLocation(line, &song)) { qWarning() << "Failed to parse location: " << line; - continue; + } else { + songs_ << song; + current_metadata_.artist.clear(); + current_metadata_.title.clear(); + current_metadata_.length = -1; } - songs_ << song; - current_metadata_.artist.clear(); - current_metadata_.title.clear(); - current_metadata_.length = -1; } - if (!device_->canReadLine()) { + if (device_->atEnd()) { break; } - line = QString::fromLatin1(device_->readLine()); + line = QString::fromLatin1(device_->readLine()).trimmed(); } return songs_; @@ -89,12 +89,19 @@ bool M3UParser::ParseTrackLocation(const QString& line, Song* song) const { // Absolute path. // Fix windows \, eg. C:\foo -> C:/foo. QString proper_path = QDir::fromNativeSeparators(line); + if (!QFile::exists(proper_path)) { + return false; + } song->set_filename(proper_path); } else { // Relative path. QString proper_path = QDir::fromNativeSeparators(line); QString absolute_path = directory_.absoluteFilePath(proper_path); + if (!QFile::exists(absolute_path)) { + return false; + } song->set_filename(absolute_path); } song->InitFromFile(song->filename(), -1); + return true; } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 39ac865e0..70100cde2 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -20,6 +20,7 @@ #include "addstreamdialog.h" #include "stylesheetloader.h" #include "albumcovermanager.h" +#include "m3uparser.h" #include "qxtglobalshortcut.h" @@ -39,6 +40,8 @@ const int MainWindow::kStateVersion = 1; const char* MainWindow::kSettingsGroup = "MainWindow"; +const char* MainWindow::kMediaFilterSpec = + "Music (*.mp3 *.ogg *.flac *.mpc *.m4a *.aac *.wma);;Playlists (*.m3u)"; MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent) : QMainWindow(parent), @@ -616,7 +619,8 @@ void MainWindow::AddMedia() { QString directory = settings_.value("add_media_path", QDir::currentPath()).toString(); // Show dialog - QStringList file_names = QFileDialog::getOpenFileNames(this, "Add media", directory); + QStringList file_names = QFileDialog::getOpenFileNames( + this, "Add media", directory, kMediaFilterSpec); if (file_names.isEmpty()) return; @@ -626,10 +630,19 @@ void MainWindow::AddMedia() { // Add media QList urls; foreach (const QString& path, file_names) { - QUrl url(path); - if (url.scheme().isEmpty()) - url.setScheme("file"); - urls << url; + if (path.endsWith(".m3u")) { + QFile file(path); + QFileInfo info(file); + file.open(QIODevice::ReadOnly); + M3UParser parser(&file, info.dir()); + const SongList& songs = parser.Parse(); + current_playlist_->InsertSongs(songs); + } else { + QUrl url(path); + if (url.scheme().isEmpty()) + url.setScheme("file"); + urls << url; + } } current_playlist_->InsertPaths(urls); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 71d391d88..a45bdd7e0 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -91,11 +91,12 @@ class MainWindow : public QMainWindow { private: void SaveGeometry(); - void SetCurrentPlaylist(PlaylistView * pCurrent) ; + void SetCurrentPlaylist(PlaylistView* current); private: static const int kStateVersion; static const char* kSettingsGroup; + static const char* kMediaFilterSpec; Ui::MainWindow ui_; SystemTrayIcon* tray_icon_;