funkwlmpv/src/mpv_control.py

117 lines
4.3 KiB
Python
Raw Normal View History

2022-11-08 19:23:19 +00:00
import src.fw_api
2022-11-08 18:02:07 +00:00
from src.utils import download_track
from src.settings import get_config
2022-11-01 10:15:28 +00:00
from loguru import logger
2022-11-08 18:02:07 +00:00
from pyfzf.pyfzf import FzfPrompt
import mpv
import time
2022-11-08 18:02:07 +00:00
fzf = FzfPrompt()
player = mpv.MPV()
player.ytdl = False # Prevent attempts load track with yt-dlp
player.prefetch_playlist = get_config('prefetch_playlist') # Fast loading next track, but high network traffic
2022-11-13 02:16:46 +00:00
show_like_button = get_config('show_like_button')
track_activity_history = get_config('track_activity_history')
2022-11-08 18:02:07 +00:00
class player_fw_storage:
storage = {}
@logger.catch
2022-11-18 10:22:55 +00:00
def track_url_to_uuid(listen_url=None):
'''Attempt get uuid from track listen url or current playing url'''
2022-11-18 10:22:55 +00:00
if listen_url:
uuid = listen_url.split(r'/')[-2]
else:
uuid = player.stream_open_filename.split(r'/')[-2]
2022-11-18 10:22:55 +00:00
return uuid
if track_activity_history:
@player.property_observer('time-pos')
@logger.catch
def time_observer(_name, value):
# Here, _value is either None if nothing is playing or a float containing
# fractional seconds since the beginning of the file.
if value and player.http_header_fields != [] and player.pause is False:
if value >= 30.0 and value <= 30.1:
# detect 30 secs for reporting listen activity
track = player_fw_storage.storage.get(track_url_to_uuid())
track_id = track.get('id')
if track_id:
src.fw_api.record_track_in_history(track_id)
else:
logger.error("Can't write track to history: No track id")
time.sleep(1)
def set_http_header(headers=[]):
player.http_header_fields = headers
@logger.catch
def player_menu(header='', storage={}):
player_fw_storage.storage.update(storage)
2022-11-14 23:02:22 +00:00
player.volume = get_config("mpv_volume")
2022-11-08 18:02:07 +00:00
while True:
try:
2022-11-13 02:16:46 +00:00
player_items_menu = ['Next', 'Prev', 'Pause',
'Download', 'Info']
if player.pause:
player_items_menu[2] = 'Play'
else:
player_items_menu[2] = 'Pause'
2022-11-13 02:16:46 +00:00
if show_like_button:
player_items_menu.append('Like')
player_items_menu.extend(['Hide artist', 'Exit'])
select = fzf.prompt(player_items_menu, f"--header=\'{header}\'")[0]
2022-11-08 18:02:07 +00:00
if select == 'Next':
player.playlist_next()
elif select == 'Prev':
player.playlist_prev()
elif select in ('Pause', 'Play'):
2022-11-08 18:02:07 +00:00
if player.pause:
player.pause = False
else:
player.pause = True
elif select == 'Download':
name_downloaded = download_track(player.stream_open_filename)
2022-11-08 18:02:07 +00:00
elif select == 'Info':
track = player_fw_storage.storage.get(track_url_to_uuid())
2022-11-18 10:22:55 +00:00
for i in track.keys():
2022-11-08 18:02:07 +00:00
if i in ('album', 'artist'):
name_aa = track.get(i).get('name')
if not name_aa:
name_aa = track.get(i).get('title')
print(i + ': '+ name_aa)
key = track.get(i)
if key and isinstance(key, str):
print(i + ': ' + key)
input()
2022-11-13 02:16:46 +00:00
elif select == 'Like':
src.fw_api.favorite_track(player_fw_storage.storage.get(track_url_to_uuid())['id'])
2022-11-08 19:23:19 +00:00
elif select == 'Hide artist':
track = player_fw_storage.storage.get(track_url_to_uuid())
2022-11-08 19:23:19 +00:00
src.fw_api.hide_content({'target': {'id': track.get('artist').get('id'), 'type': 'artist'}})
2022-11-08 18:02:07 +00:00
elif select == 'Exit':
player.playlist_clear()
player.stop()
player_fw_storage.storage = {}
2022-11-08 18:02:07 +00:00
break
except KeyboardInterrupt:
break
2022-12-17 01:16:36 +00:00
def play_track(track, multi=False):
listen_url = src.fw_api.get_audio_file(track['listen_url'], True)
player_fw_storage.storage[track_url_to_uuid(listen_url)] = track
if multi:
player.loadfile(listen_url, 'append-play')
else:
player.loadfile(listen_url, 'append-play')
track_name = track.get('title')
player_menu(f"{track_name} playing...", player_fw_storage.storage)