diff --git a/app/musicmuster.py b/app/musicmuster.py
index e77fba6..d51eb4b 100755
--- a/app/musicmuster.py
+++ b/app/musicmuster.py
@@ -1,9 +1,10 @@
#!/usr/bin/env python
-import webbrowser
+import os.path
import psutil
import sys
import urllib.parse
+import webbrowser
from datetime import datetime
@@ -36,6 +37,7 @@ from sqlalchemy.orm.exc import DetachedInstanceError
from ui.dlg_search_database_ui import Ui_Dialog
from ui.dlg_SelectPlaylist_ui import Ui_dlgSelectPlaylist
from ui.main_window_ui import Ui_MainWindow
+from utilities import create_track_from_file
class TrackData:
@@ -85,23 +87,6 @@ class Window(QMainWindow, Ui_MainWindow):
self.check_audacity()
self.timer.start(Config.TIMER_MS)
- # def add_file(self) -> None:
- # # TODO: V2 enahancement to import tracks
- # dlg = QFileDialog()
- # dlg.setFileMode(QFileDialog.ExistingFiles)
- # dlg.setViewMode(QFileDialog.Detail)
- # dlg.setDirectory(Config.ROOT)
- # dlg.setNameFilter("Music files (*.flac *.mp3)")
-
- # if dlg.exec_():
- # with Session() as session:
- # for fname in dlg.selectedFiles():
- # track = create_track_from_file(session, fname)
- # # Add to playlist on screen
- # # If we don't specify "repaint=False", playlist will
- # # also be saved to database
- # self.visible_playlist_tab().insert_track(session, track)
-
def set_main_window_size(self) -> None:
"""Set size of window from database"""
@@ -188,6 +173,7 @@ class Window(QMainWindow, Ui_MainWindow):
self.actionEnable_controls.triggered.connect(
self.enable_play_next_controls)
self.actionExport_playlist.triggered.connect(self.export_playlist_tab)
+ self.actionImport.triggered.connect(self.import_track)
self.actionFade.triggered.connect(self.fade)
self.actionMoveSelected.triggered.connect(self.move_selected)
self.actionNewPlaylist.triggered.connect(self.create_playlist)
@@ -272,6 +258,18 @@ class Window(QMainWindow, Ui_MainWindow):
# Just return if there's no visible playlist tab
return
+ def create_playlist_tab(self, session: Session,
+ playlist: Playlists) -> None:
+ """
+ Take the passed playlist database object, create a playlist tab and
+ add tab to display.
+ """
+
+ playlist_tab: PlaylistTab = PlaylistTab(
+ musicmuster=self, session=session, playlist_id=playlist.id)
+ idx: int = self.tabPlaylist.addTab(playlist_tab, playlist.name)
+ self.tabPlaylist.setCurrentIndex(idx)
+
def disable_play_next_controls(self) -> None:
"""
Disable "play next" keyboard controls
@@ -379,6 +377,25 @@ class Window(QMainWindow, Ui_MainWindow):
self.stop_playing(fade=True)
+ def import_track(self) -> None:
+ """Import track file"""
+
+ dlg = QFileDialog()
+ dlg.setFileMode(QFileDialog.ExistingFiles)
+ dlg.setViewMode(QFileDialog.Detail)
+ # TODO: remove hardcoded directory
+ dlg.setDirectory(os.path.join(Config.ROOT, "Singles"))
+ dlg.setNameFilter("Music files (*.flac *.mp3)")
+
+ if dlg.exec_():
+ with Session() as session:
+ for fname in dlg.selectedFiles():
+ track = create_track_from_file(session, fname)
+ # Add to playlist on screen
+ # If we don't specify "repaint=False", playlist will
+ # also be saved to database
+ self.visible_playlist_tab().insert_track(session, track)
+
def load_last_playlists(self):
"""Load the playlists that we loaded at end of last session"""
@@ -387,18 +404,6 @@ class Window(QMainWindow, Ui_MainWindow):
self.create_playlist_tab(session, playlist)
playlist.mark_open(session)
- def create_playlist_tab(self, session: Session,
- playlist: Playlists) -> None:
- """
- Take the passed playlist database object, create a playlist tab and
- add tab to display.
- """
-
- playlist_tab: PlaylistTab = PlaylistTab(
- musicmuster=self, session=session, playlist_id=playlist.id)
- idx: int = self.tabPlaylist.addTab(playlist_tab, playlist.name)
- self.tabPlaylist.setCurrentIndex(idx)
-
def move_selected(self) -> None:
"""Move selected rows to another playlist"""
diff --git a/app/ui/main_window.ui b/app/ui/main_window.ui
index 881901e..1553706 100644
--- a/app/ui/main_window.ui
+++ b/app/ui/main_window.ui
@@ -752,14 +752,17 @@ border: 1px solid rgb(85, 87, 83);
0
0
1280
- 29
+ 24
diff --git a/app/ui/main_window_ui.py b/app/ui/main_window_ui.py
index 8d9d08f..4ae1087 100644
--- a/app/ui/main_window_ui.py
+++ b/app/ui/main_window_ui.py
@@ -349,7 +349,7 @@ class Ui_MainWindow(object):
self.gridLayout_6.addLayout(self.horizontalLayout_2, 3, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
- self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 29))
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 24))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
@@ -441,7 +441,12 @@ class Ui_MainWindow(object):
self.actionAdd_note.setObjectName("actionAdd_note")
self.actionEnable_controls = QtWidgets.QAction(MainWindow)
self.actionEnable_controls.setObjectName("actionEnable_controls")
+ self.actionImport = QtWidgets.QAction(MainWindow)
+ self.actionImport.setObjectName("actionImport")
+ self.menuFile.addAction(self.actionImport)
+ self.menuFile.addSeparator()
self.menuFile.addAction(self.actionE_xit)
+ self.menuFile.addSeparator()
self.menuPlaylist.addAction(self.actionNewPlaylist)
self.menuPlaylist.addAction(self.actionOpenPlaylist)
self.menuPlaylist.addAction(self.actionClosePlaylist)
@@ -546,4 +551,6 @@ class Ui_MainWindow(object):
self.actionAdd_note.setText(_translate("MainWindow", "Add note..."))
self.actionAdd_note.setShortcut(_translate("MainWindow", "Ctrl+T"))
self.actionEnable_controls.setText(_translate("MainWindow", "Enable controls"))
+ self.actionImport.setText(_translate("MainWindow", "Import..."))
+ self.actionImport.setShortcut(_translate("MainWindow", "Ctrl+Shift+I"))
import icons_rc
diff --git a/app/utilities.py b/app/utilities.py
index 1fb39d7..716c442 100755
--- a/app/utilities.py
+++ b/app/utilities.py
@@ -6,6 +6,13 @@ import shutil
import tempfile
from config import Config
+from helpers import (
+ fade_point,
+ get_audio_segment,
+ get_tags,
+ leading_silence,
+ trailing_silence,
+)
from log import DEBUG, INFO
from models import Notes, Playdates, Session, Tracks
from mutagen.flac import FLAC
@@ -66,23 +73,24 @@ def create_track_from_file(session, path, normalise=None, interactive=False):
INFO(msg)
INFO("-" * len(msg))
INFO("Get track info...")
- t = get_music_info(path)
+ t = get_tags(path)
title = t['title']
artist = t['artist']
if interactive:
INFO(f" Title: \"{title}\"")
INFO(f" Artist: \"{artist}\"")
# Check for duplicate
- tracks = Tracks.search_titles(session, title)
- if interactive and tracks:
- print("Found the following possible matches:")
- for track in tracks:
- print(f'"{track.title}" by {track.artist}')
- response = input("Continue [c] or abort [a]?")
- if not response:
- return
- if response[0].lower() not in ['c', 'y']:
- return
+ if interactive:
+ tracks = Tracks.search_titles(session, title)
+ if tracks:
+ print("Found the following possible matches:")
+ for track in tracks:
+ print(f'"{track.title}" by {track.artist}')
+ response = input("Continue [c] or abort [a]?")
+ if not response:
+ return
+ if response[0].lower() not in ['c', 'y']:
+ return
track = Tracks.get_or_create(session, path)
track.title = title
track.artist = artist