From ac73249396678b394dafa0f37ef94bf6069e6000 Mon Sep 17 00:00:00 2001 From: localhost_frssoft Date: Sat, 8 Jul 2023 12:14:16 +0300 Subject: [PATCH] Added scrobbler to fediverse (mastodon API compatible) --- src/mpv_control.py | 36 ++++++++++++++++++++++++++++++++---- src/settings.py | 13 ++++++++++++- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/mpv_control.py b/src/mpv_control.py index d23572a..4148d55 100644 --- a/src/mpv_control.py +++ b/src/mpv_control.py @@ -8,6 +8,7 @@ from shlex import quote import mpv import time import re +import requests fzf = FzfPrompt() @@ -23,6 +24,8 @@ player.volume = get_config('mpv_volume') player.prefetch_playlist = get_config('prefetch_playlist') show_like_button = get_config('show_like_button') track_activity_history = get_config('track_activity_history') +scrobbler_to_fediverse_token = get_config('scrobbler_to_fediverse_token') +scrobbler_to_fediverse_instance = get_config('scrobbler_to_fediverse_instance') shuffle = False @@ -44,22 +47,47 @@ def track_url_to_uuid(listen_url=None): return uuid[0] -if track_activity_history: +if track_activity_history or scrobbler_to_fediverse_token != '': @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: + if value >= 30.0 and value <= 30.1: + track = player_fw_storage.storage.get(track_url_to_uuid()) + time.sleep(0.100) + if value > 30.1: + time.sleep(1) + return if value and src.fw_api.current_instance.token != None 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) + if track_activity_history: + src.fw_api.record_track_in_history(track_id) else: logger.error("Can't write track to history: No track id") - time.sleep(1) + if value and scrobbler_to_fediverse_token != '' and player.pause is False: + if value >= 30.0 and value <= 30.1: + fid = track.get('fid') + artist = track['artist'].get('name') + album = track['album'].get('title') + title = track.get('title') + tags = track.get('tags') + if tags: + tags = [f'#{tag}' for tag in tags] + tags = ' '.join(tags) + if tags == []: + tags = '' + status_obj = {'spoiler_text': 'funkwhale-cli music scrobbler', + 'visibility': 'unlisted', + 'status': f'🎧 {artist} - {album} - {title}\n{fid}\n#NowPlaying {tags}'} + requests.post(f'https://{scrobbler_to_fediverse_instance}/api/v1/statuses', + json=status_obj, + headers={'Authorization': f'Bearer {scrobbler_to_fediverse_token}'}) def osd_observer(value): diff --git a/src/settings.py b/src/settings.py index 8150cbb..a0432c5 100644 --- a/src/settings.py +++ b/src/settings.py @@ -1,4 +1,5 @@ import json +import os from os.path import exists from loguru import logger from pyfzf.pyfzf import FzfPrompt @@ -37,6 +38,8 @@ default_conf = { 'automatic_fetch_new_instances': False, 'enable_server_transcoding': False, 'external_transcoder_http_proxy_path': "", + 'scrobbler_to_fediverse_token': "", + 'scrobbler_to_fediverse_instance': "", 'track_activity_history': False, 'prefetch_playlist': True, 'enable_persistent_cache': False, @@ -50,7 +53,15 @@ def set_defaults(corrected_config=None): conf_rewrite = default_conf if corrected_config: conf_rewrite = corrected_config - with open(conf_file, 'wt') as f: + descriptor = os.open( + path=conf_file, + flags=( + os.O_WRONLY # access mode: write only + | os.O_CREAT # create if not exists + | os.O_TRUNC # truncate the file to zero + ), + mode=0o600) + with open(descriptor, 'wt') as f: f.write(json.dumps(conf_rewrite, indent=4))