Skip to main content

Allows control of the Foobar2000 and DeaDBeeF media players in Python through the beefweb plugin.

Project description

Allows control of the Foobar2000 and DeaDBeeF media players through the beefweb plugin API.

  • Both asynchronous and synchronous clients

  • An asynchronous event listener with callbacks

  • For Python 3.6 and up

  • MIT License

Installation

  1. Install and configure the beefweb plugin for your media player.

  2. Run:

    pip install pyfoobeef

Documentation

Documentation available at https://pyfoobeef.readthedocs.io/en/latest/

Examples

Synchronous client:

import pyfoobeef
from time import sleep


player = pyfoobeef.Client("localhost", 8880)

# Add a new playlist.
new_playlist = player.add_playlist(title="My New Playlist")
player.set_current_playlist(new_playlist)

# Add items to the playlist.  Note that paths including drive letters
# are case sensitive even on Windows due to limitations of the beefweb
# plugin (so r"c:\Music" would not work here).
player.add_playlist_items(new_playlist, items=[r"C:\Music"])

player.play_specific(new_playlist, 1)
# Give the media player a bit of time to actually start playing.
sleep(0.5)

# Column maps represent the media data fields to retrieve and the names
# to assign the returned data to.
column_map = {
    "%artist%": "artist",
    "%title%": "title",
    "%album% - %track number% - %title%": "my_custom_column",
}
status = player.get_player_state(column_map)

if status.active_item.has_columns():
    # Returned columns may be addressed by subscripting or as attributes.
    print(status.active_item.columns["artist"])
    print(status.active_item.columns.title)
    print(status.active_item.columns.my_custom_column)

# Display the playback state (ex. "playing")
print(status.playback_state)

# Display information about the volume level (current, min, max, etc.)
print(status.volume)

The asynchronous client follows a very similar format:

import pyfoobeef
import asyncio


async def example():
    player = pyfoobeef.AsyncClient("localhost", 8880)

    # Add a new playlist.
    new_playlist = await player.add_playlist(title="My New Playlist")
    await player.set_current_playlist(new_playlist)

    # Add items to the playlist.  Note that paths including drive letters
    # are case sensitive even on Windows due to limitations of the beefweb
    # plugin (so r"c:\Music" would not work here).
    await player.add_playlist_items(new_playlist, items=[r"C:\Music"])

    # sort items by length
    await player.sort_playlist_items(new_playlist, by="%length_seconds%")

    # Get information about the first 10 items in a playlist.
    items = await player.get_playlist_items(
        new_playlist,
        column_map=["%artist%", "%title%", "%length%"],
        offset=0,
        count=10,
    )
    for item in items:
        print(item)

    # Play a specific item.
    await player.play_specific(new_playlist, 4)


asyncio.run(example())

The asynchronous event listener can automatically execute callbacks when certain events are received or the media players state can be determined from the EventListener object’s attributes:

import pyfoobeef
import asyncio


def print_active_item(state):
    print("From player state callback.  Active item is:")
    print(state.active_item)


def print_playlists(playlists):
    print("From playlists callback.  Current playlists:")
    for playlist in playlists:
        print(playlist)


async def example():
    listener = pyfoobeef.EventListener(
        base_url="localhost",
        port=8880,
        active_item_column_map={
            "%artist%": "artist",
            "%title%": "title",
            "%length%": "length",
        },
    )

    # Add callbacks for player events.
    listener.add_callback("player_state", print_active_item)
    listener.add_callback("playlists", print_playlists)

    # Start listening for events from the player.
    await listener.connect(reconnect_time=1)

    await asyncio.sleep(10)

    # The last received information about the player state and playlists
    # can be accessed from the listener object itself.
    print("From the last player state object saved to listener."
          "  Active item is:")
    print(listener.player_state.active_item)
    print("Estimated playback position: ",
          listener.player_state.estimated_position_mmss())
    for playlist in listener.playlists:
        print(playlist)

    await asyncio.sleep(10)

    # The listener should always be disconnected when done.
    await listener.disconnect()


asyncio.run(example())

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

pyfoobeef-0.9.0.4-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file pyfoobeef-0.9.0.4-py3-none-any.whl.

File metadata

  • Download URL: pyfoobeef-0.9.0.4-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.14.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.7.2

File hashes

Hashes for pyfoobeef-0.9.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 4f0bb182a80da46d2385875858f210b83cc14607c020a25e9813a697fcbf6688
MD5 3d46c5d706d1a022aa7db256a273d60b
BLAKE2b-256 df9d6fdbd705963bf42a1b137ee9aad33067c7470a1525c96eca8d25effa877d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page