M3U playlists import
authorNikolay Tischenko <niktischenko@gmail.com>
Thu, 24 Mar 2011 17:36:26 +0000 (23:36 +0600)
committerNikolay Tischenko <niktischenko@gmail.com>
Thu, 24 Mar 2011 17:36:26 +0000 (23:36 +0600)
13 files changed:
src/filestorage.cpp
src/filestorage.h
src/library.cpp
src/library.h
src/mainwindow.cpp
src/mainwindow.h
src/mediascanner.cpp
src/mediascanner.h
src/resources/someplayer_it.ts
src/resources/someplayer_ru.ts
src/resources/someplayer_zh_CN.ts
src/resources/someplayer_zh_TW.ts
src/ui/mainwindow.ui

index 1938143..076530a 100644 (file)
@@ -213,6 +213,52 @@ void FileStorage::removePlaylist(QString name) {
        file.remove();
 }
 
+void FileStorage::importPlaylist(QString name) {
+       QRegExp forname("^.+\\/([^/]+)\\.[^.]+");
+       QRegExp fordir("(.+)\\/");
+       QString plsnam(name);
+       QString dir(name);
+       if (plsnam.indexOf(forname) == -1) {
+               return;
+       }
+       if (dir.indexOf(fordir) == -1) {
+               return;
+       }
+       dir = fordir.cap(1);
+       plsnam = forname.cap(1);
+       QStringList existed = getPlaylistsNames();
+       if (existed.contains(plsnam)) {
+               return;
+       }
+       QFile plsfile (name);
+       plsfile.open(QFile::ReadOnly);
+       QTextStream stream(&plsfile);
+       QStringList trackfiles;
+       while (!stream.atEnd()) {
+               QString buf = stream.readLine();
+               if (buf.startsWith("#")) {
+                       continue;
+               }
+               if (buf.startsWith("/")) {
+                       trackfiles.append(buf);
+               } else {
+                       trackfiles.append(dir+"/"+buf);
+               }
+       }
+       QList<Track> tracks;
+       TagResolver resover;
+       foreach (QString trackfile, trackfiles) {
+               if (!QFile::exists(trackfile)) {
+                       continue;
+               }
+               tracks.append(resover.decodeOne(trackfile));
+       }
+       Playlist playlist;
+       playlist.setName(plsnam);
+       playlist.setTracks(tracks);
+       savePlaylist(playlist);
+}
+
 Playlist FileStorage::getCurrentPlaylist() {
        return getPlaylist(_CURRENT_PLAYLIST_NAME_);
 }
