Supysonic is a Python implementation of the Subsonic server API.

Overview

Supysonic

Supysonic is a Python implementation of the Subsonic server API.

Build Status codecov Python

Current supported features are:

  • browsing (by folders or tags)
  • streaming of various audio file formats
  • transcoding
  • user or random playlists
  • cover art
  • starred tracks/albums and ratings
  • Last.FM scrobbling
  • Jukebox mode

Supysonic currently targets the version 1.10.2 of the Subsonic API. For more details, go check the API implementation status.

Documentation

Full documentation is available at https://supysonic.readthedocs.io/

Quickstart

Use the following commands to install Supysonic, create an admin user, define a library folder, scan it and start serving using Gunicorn.

$ pip install git+https://github.com/spl0k/supysonic.git
$ pip install gunicorn
$ supysonic-cli user add MyUserName
$ supysonic-cli user setroles --admin MyUserName
$ supysonic-cli folder add MyLibrary /home/username/Music
$ supysonic-cli folder scan MyLibrary
$ gunicorn -b 0.0.0.0:5000 "supysonic.web:create_application()"

You should now be able to enjoy your music with the client of your choice!

But using only the above commands will use a default configuration and especially storing the database in a temporary directory. Head over to the documentaiton for full setup instructions, plus other options if you don't want to use Gunicorn.

Note that there's also an optional daemon that watches for library changes and provides support for other features such as the jukebox mode.

Development stuff

For those wishing to collaborate on the project, since Supysonic uses Flask you can use its development server which provides automatic reloading and in-browser debugging among other things. To start said server:

$ export FLASK_APP="supysonic.web:create_application()"
$ export FLASK_ENV=development
$ flask run

And there's also the tests:

