diff --git a/app/helpers.py b/app/helpers.py index c7869aa..7f71ff3 100644 --- a/app/helpers.py +++ b/app/helpers.py @@ -1,3 +1,6 @@ +import os +import psutil + from datetime import datetime from PyQt5.QtWidgets import QMessageBox @@ -37,6 +40,48 @@ def get_relative_date(past_date, reference_date=None): return f"{weeks} {weeks_str}, {days} {days_str} ago" +def open_in_audacity(path): + """ + Open passed file in Audacity + + Return True if apparently opened successfully, else False + """ + + # Return if audacity not running + if "audacity" not in [i.name() for i in psutil.process_iter()]: + return False + + to_pipe = '/tmp/audacity_script_pipe.to.' + str(os.getuid()) + from_pipe = '/tmp/audacity_script_pipe.from.' + str(os.getuid()) + EOL = '\n' + + def send_command(command): + """Send a single command.""" + to_audacity.write(command + EOL) + to_audacity.flush() + + def get_response(): + """Return the command response.""" + result = '' + line = '' + while True: + result += line + line = from_audacity.readline() + if line == '\n' and len(result) > 0: + break + return result + + def do_command(command): + """Send one command, and return the response.""" + send_command(command) + response = get_response() + return response + + with open(to_pipe, 'w') as to_audacity, open( + from_pipe, 'rt') as from_audacity: + do_command(f'Import2: Filename="{path}"') + + def show_warning(title, msg): "Display a warning to user" diff --git a/app/musicmuster.py b/app/musicmuster.py index bb3eeb1..d74ca48 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -2,6 +2,7 @@ import webbrowser import os +import psutil import sys import urllib.parse @@ -80,6 +81,7 @@ class Window(QMainWindow, Ui_MainWindow): self.load_last_playlists() self.enable_play_next_controls() + self.check_audacity() self.timer.start(Config.TIMER_MS) def add_file(self): @@ -112,6 +114,14 @@ class Window(QMainWindow, Ui_MainWindow): height = record.f_int or 981 self.setGeometry(x, y, width, height) + def check_audacity(self): + "Warn user if Audacity not running" + + if "audacity" in [i.name() for i in psutil.process_iter()]: + return + + helpers.show_warning("Audacity check", "Audacity is not running") + def clear_selection(self): if self.visible_playlist_tab(): self.visible_playlist_tab().clearSelection() diff --git a/app/playlists.py b/app/playlists.py index c7c13c2..36cbc83 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -17,7 +17,7 @@ import os from config import Config from datetime import datetime, timedelta -from helpers import get_relative_date, show_warning +from helpers import get_relative_date, open_in_audacity, show_warning from log import DEBUG, ERROR from model import ( Notes, Playdates, Playlists, PlaylistTracks, Session, Settings, Tracks @@ -181,6 +181,9 @@ class PlaylistTab(QTableWidget): lambda: self._copy_path(row)) act_rescan = self.menu.addAction("Rescan track") act_rescan.triggered.connect(lambda: self._rescan(row)) + act_audacity = self.menu.addAction( + "Open track in Audacity") + act_audacity.triggered.connect(lambda: self._audacity(row)) self.menu.addSeparator() act_delete = self.menu.addAction('Delete') act_delete.triggered.connect(self._delete_rows) @@ -551,6 +554,20 @@ class PlaylistTab(QTableWidget): # ########## Internally called functions ########## + def _audacity(self, row): + "Open track in Audacity. Audacity must be already running" + + DEBUG(f"_audacity({row})") + + if row in self._meta_get_notes(): + return None + + track_id = self._get_row_id(row) + if track_id: + with Session() as session: + track = Tracks.get_track(session, track_id) + open_in_audacity(track.path) + def _calculate_next_start_time(self, session, row, start): "Return this row's end time given its start time" diff --git a/audacity_control.py b/audacity_control.py old mode 100644 new mode 100755 diff --git a/requirements.txt b/requirements.txt index 5f7ebf7..4fefcd9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,6 +17,7 @@ parso==0.8.2 pexpect==4.8.0 pickleshare==0.7.5 prompt-toolkit==3.0.18 +psutil==5.8.0 ptyprocess==0.7.0 pycodestyle==2.7.0 pydub==0.25.1 @@ -25,6 +26,8 @@ Pygments==2.8.1 PyQt5==5.15.4 PyQt5-Qt5==5.15.2 PyQt5-sip==12.8.1 +PyQtWebEngine==5.15.4 +PyQtWebEngine-Qt5==5.15.2 python-dateutil==2.8.1 python-editor==1.0.4 python-slugify==5.0.0