Klangbecken: The RaBe Endless Music Player

Overview

Klangbecken

Python package Liquidsoap script Codestyle Black

Klangbecken is the minimalistic endless music player for Radio Bern RaBe based on liquidsoap.

It supports configurable and editable playlists, jingle insertion, metadata publishing and more.

It is designed for stand-alone operation, robustness and easy maintainability. All files are stored in a single data directory.

This repository contains three components of the RaBe Klangbecken:

Two additional components are in their own repository:

  • The listener for the current "on air" status, the virtual Sämubox.
  • The web-based UI for playlist editing.

How they interact can be seen in the system overview diagram:

System overview diagram

System requirements

  • Unix-like operating system environment
  • Python (>= v3.7)
    • docopt library for parsing command line arguments
    • Werkzeug library (>= v2.0) for WSGI support
    • PyJWT library (>= v2.0) for creating and verifing JWT authentication tokens
    • mutagen library for audio tag editing
  • ffmpeg binary (>= v2.8) for audio analysis
  • Liquidsoap audio player (v1.3 without inotify support)

Local Setup

Clone the repository

git clone https://github.com/radiorabe/klangbecken.git
cd klangbecken

We strongly recommend to create a virtual environment (see additional tools). E.g.

python -m venv .venv
source .venv/bin/activate

Install dependencies

Install Python dependencies

pip install -r requirements.txt

Install ffmpeg with your system's package manager. E.g.

yum install ffmpeg

Install Liquidsoap (on CentOS 7 you can also use our prebuilt package)

yum install opam
opam init
# we need liquidsoap 1.3.7 which does not run after OCaml 4.07.0
opam switch create klangbecken 4.07.0
opam depext alsa mad lame vorbis taglib liquidsoap.1.3.7
opam install alsa mad lame vorbis taglib liquidsoap.1.3.7
eval $(opam env)

Install the client UI:

cd ..
git clone https://github.com/radiorabe/klangbecken-ui
cd klangbecken-ui
npm install

Run the programs

Initialize the data directory:

python -m klangbecken init

Run the development backend server (API and data directory):

python -m klangbecken serve

Run the client development server (user interface):

cd ../klangbecken-ui
npm run serve

Browse to http://localhost:8080 and start uploading audio files.

Run the liquidsoap audio player:

eval $(opam env)
liquidsoap klangbecken.liq

Manually set the onair status of the player using netcat:

echo "klangbecken.on_air True" | nc -U -w 1 klangbecken.sock

Development

For contributing to this project, fork this repository, and clone your local working copy from your personal fork. Push commits to your repository to create a pull request with your changes.

Python Package

The Python code is tested with a test suite and follows the flake8 coding guidelines.

Before submitting your code you might want to make sure that ...

  1. ... you have installed the test dependencies

    pip install -r requirements-test.txt
  2. ... the test suite runs without failure

    python -m unittest discover
  3. ... all your code is covered by (hopefully) meaningful unit tests

    coverage run -m unittest discover
    coverage report
  4. ... your code follows the coding style guidelines

    flake8

Recommended Tools (optional)

We recommend the use of tox, black and isort for development.

pip install tox black isort
tox

Instead of running all the above commands manually, tox lets you run them all at once for all installed Python versions. Make sure to have at least the Python version installed, that is used in production (currently Python 3.9). tox is also what we use in continuos integration, so using it locally helps you to make your code pass it. To call it simply type:

tox
black

Manually fixing coding style mistakes is a pain. black formats your code automatically.

black .
isort

Finally, isort helps to consistently organize package imports.

isort .

All development tools are preconfigured in setup.cfg. For additional tools and tips & tricks and see additional tools.

Liquidsoap Script

Liquidsoap lets you syntax check and type check your script:

liquidsoap --check klangbecken.liq

Simulation

Apart from type checking, the inherent nature of the liquidsoap language generating a live audio stream makes it difficult to test the code with unit tests. Observing the behavior of the player script and the effects of changes in real-time take lot of time, usually weeks or even months. Accellerated simulation runs help to observe the long-time player behavior in a reasonable amount of time.

Deployment

