diff --git a/app/playlists.py b/app/playlists.py index 46e6da0..670dfad 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -19,6 +19,8 @@ from PyQt5.QtWidgets import ( import helpers import os import re +import subprocess +import threading from config import Config from datetime import datetime, timedelta @@ -223,7 +225,12 @@ class PlaylistTab(QTableWidget): act_info = self.menu.addAction('Info') act_info.triggered.connect(lambda: self._info_row(row)) self.menu.addSeparator() - if row not in self._get_notes_rows(): + if row not in self.get_notes_rows(): + act_mplayer = self.menu.addAction( + "Play track with mplayer") + act_mplayer.triggered.connect( + lambda: self._mplayer(row)) + self.menu.addSeparator() if not current and not next_row: act_setnext = self.menu.addAction("Set next") with Session() as session: @@ -1420,6 +1427,21 @@ class PlaylistTab(QTableWidget): self.item(row, self.COL_USERDATA).setData( self.ROW_METADATA, new_metadata) + def _mplayer(self, row: int) -> None: + """Play track with mplayer""" + + DEBUG(f"_mplayer({row})") + + if row in self.get_notes_rows(): + return None + + with Session() as session: + track: Tracks = self._get_row_track_object(row, session) + cmd_list = ['gmplayer', '-vc', 'null', '-vo', 'null', track.path] + thread = threading.Thread( + target=self._run_subprocess, args=(cmd_list,)) + thread.start() + def _rescan(self, row: int) -> None: """ If passed row is track row, rescan it. @@ -1435,6 +1457,11 @@ class PlaylistTab(QTableWidget): track.rescan(session) self._update_row(session, row, track) + def _run_subprocess(self, args): + """Run args in subprocess""" + + subprocess.call(args) + def _set_current_track_row(self, row: int) -> None: """Mark this row as current track"""