Browse Source

minor fixes

Olivier Massot 4 years ago
parent
commit
ed870a499a
9 changed files with 168 additions and 65 deletions
  1. 33 1
      core/db.py
  2. 10 2
      core/indexer.py
  3. 2 2
      core/repositories.py
  4. 6 8
      main.py
  5. 60 14
      ui/qt/main.ui
  6. 26 25
      ui/qt/rsc.qrc
  7. BIN
      ui/qt/rsc/minus.png
  8. 21 4
      ui/qt/widgets/explorertable.py
  9. 10 9
      ui/window.py

+ 33 - 1
core/db.py

@@ -1,18 +1,50 @@
+from contextlib import contextmanager
+
 from sqlalchemy import create_engine
 from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.orm import Session
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy.orm.scoping import scoped_session
 
 from core import constants
 
-engine = create_engine(f'sqlite:///{constants.DB_PATH}', echo=constants.SQL_ALCHEMY_VERBOSE)
+engine = create_engine(
+    f'sqlite:///{constants.DB_PATH}',
+    connect_args={'check_same_thread': False},
+    echo=constants.SQL_ALCHEMY_VERBOSE)
 Base = declarative_base()
 
+# session_factory = sessionmaker(autocommit=False, autoflush=False, bind=engine)
+# session = scoped_session(session_factory)
+# # session_ = Session()
+# #
+# #
+
 
 def session():
     return Session(engine)
 
 
+@contextmanager
+def session_scope():
+    """Provide a transactional scope around a series of operations."""
+    session = Session()
+    try:
+        yield session
+        session.commit()
+    except:
+        session.rollback()
+        raise
+    finally:
+        session.close()
+
+
 def create():
     if constants.DB_PATH.exists():
         raise FileExistsError('A db file already exists')
     Base.metadata.create_all(engine)
+
+
+def close():
+    # session.remove()
+    engine.dispose()

+ 10 - 2
core/indexer.py

@@ -88,6 +88,8 @@ class Indexer(CyclicThread):
         self.deque = deque()
         self.interrupted = False
         self.discoverer = Discoverer(self)
+        self.last_commit = None
+        self.tracks = []
 
     def start(self):
         logger.info('** indexation thread started **')
@@ -97,9 +99,10 @@ class Indexer(CyclicThread):
     def act(self):
         if self.deque:
             try:
-                self.index(self.deque.pop())
+                track = self.index(self.deque.pop())
             except (FileNotFoundError, NotSupportedFile) as e:
                 logger.warning("Error during indexation: %s" % e)
+                return
 
     def put(self, filename_or_track_id):
         self.deque.appendleft(filename_or_track_id)
@@ -139,7 +142,10 @@ class Indexer(CyclicThread):
         vlc_media.parse()
         track_infos = vlc_media.get_tracks_info()
 
-        track.title = vlc_media.get_meta(vlc.Meta.Title) or filename.stripext().name
+        title = vlc_media.get_meta(vlc.Meta.Title)
+        if not title or title == '(null)':
+            title = filename.stripext().name
+        track.title = title
         track.format = filename.ext
         track.artist = vlc_media.get_meta(vlc.Meta.AlbumArtist) or vlc_media.get_meta(vlc.Meta.Artist)
         track.album = vlc_media.get_meta(vlc.Meta.Album)
@@ -156,7 +162,9 @@ class Indexer(CyclicThread):
             track_repo.create(track)
 
         logger.debug('Index - updated: %s' % filename)
+
         track_repo.commit()
+        return track
 
     def stop(self):
         self.discoverer.stop()

+ 2 - 2
core/repositories.py

@@ -39,8 +39,8 @@ class Repository:
         if commit:
             self.commit()
 
-    def __del__(self):
-        self.session.close()
+    # def __del__(self):
+    #     self.session.close()
 
 
 class MusicFolderRepository(Repository):

+ 6 - 8
main.py

