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)
[Singing Log] Let your program learn to sing!

[Singing Log] Let your program learn to sing! You must have thought this was changelog when you saw the English title, but it's not, it's chànggēlog. What it does is allow your program to print logs

黄巍 22 Sep 03, 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
Vixtify - Python Controlled Music Player

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

Vicky Kumar 2 Feb 03, 2022
Codes for "Efficient Long-Range Attention Network for Image Super-resolution"

ELAN Codes for "Efficient Long-Range Attention Network for Image Super-resolution", arxiv link. Dependencies & Installation Please refer to the follow

xindong zhang 124 Dec 22, 2022
L-SpEx: Localized Target Speaker Extraction

L-SpEx: Localized Target Speaker Extraction The data configuration and simulation of L-SpEx. The code scripts will be released in the future. Data Gen

Meng Ge 20 Jan 02, 2023
Bot duniya Music Player

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

Aman Vishwakarma 16 Oct 21, 2022
Using python to generate a bat script of repetitive lines of code that differ in some way but can sort out a group of audio files according to their common names

Batch Sorting Using python to generate a bat script of repetitive lines of code that differ in some way but can sort out a group of audio files accord

David Mainoo 1 Oct 29, 2021
TwitterMusicBot - A Twitter bot with Spotify integration.

A Twitter Music Bot 🤖 🎵 🎶 I created this project to learn more about APIs, so it only works for student purposes. Initially, delving into the Spoti

Gustavo Oliveira 2 Jan 02, 2022
Open-Source Tools & Data for Music Source Separation: A Pragmatic Guide for the MIR Practitioner

Open-Source Tools & Data for Music Source Separation: A Pragmatic Guide for the MIR Practitioner

IELab@ Korea University 0 Nov 12, 2021
Open-Source bot to play songs in your Telegram's Group Voice Chat. Powered by @Akki_ThePro

VcPlayer Telegram Voice-Chat Bot [PyTGCalls] ⇝ Requirements ⇜ Account requirements A Telegram account to use as the music bot, You cannot use regular

Akki ThePro 2 Dec 25, 2021
Sequencer: Deep LSTM for Image Classification

Sequencer: Deep LSTM for Image Classification Created by Yuki Tatsunami Masato Taki This repository contains implementation for Sequencer. Abstract In

Yuki Tatsunami 111 Dec 16, 2022
NovaMusic is a music sharing robot. Users can get music and music lyrics using inline queries.

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

Hesam Norin 7 Oct 21, 2022
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 07, 2022
Voicefixer aims at the restoration of human speech regardless how serious its degraded.

Voicefixer aims at the restoration of human speech regardless how serious its degraded.

Leo 324 Dec 26, 2022
MUSIC-AVQA, CVPR2022 (ORAL)

Audio-Visual Question Answering (AVQA) PyTorch code accompanies our CVPR 2022 paper: Learning to Answer Questions in Dynamic Audio-Visual Scenarios (O

44 Dec 23, 2022
controls volume using hand gestures

controls volume using hand gestures

1 Oct 11, 2021
SolidMusic rewrite version, need help

Telegram Streamer Bot This is rewrite version of solidmusic, but it can't be deployed now, help me to make this bot running fast and good. If anyone w

Shohih Abdul 63 Jan 06, 2022
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
Implicit neural differentiable FM synthesizer

Implicit neural differentiable FM synthesizer The purpose of this project is to emulate arbitrary sounds with FM synthesis, where the parameters of th

Andreas Jansson 34 Nov 06, 2022
gentle forced aligner

Gentle Robust yet lenient forced-aligner built on Kaldi. A tool for aligning speech with text. Getting Started There are three ways to install Gentle.

1.2k Dec 30, 2022