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)
Python library for audio and music analysis

librosa A python package for music and audio analysis. Documentation See https://librosa.org/doc/ for a complete reference manual and introductory tut

librosa 5.6k Jan 06, 2023
An audio guide for destroying oracles in Destiny's Vault of Glass raid

prophet An audio guide for destroying oracles in Destiny's Vault of Glass raid. This project allows you to make any encounter with oracles without hav

24 Sep 15, 2022
Audio2midi - Automatic Audio-to-symbolic Arrangement

Automatic Audio-to-symbolic Arrangement This is the repository of the project "Audio-to-symbolic Arrangement via Cross-modal Music Representation Lear

Ziyu Wang 24 Dec 05, 2022
Any-to-any voice conversion using synthetic specific-speaker speeches as intermedium features

MediumVC MediumVC is an utterance-level method towards any-to-any VC. Before that, we propose SingleVC to perform A2O tasks(Xi → Ŷi) , Xi means utter

谷下雨 47 Dec 25, 2022
cross-library (GStreamer + Core Audio + MAD + FFmpeg) audio decoding for Python

audioread Decode audio files using whichever backend is available. The library currently supports: Gstreamer via PyGObject. Core Audio on Mac OS X via

beetbox 419 Dec 26, 2022
Python implementation of the Short Term Objective Intelligibility measure

Python implementation of STOI Implementation of the classical and extended Short Term Objective Intelligibility measures Intelligibility measure which

Pariente Manuel 250 Dec 21, 2022
An audio-solving python funcaptcha solving module

funcapsolver funcapsolver is a funcaptcha audio-solving module, which allows captchas to be interacted with and solved with the use of google's speech

Acier 8 Nov 21, 2022
Powerful, simple, audio tag editor for GNU/Linux

puddletag puddletag is an audio tag editor (primarily created) for GNU/Linux similar to the Windows program, Mp3tag. Unlike most taggers for GNU/Linux

341 Dec 26, 2022
Some utils for auto speech recognition

About Some utils for auto speech recognition. Utils Util Description Script Reset audio Reset sample rate, sample width, etc of audios.

1 Jan 24, 2022
pedalboard is a Python library for adding effects to audio.

pedalboard is a Python library for adding effects to audio. It supports a number of common audio effects out of the box, and also allows the use of VST3® and Audio Unit plugin formats for third-party

Spotify 3.9k Jan 02, 2023
voice assistant made with python that search for covid19 data(like total cases, deaths and etc) in a specific country

covid19-voice-assistant voice assistant made with python that search for covid19 data(like total cases, deaths and etc) in a specific country installi

Miguel 2 Dec 05, 2021
DeepSpeech is an open source embedded (offline, on-device) speech-to-text engine which can run in real time on devices ranging from a Raspberry Pi 4 to high power GPU servers.

Project DeepSpeech DeepSpeech is an open-source Speech-To-Text engine, using a model trained by machine learning techniques based on Baidu's Deep Spee

Mozilla 20.8k Jan 03, 2023
Graphical interface to control granular sound synthesis.

Granular sound synthesis interface SoundGrain is a graphical interface where users can draw and edit trajectories to control granular sound synthesis

Olivier Bélanger 122 Dec 10, 2022
MIDI-DDSP: Detailed Control of Musical Performance via Hierarchical Modeling

MIDI-DDSP: Detailed Control of Musical Performance via Hierarchical Modeling Demos | Blog Post | Colab Notebook | Paper | MIDI-DDSP is a hierarchical

Magenta 239 Jan 03, 2023
python wrapper for rubberband

pyrubberband A python wrapper for rubberband. For now, this just provides lightweight wrappers for pitch-shifting and time-stretching. All processing

Brian McFee 106 Nov 28, 2022
Multi-Track Music Generation with the Transfomer and the Johann Sebastian Bach Chorales dataset

MMM: Exploring Conditional Multi-Track Music Generation with the Transformer and the Johann Sebastian Bach Chorales Dataset. Implementation of the pap

102 Dec 08, 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
Scrap electronic music charts into CSV files

musiccharts A small python script to scrap (electronic) music charts into directories with csv files. Installation Download MusicCharts.exe Run MusicC

Dustin Scharf 1 May 11, 2022
Telegram Bot to play music in VoiceChat with Channel Support and autostarts Radio.

VCPlayerBot Telegram bot to stream videos in telegram voicechat for both groups and channels. Supports live streams, YouTube videos and telegram media

Abdisamad Omar Mohamed 1 Oct 15, 2021
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