@@ -5,14 +5,12 @@
     @author:[author], [year]
 """
 
-import logging
 import sys
-import traceback
 
 from PyQt5.Qt import QApplication
 from PyQt5.QtWidgets import QMessageBox
 
-from core import logging_, db
+from core import db
 from core.indexer import Indexer
 from core.logging_ import Logger
 from ui.window import MainWindow
@@ -46,14 +44,14 @@ except FileExistsError:
 # Start UI
 logger.info("-- Start --")
 app = QApplication(sys.argv)
-indexer = Indexer()
-indexer.start()
+# indexer = Indexer()
+# indexer.start()
 main_window = MainWindow()
 main_window.show()
 try:
     r = app.exec_()
 finally:
-    indexer.stop()
-    db.engine.dispose()
+    # indexer.stop()
+    db.close()
 
-logger.info("-- Closed --")
+logger.info("-- Closed --")

+ 60 - 14
ui/qt/main.ui

@@ -96,7 +96,7 @@
         <item>
          <widget class="QStackedWidget" name="stack">
           <property name="currentIndex">
-           <number>0</number>
+           <number>2</number>
           </property>
           <widget class="QWidget" name="page_1">
            <layout class="QHBoxLayout" name="horizontalLayout_2">
@@ -257,7 +257,7 @@
                </layout>
               </item>
               <item>
-               <layout class="QVBoxLayout" name="verticalLayout_5" stretch="1,0,1,0,0,0">
+               <layout class="QVBoxLayout" name="verticalLayout_5" stretch="1,0,0,0">
                 <property name="leftMargin">
                  <number>10</number>
                 </property>
@@ -272,10 +272,16 @@
                 </property>
                 <item>
                  <widget class="QFrame" name="explorerTrackMetaFrame">
+                  <property name="minimumSize">
+                   <size>
+                    <width>0</width>
+                    <height>240</height>
+                   </size>
+                  </property>
                   <property name="maximumSize">
                    <size>
                     <width>16777215</width>
-                    <height>100</height>
+                    <height>240</height>
                    </size>
                   </property>
                   <property name="frameShape">
@@ -441,21 +447,43 @@
                        </item>
                       </layout>
                      </item>
+                     <item>
+                      <widget class="QLabel" name="label_10">
+                       <property name="minimumSize">
+                        <size>
+                         <width>361</width>
+                         <height>14</height>
+                        </size>
+                       </property>
+                       <property name="maximumSize">
+                        <size>
+                         <width>361</width>
+                         <height>14</height>
+                        </size>
+                       </property>
+                       <property name="text">
+                        <string>Notes</string>
+                       </property>
+                      </widget>
+                     </item>
+                     <item>
+                      <widget class="QTextBrowser" name="explorerTrackNotepad">
+                       <property name="minimumSize">
+                        <size>
+                         <width>0</width>
+                         <height>120</height>
+                        </size>
+                       </property>
+                       <property name="undoRedoEnabled">
+                        <bool>true</bool>
+                       </property>
+                      </widget>
+                     </item>
                     </layout>
                    </item>
                   </layout>
                  </widget>
                 </item>
-                <item>
-                 <widget class="QLabel" name="label_10">
-                  <property name="text">
-                   <string>Notes</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QTextBrowser" name="explorerTrackNotepad"/>
-                </item>
                 <item>
                  <widget class="QLabel" name="label_9">
                   <property name="text">
@@ -476,6 +504,12 @@
                       <height>28</height>
                      </size>
                     </property>
+                    <property name="maximumSize">
+                     <size>
+                      <width>28</width>
+                      <height>28</height>
+                     </size>
+                    </property>
                     <property name="text">
                      <string>+</string>
                     </property>
@@ -493,12 +527,18 @@
                       <height>28</height>
                      </size>
                     </property>
+                    <property name="maximumSize">
+                     <size>
+                      <width>28</width>
+                      <height>28</height>
+                     </size>
+                    </property>
                     <property name="text">
                      <string>-</string>
                     </property>
                     <property name="icon">
                      <iconset resource="rsc.qrc">
-                      <normaloff>:/img/rsc/delete.png</normaloff>:/img/rsc/delete.png</iconset>
+                      <normaloff>:/img/rsc/minus.png</normaloff>:/img/rsc/minus.png</iconset>
                     </property>
                    </widget>
                   </item>
@@ -510,6 +550,12 @@
                       <height>28</height>
                      </size>
                     </property>
+                    <property name="maximumSize">
+                     <size>
+                      <width>16777215</width>
+                      <height>28</height>
+                     </size>
+                    </property>
                    </widget>
                   </item>
                  </layout>

+ 26 - 25
ui/qt/rsc.qrc

@@ -1,27 +1,28 @@
 <RCC>
-    <qresource prefix="/img">
-        <file>rsc/calendar.png</file>
-        <file>rsc/map.png</file>
-        <file>rsc/settings.png</file>
-        <file>rsc/writing-tool.png</file>
-        <file>rsc/dance.png</file>
-        <file>rsc/delete.png</file>
-        <file>rsc/email.png</file>
-        <file>rsc/folder.png</file>
-        <file>rsc/hourglass.png</file>
-        <file>rsc/man-user.png</file>
-        <file>rsc/music-album.png</file>
-        <file>rsc/music-note.png</file>
-        <file>rsc/next.png</file>
-        <file>rsc/pdf.png</file>
-        <file>rsc/plus.png</file>
-        <file>rsc/previous.png</file>
-        <file>rsc/question.png</file>
-        <file>rsc/refresh-page-option.png</file>
-        <file>rsc/remove.png</file>
-        <file>rsc/save.png</file>
-        <file>rsc/edit.png</file>
-        <file>rsc/swap.png</file>
-        <file>rsc/constellations.svg</file>
-    </qresource>
+  <qresource prefix="/img">
+    <file>rsc/calendar.png</file>
+    <file>rsc/minus.png</file>
+    <file>rsc/map.png</file>
+    <file>rsc/settings.png</file>
+    <file>rsc/writing-tool.png</file>
+    <file>rsc/dance.png</file>
+    <file>rsc/delete.png</file>
+    <file>rsc/email.png</file>
+    <file>rsc/folder.png</file>
+    <file>rsc/hourglass.png</file>
+    <file>rsc/man-user.png</file>
+    <file>rsc/music-album.png</file>
+    <file>rsc/music-note.png</file>
+    <file>rsc/next.png</file>
+    <file>rsc/pdf.png</file>
+    <file>rsc/plus.png</file>
+    <file>rsc/previous.png</file>
+    <file>rsc/question.png</file>
+    <file>rsc/refresh-page-option.png</file>
+    <file>rsc/remove.png</file>
+    <file>rsc/save.png</file>
+    <file>rsc/edit.png</file>
+    <file>rsc/swap.png</file>
+    <file>rsc/constellations.svg</file>
+  </qresource>
 </RCC>

BIN
ui/qt/rsc/minus.png


+ 21 - 4
ui/qt/widgets/explorertable.py

@@ -1,7 +1,10 @@
 from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem
 
+from core.logging_ import Logger
 from core.repositories import TrackRepository
 
+logger = Logger.get()
+
 
 class ExplorerTable(QTreeWidget):
     def __init__(self, parent):
@@ -9,26 +12,40 @@ class ExplorerTable(QTreeWidget):
 
     def populate(self):
         track_repo = TrackRepository()
+        self.clear()
 
         artist_folders = {}
         album_folders = {}
+        orphans = []
         tracks = track_repo.get_all()
 
+        logger.info(".. start populating explorer table - 1")
+
         for track in tracks:
+            # list artists
             if track.artist and track.artist not in artist_folders:
-                item = QTreeWidgetItem(self, [track.artist])
+                item = QTreeWidgetItem([track.artist])
                 artist_folders[track.artist] = item
 
+        for track in tracks:
+            # list albums with artists
             if track.artist and track.album and (track.artist, track.album) not in album_folders:
-                item = QTreeWidgetItem(artist_folders[track.artist], [track.album])
+                item = QTreeWidgetItem([track.album])
                 album_folders[(track.artist, track.album)] = item
 
+        for track in tracks:
+            # list tracks
+
             if track.artist and track.album:
                 parent = album_folders[(track.artist, track.album)]
             elif track.artist:
                 parent = artist_folders[track.artist]
             else:
-                parent = self
+                orphans.append(QTreeWidgetItem([track.title]))
 
-            item = QTreeWidgetItem(parent, [track.title])
+        self.setUpdatesEnabled(False)
+        self.insertTopLevelItems(0, orphans)
+        self.insertTopLevelItems(0, artist_folders.values())
+        self.setUpdatesEnabled(True)
 
+        logger.info(".. explorer table populated")

+ 10 - 9
ui/window.py

@@ -4,23 +4,20 @@
 
     @author:[author], [year]
 """
