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:supysonic@localhost/supysonic
    ;database_uri = postgres://supysonic:supysonic@localhost/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)
Synchronize a local directory of songs' (MP3, MP4) metadata (genre, ratings) and playlists with a Plex server.

PlexMusicSync Synchronize a local directory of songs' (MP3, MP4) metadata (genre, ratings) and playlists (m3u, m3u8) with a Plex server. The song file

Tom Goetz 9 Jul 7, 2022
Scalable audio processing framework written in Python with a RESTful API

TimeSide : scalable audio processing framework and server written in Python TimeSide is a python framework enabling low and high level audio analysis,

Parisson 340 Jan 4, 2023
A Python wrapper around the Soundcloud API

soundcloud-python A friendly wrapper around the Soundcloud API. Installation To install soundcloud-python, simply: pip install soundcloud Or if you'r

SoundCloud 84 Dec 31, 2022
Simple, hackable offline speech to text - using the VOSK-API.

Nerd Dictation Offline Speech to Text for Desktop Linux. This is a utility that provides simple access speech to text for using in Linux without being

Campbell Barton 844 Jan 7, 2023
Just-Music - Spotify API Driven Music Web app, that allows to listen and control and share songs

Just Music... Just Music Is A Web APP That Allows Users To Play Song Using Spoti

Ayush Mishra 3 May 1, 2022
A voice based calculator by using termux api in Android

termux_voice_calculator This is. A voice based calculator by using termux api in Android Instagram account ?? ?? Requirements and installation Downloa

ʕ´•ᴥ•`ʔ╠ŞĦỮβĦa̷m̷╣ʕ´•ᴥ•`ʔ 2 Apr 29, 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
A fast MDCT implementation using SciPy and FFTs

MDCT A fast MDCT implementation using SciPy and FFTs Installation As usual pip install mdct Dependencies NumPy SciPy STFT Usage import mdct spectrum

Nils Werner 43 Sep 2, 2022
Implementation of "Slow-Fast Auditory Streams for Audio Recognition, ICASSP, 2021" in PyTorch

Auditory Slow-Fast This repository implements the model proposed in the paper: Evangelos Kazakos, Arsha Nagrani, Andrew Zisserman, Dima Damen, Slow-Fa

Evangelos Kazakos 57 Dec 7, 2022
Algorithmic and AI MIDI Drums Generator Implementation

Algorithmic and AI MIDI Drums Generator Implementation

Tegridy Code 8 Dec 30, 2022
Official implementation of A cappella: Audio-visual Singing VoiceSeparation, from BMVC21

Y-Net Official implementation of A cappella: Audio-visual Singing VoiceSeparation, British Machine Vision Conference 2021 Project page: ipcv.github.io

Juan F. Montesinos 12 Oct 22, 2022
Official implementation of A cappella: Audio-visual Singing VoiceSeparation, from BMVC21

Y-Net Official implementation of A cappella: Audio-visual Singing VoiceSeparation, British Machine Vision Conference 2021 Project page: ipcv.github.io

Juan F. Montesinos 12 Oct 22, 2022
Music Streaming Platform based on full implementation of DBSM

Symphony Music Streaming Platform based on full implementation of DBSM List of Commands Insert User (INSERT) Function to implement input in USER Get a

Parth Maradia 1 Nov 12, 2021
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
Audio fingerprinting and recognition in Python

dejavu Audio fingerprinting and recognition algorithm implemented in Python, see the explanation here: How it works Dejavu can memorize audio by liste

Will Drevo 6k Jan 6, 2023
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 6, 2023
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 2, 2023
nicfit 425 Jan 1, 2023
Python module for handling audio metadata

Mutagen is a Python module to handle audio metadata. It supports ASF, FLAC, MP4, Monkey's Audio, MP3, Musepack, Ogg Opus, Ogg FLAC, Ogg Speex, Ogg The

Quod Libet 1.1k Dec 31, 2022