Your code has passed continuous integration, and your pull request has been accepted. Now you want to deploy your (or somebody else's) code to production. First, some preparation is necessary, but then the deployment script deploy.sh automates most of the work deploying the code.

Preparation before deploying for the first time:

  • Make sure that you have access to the production server (e.g. SSH publik key authentication).
  • Configure a remote prod pointing at the repository on the production system.
    git add remote prod root@YOUR_PRODUCTION_VM_NAME:klangbecken.git
  • Optional: Install the Apache development libraries locally. E.g.
    yum install httpd-devel
  • Configure a remote repository upstream pointing at this upstream repository:
    git remote add upstream [email protected]:radiorabe/klangbecken-ui.git
  • Configure git to automatically fetch tags from upstream:
    git config remote.upstream.tagOpt --tags

Preparation before deploying:

  • When deploying both, the front-end and the back-end app, deploy the front-end first.
  • Check again that the code you want to deploy passed continuous integration.
  • Make sure that your working directory is clean, and that you are on the master branch:
    git stash
    git checkout master
  • Bring your code in sync with the latest version from upstream:
    git fetch upstream
    git rebase upstream/master
  • Verify that you are indeed in sync with upstream:
    git show --no-patch

Run the script:

./deploy.sh [--no-mod-wsgi]

It perfoms the following steps:

  • Increment and commit a new version number.
  • Download all run-time dependencies.
  • Optionally download mod_wsgi (Requires httpd-devel libraries to be installed locally. Use --no-mod-wsgi to not reinstall mod_wsgi).
  • Copy the dependencies to production.
  • Push your code to production.
  • Install all dependencies in production.
  • Install the Python package (API and CLI) in production.
  • Reload the web server to load the new API code.
  • Copy the liquidsoap script to it's destination.
  • If everything was successful, tag the current commit with the new version number, and push it to the upstream repository.

Finalize deployment:

  • If the liquidsoap script (klangbecken.liq) changed, restart the liquidsoap player during a "off air" moment:
    systemctl restart liquidsoap@klangbecken

For detailed information on how to setup a productive server see Deployment.

License

Klangbecken is released under the terms of the GNU Affero General Public License. Copyright 2017-2021 Radio RaBe. See LICENSE for further information.

Comments
  • Logging

    Logging "last_play" to mp3 does not work

    The python script gets a permission denied on the server:

    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: Traceback (most recent call last):
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: File "/usr/local/venvs/klangbecken-py36/lib64/python3.6/site-packages/mutagen/_util.py", line 235, in _openfile
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: fileobj = open(filename, "rb+" if writable else "rb")
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: PermissionError: [Errno 13] Permission denied: '/var/lib/klangbecken/music/a5f533a7-cc7d-42bf-a903-f8ebb5a7c7bf.mp3'
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: During handling of the above exception, another exception occurred:
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: Traceback (most recent call last):
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: File "/usr/local/venvs/klangbecken-py36/bin/klangbecken", line 11, in <module>
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: load_entry_point('klangbecken==0.0.12', 'console_scripts', 'klangbecken')()
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: File "/usr/local/venvs/klangbecken-py36/lib64/python3.6/site-packages/klangbecken.py", line 1178, in main
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: playlog_cmd(data_dir, args["FILE"][0], dev_mode=dev_mode)
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: File "/usr/local/venvs/klangbecken-py36/lib64/python3.6/site-packages/klangbecken.py", line 1046, in playlog_cmd
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: mutagenfile.save()
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: File "/usr/local/venvs/klangbecken-py36/lib64/python3.6/site-packages/mutagen/_util.py", line 139, in wrapper
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: writable, create) as h:
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: File "/usr/lib64/python3.6/contextlib.py", line 81, in __enter__
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: return next(self.gen)
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: File "/usr/local/venvs/klangbecken-py36/lib64/python3.6/site-packages/mutagen/_util.py", line 256, in _openfile
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: raise MutagenError(e)
    Aug 27 11:33:01 vm-0016.audio.int.rabe.ch liquidsoap[25906]: mutagen.MutagenError: [Errno 13] Permission denied: '/var/lib/klangbecken/music/a5f533a7-cc7d-42bf-a903-f8ebb5a7c7bf.mp3'
    

    The permission is as follows:

    [root@vm-0016 music]# ls -l /var/lib/klangbecken/music/a5f533a7-cc7d-42bf-a903-f8ebb5a7c7bf.mp3
    -rw-r--r--. 1 apache apache 5903777 Mar  2 11:33 /var/lib/klangbecken/music/a5f533a7-cc7d-42bf-a903-f8ebb5a7c7bf.mp3
    

    What user is the script being run as?

    opened by spameier 7
  • Add function that checks if track was recently played

    Add function that checks if track was recently played

    This might fix the issue with some tracks being repeated to quickly (#21).

    @reviewers: what do you think?

    Of course this is not yet finished and needs improvement.

    opened by spameier 7
  • Umlaut Probleme im Klangbecken

    Umlaut Probleme im Klangbecken

    vgl. dieser twitter thread: https://twitter.com/frauxirah/status/1240937156438364160

    März 2020: Laut eurer Playlist hätte um 06.37 "A.A.L (Against All Logic) - Fantasy" laufen sollen; es war aber Björks Jóga Smiling face with sunglasses

    Das es ein Umlaut Problem ist, ist nur meine Vermutung. Der umlautige Björk Track ist nicht im Kangbecken log und nicht im Songticker, ACRCloud sieht den Track.

    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: Traceback (most recent call last):
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: File "/usr/local/venvs/klangbecken-py36/bin/klangbecken", line 11, in <module>
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: load_entry_point('klangbecken==0.0.12', 'console_scripts', 'klangbecken')()
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: File "/usr/local/venvs/klangbecken-py36/lib64/python3.6/site-packages/klangbecken.py", line 1170, in main
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: playlog_cmd(data_dir, args["FILE"][0], dev_mode=dev_mode)
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: File "/usr/local/venvs/klangbecken-py36/lib64/python3.6/site-packages/klangbecken.py", line 1062, in playlog_cmd
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: subprocess.check_call(EXTERNAL_PLAY_LOGGER.format(**entry), shell=True)
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: File "/usr/lib64/python3.6/subprocess.py", line 306, in check_call
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: retcode = call(*popenargs, **kwargs)
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: File "/usr/lib64/python3.6/subprocess.py", line 287, in call
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: with Popen(*popenargs, **kwargs) as p:
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: File "/usr/lib64/python3.6/subprocess.py", line 729, in __init__
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: restore_signals, start_new_session)
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: File "/usr/lib64/python3.6/subprocess.py", line 1295, in _execute_child
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: restore_signals, start_new_session, preexec_fn)
    Jun 05 11:32:32 vm-0016.audio.int.rabe.ch liquidsoap[13145]: UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 39: ordinal not in range(128)
    
    bug priority/1 
    opened by hairmare 7
  • `klangbecken` package and dynamic player support

    `klangbecken` package and dynamic player support

    Split up the code into logical components

    • api.py: All Rest-API related code
    • api_utils.py: API support code
    • playlist.py: playlist handling with analyzers and processors
    • player.py: LiquidsoapClient to query dynamic player information
    • cli.py: Code for all the command line commands
    • settings.py: Global settings (playlist names, supported metadata keys, ...)

    Also, lots of documentation updates plus 100% test coverage

    opened by smlz 6
  • WIP: Rework priority queue and liquidsoap player interaction

    WIP: Rework priority queue and liquidsoap player interaction

    Warning: This code is still in a very preliminary stage... :worried:

    This PR should clarify some parts of the system, and also introduce the feature of a arbitrarily long and editable 'play next' queue.

    As for now, some files on the file system hold long-lived information like the playlist and audio files. But some information is only short-lived. This includes the current.json for the currently played song, or the prio.m3u priority playlist.

    With this PR we clarify the situation. The file system only holds long-living information:

    • Audio files
    • Playlist files (*.m3u)
    • Logs (*.csv)
    • The index.json cache

    All the short-lived information about the current state of the player is retrieved directly from the liquidsoap process via it's telnet interface with the LiquidsoapClient. This includes:

    • Current song with it's remaining time
    • Next songs queued in the playlists
    • Additional meta information like uptime and version

    Additionally this PR replaces the prio.m3u with a new queue using liquidsoap's request.equeue, supporting queue editing (reordering and deleting).

    • [ ] Prioritize queue or jingles?
    • [ ] Unit testing
    • [x] Simplify JSON validation in KlangbeckenAPI
    • [ ] UI

    Fixes #29

    opened by smlz 6
  • WIP: Stop sniffing mimetype on playlists and don't use playlist.once anymore

    WIP: Stop sniffing mimetype on playlists and don't use playlist.once anymore

    This replaces the mime type sniffing that we are doing when loading a playlist with a hardcoded mime type. We can always assume that the generated m3u files have a text/plain mime type. With this assumption liquidsoap won't log Wrong mime type application/octet-stream for playlist! if the file is empty.

    We need to switch to not using playlist.once anymore since it is deprecated nowadays: https://github.com/savonet/liquidsoap/pull/1015. I think we don't need to use reload_mode="once" but can stick to reload_mode=watch since the prio file is handled in a way that watching it leads to the behaviour we want.

    • [x] deactivate mime type sniffing
    • [x] refactor so we don't use playlist.once anymore
    • [ ] test if this works with all the liquidsoap versions we are supporting (currently 1.3.2 with the possibilty to upgrade to 1.3.7 which has already been built, 1.4 support depends on us rolling out CentOS 8)
    opened by hairmare 6
  • change replaygain from gstreamer to bs1770gain

    change replaygain from gstreamer to bs1770gain

    This changes the replaygain analysis from using gstreamer to bs1770gain. I used the 'lu' field of bs1770gain's xml output. This fixes #4.

    The output looks like this:

    <bs1770gain>
      <album>
        <track total="1" number="1" file="01&#x5F;Birds&#x5F;n&#x5F;Bars&#x2E;mp3">
          <integrated lufs="-8.94" lu="-14.06" />
        </track>
        <summary total="1">
          <integrated lufs="-8.94" lu="-14.06" />
        </summary>
      </album>
    </bs1770gain>
    
    opened by spameier 6
  • ✨ (api) getnext track api

    ✨ (api) getnext track api

    This is a PoC for fixing the API parts needed for #52

    • [ ] do we want to rerun mutagen or is there a saner way to get the metadata
    • [x] ensure coverage doesn't tank by writing some tests
    • [x] rebase onto #54
    opened by hairmare 5
  • blacken code and clean up test-env install, introduce pre-commit

    blacken code and clean up test-env install, introduce pre-commit

    This PR reformats the code using black, configures isort & flake8 to match and adds pre-commit to the README as well as to the travis tests. I also took care of fixing or ignoring any issues found by flake8.

    My apologies for the huge changeset, all of this does not touch/refactor any of the business logic ~~or logic in setup.py~~ (it touches how requirements are read from txt files in setup.py)... The changes to .travis.yml are kept as minimal as possible.

    I plan on taking care of the werkzeug deprecation warnings in a future pull request and this prepares the repo to make it easy to do so. I'll also automate dependency bumping PRs once this is merged.

    opened by hairmare 5
  • depedabot is not updating werkzeug

    depedabot is not updating werkzeug

    There are the following entries in dependabot's logs

    updater | INFO <job_277638052> Checking if werkzeug 2.0.1 needs updating
      proxy | 2022/02/08 19:18:42 [066] GET https://pypi.org:443/simple/werkzeug/
      proxy | 2022/02/08 19:18:42 [066] 200 https://pypi.org:443/simple/werkzeug/
    updater | INFO <job_277638052> Latest version is 2.0.3
      proxy | 2022/02/08 19:18:42 [068] GET https://pypi.org:443/simple/werkzeug/
      proxy | 2022/02/08 19:18:42 [068] 200 https://pypi.org:443/simple/werkzeug/
    updater | INFO <job_277638052> Requirements to unlock update_not_possible
    updater | INFO <job_277638052> Requirements update strategy bump_versions
    updater | INFO <job_277638052> No update possible for werkzeug 2.0.1
    

    I'm failing to understand why it doesn feel like opening a pr for 2.03.

    One possible reason could be the versioning-strategy in the config, since it was introduced in 0866776473d4c3371e5ad52124fa501bc4e39446 dependabot didn't create a single PR.

    https://github.com/radiorabe/klangbecken/blob/450356fcedfd63ee5fd1f9a7845dd1f9ae3fb4af/.github/dependabot.yml#L11-L16

    cat-page seems to have picked up the werkzeug bump and it uses the default auto versioning-strategy via the following config:

      - package-ecosystem: pip
        directory: "/"
        schedule:
          interval: "daily"
    

    The docs have this to say on the version strategy thing:

    When Dependabot edits a manifest file to update a version, it uses the following overall strategies:

    • For apps, the version requirements are increased, for example: npm, pip and Composer.
    • For libraries, the range of versions is widened, for example: Bundler and Cargo.

    Use the versioning-strategy option to change this behavior for supported package managers.

    Option | Supported by | Action -- | -- | -- lockfile-only | bundler, cargo, composer, mix, npm, pip | Only create pull requests to update lockfiles. Ignore any new versions that would require package manifest changes. auto | bundler, cargo, composer, mix, npm, pip | Follow the default strategy described above.

    In a python setuptools context, i'm not sure what lockfile-only wants to achieve. With npm or composer there is clearly a *.lock file that lockfile-only can work on. I'm not sure what i'm missing but i don't think we have a lockfile.

    I'm gonna read some more docs, but i guess my proposal would be to switch to auto so we get updates like the werkzeug one that made me ralise that dependabot isn't pulling it's weight

    opened by hairmare 4
  • feat(playlist): check audio quality

    feat(playlist): check audio quality

    Verify the quality of the uploaded audio:

    • 44.1 or 48 kHz sample rate
    • stereo (except for jingles)
    • at least 120 kb/s bit rate

    The minimum bit rate is somewhat random. I thought slightly less than 128 kb/s to make all 128 kb/s files pass. But we might want to set it higher. Thoughts?

    opened by smlz 4
  • chore(deps): bump coverage from 7.0.3 to 7.0.4

    chore(deps): bump coverage from 7.0.3 to 7.0.4

    Bumps coverage from 7.0.3 to 7.0.4.

    Changelog

    Sourced from coverage's changelog.

    Version 7.0.4 — 2023-01-07

    • Performance: an internal cache of file names was accidentally disabled, resulting in sometimes drastic reductions in performance. This is now fixed, closing issue 1527_. Thanks to Ivan Ciuvalschii for the reproducible test case.

    .. _issue 1527: nedbat/coveragepy#1527

    .. _changes_7-0-3:

    Commits
    • f4c27c7 docs: sample html report for 7.0.4
    • 2b95dba docs: prep for 7.0.4
    • 61ccfb8 test(benchmark): more reasonable numeric displays
    • 2fa45d6 refactor(benchmark): move benchmark.py to its own directory
    • 4d6ac8b test(perf): randomize the order of benchmark runs
    • 405fae8 build: add .git-blame-ignore-revs
    • 9554e50 style(perf): blacken lab/benchmark.py
    • dc4f0c1 test(perf): more experiments for #1527
    • b3b05bd perf: the file mapping cache was off by mistake. #1527
    • d00f1dd mypy: debug.py
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 0
  • Do not skip the track when coming online after being offline for only a short time

    Do not skip the track when coming online after being offline for only a short time

    When the Klangbecken is switched to the online mode after being offline for only a few seconds, it's likely a false positive and we should not skip to the next track.

    enhancement 
    opened by spameier 0
  • Getting connection timeouts when connecting to liquidsoap process

    Getting connection timeouts when connecting to liquidsoap process

    Getting timeouts:

    Exception: <class 'ConnectionError'> Timeout while trying to read from player. Got no answer. <traceback object at 0x7f33a8841740>
    ERROR ConnectionError: Timeout while trying to read from player. Got no answer.
    Traceback (most recent call last):
      File "/usr/local/venvs/klangbecken-py39/lib/python3.9/site-packages/klangbecken/api_utils.py", line 201, in __call__
       response = endpoint(request, **values)
      File "/usr/local/venvs/klangbecken-py39/lib/python3.9/site-packages/klangbecken/api_utils.py", line 269, in wrapper
        return func(request, *args, **kwargs)
      File "/usr/local/venvs/klangbecken-py39/lib/python3.9/site-packages/klangbecken/api.py", line 178, in queue_push
        queue_id = client.push(path)
      File "/usr/local/venvs/klangbecken-py39/lib/python3.9/site-packages/klangbecken/player.py", line 186, in push
        rid = self.command(f"queue.push {path}").strip()
      File "/usr/local/venvs/klangbecken-py39/lib/python3.9/site-packages/klangbecken/player.py", line 79, in command
        raise ConnectionError(
    ConnectionError: Timeout while trying to read from player. Got no answer.
    

    Error source of radiorabe/klangbecken-ui#534.

    opened by smlz 0
  • chore(deps): bump flake8 from 5.0.4 to 6.0.0

    chore(deps): bump flake8 from 5.0.4 to 6.0.0

    Bumps flake8 from 5.0.4 to 6.0.0.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies python 
    opened by dependabot[bot] 2
Music player - endlessly plays your music

Music player First, if you wonder about what is supposed to be a music player or what makes a music player different from a simple media player, read

Albert Zeyer 482 Dec 19, 2022
Music player and music library manager for Linux, Windows, and macOS

Ex Falso / Quod Libet - A Music Library / Editor / Player Quod Libet is a music management program. It provides several different ways to view your au

Quod Libet 1.2k Jan 7, 2023
SU Music Player — The first open-source PyTgCalls based Pyrogram bot to play music in voice chats

SU Music Player — The first open-source PyTgCalls based Pyrogram bot to play music in voice chats Note Neither this, or PyTgCalls are fully

SU Projects 58 Jan 2, 2023
This is an OverPowered Vc Music Player! Will work for you and play music in Voice Chatz

VcPlayer This is an OverPowered Vc Music Player! Will work for you and play music in Voice Chatz Telegram Voice-Chat Bot [PyTGCalls] ⇝ Requirements ⇜

null 1 Dec 20, 2021
XA Music Player - Telegram Music Bot

XA Music Player Requirements ?? FFmpeg (Latest) NodeJS nodesource.com (NodeJS 17+) Python (3.10+) PyTgCalls (Lastest) MongoDB (3.12.1) 2nd Telegram Ac

RexAshh 3 Jun 30, 2022
❤️ Hi There Im Cozmo Music Bot A next gen powerful telegram group Music bot for get your Songs and music @Venuja_Sadew

?? Cozmo MUSIC ?? Cozmo Music is a Music powerfull bot for playing music on telegram voice chat groups. Requirements FFmpeg NodeJS nodesource.com Pyth

Venuja Sadew 3 Jan 8, 2022
Okaeri-Music is a telegram music bot project, allow you to play music on voice chat group telegram.

Okaeri-Music is a telegram bot project that's allow you to play music on telegram voice chat group

Wahyusaputra 1 Dec 22, 2021
Okaeri-Music is a telegram music bot project, allow you to play music on voice chat group telegram.

??️ PROJECT MUSIC,THIS IS MAINTAINED Okaeri-Music is a telegram bot project that's allow you to play music on telegram voice chat group Features ?? Th

Okaeri-Project 2 Dec 23, 2021
NovaMusic is a music sharing robot. Users can get music and music lyrics using inline queries.

A music sharing telegram robot using Redis database and Telebot python library using Redis database.

Hesam Norin 7 Oct 21, 2022
:notes: Cross-platform music player

Exaile Exaile is a music player with a simple interface and powerful music management capabilities. Features include automatic fetching of album art,

Exaile 327 Dec 19, 2022
A Music Player Bot for Discord Servers

A Music Player Bot for Discord Servers

Halil Acar 2 Oct 25, 2021
Stevan KZ 1 Oct 27, 2021
An 8D music player made to enjoy Halloween this year!🤘

HAPPY HALLOWEEN buddy! Split Player Hello There! Welcome to SplitPlayer... Supposed To Be A 8DPlayer.... You Decide.... It can play the ordinary audio

Akshat Kumar Singh 1 Nov 4, 2021
A music player designed for a University Project.

A music player designed for a University Project. Very flexibe and easy to use, a real life working application with user friendly controls. Hope u enjoy!!

Aditya Johorey 1 Nov 19, 2021
A Quick Music Player Made Fully in Python

Quick Music Player Made Fully In Python. Pure Python, cross platform, single function module with no dependencies for playing sounds. Installation & S

null 1 Dec 24, 2021
Vixtify - Python Controlled Music Player

Strumm Sound Playlist : Click me to listen Welcome to GitHub Pages You can use the editor on GitHub to maintain and preview the content for your websi

Vicky Kumar 2 Feb 3, 2022
Anki vector Music ❤ is the best and only Telegram VC player with playlists, Multi Playback, Channel play and more

Anki Vector Music ?? A bot that can play music on Telegram Group and Channel Voice Chats Available on telegram as @Anki Vector Music Features ?? Thumb

Damantha Jasinghe 12 Nov 12, 2022
A simple music player, powered by Python, utilising various libraries such as Tkinter and Pygame

A simple music player, powered by Python, utilising various libraries such as Tkinter and Pygame

PotentialCoding 2 May 12, 2022
Bot duniya Music Player

Bot duniya Music Player Requirements ?? FFmpeg (Latest) NodeJS nodesource.com (NodeJS 17+) Python (3.10+) PyTgCalls (Lastest) 2nd Telegram Account (ne

Aman Vishwakarma 16 Oct 21, 2022