{"id":37064395,"url":"https://github.com/deafmute1/jellyshuf","last_synced_at":"2026-01-14T07:31:29.428Z","repository":{"id":62572278,"uuid":"434870299","full_name":"deafmute1/jellyshuf","owner":"deafmute1","description":"Shuffle and add items from jellyfin to mpd (use in tandem with jellyfin-mopidy and mpd-mopidy). Similar to ncmpcpp's \"Add random\" feature..","archived":false,"fork":false,"pushed_at":"2022-04-10T06:24:15.000Z","size":31,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-08-09T01:39:40.987Z","etag":null,"topics":["jellyfin","mopidy"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deafmute1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-12-04T10:26:54.000Z","updated_at":"2023-03-28T08:23:09.000Z","dependencies_parsed_at":"2022-11-03T20:45:44.874Z","dependency_job_id":null,"html_url":"https://github.com/deafmute1/jellyshuf","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/deafmute1/jellyshuf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deafmute1%2Fjellyshuf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deafmute1%2Fjellyshuf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deafmute1%2Fjellyshuf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deafmute1%2Fjellyshuf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deafmute1","download_url":"https://codeload.github.com/deafmute1/jellyshuf/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deafmute1%2Fjellyshuf/sbom","scorecard":{"id":330722,"data":{"date":"2025-08-11","repo":{"name":"github.com/deafmute1/jellyshuf","commit":"1390c3cf330d4f0fdd4de1104e094cc9f5fb8dd9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/17 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-18T03:31:38.370Z","repository_id":62572278,"created_at":"2025-08-18T03:31:38.370Z","updated_at":"2025-08-18T03:31:38.370Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28413356,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["jellyfin","mopidy"],"created_at":"2026-01-14T07:31:28.747Z","updated_at":"2026-01-14T07:31:29.407Z","avatar_url":"https://github.com/deafmute1.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jellyshuf \nEssentially implements ncmpcpp's add random feature (default hotkey: `) through a script which grabs info from jellyfin api itself. \njellyfin-mpd (and by proxy jellyfin-mopidy) does not implement the required mpd commands for this ncmpcpp function to work. \n\n# Install\n## Arch Linux (AUR)\n`paru -S jellyshuf` (or any other AUR helper) \n\n## Any system (pip)\n`pip install jellyshuf` \n\nor\n\n```\ngit clone https://github.com/deafmute1/jellyshuf.git\ncd jellyshuf\npip install . \n```\n\n# Usage\njellyshuf will asked for required information config info on first run. Some advanced config options are not exposed via `jellyshuf --config`. You can edit these manually. You can use `--empty-config` to generate all options with their defaults at the config location. The config file is located at  `$XDG_CONFIG_DIR/jellyshuf/config.json`. \n\nPasswords is by default stored to the system keyring if available; otherwise, they are stored in the config file as plaintext.\n\nPlease note there is some time required to fetch items from jellyfin when they have not yet been cached to disk. This is mainly noticable with using `songs`; on large libraries there may be notcable lag even when using disk cache. Subsonic implementation which makes use of the ability to set the size of the return list, and to offload randomisation of songs to the server does not have this issue.\n\nThis program currently requires the option `albumartistsort` in mopidy-jellyfin to be set to `true` (this is the default setting).\n\n`jellyshuf --help` \n```\nusage: jellyshuf [-h] [--stdout] [-i] [-r] [-s] [-c] [--config] [--default-config] [-v] backend size type\n\nRandomly add items to mpd queue from jellyfin or subsonic server.\n\npositional arguments:\n  backend            Server backend to use (either subsonic/sonic/ss or jellyfin/jf)\n  size               Number of items to add to queue\n  type               Type of items to add (either albums, artists or songs)\n\noptions:\n  -h, --help         show this help message and exit\n  --stdout           Instead of adding retrieved paths to mpd queue, emits them to stdout (line separated)\n  -i, --interactive  If not in stdout mode, interactively confirms albums before adding them; jellyshuf runs until NUMBER has been added to queue.\n  -r, --random       Set mpd to random mode after adding new items\n  -s, --start        Start mpd after adding new items\n  -c, --clear        Clear mpd queue before adding items\n  --config           Run interactive config (overwriting existing settings on disk), then exit\n  --default-config   Replace config on disk with default one\n  -v, --version      Print version and exit    \n\n```\n\n## Backend support.\n- Jellyfin backend: Offically supports Emby API reference; tested working on the following implementations: Jellyfin \n- (Sub)sonic backend: Officially supports Subsonic API reference; tested working on follow implementations: Navidrome","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeafmute1%2Fjellyshuf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeafmute1%2Fjellyshuf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeafmute1%2Fjellyshuf/lists"}