{"id":16653625,"url":"https://github.com/norm/deck","last_synced_at":"2026-05-27T18:32:15.872Z","repository":{"id":66550701,"uuid":"423098064","full_name":"norm/deck","owner":"norm","description":"A digital music player for the 20th century.","archived":false,"fork":false,"pushed_at":"2022-06-02T05:48:57.000Z","size":58,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-12T21:35:47.832Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/norm.png","metadata":{"files":{"readme":"README.markdown","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-31T08:57:05.000Z","updated_at":"2021-10-31T08:57:28.000Z","dependencies_parsed_at":"2023-02-28T13:31:00.276Z","dependency_job_id":null,"html_url":"https://github.com/norm/deck","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/norm/deck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norm%2Fdeck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norm%2Fdeck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norm%2Fdeck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norm%2Fdeck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/norm","download_url":"https://codeload.github.com/norm/deck/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/norm%2Fdeck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33579665,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-27T02:00:06.184Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T09:46:05.207Z","updated_at":"2026-05-27T18:32:15.854Z","avatar_url":"https://github.com/norm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"deck\n====\n\nA digital music player for the 20th century.\n\n\n## The problem to solve\n\nI still mostly listen to music from my own music library, for two reasons:\n\n*   there are many albums and tracks important to me that just don't exist on\n    streaming services.\n*   I am far too used to choosing music to listen to using smart playlists,\n    such as \"my favourites that I've not listened to in over two months\"\n\nPlus, more than once I've been in the situation where my current library\n(iTunes) has stopped syncing to my phone, corrupted itself, or just revamped\nthe UI to make it harder for me to listen to music so Apple can promote their\nstreaming service.\n\n\n## The design\n\nThe whiteboard sketch level description is:\n\n1.  A way of storing, categorising, and arranging music.\n\n    * add music from local files\n    * add music from CDs\n    * add music from the internet\n    * sync playlists to/from streaming services\n    * use useful metadata from musicbrainz/last.fm/etc\n    * store complete history of metadata updates (inc import from last.fm of\n      historical plays)\n\n2.  Copies of this collection living in the cloud, in my house, and in my\n    pocket.\n\n    * cloud backups of music files, a centralised copy of the database\n    * a complete local copy and player running on a raspberry pi/Mac\n    * iOS app player that can sync subsets of the library for offline playing\n\n\n## Raspberry Pi requirements\n\nMinimum install to get music files playing on Raspberry Pi (raspbian):\n\n    sudo apt-get -y install \\\n        gstreamer1.0-alsa \\\n        gstreamer1.0-plugins-good \\\n        gstreamer1.0-plugins-bad \\\n        gstreamer1.0-plugins-ugly \\\n        python3-gst-1.0 \\\n        redis\n\n    # if using the NFC HAT to trigger music, first configure jumpers\n    # on it to communicate via UART:\n    # https://www.raspberrypi.com/news/read-rfid-and-nfc-tokens-with-raspberry-pi-hackspace-37/\n    sudo raspi-config\n        # Interface Options -\u003e Serial Interface\n        # Login to console: NO\n        # Enable: YES\n    # ...or...\n    # /boot/config.txt: set \"enable_uart=1\"\n    # /boot/cmdline.txt: remove \"console=serial0,115200\"\n\n## Usage\n\n    sudo pip install .\n\n    # to scrobble played tracks, set the environment vars:\n    export LASTFM_KEY=...\n    export LASTFM_SECRET=...\n    export LASTFM_USER=...\n    export LASTFM_PASS=...\n\n    # to play a single track then exit\n    deck play track.mp3\n\n    # to play indefinitely from the redis queue\n    deck spin\n\n    # to make the indefinite player exit\n    deck quit\n\n    # to queue up music\n    deck queue track.mp3 [...]\n    deck queue --prepend track.mp3 [...]\n\n    # ...or with playlists\n    deck queue favourites.m3u\n\n    # ...or directories (to traverse and queue all music below)\n    deck queue Barenaked\\ Ladies/\n\n    # ...or by listing files/playlists/dirs to stdin\n    echo track.mp3 | deck queue -\n\n    # to remove tracks from the queue\n    deck queue --remove track.mp3 [...]\n\n    # to clear the entire queue\n    deck queue --clear\n\n    # to replace the entire queue\n    deck queue --clear track.mp3 [...]\n\n    # to play something then return to the queue\n    deck interrupt track.mp3\n\n    # controls\n    deck pause\n    deck next\n    deck previous\n    deck skip\n    deck stop\n\n    # monitor previous, current, and queued tracks\n    deck show-previous [--repeat \u003csecs\u003e]\n    deck show-playing [--repeat \u003csecs\u003e]\n    deck show-queue [--repeat \u003csecs\u003e]\n    deck show-summary [--repeat \u003csecs\u003e]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorm%2Fdeck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnorm%2Fdeck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnorm%2Fdeck/lists"}