$ python setup.py test
$ python setup.py test --test-suite tests.with_net
Comments
  • Testsuite failure with Python 3.11

    Testsuite failure with Python 3.11

    Hello!

    Debian is currently busy migrating to Python 3.11 and I'm getting some testsuite failures. Everything but the failure on test_unstar spawns from pony not supporting 3.11.

    Somewhat unrelated, but there has been no commit to the pony source code since May 2022 and I fear it's a casualty of the current Russia-Ukraine war... Anyway, the current situation is worrisome.

    I: pybuild base:240: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11/build; python3.11 -m unittest discover -v 
    test_get_album_list (tests.api.test_album_songs.AlbumSongsTestCase.test_get_album_list) ... ERROR
    test_get_album_list2 (tests.api.test_album_songs.AlbumSongsTestCase.test_get_album_list2) ... ERROR
    test_get_random_songs (tests.api.test_album_songs.AlbumSongsTestCase.test_get_random_songs) ... ERROR
    test_get_starred (tests.api.test_album_songs.AlbumSongsTestCase.test_get_starred) ... ERROR
    test_get_starred2 (tests.api.test_album_songs.AlbumSongsTestCase.test_get_starred2) ... ERROR
    test_now_playing (tests.api.test_album_songs.AlbumSongsTestCase.test_now_playing) ... ERROR
    test_scrobble (tests.api.test_annotation.AnnotationTestCase.test_scrobble) ... ok
    test_set_rating (tests.api.test_annotation.AnnotationTestCase.test_set_rating) ... ERROR
    test_star (tests.api.test_annotation.AnnotationTestCase.test_star) ... ERROR
    test_unstar (tests.api.test_annotation.AnnotationTestCase.test_unstar) ... FAIL
    test_auth_basic (tests.api.test_api_setup.ApiSetupTestCase.test_auth_basic) ... ok
    test_auth_post (tests.api.test_api_setup.ApiSetupTestCase.test_auth_post) ... ok
    test_auth_query_params (tests.api.test_api_setup.ApiSetupTestCase.test_auth_query_params) ... ok
    test_format (tests.api.test_api_setup.ApiSetupTestCase.test_format) ... ok
    test_not_implemented (tests.api.test_api_setup.ApiSetupTestCase.test_not_implemented) ... ok
    test_required_client (tests.api.test_api_setup.ApiSetupTestCase.test_required_client) ... ok
    test_genres (tests.api.test_browse.BrowseTestCase.test_genres) ... ERROR
    test_get_album (tests.api.test_browse.BrowseTestCase.test_get_album) ... ERROR
    test_get_artist (tests.api.test_browse.BrowseTestCase.test_get_artist) ... ERROR
    test_get_artists (tests.api.test_browse.BrowseTestCase.test_get_artists) ... ERROR
    test_get_indexes (tests.api.test_browse.BrowseTestCase.test_get_indexes) ... ERROR
    test_get_music_directory (tests.api.test_browse.BrowseTestCase.test_get_music_directory) ... ERROR
    test_get_music_folders (tests.api.test_browse.BrowseTestCase.test_get_music_folders) ... ERROR
    test_get_song (tests.api.test_browse.BrowseTestCase.test_get_song) ... ERROR
    test_get_videos (tests.api.test_browse.BrowseTestCase.test_get_videos) ... ERROR
    test_add_message (tests.api.test_chat.ChatTestCase.test_add_message) ... ERROR
    test_get_messages (tests.api.test_chat.ChatTestCase.test_get_messages) ... ERROR
    test_download (tests.api.test_media.MediaTestCase.test_download) ... ERROR
    test_get_avatar (tests.api.test_media.MediaTestCase.test_get_avatar) ... ERROR
    test_get_cover_art (tests.api.test_media.MediaTestCase.test_get_cover_art) ... ERROR
    test_stream (tests.api.test_media.MediaTestCase.test_stream) ... ERROR
    test_create_playlist (tests.api.test_playlist.PlaylistTestCase.test_create_playlist) ... ERROR
    test_delete_playlist (tests.api.test_playlist.PlaylistTestCase.test_delete_playlist) ... ERROR
    test_get_playlist (tests.api.test_playlist.PlaylistTestCase.test_get_playlist) ... ERROR
    test_get_playlists (tests.api.test_playlist.PlaylistTestCase.test_get_playlists) ... ERROR
    test_update_playlist (tests.api.test_playlist.PlaylistTestCase.test_update_playlist) ... ERROR
    test_create_radio_station (tests.api.test_radio.RadioStationTestCase.test_create_radio_station) ... ERROR
    test_delete_radio_station (tests.api.test_radio.RadioStationTestCase.test_delete_radio_station) ... ERROR
    test_get_radio_stations (tests.api.test_radio.RadioStationTestCase.test_get_radio_stations) ... ERROR
    test_update_radio_station (tests.api.test_radio.RadioStationTestCase.test_update_radio_station) ... ERROR
    test_basic (tests.api.test_response_helper.ResponseHelperJsonTestCase.test_basic) ... ERROR
    test_dicts (tests.api.test_response_helper.ResponseHelperJsonTestCase.test_dicts) ... ERROR
    test_lists (tests.api.test_response_helper.ResponseHelperJsonTestCase.test_lists) ... ERROR
    test_nesting (tests.api.test_response_helper.ResponseHelperJsonTestCase.test_nesting) ... ERROR
    test_basic (tests.api.test_response_helper.ResponseHelperJsonpTestCase.test_basic) ... ERROR
    test_basic (tests.api.test_response_helper.ResponseHelperXMLTestCase.test_basic) ... ERROR
    test_dicts (tests.api.test_response_helper.ResponseHelperXMLTestCase.test_dicts) ... ERROR
    test_lists (tests.api.test_response_helper.ResponseHelperXMLTestCase.test_lists) ... ERROR
    test_nesting (tests.api.test_response_helper.ResponseHelperXMLTestCase.test_nesting) ... ERROR
    test_root (tests.api.test_response_helper.ResponseHelperXMLTestCase.test_root) ... ERROR
    test_unauthorized (tests.api.test_scan.ScanTestCase.test_unauthorized) ... ERROR
    test_unavailable (tests.api.test_scan.ScanTestCase.test_unavailable) ... ERROR
    test_getScanStatus (tests.api.test_scan.ScanWithDaemonTestCase.test_getScanStatus) ... ERROR
    test_startScan (tests.api.test_scan.ScanWithDaemonTestCase.test_startScan) ... ERROR
    test_search (tests.api.test_search.SearchTestCase.test_search) ... ERROR
    test_search2 (tests.api.test_search.SearchTestCase.test_search2) ... ERROR
    test_search3 (tests.api.test_search.SearchTestCase.test_search3) ... ERROR
    test_get_license (tests.api.test_system.SystemTestCase.test_get_license) ... ERROR
    test_ping (tests.api.test_system.SystemTestCase.test_ping) ... ERROR
    test_decode_encode (tests.api.test_transcoding.TranscodingTestCase.test_decode_encode) ... ERROR
    test_direct_transcode (tests.api.test_transcoding.TranscodingTestCase.test_direct_transcode) ... ERROR
    test_last_chunk_close_transcoded_cached (tests.api.test_transcoding.TranscodingTestCase.test_last_chunk_close_transcoded_cached) ... ERROR
    test_mostly_transcoded_cached (tests.api.test_transcoding.TranscodingTestCase.test_mostly_transcoded_cached) ... ERROR
    test_no_transcoding_available (tests.api.test_transcoding.TranscodingTestCase.test_no_transcoding_available) ... ERROR
    test_partly_transcoded_cached (tests.api.test_transcoding.TranscodingTestCase.test_partly_transcoded_cached) ... ERROR
    test_change_password (tests.api.test_user.UserTestCase.test_change_password) ... ERROR
    test_create_user (tests.api.test_user.UserTestCase.test_create_user) ... ERROR
    test_delete_user (tests.api.test_user.UserTestCase.test_delete_user) ... ERROR
    test_get_user (tests.api.test_user.UserTestCase.test_get_user) ... ERROR
    test_get_users (tests.api.test_user.UserTestCase.test_get_users) ... ERROR
    test_update_user (tests.api.test_user.UserTestCase.test_update_user) ... ERROR
    test_access_data (tests.base.test_cache.CacheTestCase.test_access_data) ... ok
    test_accessing_preserves (tests.base.test_cache.CacheTestCase.test_accessing_preserves) ... ok
    test_automatic_delete_oldest (tests.base.test_cache.CacheTestCase.test_automatic_delete_oldest) ... ok
    test_cleanup_on_error (tests.base.test_cache.CacheTestCase.test_cleanup_on_error) ... ok
    test_delete (tests.base.test_cache.CacheTestCase.test_delete) ... ok
    test_delete_missing (tests.base.test_cache.CacheTestCase.test_delete_missing) ... ok
    test_existing_files_order (tests.base.test_cache.CacheTestCase.test_existing_files_order) ... ok
    test_min_time_clear (tests.base.test_cache.CacheTestCase.test_min_time_clear) ... ok
    test_missing (tests.base.test_cache.CacheTestCase.test_missing) ... ok
    test_missing_cache_file (tests.base.test_cache.CacheTestCase.test_missing_cache_file) ... ok
    test_no_auto_prune (tests.base.test_cache.CacheTestCase.test_no_auto_prune) ... ok
    test_not_expired (tests.base.test_cache.CacheTestCase.test_not_expired) ... ok
    test_parallel_generation (tests.base.test_cache.CacheTestCase.test_parallel_generation) ... ok
    test_replace (tests.base.test_cache.CacheTestCase.test_replace) ... ok
    test_store_generated (tests.base.test_cache.CacheTestCase.test_store_generated) ... ok
    test_store_literal (tests.base.test_cache.CacheTestCase.test_store_literal) ... ok
    test_store_to_fp (tests.base.test_cache.CacheTestCase.test_store_to_fp) ... ok
    test_folder_add (tests.base.test_cli.CLITestCase.test_folder_add) ... ERROR
    test_folder_add_errors (tests.base.test_cli.CLITestCase.test_folder_add_errors) ... ERROR
    test_folder_delete (tests.base.test_cli.CLITestCase.test_folder_delete) ... ERROR
    test_folder_list (tests.base.test_cli.CLITestCase.test_folder_list) ... ERROR
    test_folder_scan (tests.base.test_cli.CLITestCase.test_folder_scan) ... ERROR
    test_user_add (tests.base.test_cli.CLITestCase.test_user_add) ... ERROR
    test_user_changepass (tests.base.test_cli.CLITestCase.test_user_changepass) ... ERROR
    test_user_delete (tests.base.test_cli.CLITestCase.test_user_delete) ... ERROR
    test_user_list (tests.base.test_cli.CLITestCase.test_user_list) ... ERROR
    test_user_rename (tests.base.test_cli.CLITestCase.test_user_rename) ... ERROR
    test_user_setadmin (tests.base.test_cli.CLITestCase.test_user_setadmin) ... ERROR
    test_user_setjukebox (tests.base.test_cli.CLITestCase.test_user_setjukebox) ... ERROR
    test_user_unsetadmin (tests.base.test_cli.CLITestCase.test_user_unsetadmin) ... ERROR
    test_user_unsetjukebox (tests.base.test_cli.CLITestCase.test_user_unsetjukebox) ... ERROR
    test_no_interpolation (tests.base.test_config.ConfigTestCase.test_no_interpolation) ... ok
    test_sections (tests.base.test_config.ConfigTestCase.test_sections) ... ok
    test_types (tests.base.test_config.ConfigTestCase.test_types) ... ok
    test_album (tests.base.test_db.DbTestCase.test_album) ... ERROR
    test_artist (tests.base.test_db.DbTestCase.test_artist) ... ERROR
    test_chat (tests.base.test_db.DbTestCase.test_chat) ... ERROR
    test_folder_annotation (tests.base.test_db.DbTestCase.test_folder_annotation) ... ERROR
    test_folder_base (tests.base.test_db.DbTestCase.test_folder_base) ... ERROR
    test_playlist (tests.base.test_db.DbTestCase.test_playlist) ... ERROR
    test_playlist_fixing (tests.base.test_db.DbTestCase.test_playlist_fixing) ... ERROR
    test_playlist_remove_tracks (tests.base.test_db.DbTestCase.test_playlist_remove_tracks) ... ERROR
    test_playlist_tracks (tests.base.test_db.DbTestCase.test_playlist_tracks) ... ERROR
    test_track (tests.base.test_db.DbTestCase.test_track) ... ERROR
    test_user (tests.base.test_db.DbTestCase.test_user) ... ERROR
    test_force_rescan (tests.base.test_scanner.ScannerTestCase.test_force_rescan) ... ERROR
    test_move_file (tests.base.test_scanner.ScannerTestCase.test_move_file) ... ERROR
    test_remove_file (tests.base.test_scanner.ScannerTestCase.test_remove_file) ... ERROR
    test_rescan (tests.base.test_scanner.ScannerTestCase.test_rescan) ... ERROR
    test_rescan_corrupt_file (tests.base.test_scanner.ScannerTestCase.test_rescan_corrupt_file) ... ERROR
    test_rescan_removed_file (tests.base.test_scanner.ScannerTestCase.test_rescan_removed_file) ... ERROR
    test_scan (tests.base.test_scanner.ScannerTestCase.test_scan) ... ERROR
    test_scan_file (tests.base.test_scanner.ScannerTestCase.test_scan_file) ... ERROR
    test_scan_tag_change (tests.base.test_scanner.ScannerTestCase.test_scan_tag_change) ... ERROR
    test_stats (tests.base.test_scanner.ScannerTestCase.test_stats) ... ERROR
    test_key (tests.base.test_secret.SecretTestCase.test_key) ... ERROR
    test_add (tests.base.test_watcher.AudioWatcherTestCase.test_add) ... ERROR
    test_add_delete (tests.base.test_watcher.AudioWatcherTestCase.test_add_delete) ... ERROR
    test_add_multiple (tests.base.test_watcher.AudioWatcherTestCase.test_add_multiple) ... ERROR
    test_add_nowait_stop (tests.base.test_watcher.AudioWatcherTestCase.test_add_nowait_stop) ... ERROR
    test_add_rename (tests.base.test_watcher.AudioWatcherTestCase.test_add_rename) ... ERROR
    test_add_rename_delete (tests.base.test_watcher.AudioWatcherTestCase.test_add_rename_delete) ... ERROR
    test_change (tests.base.test_watcher.AudioWatcherTestCase.test_change) ... ERROR
    test_delete (tests.base.test_watcher.AudioWatcherTestCase.test_delete) ... ERROR
    test_move_in (tests.base.test_watcher.AudioWatcherTestCase.test_move_in) ... ERROR
    test_move_out (tests.base.test_watcher.AudioWatcherTestCase.test_move_out) ... ERROR
    test_rename (tests.base.test_watcher.AudioWatcherTestCase.test_rename) ... ERROR
    test_rename_delete (tests.base.test_watcher.AudioWatcherTestCase.test_rename_delete) ... ERROR
    test_rename_rename (tests.base.test_watcher.AudioWatcherTestCase.test_rename_rename) ... ERROR
    test_add_cover_then_file (tests.base.test_watcher.CoverWatcherTestCase.test_add_cover_then_file) ... ERROR
    test_add_file_then_cover (tests.base.test_watcher.CoverWatcherTestCase.test_add_file_then_cover) ... ERROR
    test_add_to_folder_without_track (tests.base.test_watcher.CoverWatcherTestCase.test_add_to_folder_without_track) ... ERROR
    test_add_track_to_empty_folder (tests.base.test_watcher.CoverWatcherTestCase.test_add_track_to_empty_folder) ... ERROR
    test_naming_add_bad (tests.base.test_watcher.CoverWatcherTestCase.test_naming_add_bad) ... ERROR
    test_naming_add_good (tests.base.test_watcher.CoverWatcherTestCase.test_naming_add_good) ... ERROR
    test_naming_remove_bad (tests.base.test_watcher.CoverWatcherTestCase.test_naming_remove_bad) ... ERROR
    test_naming_remove_good (tests.base.test_watcher.CoverWatcherTestCase.test_naming_remove_good) ... ERROR
    test_remove_cover (tests.base.test_watcher.CoverWatcherTestCase.test_remove_cover) ... ERROR
    test_remove_from_folder_without_track (tests.base.test_watcher.CoverWatcherTestCase.test_remove_from_folder_without_track) ... ERROR
    test_rename (tests.base.test_watcher.CoverWatcherTestCase.test_rename) ... ERROR
    test_add_get (tests.frontend.test_folder.FolderTestCase.test_add_get) ... ERROR
    test_add_post (tests.frontend.test_folder.FolderTestCase.test_add_post) ... ERROR
    test_delete (tests.frontend.test_folder.FolderTestCase.test_delete) ... ERROR
    test_index (tests.frontend.test_folder.FolderTestCase.test_index) ... ERROR
    test_scan (tests.frontend.test_folder.FolderTestCase.test_scan) ... ERROR
    test_login_admin (tests.frontend.test_login.LoginTestCase.test_login_admin) ... ERROR
    test_login_non_admin (tests.frontend.test_login.LoginTestCase.test_login_non_admin) ... ERROR
    test_login_with_bad_data (tests.frontend.test_login.LoginTestCase.test_login_with_bad_data) ... ERROR
    test_multiple_login (tests.frontend.test_login.LoginTestCase.test_multiple_login) ... ERROR
    test_root_with_non_valid_session (tests.frontend.test_login.LoginTestCase.test_root_with_non_valid_session) ... ERROR
    test_root_with_valid_session (tests.frontend.test_login.LoginTestCase.test_root_with_valid_session) ... ERROR
    test_unauthorized_request (tests.frontend.test_login.LoginTestCase.test_unauthorized_request) ... ERROR
    test_delete (tests.frontend.test_playlist.PlaylistTestCase.test_delete) ... ERROR
    test_details (tests.frontend.test_playlist.PlaylistTestCase.test_details) ... ERROR
    test_index (tests.frontend.test_playlist.PlaylistTestCase.test_index) ... ERROR
    test_update (tests.frontend.test_playlist.PlaylistTestCase.test_update) ... ERROR
    test_add_get (tests.frontend.test_user.UserTestCase.test_add_get) ... ERROR
    test_add_post (tests.frontend.test_user.UserTestCase.test_add_post) ... ERROR
    test_change_mail_get (tests.frontend.test_user.UserTestCase.test_change_mail_get) ... ERROR
    test_change_mail_post (tests.frontend.test_user.UserTestCase.test_change_mail_post) ... ERROR
    test_change_password_get (tests.frontend.test_user.UserTestCase.test_change_password_get) ... ERROR
    test_change_password_post (tests.frontend.test_user.UserTestCase.test_change_password_post) ... ERROR
    test_change_username_get (tests.frontend.test_user.UserTestCase.test_change_username_get) ... ERROR
    test_change_username_post (tests.frontend.test_user.UserTestCase.test_change_username_post) ... ERROR
    test_delete (tests.frontend.test_user.UserTestCase.test_delete) ... ERROR
    test_details (tests.frontend.test_user.UserTestCase.test_details) ... ERROR
    test_index (tests.frontend.test_user.UserTestCase.test_index) ... ERROR
    test_lastfm_link (tests.frontend.test_user.UserTestCase.test_lastfm_link) ... ERROR
    test_lastfm_unlink (tests.frontend.test_user.UserTestCase.test_lastfm_unlink) ... ERROR
    test_update_client_prefs (tests.frontend.test_user.UserTestCase.test_update_client_prefs) ... ERROR
    test_add_folder (tests.managers.test_manager_folder.FolderManagerTestCase.test_add_folder) ... ERROR
    test_delete_by_name (tests.managers.test_manager_folder.FolderManagerTestCase.test_delete_by_name) ... ERROR
    test_delete_folder (tests.managers.test_manager_folder.FolderManagerTestCase.test_delete_folder) ... ERROR
    test_get_folder (tests.managers.test_manager_folder.FolderManagerTestCase.test_get_folder) ... ERROR
    test_add_user (tests.managers.test_manager_user.UserManagerTestCase.test_add_user) ... ERROR
    test_change_password (tests.managers.test_manager_user.UserManagerTestCase.test_change_password) ... ERROR
    test_change_password2 (tests.managers.test_manager_user.UserManagerTestCase.test_change_password2) ... ERROR
    test_delete_by_name (tests.managers.test_manager_user.UserManagerTestCase.test_delete_by_name) ... ERROR
    test_delete_user (tests.managers.test_manager_user.UserManagerTestCase.test_delete_user) ... ERROR
    test_encrypt_password (tests.managers.test_manager_user.UserManagerTestCase.test_encrypt_password) ... ERROR
    test_get_user (tests.managers.test_manager_user.UserManagerTestCase.test_get_user) ... ERROR
    test_try_auth (tests.managers.test_manager_user.UserManagerTestCase.test_try_auth) ... ERROR
    test_issue (tests.issue101.Issue101TestCase.test_issue) ... ERROR
    test_last_play (tests.issue129.Issue129TestCase.test_last_play) ... ERROR
    test_rating (tests.issue129.Issue129TestCase.test_rating) ... ERROR
    test_starred (tests.issue129.Issue129TestCase.test_starred) ... ERROR
    test_issue133 (tests.issue133.Issue133TestCase.test_issue133) ... ERROR
    test_float_bitrate (tests.issue139.Issue139TestCase.test_float_bitrate) ... ERROR
    test_null_genre (tests.issue139.Issue139TestCase.test_null_genre) ... ERROR
    test_issue (tests.issue148.Issue148TestCase.test_issue) ... ERROR
    test_issue (tests.issue221.Issue221TestCase.test_issue) ... ERROR
    test_issue (tests.issue85.Issue85TestCase.test_issue) ... ERROR
    

    I'm attaching the full tracelog, as apparently, Github has decided I can't post more than 65536 characters in an issue (what nonsense).

    supysonic_failure_3.11.txt

    opened by baldurmen 6
  • jukebox mode skipping over songs

    jukebox mode skipping over songs

    I've been experimenting with jukebox mode and Android Apps:

    • DSub
    • Ultrasonic

    I've experienced some (more than annoying) issues on the phone (for example hangs, switching between jukebox and local tricky) as well as issues where the jukebox mode will play the first track in the playlist and then immediately play the next track. At this point I'm unclear if this is a supysonic issue or the client.

    I need some help/guidance:

    • any recommendations for a client (even if just for testing) for jukebox mode that any can recommend that they have had good results with? If not I may try and reduce this down to a python/curl script that just makes REST requests.
    • any recommendations on the level of tracing that would help diagnose this?

    Thanks for making supysonic available!

    opened by clach04 2
  • Running in PyCharm

    Running in PyCharm

    Bear with me here. I'm not new to coding but new to Python/PyCharm.

    I have supysonic installed via pip and it's open in PyCharm. I can't figure out get the application running in the PyCharm debugger.

    EDIT

    OK, I added a module with the following, and a I'm running that.

    from web import create_application
    
    if __name__ == '__main__':
        app = create_application()
        app.run()
    
    opened by JSonnabend 1
  • Song play doesn't start until end of download (Dsub)

    Song play doesn't start until end of download (Dsub)

    Hello,

    I've migrated from Airsonic 10.6.2 to Supysonic, because I'd like to avoid Java as much as possible ^^.

    I noticed a comportment change with my Dsub app (latest from Google Play) : with Airsonic, the song start to play around 10% of downloading. With Supysonic, the song needs to be fully downloaded before playing.

    Did I miss a setting somewhere ? In Airsonic, I didn't needed to configure anything to have this behaviour.

    The supyserver.log didn't catch the direct play like I do with Airsonic, only transcoding tests that I've done earlier.

    Here's my configuration :

    [base]
    ; A database URI. Default: sqlite:////tmp/supysonic/supysonic.db
    database_uri = sqlite:////var/supysonic/supysonic.db
    ;database_uri = mysql://supysonic:[email protected]/supysonic
    ;database_uri = postgres://supysonic:[email protected]/supysonic
    
    ####################################################
    [webapp]
    ; Optional cache directory. Default: /tmp/supysonic
    cache_dir = /var/supysonic/cache
    
    ; Main cache max size in MB. Default: 512
    cache_size = 512
    
    ; Transcode cache max size in MB. Default: 1024 (1GB)
    transcode_cache_size = 1024
    
    ; Optional rotating log file. Default: none
    log_file = /var/supysonic/supysonic.log
    
    ; Log level. Possible values: DEBUG, INFO, WARNING, ERROR, CRITICAL.
    ; Default: WARNING
    log_level = DEBUG
    
    ; Enable the Subsonic REST API. You'll most likely want to keep this on.
    ; Here for testing purposes. Default: on
    ;mount_api = on
    
    ; Enable the administrative web interface. Default: on
    ;mount_webui = on
    
    ; Space separated list of prefixes that should be ignored on index endpoints
    ; Default: El La Le Las Les Los The
    index_ignored_prefixes = El La Le Las Les Los The
    
    ####################################################
    [daemon]
    ; Default: /tmp/supysonic/supysonic.sock
    socket = /var/supysonic/supysonic.sock
    
    ; Defines if the file watcher should be started. Default: yes
    run_watcher = yes
    
    ; Delay in seconds before triggering scanning operation after a change have been
    ; detected.
    ; This prevents running too many scans when multiple changes are detected for a
    ; single file over a short time span. Default: 5
    wait_delay = 5
    
    ; Command used by the jukebox
    jukebox_command = mplayer -ss %offset %path
    
    ; Optional rotating log file for the scanner daemon. Logs to stderr if empty
    log_file = /var/supysonic/supysonic-daemon.log
    log_level = INFO
    
    ####################################################
    [transcoding]
    transcoder_mp3_mp3 = lame --quiet --mp3input -b %outrate --tt %title --tl %album --ta %artist --tn %tracknumber/%totaltracks --tv TPOS=%discnumber --tg %genre --ty %year --add-id3v2 %srcpath -
    transcoder = ffmpeg -i %srcpath -ab %outratek -v 0 -metadata title=%title -metadata album=%album -metadata author=%artist -metadata track=%tracknumber/%totaltracks -metadata disc=%discnumber -metadata genre=%genre -metadata date=%year -f %outfmt -
    decoder_mp3 = mpg123 --quiet -w - %srcpath
    decoder_ogg = oggdec -o %srcpath
    decoder_flac = flac -d -c -s %srcpath
    encoder_mp3 = lame --quiet -b %outrate --tt %title --tl %album --ta %artist --tn %tracknumber/%totaltracks --tv TPOS=%discnumber --tg %genre --ty %year --add-id3v2 - -
    encoder_ogg = oggenc2 -Q -M %outrate -t %title -l %album -a %artist -N %tracknumber -c TOTALTRACKS=%totaltracks -c DISCNUMBER=%discnumber -G %genre -d %year -
    default_transcode_target = mp3
    
    
    

    Thanks !

    opened by Fabiosilvero 2
  • Missing the Link button for Last.fm scrobbling

    Missing the Link button for Last.fm scrobbling

    I have configured Supysonic using this Docker image and added my Last.fm api_key and secret values. However, I cannot find the Link button on my user page. On that page, I can only see "LastFM status Unavailable". I have double-checked my Last.fm API key/secret values are correct and they are newly registered.

    How can I troubleshoot this? Is there a recommended Docker image to use?

    opened by dbogdanov 2