-import re
 
-from PyQt5.QtCore import Qt
-from PyQt5.QtSql import QSqlDatabase, QSqlTableModel, QSqlQueryModel
+from PyQt5.QtSql import QSqlDatabase
 from path import Path
 
 from PyQt5.QtGui import QIcon
-from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog, QDialog, QMessageBox, \
-    QTreeWidgetItem
+from PyQt5.QtWidgets import QMainWindow, QListWidgetItem, QTableWidgetItem, QFileDialog
 
 from core import constants
-from core.file_utilities import is_subdir_of
-from core.indexer import Indexer
+from core.logging_ import Logger
 from core.models import MusicFolder
 from core.repositories import MusicFolderRepository, TrackRepository
 from ui.qt.main_ui import Ui_mainWindow
 
+logger = Logger.get()
 
 class MainWindow(QMainWindow):
     def __init__(self):
@@ -48,12 +45,15 @@ class MainWindow(QMainWindow):
             (':/img/rsc/settings.png', 'Paramètres'),
         ]
 
+
+
         for i, item in enumerate(menu_items):
             icon, lbl = item
             item = QListWidgetItem(QIcon(icon), lbl)
             item.index = i
             self.ui.menu.addItem(item)
 
+
         # Menu item clicked
         self.ui.menu.itemClicked.connect(self.menu_item_selected)
 
@@ -67,6 +67,8 @@ class MainWindow(QMainWindow):
         self.ui.musicFoldersRemoveButton.clicked.connect(self.remove_music_folder)
         self.populate_music_folders_table()
 
+        logger.info("d")
+
     def menu_item_selected(self, e):
         self.ui.stack.setCurrentIndex(e.index)
 
@@ -77,7 +79,7 @@ class MainWindow(QMainWindow):
         self.ui.statusbar.setStatusTip("Indexation terminée.")
 
     def refresh_explorer_tree(self):
-        self.track_model.query()
+        self.ui.explorerTable.populate()
 
     def explorer_tree_selection_changed(self, model_index):
         track_id = model_index.indexes()[0].data(0)
@@ -139,4 +141,3 @@ class MainWindow(QMainWindow):
     def __del__(self):
         if self.qdb.isOpen():
             self.qdb.close()
-        super().__del__()