index f6dad99..1bdbc09 100644 (file)
@@ -56,6 +56,7 @@ namespace SomePlayer {
                        void savePlaylist(Playlist playlist);
                        void removePlaylist(Playlist playlist);
                        void removePlaylist(QString name);
+                       void importPlaylist(QString name);
 
                        Playlist getCurrentPlaylist();
                        void saveCurrentPlaylist(Playlist playlist);
index 576440f..4c0047e 100644 (file)
@@ -137,6 +137,21 @@ void Library::removePlaylist(QString name) {
        _playlist_storage->removePlaylist(name);
 }
 
+void Library::importPlaylist(QString name) {
+       _playlist_storage->importPlaylist(name);
+}
+
+void Library::importPlaylists(QStringList files) {
+       foreach (QString name, files) {
+               importPlaylist(name);
+       }
+}
+
+void Library::scanAndImportPlaylists(QString dirpath) {
+       QStringList playlists = _scanner->scanForPlaylists(dirpath);
+       importPlaylists(playlists);
+}
+
 Playlist Library::getCurrentPlaylist() {
        return _playlist_storage->getCurrentPlaylist();
 }
index 1803c02..608d627 100644 (file)
@@ -73,6 +73,9 @@ namespace SomePlayer {
                        void savePlaylist(const Playlist &playlist);
                        void removePlaylist(const Playlist &playlist);
                        void removePlaylist(QString name);
+                       void importPlaylist(QString name);
+                       void importPlaylists(QStringList files);
+                       void scanAndImportPlaylists(QString dirpath);
 
                        Playlist getCurrentPlaylist();
                        void saveCurrentPlaylist(const Playlist &playlist);
index b888452..5c5d787 100644 (file)
@@ -66,6 +66,7 @@ MainWindow::MainWindow(QWidget *parent) :
        connect(_library_form, SIGNAL(refreshPlayer()), this, SLOT(player()));
        connect(ui->actionManageLibrary, SIGNAL(triggered()), this, SLOT(_manage_library()));
        connect(ui->actionSavePlaylist, SIGNAL(triggered()), this, SLOT(_save_playlist()));
+       connect(ui->actionImport, SIGNAL(triggered()), this, SLOT(_import_playlits()));
        connect(_player_form, SIGNAL(clearPlaylist()), this, SLOT(_clear_current_playlist()));
        connect(ui->actionSetTimer, SIGNAL(triggered()), this, SLOT(_set_timer()));
        connect(ui->actionEqualizer, SIGNAL(triggered()), this, SLOT(_equalizer()));
@@ -477,3 +478,9 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event) {
 
        return true;
 }
+
+
+void MainWindow::_import_playlits() {
+       QString directory = QFileDialog::getExistingDirectory (this, tr("Select directory"), "", QFileDialog::ShowDirsOnly );
+       _library->scanAndImportPlaylists(directory);
+}
index 8f49a71..54a396d 100644 (file)
@@ -72,6 +72,7 @@ public slots:
 private slots:
        void _manage_library();
        void _save_playlist();
+       void _import_playlits();
        void _clear_current_playlist();
        void _set_timer();
        void _timeout();
index 7270745..3d1017f 100644 (file)
@@ -45,6 +45,18 @@ QStringList MediaScanner::singleScan(QString path) {
        return _scan_directory(_dir);
 }
 
+QStringList MediaScanner::scanForPlaylists(QString path) {
+       QStringList extensions_backup(REGISTERED_FILE_EXTENSIONS);
+       REGISTERED_FILE_EXTENSIONS.clear();
+       REGISTERED_FILE_EXTENSIONS << "m3u";
+       _dir = path;
+       _foundMedia.clear();
+       QStringList result = _scan_directory(_dir);
+       REGISTERED_FILE_EXTENSIONS.clear();
+       REGISTERED_FILE_EXTENSIONS.append(extensions_backup);
+       return result;
+}
+
 QStringList MediaScanner::_scan_directory(QDir dir) {
        QFileInfoList items = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden);
        foreach (QFileInfo info, items) {
index 151bf3d..d5c8a97 100644 (file)
@@ -37,6 +37,7 @@ namespace SomePlayer {
                        explicit MediaScanner(QObject *parent = 0);
                        void run();
                        QStringList singleScan(QString);
+                       QStringList scanForPlaylists(QString);
 
                signals:
                        void scanFinish(QStringList);
index eed354b..13aa2eb 100644 (file)
@@ -412,60 +412,70 @@ MrClon (maemoworld.ru)&lt;br /&gt;hxka (maemoworld.ru)&lt;br /&gt;jerich0 (maemo
         <translation>Lettore</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="66"/>
+        <location filename="../ui/mainwindow.ui" line="67"/>
         <source>Help</source>
         <translation>Aiuto</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="78"/>
+        <location filename="../ui/mainwindow.ui" line="79"/>
         <source>About</source>
         <translation>About</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="83"/>
+        <location filename="../ui/mainwindow.ui" line="84"/>
         <source>Settings</source>
         <translation>Impostazioni</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="88"/>
+        <location filename="../ui/mainwindow.ui" line="89"/>
         <source>Manage library</source>
         <translation>Gestisci collezione</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="93"/>
+        <location filename="../ui/mainwindow.ui" line="94"/>
         <source>Equalizer</source>
         <translation>Equalizzatore</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="98"/>
+        <location filename="../ui/mainwindow.ui" line="99"/>
         <source>Set timer</source>
         <translation>Imposta timer</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="103"/>
+        <location filename="../ui/mainwindow.ui" line="104"/>
         <source>Save playlist</source>
         <translation>Salva playlist</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="106"/>
+        <location filename="../ui/mainwindow.ui" line="107"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="111"/>
+        <location filename="../ui/mainwindow.ui" line="112"/>
         <source>Online help</source>
         <translation>Aiuto online</translation>
     </message>
     <message>
-        <location filename="../mainwindow.cpp" line="224"/>
+        <location filename="../ui/mainwindow.ui" line="117"/>
+        <source>Import playlists</source>
+        <translation>Importa playliste</translation>
+    </message>
+    <message>
+        <location filename="../mainwindow.cpp" line="225"/>
         <source>Clear playlist?</source>
         <translation>Cancellare la playlist?</translation>
     </message>
     <message>
-        <location filename="../mainwindow.cpp" line="270"/>
+        <location filename="../mainwindow.cpp" line="271"/>
         <source>Music off: </source>
         <translation>Spegnimento musica:</translation>
     </message>
+    <message>
+        <location filename="../mainwindow.cpp" line="484"/>
+        <source>Select directory</source>
+        <translation>Seleziona cartella</translation>
+    </message>
 </context>
 <context>
     <name>ManageLibraryForm</name>
index 026e2a4..f4a04ef 100644 (file)
@@ -412,60 +412,70 @@ MrClon (maemoworld.ru)&lt;br /&gt;hxka (maemoworld.ru)&lt;br /&gt;jerich0 (maemo
         <translation>Плеер</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="66"/>
+        <location filename="../ui/mainwindow.ui" line="67"/>
         <source>Help</source>
         <translation>Помощь</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="78"/>
+        <location filename="../ui/mainwindow.ui" line="79"/>
         <source>About</source>
         <translation>О программе</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="83"/>
+        <location filename="../ui/mainwindow.ui" line="84"/>
         <source>Settings</source>
         <translation>Настройки</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="88"/>
+        <location filename="../ui/mainwindow.ui" line="89"/>
         <source>Manage library</source>
         <translation>Управление библиотекой</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="93"/>
+        <location filename="../ui/mainwindow.ui" line="94"/>
         <source>Equalizer</source>
         <translation>Эквалайзер</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="98"/>
+        <location filename="../ui/mainwindow.ui" line="99"/>
         <source>Set timer</source>
         <translation>Установить таймер</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="103"/>
+        <location filename="../ui/mainwindow.ui" line="104"/>
         <source>Save playlist</source>
         <translation>Сохранить плейлист</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="106"/>
+        <location filename="../ui/mainwindow.ui" line="107"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../ui/mainwindow.ui" line="111"/>
+        <location filename="../ui/mainwindow.ui" line="112"/>
         <source>Online help</source>
         <translation>Онлайн справка</translation>
     </message>
     <message>
-        <location filename="../mainwindow.cpp" line="224"/>
+        <location filename="../ui/mainwindow.ui" line="117"/>
+        <source>Import playlists</source>
+        <translation>Импорт плейлистов</translation>
+    </message>
+    <message>
+        <location filename="../mainwindow.cpp" line="225"/>
         <source>Clear playlist?</source>
         <translation>Очистить плейлист?</translation>
     </message>
     <message>
-        <location filename="../mainwindow.cpp" line="270"/>
+        <location filename="../mainwindow.cpp" line="271"/>
         <source>Music off: </source>
         <translation>Отключение: </translation>
     </message>
+    <message>
+        <location filename="../mainwindow.cpp" line="484"/>
+        <source>Select directory</source>
+        <translation>Выбрать директорию</translation>
+    </message>
 </context>
 <context>
     <name>ManageLibraryForm</name>
index 6d2b949..9b883b5 100644 (file)
@@ -375,6 +375,14 @@ MrClon (maemoworld.ru)&lt;br /&gt;hxka (maemoworld.ru)&lt;br /&gt;jerich0 (maemo
         <source>Online help</source>
         <translation>在线帮助</translation>
     </message>
+    <message>
+        <source>Import playlists</source>
+        <translation>导入播放列表</translation>
+    </message>
+    <message>
+        <source>Select directory</source>
+        <translation>选择目录</translation>
+    </message>
 </context>
 <context>
     <name>ManageLibraryForm</name>
index 38f5338..8c57a38 100644 (file)
@@ -375,6 +375,14 @@ By Nikolay Tischenko (somebody)&lt;/p&gt;&lt;p align=&quot;center&quot;&gt;&lt;b
         <source>Settings</source>
         <translation>設定</translation>
     </message>
+    <message>
+        <source>Import playlists</source>
+        <translation>導入播放列表</translation>
+    </message>
+    <message>
+        <source>Select directory</source>
+        <translation>選擇目錄</translation>
+    </message>
 </context>
 <context>
     <name>ManageLibraryForm</name>
index a672aa9..c3256b8 100644 (file)
@@ -60,6 +60,7 @@
      <string>Player</string>
     </property>
     <addaction name="actionSavePlaylist"/>
+    <addaction name="actionImport"/>
    </widget>
    <widget class="QMenu" name="menuHelp_2">
     <property name="title">
     <string>Online help</string>
    </property>
   </action>
+  <action name="actionImport">
+   <property name="text">
+    <string>Import playlists</string>
+   </property>
+  </action>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
  <resources/>