Releases(0.7.2)
  • 0.7.2(Feb 27, 2022)

    Added Python 3.10 support Prevent name collisions when zipping albums Fixed cover art sometimes not being picked up by the daemon Fixed tests sometimes failing

    Source code(tar.gz)
    Source code(zip)
  • 0.7.1(Jan 1, 2022)

    Added version number to web UI Slightly reworked man pages Man pages should now be installed alongside the package Minor updates in code style, tests, and CI

    Python 3.5 isn't supported anymore

    Source code(tar.gz)
    Source code(zip)
  • 0.7.0(Nov 21, 2021)

    Added:

    • Playlists can be exported to .m3u files from the web interface
    • Ability to rename users from the CLI
    • Covers are added to zip files when downloading full albums
    • Downloading a folder now includes all the subfolders
    • supysonic-server command to start the web server

    Improvements:

    • Disabled compression for generated zip files
    • When downloading a folder or album, the size of the zip file is now known
    • Prevent downloading empty zip files

    Fixes:

    • Fixed renaming playlists from the web interface
    • Fixed watcher error when files were added and removed within a short timespan
    • Fixed potential errors when accessing the API with a new client for the first time
    • Fixed genre duplication in album info
    • Support for large zip files
    • Handle dates outside the range supported by zip files
    • Properly close daemon connection on shutdown

    Breaking changes:

    • The CLI doesn't support shell-like capability anymore
    • As announced earlier, bin and cgi-bin folders have been deleted

    Note to package maintainers:

    • click is now explicitly needed (rather than implicitly as a Flask dependency)
    • Dependency on zipstream was replaced by zipstream-ng
    Source code(tar.gz)
    Source code(zip)
  • 0.6.3(Jan 30, 2021)

    New: Lyrics can now be retrieved from files metadata New: Added support for endpoints without ".view" suffix Fixed: Fixed an error when getting random songs with a PostgreSQL database

    ⚠️ Deprecation notice: This version might be the last one to provide the files available in the bin and cgi-bin folders and the supysonic-daemon.service file. Theses were either old stuff kept for compatibility or installation specific (requiring modifications and/or additional programs to be properly used). Please upade your installation/deployment/scripts if you are using any of them. The possible interesting bits are now described in the documentation

    Source code(tar.gz)
    Source code(zip)
  • 0.6.2(Dec 13, 2020)

    New feature: support for startScan and getScanStatus API Improvement: files transcoded up to 95% of their estimated size will be cached even if the connection is prematurely closed Fix: Properly close handles when after converting files

    Source code(tar.gz)
    Source code(zip)
  • 0.6.1(Nov 11, 2020)

    Now targets Subsonic API 1.10.2, which brings the following:

    • listing albums by year
    • listing albums by genre
    • ignoring a set of defined prefixes in indexes
    • ability to edit user roles through the API

    This release also allows to retreive embedded cover art from more file formats, such as M4A. This comes at the price of an additional (small) dependency: mediafile.

    It may now work on Windows (but hasn't actually been tested).

    And to conclude, it fixes duplicates in album lists.

    Source code(tar.gz)
    Source code(zip)
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
PyAbsorp is a python module that has the main focus to help estimate the Sound Absorption Coefficient.

This is a package developed to be use to find the Sound Absorption Coefficient through some implemented models, like Biot-Allard, Johnson-Champoux and

Michael Markus Ackermann 8 Oct 19, 2022
This library provides common speech features for ASR including MFCCs and filterbank energies.

python_speech_features This library provides common speech features for ASR including MFCCs and filterbank energies. If you are not sure what MFCCs ar

James Lyons 2.2k Jan 04, 2023
Extract the songs from your osu! libary into proper mp3 form, complete with metadata and album art!

osu-Extract Extract the songs from your osu! libary into proper mp3 form, complete with metadata and album art! Requirements python3 mutagen pillow Us

William Carter 2 Mar 09, 2022
Guide & Examples to create deeplearning gstreamer plugins and use them in your pipeline

upai-gst-dl-plugins Guide & Examples to create deeplearning gstreamer plugins and use them in your pipeline Introduction Thanks to the work done by @j

UPAI.IO 11 Dec 11, 2022
extract unpack asset file (form unreal engine 4 pak) with extenstion *.uexp which contain awb/acb (cri/cpk like) sound or music resource

Uexp2Awb extract unpack asset file (form unreal engine 4 pak) with extenstion .uexp which contain awb/acb (cri/cpk like) sound or music resource. i ju

max 6 Jun 22, 2022
Xbot-Music - Bot Play Music and Video in Voice Chat Group Telegram

XBOT-MUSIC A Telegram Music+video Bot written in Python using Pyrogram and Py-Tg

Fariz 2 Jan 20, 2022
:speech_balloon: SpeechPy - A Library for Speech Processing and Recognition: http://speechpy.readthedocs.io/en/latest/

SpeechPy Official Project Documentation Table of Contents Documentation Which Python versions are supported Citation How to Install? Local Installatio

Amirsina Torfi 870 Dec 27, 2022
A telegram bot for which is help to play songs in vc 🥰 give 🌟 and fork this repo before use 😏

TamilVcMusic 🌟 TamilVCMusicBot 🌟 Give your 💙 Before clicking on deploy to heroku just click on fork and star just below How to deploy Click the bel

TamilBots 150 Dec 13, 2022
An Amazon Music client for Linux (unpretentious)

Amusiz An Amazon Music client for Linux (unpretentious) ↗️ Install You can install Amusiz in multiple ways, choose your favorite. 🚀 AppImage Here you

Mirko Brombin 25 Nov 08, 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 07, 2023
A Python 3 script for capturing and recording a SDR stream to a WAV file (or serving it to a HTTP audio stream).

rfsoapyfile A Python 3 script for capturing and recording a SDR stream to a WAV file (or serving it to a HTTP audio stream). The script is threaded fo

4 Dec 19, 2022
Praat in Python, the Pythonic way

Parselmouth - Praat in Python, the Pythonic way Parselmouth is a Python library for the Praat software. Though other attempts have been made at portin

Yannick Jadoul 786 Jan 09, 2023
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

1 Dec 24, 2021
Enhanced Audio Player for Discord

Discodo is an enhanced audio player for discord

Mary 42 Oct 05, 2022
Python Audio Analysis Library: Feature Extraction, Classification, Segmentation and Applications

A Python library for audio feature extraction, classification, segmentation and applications This doc contains general info. Click here for the comple

Theodoros Giannakopoulos 5.1k Jan 02, 2023
Dataset and baseline code for the VocalSound dataset (ICASSP2022).

VocalSound: A Dataset for Improving Human Vocal Sounds Recognition Introduction Citing Download VocalSound Dataset Details Baseline Experiment Contact

Yuan Gong 58 Jan 03, 2023
Muzic: Music Understanding and Generation with Artificial Intelligence

Muzic is a research project on AI music that empowers music understanding and generation with deep learning and artificial intelligence.

Microsoft 2.6k Dec 30, 2022
We built this fully functioning Music player in Python. The music player allows you to play/pause and switch to different songs easily.

We built this fully functioning Music player in Python. The music player allows you to play/pause and switch to different songs easily.

1 Nov 19, 2021
Voice to Text using Raspberry Pi

This module will help to convert your voice (speech) into text using Speech Recognition Library. You can control the devices or you can perform the desired tasks by the word recognition

Raspberry_Pi Pakistan 2 Dec 15, 2021