From 3229729f1378c2f8152d8928a84010d8efb07463 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Fri, 24 May 2019 18:17:02 +0200 Subject: [PATCH] some optimizations --- music_assistant/main.py | 15 +- music_assistant/models.py | 2 +- music_assistant/modules/http_streamer.py | 218 ++++++++++++++++ .../modules/musicproviders/qobuz.py | 6 +- .../modules/musicproviders/spotify.py | 8 +- music_assistant/modules/player.py | 239 ++---------------- .../modules/playerproviders/chromecast.py | 4 +- .../modules/playerproviders/pylms.py | 36 ++- music_assistant/modules/web.py | 2 +- music_assistant/web/config_old.vue.js | 202 +++++++++++++++ .../web/images/icons/chromecast.png | Bin 0 -> 1634 bytes .../web/images/icons/homeassistant.png | Bin 0 -> 6530 bytes .../web/images/icons/http_streamer.png | Bin 0 -> 9769 bytes music_assistant/web/images/icons/lms.png | Bin 0 -> 63912 bytes music_assistant/web/images/icons/pylms.png | Bin 0 -> 20186 bytes music_assistant/web/images/icons/web.png | Bin 0 -> 16413 bytes music_assistant/web/pages/config.vue.js | 216 ++++++---------- music_assistant/web/strings.js | 157 +++++++----- 18 files changed, 662 insertions(+), 443 deletions(-) create mode 100755 music_assistant/modules/http_streamer.py create mode 100755 music_assistant/web/config_old.vue.js create mode 100644 music_assistant/web/images/icons/chromecast.png create mode 100644 music_assistant/web/images/icons/homeassistant.png create mode 100644 music_assistant/web/images/icons/http_streamer.png create mode 100644 music_assistant/web/images/icons/lms.png create mode 100644 music_assistant/web/images/icons/pylms.png create mode 100644 music_assistant/web/images/icons/web.png diff --git a/music_assistant/main.py b/music_assistant/main.py index fc09a511..9f3692d3 100755 --- a/music_assistant/main.py +++ b/music_assistant/main.py @@ -20,6 +20,7 @@ from modules.metadata import MetaData from modules.cache import Cache from modules.music import Music from modules.player import Player +from modules.http_streamer import HTTPStreamer from modules.homeassistant import setup as hass_setup from modules.web import setup as web_setup @@ -47,6 +48,7 @@ class Main(): self.hass = hass_setup(self) self.music = Music(self) self.player = Player(self) + self.http_streamer = HTTPStreamer(self) # start the event loop try: @@ -71,18 +73,25 @@ class Main(): self.event_listeners[cb_id] = cb async def remove_event_listener(self, cb_id): - ''' add callback to our event listeners ''' + ''' remove callback from our event listeners ''' self.event_listeners.pop(cb_id, None) def save_config(self): ''' save config to file ''' # backup existing file conf_file = os.path.join(self.datapath, 'config.json') - conf_file_backup = os.path.join(self.datapath, 'config.json') + conf_file_backup = os.path.join(self.datapath, 'config.json.backup') if os.path.isfile(conf_file): shutil.move(conf_file, conf_file_backup) + # remove description keys from config + final_conf = {} + for key, value in self.config.items(): + final_conf[key] = {} + for subkey, subvalue in value.items(): + if subkey != "__desc__": + final_conf[key][subkey] = subvalue with open(conf_file, 'w') as f: - f.write(json.dumps(self.config, indent=4)) + f.write(json.dumps(final_conf, indent=4)) def parse_config(self): '''get config from config file''' diff --git a/music_assistant/models.py b/music_assistant/models.py index e88b5132..5c30f536 100755 --- a/music_assistant/models.py +++ b/music_assistant/models.py @@ -468,7 +468,7 @@ class MusicPlayer(): self.name = '' self.state = PlayerState.Stopped self.powered = False - self.cur_item = Track() + self.cur_item = None self.cur_item_time = 0 self.volume_level = 0 self.shuffle_enabled = True diff --git a/music_assistant/modules/http_streamer.py b/music_assistant/modules/http_streamer.py new file mode 100755 index 00000000..751d4aed --- /dev/null +++ b/music_assistant/modules/http_streamer.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +# -*- coding:utf-8 -*- + +import asyncio +import os +from utils import LOGGER, try_parse_int, get_ip, run_async_background_task +from models import TrackQuality +import shutil +import xml.etree.ElementTree as ET +import random + + +AUDIO_TEMP_DIR = "/tmp/audio_tmp" +AUDIO_CACHE_DIR = "/tmp/audio_cache" + +class HTTPStreamer(): + ''' Built-in streamer using sox and webserver ''' + + def __init__(self, mass): + self.mass = mass + self.create_config_entries() + self.local_ip = get_ip() + # create needed temp/cache dirs + if self.mass.config['base']['http_streamer']['enable_cache'] and not os.path.isdir(AUDIO_CACHE_DIR): + os.makedirs(AUDIO_CACHE_DIR) + if not os.path.isdir(AUDIO_TEMP_DIR): + os.makedirs(AUDIO_TEMP_DIR) + + def create_config_entries(self): + ''' sets the config entries for this module (list with key/value pairs)''' + config_entries = [ + ('volume_normalisation', True, 'enable_r128_volume_normalisation'), + ('target_volume', '-23', 'target_volume_lufs'), + ('fallback_gain_correct', '-12', 'fallback_gain_correct'), + ('enable_cache', True, 'enable_audio_cache'), + ('trim_silence', True, 'trim_silence') + ] + if not self.mass.config['base'].get('http_streamer'): + self.mass.config['base']['http_streamer'] = {} + self.mass.config['base']['http_streamer']['__desc__'] = config_entries + for key, def_value, desc in config_entries: + if not key in self.mass.config['base']['http_streamer']: + self.mass.config['base']['http_streamer'][key] = def_value + + async def get_audio_stream(self, track_id, provider, player_id=None): + ''' get audio stream for a track ''' + queue = asyncio.Queue() + run_async_background_task( + self.mass.bg_executor, self.__get_audio_stream, queue, track_id, provider, player_id) + while True: + chunk = await queue.get() + if not chunk: + queue.task_done() + break + yield chunk + queue.task_done() + await queue.join() + # TODO: handle disconnects ? + LOGGER.info("Finished streaming %s" % track_id) + + async def __get_audio_stream(self, audioqueue, track_id, provider, player_id=None): + ''' get audio stream from provider and apply additional effects/processing where/if needed''' + input_content_type = await self.mass.music.providers[provider].get_stream_content_type(track_id) + cachefile = self.__get_track_cache_filename(track_id, provider) + sox_effects = '' + # sox settings + if self.mass.config['base']['http_streamer']['volume_normalisation']: + gain_correct = await self.__get_track_gain_correct(track_id, provider) + LOGGER.info("apply gain correction of %s" % gain_correct) + sox_effects += ' vol %s dB ' % gain_correct + sox_effects += await self.__get_player_sox_options(track_id, provider, player_id) + if os.path.isfile(cachefile): + # we have a cache file for this track which we can use + args = 'sox -t flac %s -t flac -C 0 - %s' % (cachefile, sox_effects) + LOGGER.info("Running sox with args: %s" % args) + process = await asyncio.create_subprocess_shell(args, + stdout=asyncio.subprocess.PIPE) + buffer_task = None + else: + # stream from provider + args = 'sox -t %s - -t flac -C 0 - %s' % (input_content_type, sox_effects) + LOGGER.info("Running sox with args: %s" % args) + process = await asyncio.create_subprocess_shell(args, + stdout=asyncio.subprocess.PIPE, stdin=asyncio.subprocess.PIPE) + buffer_task = asyncio.get_event_loop().create_task( + self.__fill_audio_buffer(process.stdin, track_id, provider, input_content_type)) + # put chunks from stdout into queue + while not process.stdout.at_eof(): + chunk = await process.stdout.read(10240000) + if not chunk: + break + await audioqueue.put(chunk) + # TODO: cooldown if the queue can't catch up to prevent memory being filled up with entire track + await process.wait() + await audioqueue.put('') # indicate EOF + LOGGER.info("streaming of track_id %s completed" % track_id) + + async def __get_player_sox_options(self, track_id, provider, player_id): + ''' get player specific sox options ''' + sox_effects = ' ' + if not player_id: + return '' + if self.mass.config['player_settings'][player_id]['max_sample_rate']: + # downsample if needed + max_sample_rate = try_parse_int(self.mass.config['player_settings'][player_id]['max_sample_rate']) + if max_sample_rate: + quality = TrackQuality.LOSSY_MP3 + track_future = asyncio.run_coroutine_threadsafe( + self.mass.music.track(track_id, provider), + self.mass.event_loop + ) + track = track_future.result() + for item in track.provider_ids: + if item['provider'] == provider and item['item_id'] == track_id: + quality = item['quality'] + break + if quality > TrackQuality.FLAC_LOSSLESS_HI_RES_3 and max_sample_rate == 192000: + sox_effects += 'rate -v 192000' + elif quality > TrackQuality.FLAC_LOSSLESS_HI_RES_2 and max_sample_rate == 96000: + sox_effects += 'rate -v 96000' + elif quality > TrackQuality.FLAC_LOSSLESS_HI_RES_1 and max_sample_rate == 48000: + sox_effects += 'rate -v 48000' + if self.mass.config['player_settings'][player_id]['sox_effects']: + sox_effects += self.mass.config['player_settings'][player_id]['sox_effects'] + return sox_effects + ' ' + + async def __analyze_audio(self, tmpfile, track_id, provider, content_type): + ''' analyze track audio, for now we only calculate EBU R128 loudness ''' + LOGGER.info('Start analyzing file %s' % tmpfile) + cachefile = self.__get_track_cache_filename(track_id, provider) + # not needed to do processing if there already is a cachedfile + bs1770_binary = self.__get_bs1770_binary() + if bs1770_binary: + # calculate integrated r128 loudness with bs1770 + analyse_dir = os.path.join(self.mass.datapath, 'analyse_info') + analysis_file = os.path.join(analyse_dir, "%s_%s.xml" %(provider, track_id.split(os.sep)[-1])) + if not os.path.isfile(analysis_file): + if not os.path.isdir(analyse_dir): + os.makedirs(analyse_dir) + cmd = '%s %s --xml --ebu -f %s' % (bs1770_binary, tmpfile, analysis_file) + process = await asyncio.create_subprocess_shell(cmd) + await process.wait() + if self.mass.config['base']['http_streamer']['enable_cache'] and not os.path.isfile(cachefile): + # use sox to store cache file (optionally strip silence from start and end) + if self.mass.config['base']['http_streamer']['trim_silence']: + cmd = 'sox -t %s %s -t flac -C5 %s silence 1 0.1 1%% reverse silence 1 0.1 1%% reverse' %(content_type, tmpfile, cachefile) + else: + # cachefile is always stored as flac + cmd = 'sox -t %s %s -t flac -C5 %s' %(content_type, tmpfile, cachefile) + process = await asyncio.create_subprocess_shell(cmd) + await process.wait() + # always clean up temp file + while os.path.isfile(tmpfile): + os.remove(tmpfile) + await asyncio.sleep(0.5) + LOGGER.info('Fininished analyzing file %s' % tmpfile) + + async def __get_track_gain_correct(self, track_id, provider): + ''' get the gain correction that should be applied to a track ''' + target_gain = int(self.mass.config['base']['http_streamer']['target_volume']) + fallback_gain = int(self.mass.config['base']['http_streamer']['fallback_gain_correct']) + analysis_file = os.path.join(self.mass.datapath, 'analyse_info', "%s_%s.xml" %(provider, track_id.split(os.sep)[-1])) + if not os.path.isfile(analysis_file): + return fallback_gain + try: # read audio analysis if available + tree = ET.parse(analysis_file) + trackinfo = tree.getroot().find("album").find("track") + track_lufs = trackinfo.find('integrated').get('lufs') + gain_correct = target_gain - float(track_lufs) + except Exception as exc: + LOGGER.error('could not retrieve track gain - %s' % exc) + gain_correct = fallback_gain # fallback value + if os.path.isfile(analysis_file): + os.remove(analysis_file) + # reschedule analyze task to try again + cachefile = self.__get_track_cache_filename(track_id, provider) + self.mass.event_loop.create_task(self.__analyze_audio(cachefile, track_id, provider, 'flac')) + return round(gain_correct,2) + + async def __fill_audio_buffer(self, buf, track_id, provider, content_type): + ''' get audio data from provider and write to buffer''' + # fill the buffer with audio data + # a tempfile is created so we can do audio analysis + tmpfile = os.path.join(AUDIO_TEMP_DIR, '%s%s%s.tmp' % (random.randint(0, 999), track_id, random.randint(0, 999))) + fd = open(tmpfile, 'wb') + async for chunk in self.mass.music.providers[provider].get_audio_stream(track_id): + buf.write(chunk) + await buf.drain() + fd.write(chunk) + await buf.drain() + buf.write_eof() + fd.close() + # successfull completion, send tmpfile to be processed in the background in main loop + self.mass.event_loop.create_task(self.__analyze_audio(tmpfile, track_id, provider, content_type)) + LOGGER.info("fill_audio_buffer complete for track %s" % track_id) + return + + @staticmethod + def __get_track_cache_filename(track_id, provider): + ''' get filename for a track to use as cache file ''' + return os.path.join(AUDIO_CACHE_DIR, '%s_%s' %(provider, track_id.split(os.sep)[-1])) + + @staticmethod + def __get_bs1770_binary(): + ''' get the path to the bs1770 binary for the current OS ''' + import platform + bs1770_binary = None + if platform.system() == "Windows": + bs1770_binary = os.path.join(os.path.dirname(__file__), "bs1770gain", "win64", "bs1770gain") + elif platform.system() == "Darwin": + # macos binary is x86_64 intel + bs1770_binary = os.path.join(os.path.dirname(__file__), "bs1770gain", "osx", "bs1770gain") + elif platform.system() == "Linux": + architecture = platform.machine() + if architecture.startswith('AMD64') or architecture.startswith('x86_64'): + bs1770_binary = os.path.join(os.path.dirname(__file__), "bs1770gain", "linux64", "bs1770gain") + # TODO: build armhf binary + return bs1770_binary \ No newline at end of file diff --git a/music_assistant/modules/musicproviders/qobuz.py b/music_assistant/modules/musicproviders/qobuz.py index 25f93659..7ba28a95 100644 --- a/music_assistant/modules/musicproviders/qobuz.py +++ b/music_assistant/modules/musicproviders/qobuz.py @@ -268,11 +268,10 @@ class QobuzProvider(MusicProvider): async with aiohttp.ClientSession(loop=asyncio.get_event_loop(), connector=aiohttp.TCPConnector(verify_ssl=False)) as session: async with session.get(streamdetails['url']) as resp: while True: - chunk = await resp.content.read(10240000) + chunk = await resp.content.read(512000) if not chunk: break yield chunk - await asyncio.sleep(0.1) LOGGER.info("end of stream for track_id %s" % track_id) async def __parse_artist(self, artist_obj): @@ -507,11 +506,10 @@ class QobuzProvider(MusicProvider): async with self.throttler: async with self.http_session.get(url, headers=headers, params=params) as response: result = await response.json() - if 'error' in result: + if not result or 'error' in result: LOGGER.error(url) LOGGER.error(params) LOGGER.error(result) result = None - result = await response.json() return result diff --git a/music_assistant/modules/musicproviders/spotify.py b/music_assistant/modules/musicproviders/spotify.py index 3640e544..0fc19698 100644 --- a/music_assistant/modules/musicproviders/spotify.py +++ b/music_assistant/modules/musicproviders/spotify.py @@ -253,11 +253,11 @@ class SpotifyProvider(MusicProvider): args = ['-n', 'temp', '-u', self._username, '-p', self._password, '--pass-through', '--single-track', track_id] process = await asyncio.create_subprocess_exec(spotty, *args, stdout=asyncio.subprocess.PIPE) while not process.stdout.at_eof(): - chunk = await process.stdout.read(10240000) + chunk = await process.stdout.read(128000) if not chunk: break yield chunk - await asyncio.sleep(0.1) + await process.wait() LOGGER.info("end of stream for track_id %s" % track_id) async def __parse_artist(self, artist_obj): @@ -477,10 +477,10 @@ class SpotifyProvider(MusicProvider): async with self.throttler: async with self.http_session.get(url, headers=headers, params=params) as response: result = await response.json() - if 'error' in result: + if not result or 'error' in result: LOGGER.error(url) LOGGER.error(params) - return None + result = None return result async def __delete_data(self, endpoint, params={}): diff --git a/music_assistant/modules/player.py b/music_assistant/modules/player.py index a8163685..d5496ba0 100755 --- a/music_assistant/modules/player.py +++ b/music_assistant/modules/player.py @@ -4,28 +4,16 @@ import asyncio import os from utils import run_periodic, LOGGER, try_parse_int, try_parse_float, get_ip, run_async_background_task -import aiohttp -from difflib import SequenceMatcher as Matcher from models import MediaType, PlayerState, MusicPlayer, TrackQuality -from typing import List -import toolz import operator -import socket import random from copy import deepcopy import functools -import time -import shutil -import xml.etree.ElementTree as ET -import concurrent -import aiohttp -import random import urllib BASE_DIR = os.path.dirname(os.path.abspath(__file__)) MODULES_PATH = os.path.join(BASE_DIR, "playerproviders" ) -AUDIO_TEMP_DIR = "/tmp/audio_tmp" -AUDIO_CACHE_DIR = "/tmp/audio_cache" + class Player(): ''' several helpers to handle playback through player providers ''' @@ -34,46 +22,9 @@ class Player(): self.mass = mass self.providers = {} self._players = {} - self.create_config_entries() self.local_ip = get_ip() - # create needed temp/cache dirs - if self.mass.config['base']['http_streamer']['enable_cache'] and not os.path.isdir(AUDIO_CACHE_DIR): - os.makedirs(AUDIO_CACHE_DIR) - if not os.path.isdir(AUDIO_TEMP_DIR): - os.makedirs(AUDIO_TEMP_DIR) # dynamically load provider modules self.load_providers() - - def create_config_entries(self): - ''' sets the config entries for this module (list with key/value pairs)''' - # player specific settings - self.mass.config['player_settings']['__desc__'] = [ - ("enabled", False, "player_enabled"), - ("name", "", "player_name"), - ("group_parent", "", "player_group_with"), - ("mute_as_power", False, "player_mute_power"), - ("disable_volume", False, "player_disable_vol"), - ("apply_group_volume", False, "player_group_vol"), - ("apply_group_power", False, "player_group_pow"), - ("play_power_on", False, "player_power_play"), - ("sox_effects", '', "http_streamer_sox_effects"), - ("max_sample_rate", '96000', "max_sample_rate"), - ("force_http_streamer", False, "force_http_streamer") - ] - # config for the http streamer - config_entries = [ - ('volume_normalisation', True, 'enable_r128_volume_normalisation'), - ('target_volume', '-23', 'target_volume_lufs'), - ('fallback_gain_correct', '-12', 'fallback_gain_correct'), - ('enable_cache', True, 'enable_audio_cache'), - ('trim_silence', True, 'trim_silence') - ] - if not self.mass.config['base'].get('http_streamer'): - self.mass.config['base']['http_streamer'] = {} - self.mass.config['base']['http_streamer']['__desc__'] = config_entries - for key, def_value, desc in config_entries: - if not key in self.mass.config['base']['http_streamer']: - self.mass.config['base']['http_streamer'][key] = def_value async def players(self): ''' return all players ''' @@ -114,7 +65,7 @@ class Player(): return await self.__player_command_group_volume(player, player_childs, cmd_args) if player.is_group and cmd == 'power' and cmd_args == 'off': for item in player_childs: - asyncio.create_task(self.player_command(item.player_id, cmd, cmd_args)) + await self.player_command(item.player_id, cmd, cmd_args) # normal execution of command on player prov_id = self._players[player_id].player_provider prov = self.providers[prov_id] @@ -287,8 +238,21 @@ class Player(): async def __get_player_settings(self, player_id): ''' get (or create) player config ''' + config_entries = [ # default config entries for a player + ("enabled", False, "player_enabled"), + ("name", "", "player_name"), + ("group_parent", "", "player_group_with"), + ("mute_as_power", False, "player_mute_power"), + ("disable_volume", False, "player_disable_vol"), + ("apply_group_volume", False, "player_group_vol"), + ("apply_group_power", False, "player_group_pow"), + ("play_power_on", False, "player_power_play"), + ("sox_effects", '', "http_streamer_sox_effects"), + ("max_sample_rate", '96000', "max_sample_rate"), + ("force_http_streamer", False, "force_http_streamer") + ] player_settings = self.mass.config['player_settings'].get(player_id,{}) - for key, def_value, desc in self.mass.config['player_settings']['__desc__']: + for key, def_value, desc in config_entries: if not key in player_settings: if (isinstance(def_value, str) and def_value.startswith('<')): player_settings[key] = None @@ -371,177 +335,6 @@ class Player(): player_prov = self.providers[player.player_provider] return await player_prov.player_queue(player_id, offset=offset, limit=limit) - async def get_audio_stream(self, track_id, provider, player_id=None): - ''' get audio stream for a track ''' - queue = asyncio.Queue() - run_async_background_task( - self.mass.bg_executor, self.__get_audio_stream, queue, track_id, provider, player_id) - while True: - chunk = await queue.get() - if not chunk: - break - yield chunk - queue.task_done() - - async def __get_audio_stream(self, audioqueue, track_id, provider, player_id=None): - ''' get audio stream from provider and apply additional effects/processing where/if needed''' - input_content_type = await self.mass.music.providers[provider].get_stream_content_type(track_id) - cachefile = self.__get_track_cache_filename(track_id, provider) - sox_effects = '' - # sox settings - if self.mass.config['base']['http_streamer']['volume_normalisation']: - gain_correct = await self.__get_track_gain_correct(track_id, provider) - LOGGER.info("apply gain correction of %s" % gain_correct) - sox_effects += ' vol %s dB ' % gain_correct - sox_effects += await self.__get_player_sox_options(track_id, provider, player_id) - if os.path.isfile(cachefile): - # we have a cache file for this track which we can use - args = 'sox -t flac %s -t flac -C 0 - %s' % (cachefile, sox_effects) - LOGGER.info("Running sox with args: %s" % args) - process = await asyncio.create_subprocess_shell(args, - stdout=asyncio.subprocess.PIPE) - buffer_task = None - else: - # stream from provider - args = 'sox -t %s - -t flac -C 0 - %s' % (input_content_type, sox_effects) - LOGGER.info("Running sox with args: %s" % args) - process = await asyncio.create_subprocess_shell(args, - stdout=asyncio.subprocess.PIPE, stdin=asyncio.subprocess.PIPE) - buffer_task = asyncio.get_event_loop().create_task( - self.__fill_audio_buffer(process.stdin, track_id, provider, input_content_type)) - # put chunks from stdout into queue - while not process.stdout.at_eof(): - chunk = await process.stdout.read(10240000) - await audioqueue.put(chunk) - if not chunk: - break - await asyncio.sleep(0.1) - await process.wait() - await audioqueue.put('') # indicate EOF - LOGGER.info("streaming of track_id %s completed" % track_id) - - async def __get_player_sox_options(self, track_id, provider, player_id): - ''' get player specific sox options ''' - sox_effects = ' ' - if not player_id: - return '' - if self.mass.config['player_settings'][player_id]['max_sample_rate']: - # downsample if needed - max_sample_rate = try_parse_int(self.mass.config['player_settings'][player_id]['max_sample_rate']) - if max_sample_rate: - quality = TrackQuality.LOSSY_MP3 - track_future = asyncio.run_coroutine_threadsafe( - self.mass.music.track(track_id, provider), - self.mass.event_loop - ) - track = track_future.result() - for item in track.provider_ids: - if item['provider'] == provider and item['item_id'] == track_id: - quality = item['quality'] - break - if quality > TrackQuality.FLAC_LOSSLESS_HI_RES_3 and max_sample_rate == 192000: - sox_effects += 'rate -v 192000' - elif quality > TrackQuality.FLAC_LOSSLESS_HI_RES_2 and max_sample_rate == 96000: - sox_effects += 'rate -v 96000' - elif quality > TrackQuality.FLAC_LOSSLESS_HI_RES_1 and max_sample_rate == 48000: - sox_effects += 'rate -v 48000' - if self.mass.config['player_settings'][player_id]['sox_effects']: - sox_effects += self.mass.config['player_settings'][player_id]['sox_effects'] - return sox_effects + ' ' - - async def __analyze_audio(self, tmpfile, track_id, provider, content_type): - ''' analyze track audio, for now we only calculate EBU R128 loudness ''' - LOGGER.info('Start analyzing file %s' % tmpfile) - cachefile = self.__get_track_cache_filename(track_id, provider) - # not needed to do processing if there already is a cachedfile - bs1770_binary = self.__get_bs1770_binary() - if bs1770_binary: - # calculate integrated r128 loudness with bs1770 - analyse_dir = os.path.join(self.mass.datapath, 'analyse_info') - analysis_file = os.path.join(analyse_dir, "%s_%s.xml" %(provider, track_id.split(os.sep)[-1])) - if not os.path.isfile(analysis_file): - if not os.path.isdir(analyse_dir): - os.makedirs(analyse_dir) - cmd = '%s %s --xml --ebu -f %s' % (bs1770_binary, tmpfile, analysis_file) - process = await asyncio.create_subprocess_shell(cmd) - await process.wait() - if self.mass.config['base']['http_streamer']['enable_cache'] and not os.path.isfile(cachefile): - # use sox to store cache file (optionally strip silence from start and end) - if self.mass.config['base']['http_streamer']['trim_silence']: - cmd = 'sox -t %s %s -t flac -C5 %s silence 1 0.1 1%% reverse silence 1 0.1 1%% reverse' %(content_type, tmpfile, cachefile) - else: - # cachefile is always stored as flac - cmd = 'sox -t %s %s -t flac -C5 %s' %(content_type, tmpfile, cachefile) - process = await asyncio.create_subprocess_shell(cmd) - await process.wait() - # always clean up temp file - while os.path.isfile(tmpfile): - os.remove(tmpfile) - await asyncio.sleep(0.5) - LOGGER.info('Fininished analyzing file %s' % tmpfile) - - async def __get_track_gain_correct(self, track_id, provider): - ''' get the gain correction that should be applied to a track ''' - target_gain = int(self.mass.config['base']['http_streamer']['target_volume']) - fallback_gain = int(self.mass.config['base']['http_streamer']['fallback_gain_correct']) - analysis_file = os.path.join(self.mass.datapath, 'analyse_info', "%s_%s.xml" %(provider, track_id.split(os.sep)[-1])) - if not os.path.isfile(analysis_file): - return fallback_gain - try: # read audio analysis if available - tree = ET.parse(analysis_file) - trackinfo = tree.getroot().find("album").find("track") - track_lufs = trackinfo.find('integrated').get('lufs') - gain_correct = target_gain - float(track_lufs) - except Exception as exc: - LOGGER.error('could not retrieve track gain - %s' % exc) - gain_correct = fallback_gain # fallback value - if os.path.isfile(analysis_file): - os.remove(analysis_file) - # reschedule analyze task to try again - cachefile = self.__get_track_cache_filename(track_id, provider) - self.mass.event_loop.create_task(self.__analyze_audio(cachefile, track_id, provider, 'flac')) - return round(gain_correct,2) - - async def __fill_audio_buffer(self, buf, track_id, provider, content_type): - ''' get audio data from provider and write to buffer''' - # fill the buffer with audio data - # a tempfile is created so we can do audio analysis - tmpfile = os.path.join(AUDIO_TEMP_DIR, '%s%s%s.tmp' % (random.randint(0, 999), track_id, random.randint(0, 999))) - fd = open(tmpfile, 'wb') - async for chunk in self.mass.music.providers[provider].get_audio_stream(track_id): - buf.write(chunk) - await buf.drain() - fd.write(chunk) - await buf.drain() - buf.write_eof() - fd.close() - # successfull completion, send tmpfile to be processed in the background in main loop - self.mass.event_loop.create_task(self.__analyze_audio(tmpfile, track_id, provider, content_type)) - LOGGER.info("fill_audio_buffer complete for track %s" % track_id) - return - - @staticmethod - def __get_track_cache_filename(track_id, provider): - ''' get filename for a track to use as cache file ''' - return os.path.join(AUDIO_CACHE_DIR, '%s_%s' %(provider, track_id.split(os.sep)[-1])) - - @staticmethod - def __get_bs1770_binary(): - ''' get the path to the bs1770 binary for the current OS ''' - import platform - bs1770_binary = None - if platform.system() == "Windows": - bs1770_binary = os.path.join(os.path.dirname(__file__), "bs1770gain", "win64", "bs1770gain") - elif platform.system() == "Darwin": - # macos binary is x86_64 intel - bs1770_binary = os.path.join(os.path.dirname(__file__), "bs1770gain", "osx", "bs1770gain") - elif platform.system() == "Linux": - architecture = platform.machine() - if architecture.startswith('AMD64') or architecture.startswith('x86_64'): - bs1770_binary = os.path.join(os.path.dirname(__file__), "bs1770gain", "linux64", "bs1770gain") - # TODO: build armhf binary - return bs1770_binary - def load_providers(self): ''' dynamically load providers ''' for item in os.listdir(MODULES_PATH): diff --git a/music_assistant/modules/playerproviders/chromecast.py b/music_assistant/modules/playerproviders/chromecast.py index 5592e9d3..69008c84 100644 --- a/music_assistant/modules/playerproviders/chromecast.py +++ b/music_assistant/modules/playerproviders/chromecast.py @@ -61,7 +61,9 @@ class ChromecastProvider(PlayerProvider): async def player_command(self, player_id, cmd:str, cmd_args=None): ''' issue command on player (play, pause, next, previous, stop, power, volume, mute) ''' if cmd == 'play': - if self._chromecasts[player_id].media_controller.status.player_is_paused: + if self._chromecasts[player_id].media_controller.status.player_is_playing: + pass + elif self._chromecasts[player_id].media_controller.status.player_is_paused: self._chromecasts[player_id].media_controller.play() else: await self.__resume_queue(player_id) diff --git a/music_assistant/modules/playerproviders/pylms.py b/music_assistant/modules/playerproviders/pylms.py index 8583b107..fb29c7b2 100644 --- a/music_assistant/modules/playerproviders/pylms.py +++ b/music_assistant/modules/playerproviders/pylms.py @@ -96,11 +96,11 @@ class PyLMSServer(PlayerProvider): if queue_opt == 'replace' or not self._player_queue[player_id]: # overwrite queue with new items self._player_queue[player_id] = media_items - await self.__queue_play(player_id, 0) + await self.__queue_play(player_id, 0, send_flush=True) elif queue_opt == 'play': # replace current item with new item(s) self._player_queue[player_id] = self._player_queue[player_id][:cur_queue_index] + media_items + self._player_queue[player_id][cur_queue_index+1:] - await self.__queue_play(player_id, cur_queue_index) + await self.__queue_play(player_id, cur_queue_index, send_flush=True) elif queue_opt == 'next': # insert new items at current index +1 self._player_queue[player_id] = self._player_queue[player_id][:cur_queue_index+1] + media_items + self._player_queue[player_id][cur_queue_index+1:] @@ -110,13 +110,14 @@ class PyLMSServer(PlayerProvider): ### Provider specific (helper) methods ##### - async def __queue_play(self, player_id, index): + async def __queue_play(self, player_id, index, send_flush=False): ''' send play command to player ''' - if not index: + if index == None: index = self._player_queue_index[player_id] if len(self._player_queue[player_id]) >= index-1: track = self._player_queue[player_id][index] - self._lmsplayers[player_id].stop() + if send_flush: + self._lmsplayers[player_id].flush() self._lmsplayers[player_id].play(track.uri) self._player_queue_index[player_id] = index @@ -201,9 +202,18 @@ class PyLMSServer(PlayerProvider): self._lmsplayers[lms_player.player_id] = lms_player asyncio.create_task(self.__handle_player_event(lms_player.player_id, event, event_data)) + @run_periodic(5) + async def send_heartbeat(): + try: + timestamp = int(time.time()) + data = lms_player.pack_stream(b"t", replayGain=timestamp, flags=0) + lms_player.send_frame(b"strm", data) + except RuntimeError: + reader.close() + lms_player.send_frame = send_frame lms_player.send_event = handle_event - heartbeat_task = asyncio.create_task(self.send_heartbeat(lms_player)) + heartbeat_task = asyncio.create_task(send_heartbeat()) # keep reading bytes from the socket while True: @@ -216,12 +226,7 @@ class PyLMSServer(PlayerProvider): heartbeat_task.cancel() asyncio.create_task(self.__handle_player_event(lms_player.player_id, 'disconnected')) - @run_periodic(5) - async def send_heartbeat(self, lms_player): - timestamp = int(time.time()) - data = lms_player.pack_stream(b"t", replayGain=timestamp, flags=0) - lms_player.send_frame(b"strm", data) - + ### Provider specific implementation ##### class PyLMSPlayer(object): @@ -288,6 +293,10 @@ class PyLMSPlayer(object): data = self.pack_stream(b"q", autostart=b"0", flags=0) self.send_frame(b"strm", data) + def flush(self): + data = self.pack_stream(b"f", autostart=b"1", flags=0) + self.send_frame(b"strm", data) + def pause(self): data = self.pack_stream(b"p", autostart=b"0", flags=0) self.send_frame(b"strm", data) @@ -337,7 +346,8 @@ class PyLMSPlayer(object): self._volume.volume = new_vol self.send_volume() - def play(self, uri, crossfade=False): + def play(self, uri, crossfade=True): + # TODO: attach crossfade to a config setting command = b's' autostart = b'3' # we use direct stream for now so let the player do the messy work with buffers transType= b'1' if crossfade else b'0' diff --git a/music_assistant/modules/web.py b/music_assistant/modules/web.py index d7a31d9d..62099c5d 100755 --- a/music_assistant/modules/web.py +++ b/music_assistant/modules/web.py @@ -277,6 +277,6 @@ class Web(): headers={'Content-Type': 'audio/flac'}) await resp.prepare(request) if request.method.upper() != 'HEAD': - async for chunk in self.mass.player.get_audio_stream(track_id, provider, player_id): + async for chunk in self.mass.http_streamer.get_audio_stream(track_id, provider, player_id): await resp.write(chunk) return resp \ No newline at end of file diff --git a/music_assistant/web/config_old.vue.js b/music_assistant/web/config_old.vue.js new file mode 100755 index 00000000..77299c23 --- /dev/null +++ b/music_assistant/web/config_old.vue.js @@ -0,0 +1,202 @@ +var Config = Vue.component('Config', { + template: ` +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Save + +
+ `, + props: [], + data() { + return { + conf: {}, + players: {} + } + }, + computed: { + playersLst() + { + var playersLst = []; + for (player_id in this.conf.player_settings) + if (player_id != '__desc__') + playersLst.push({id: player_id, name: this.conf.player_settings[player_id].name}) + return playersLst; + } + + }, + created() { + this.$globals.windowtitle = this.$t('settings'); + this.getPlayers(); + this.getConfig(); + console.log(this.$globals.all_players); + }, + methods: { + getConfig () { + axios + .get('/api/config') + .then(result => { + this.conf = result.data; + }) + .catch(error => { + console.log("error", error); + }); + }, + saveConfig () { + axios + .post('/api/config', this.conf) + .then(result => { + console.log(result); + }) + .catch(error => { + console.log("error", error); + }); + }, + getPlayers () { + const api_url = '/api/players'; + axios + .get(api_url) + .then(result => { + for (var item of result.data) + this.$set(this.players, item.player_id, item) + }) + .catch(error => { + console.log("error", error); + this.showProgress = false; + }); + }, + } +}) diff --git a/music_assistant/web/images/icons/chromecast.png b/music_assistant/web/images/icons/chromecast.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d2a46f1a3d2ccc837fed2d9932b46ef425a427 GIT binary patch literal 1634 zcmV-o2A%ndP)!NH7-jQ98VT3T9teSNaBvhD5dgwR&;I_85OiWBAB_-6< z)EyliZfhRm| zj}jXmfuqzW_=6mA2z*T~i}1>zu(+2sdO{T816ZS{u=f&p2F}(a1GB;=m!)=017>U z!U#a2Cr}sxDD(shBLIb-Kw$)+(34ha^uhoAH83ljz5K9aeup;zv%)(73LhURe0-qr z@qxm}2MQk_DDpS=$ zmx-9;pNEjL9OqFJ#mEZ(RXJ(*@t$M?g=djs6aMgyn=}efgQ+?XKAekW3XiC&kKkNW zD$Ft&L1S8lM~x--Iil1GPe;soeNK9X$53F(8Pi3G+UW5>r^ad(eB}ROR+w+MU9o8< z^2kNEx(Pn?f5gh3*7&Vav{n^L(&%IP1D5fkM2 z^SpKY9@!okhD%e$m=&4ph`Xp6zVeZ(PIKs71}P@t{Y|<`)S__NqY5rDWvy-9I+kki zFMXt~Cay~RF^a$v6W2=@Q^#WryHJx?g!9UJj8#yNnq1-2M`J$5u-|88R`|7AzO8=? zRSNS9ZlVo11^(>mxaz8=+rM8qi8FEk0i3LKKR*6<(?XJIXRSU8iM$DKIPSnx?5UHK0>eRw}q5cd7t2)Ck$r;&s=z zm9t1HD$|*K(i>Jo5s6<%>MAO^Q zrZ&FOX^L7~Zyt6t#-;tiO3xG{Nj1^TlgxEWwteZDC#I>Fnw2NxIqk?Y^?b#js3L5{ zpR%KuYa-vTKAfuN-5aUkVQ^NN@>{0N3g`2o8YvC2jV4?Na?P(M#hpE6bvs=;&jizM ze1d)wdV{X4@jAi4p8*S@CgU&r(i@G=Xph)ES*DlX2>eQeu{E z+Qh122s<`eROBI2f6@dq#CUZYX_*u8r-qD<7^2S8@0!RIO%T60(xVVcj9xzaSTA2y%c6*BaowZ8X6=lZU17}OAntD*I%+Z8hO5w@P8 z@%CCzBIpu25LXjMAxAH0OQA8yXwcD-(y$^?>+R2w;c%zp%?!CtCQCPV-I>zJ^j3u| zJ=txA)YwTjUz4Cm_p^#bwKpo{>8tNJsX)^C58c(!n1?iAB2MTwg-pMV;7~}z3O#VE z$Xe73!?aX&lR~cFw{X}Y-Pm=7^sP2gNZjlV3T4Li8zo~qz>?&KO8fO0YHd^PPZgQp zUq)@bzcaJ9Lt(mI=uONE>M`{{qQSu5MBb5pD+mAp0000000000000000000000000 g00000008jgAAv{{H?*zxDh3`}ggwg? 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 literal 0 HcmV?d00001 diff --git a/music_assistant/web/images/icons/http_streamer.png b/music_assistant/web/images/icons/http_streamer.png new file mode 100644 index 0000000000000000000000000000000000000000..c35c983962cedde5b9fbbf2b3ae3293fbdb016df GIT binary patch literal 9769 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≦DV;xbKffr(C6Y@zh0(9^SYs991RVj8006` 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 - + + {{ $t('conf.'+conf_key) }} + - - - - - + + + + +
+ + + + + + +
+ +
+
+ + + + +
+ + + + + + + + + + +
+
+ + + +
+ +
+
+
+ +
- - - - - - - - - - - - - - - - - - Save -
`, props: [], data() { return { conf: {}, - players: {} + players: {}, + active: 0 } }, computed: { playersLst() { var playersLst = []; - for (player_id in this.conf.player_settings) - if (player_id != '__desc__') - playersLst.push({id: player_id, name: this.conf.player_settings[player_id].name}) + playersLst.push({id: null, name: this.$t('conf.'+'not_grouped')}) + for (player_id in this.players) + playersLst.push({id: player_id, name: this.conf.player_settings[player_id].name}) return playersLst; } }, + watch: { + conf: { + handler: _.debounce(function (val) { + console.log("save config needed!"); + this.saveConfig(); + }, 1000) + } + }, created() { this.$globals.windowtitle = this.$t('settings'); this.getPlayers(); diff --git a/music_assistant/web/strings.js b/music_assistant/web/strings.js index 0c2c759d..a9623c7c 100644 --- a/music_assistant/web/strings.js +++ b/music_assistant/web/strings.js @@ -12,38 +12,60 @@ const messages = { search: "Search", settings: "Settings", queue: "Queue", - generic_settings: "Generic settings", - music_providers: "Music providers", - player_providers: "Player providers", - player_settings: "Player settings", type_to_search: "Type here to search...", - enabled: "Enabled", add_library: "Add to library", remove_library: "Remove from library", // settings strings - username: "Username", - password: "Password", - hostname: "Hostname (or IP)", - port: "Port", - hass_url: "URL to homeassistant (e.g. https://homeassistant:8123)", - hass_token: "Long Lived Access Token", - hass_publish: "Publish players to Home Assistant", - hass_player_power: "Attach player power to homeassistant entity", - hass_player_source: "Source on the homeassistant entity (optional)", - hass_player_volume: "Attach player volume to homeassistant entity", - web_ssl_cert: "Path to ssl certificate file", - web_ssl_key: "Path to ssl keyfile", - web_ssl_host: "Hostname (FQDN used in the certificate)", - player_enabled: "Enable player", - player_name: "Custom name for this player", - player_group_with: "Group this player to another (parent)player", - player_mute_power: "Use muting as power control", - player_disable_vol: "Disable volume controls", - player_group_vol: "Apply group volume to childs (for group players only)", - player_group_pow: "Apply group power based on childs (for group players only)", - player_power_play: "Issue play command on power on", - file_prov_music_path: "Path to music files", - file_prov_playlists_path: "Path to playlists (.m3u)", + conf: { + enabled: "Enabled", + base: "Generic settings", + musicproviders: "Music providers", + playerproviders: "Player providers", + player_settings: "Player settings", + homeassistant: "Home Assistant integration", + web: "Webserver", + http_streamer: "Built-in (sox based) streamer", + qobuz: "Qobuz", + spotify: "Spotify", + file: "Filesystem", + chromecast: "Chromecast", + lms: "Logitech Media Server", + pylms: "Emulated (built-in) Squeezebox support", + username: "Username", + password: "Password", + hostname: "Hostname (or IP)", + port: "Port", + hass_url: "URL to homeassistant (e.g. https://homeassistant:8123)", + hass_token: "Long Lived Access Token", + hass_publish: "Publish players to Home Assistant", + hass_player_power: "Attach player power to homeassistant entity", + hass_player_source: "Source on the homeassistant entity (optional)", + hass_player_volume: "Attach player volume to homeassistant entity", + web_ssl_cert: "Path to ssl certificate file", + web_ssl_key: "Path to ssl keyfile", + player_enabled: "Enable player", + player_name: "Custom name for this player", + player_group_with: "Group this player to another (parent)player", + player_mute_power: "Use muting as power control", + player_disable_vol: "Disable volume controls", + player_group_vol: "Apply group volume to childs (for group players only)", + player_group_pow: "Apply group power based on childs (for group players only)", + player_power_play: "Issue play command on power on", + file_prov_music_path: "Path to music files", + file_prov_playlists_path: "Path to playlists (.m3u)", + web_http_port: "HTTP port", + web_https_port: "HTTPS port", + cert_fqdn_host: "FQDN of hostname in certificate", + enable_r128_volume_normalisation: "Enable R128 volume normalization", + target_volume_lufs: "Target volume (R128 default is -23 LUFS)", + fallback_gain_correct: "Fallback gain correction if R128 readings not (yet) available", + enable_audio_cache: "Allow caching of audio to temp files", + trim_silence: "Strip silence from beginning and end of audio (temp files only!)", + http_streamer_sox_effects: "Custom sox effects to apply to audio (built-in streamer only!) See http://sox.sourceforge.net/sox.html#EFFECTS", + max_sample_rate: "Maximum sample rate this player supports, higher will be downsampled", + force_http_streamer: "Force use of built-in streamer, even if the player can handle the music provider directly", + not_grouped: "Not grouped" + }, // player strings players: "Players", play: "Play", @@ -58,7 +80,6 @@ const messages = { paused: "paused", off: "off" } - }, nl: { @@ -72,38 +93,60 @@ const messages = { search: "Zoeken", settings: "Instellingen", queue: "Wachtrij", - generic_settings: "Algemene instellingen", - music_providers: "Muziek providers", - player_providers: "Speler providers", - player_settings: "Speler instellingen", - enabled: "Ingeschakeld", type_to_search: "Type hier om te zoeken...", add_library: "Voeg toe aan bibliotheek", remove_library: "Verwijder uit bibliotheek", // settings strings - username: "Gebruikersnaam", - password: "Wachtwoord", - hostname: "Hostnaam (of IP)", - port: "Poort", - hass_url: "URL naar homeassistant (b.v. https://homeassistant:8123)", - hass_token: "Token met lange levensduur", - hass_publish: "Publiceer spelers naar Home Assistant", - hass_player_power: "Verbind speler aan/uit met homeassistant entity", - hass_player_source: "Benodigde bron op de verbonden homeassistant entity (optioneel)", - hass_player_volume: "Verbind volume van speler aan een homeassistant entity", - web_ssl_cert: "Pad naar ssl certificaat bestand", - web_ssl_key: "Pad naar ssl certificaat key bestand", - web_ssl_host: "Hostname (FQDN van certificaat)", - player_enabled: "Speler inschakelen", - player_name: "Aangepaste naam voor deze speler", - player_group_with: "Groupeer deze speler met een andere (hoofd)speler", - player_mute_power: "Gebruik mute als aan/uit", - player_disable_vol: "Schakel volume bediening helemaal uit", - player_group_vol: "Pas groep volume toe op onderliggende spelers (alleen groep spelers)", - player_group_pow: "Pas groep aan/uit toe op onderliggende spelers (alleen groep spelers)", - player_power_play: "Automatisch afspelen bij inschakelen", - file_prov_music_path: "Pad naar muziek bestanden", - file_prov_playlists_path: "Pad naar playlist bestanden (.m3u)", + conf: { + enabled: "Ingeschakeld", + base: "Algemene instellingen", + musicproviders: "Muziek providers", + playerproviders: "Speler providers", + player_settings: "Speler instellingen", + homeassistant: "Home Assistant integratie", + web: "Webserver", + http_streamer: "Ingebouwde (sox gebaseerde) streamer", + qobuz: "Qobuz", + spotify: "Spotify", + file: "Bestandssysteem", + chromecast: "Chromecast", + lms: "Logitech Media Server", + pylms: "Geemuleerde (ingebouwde) Squeezebox ondersteuning", + username: "Gebruikersnaam", + password: "Wachtwoord", + hostname: "Hostnaam (of IP)", + port: "Poort", + hass_url: "URL naar homeassistant (b.v. https://homeassistant:8123)", + hass_token: "Token met lange levensduur", + hass_publish: "Publiceer spelers naar Home Assistant", + hass_player_power: "Verbind speler aan/uit met homeassistant entity", + hass_player_source: "Benodigde bron op de verbonden homeassistant entity (optioneel)", + hass_player_volume: "Verbind volume van speler aan een homeassistant entity", + web_ssl_cert: "Pad naar ssl certificaat bestand", + web_ssl_key: "Pad naar ssl certificaat key bestand", + player_enabled: "Speler inschakelen", + player_name: "Aangepaste naam voor deze speler", + player_group_with: "Groupeer deze speler met een andere (hoofd)speler", + player_mute_power: "Gebruik mute als aan/uit", + player_disable_vol: "Schakel volume bediening helemaal uit", + player_group_vol: "Pas groep volume toe op onderliggende spelers (alleen groep spelers)", + player_group_pow: "Pas groep aan/uit toe op onderliggende spelers (alleen groep spelers)", + player_power_play: "Automatisch afspelen bij inschakelen", + file_prov_music_path: "Pad naar muziek bestanden", + file_prov_playlists_path: "Pad naar playlist bestanden (.m3u)", + web_http_port: "HTTP poort", + web_https_port: "HTTPS poort", + cert_fqdn_host: "Hostname (FQDN van certificaat)", + enable_r128_volume_normalisation: "Schakel R128 volume normalisatie in", + target_volume_lufs: "Doelvolume (R128 standaard is -23 LUFS)", + fallback_gain_correct: "Fallback gain correctie indien R128 meting (nog) niet beschikbaar is", + enable_audio_cache: "Sta het cachen van audio toe naar temp map", + trim_silence: "Strip stilte van begin en eind van audio (in temp bestanden)", + http_streamer_sox_effects: "Eigen sox effects toepassen op audio (alleen voor ingebouwde streamer). Zie http://sox.sourceforge.net/sox.html#EFFECTS", + max_sample_rate: "Maximale sample rate welke deze speler ondersteund, hoger wordt gedownsampled.", + force_http_streamer: "Forceer het gebruik van de ingebouwde streamer, ook al heeft de speler directe ondersteuning voor de muziek provider", + not_grouped: "Niet gegroepeerd" + }, // player strings players: "Spelers", play: "Afspelen", -- 2.34.1