{"id":13586747,"url":"https://github.com/erik/lastcast","last_synced_at":"2026-01-25T07:46:10.999Z","repository":{"id":46140684,"uuid":"60490048","full_name":"erik/lastcast","owner":"erik","description":"Scrobble music playing on Chromecast (from Spotify, Google Play, SoundCloud, ...) to last.fm and libre.fm","archived":false,"fork":false,"pushed_at":"2022-07-18T08:41:30.000Z","size":105,"stargazers_count":80,"open_issues_count":1,"forks_count":9,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-09-20T17:10:03.111Z","etag":null,"topics":["chromecast","lastfm","libre-fm","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/erik.png","metadata":{"files":{"readme":"README.rst","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":"2016-06-06T01:28:41.000Z","updated_at":"2025-04-11T20:45:40.000Z","dependencies_parsed_at":"2022-09-24T14:50:48.141Z","dependency_job_id":null,"html_url":"https://github.com/erik/lastcast","commit_stats":null,"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/erik/lastcast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erik%2Flastcast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erik%2Flastcast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erik%2Flastcast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erik%2Flastcast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/erik","download_url":"https://codeload.github.com/erik/lastcast/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/erik%2Flastcast/sbom","scorecard":{"id":380875,"data":{"date":"2025-08-11","repo":{"name":"github.com/erik/lastcast","commit":"de07f8ada87007772ca1dcaeca40eeed5cfcdb5d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"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":"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":"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":"Code-Review","score":1,"reason":"Found 3/17 approved changesets -- score normalized to 1","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":"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":"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:2: pin your Docker image by updating python:3 to python:3@sha256:1e4584c017d9cecf8a952cfd8f8e47ef5611b28dfc29da9e1d4b6bad98daf9b0","Info:   0 out of   1 containerImage dependencies pinned"],"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T15:24:50.875Z","repository_id":46140684,"created_at":"2025-08-18T15:24:50.875Z","updated_at":"2025-08-18T15:24:50.875Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28748223,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T05:12:38.112Z","status":"ssl_error","status_checked_at":"2026-01-25T05:04:50.338Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["chromecast","lastfm","libre-fm","python"],"created_at":"2024-08-01T15:05:46.872Z","updated_at":"2026-01-25T07:46:10.981Z","avatar_url":"https://github.com/erik.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"lastcast\n========\n\nScrobble music playing on Chromecast devices to last.fm and libre.fm.\n\nBy default, lastcast will scrobble music playing on Spotify,\nGoogle Play Music, SoundCloud, Plex, and YouTube Music but can\nbe configured to scrobble any media player that supports Chromecast.\n\n**A Note for Spotify Users:**\n\nLast.fm now has `first class\nsupport \u003chttps://support.last.fm/t/spotify-scrobbling/189\u003e`_\nfor Spotify, and you should probably use this rather than lastcast.\n\nRequires Python 3.7+. **If you need Python 2** please install\n``lastcast==0.7.0``\n\nGetting started\n---------------\n\n``pip3 install lastcast``\n\nSet up an initial configuration with the configuration\ncreation tool:\n\n``lastcast --wizard``\n\nIf you'd prefer to set up the configuration manually, modify\n``example.lastcast.toml`` from the repo and save it to\n``~/.lastcast.toml``.\n\nOnce the configuration file is in place, just run ``lastcast`` to connect to\nthe Chromecast and start scrobbling!\n\nLinux / systemd instructions\n----------------------------\n\n1. ``sudo pip3 install --upgrade lastcast``\n2. ``lastcast --wizard``\n3. Edit the code block below as needed (remember to fill in the config path!)\n   and write to ``/usr/lib/systemd/system/lastcast.service``\n   (or ``/etc/systemd/system/lastcast.service`` if the directory doesn't exist)\n4. ``sudo systemctl daemon-reload``\n5. ``sudo systemctl enable lastcast``\n\n.. code-block:: ini\n\n   [Unit]\n   Description=lastcast\n   Requires=networking.service\n   After=network-online.target\n   Wants=network-online.target\n\n   [Service]\n   ExecStart=/usr/local/bin/lastcast --config [PATH TO lastcast.toml]\n   Restart=always\n   RestartSec=5\n   # Set this to run as your user rather than root!\n   User=pi\n\n   [Install]\n   WantedBy=multi-user.target\n\nLinux / systemd troubleshooting\n-------------------------------\n\nIf your lastcast installation is not scrobbling check its log calling ``journalctl -f _COMM=lastcast``\n\nIf you see the following error\n\n.. code-block:: bash\n\n    RuntimeError: Click will abort further execution because Python 3 was\n    configured to use ASCII as encoding for the environment.\n\n    This system supports the C.UTF-8 locale which is recommended.\n    You might be able to resolve your issue by exporting the\n    following environment variables:\n\n    export LC_ALL=C.UTF-8\n    export LANG=C.UTF-8\n\nmodify the ``lastcast.service`` file you created in the previous section as by adding the following\nto the ``[Service]`` section\n\n.. code-block:: ini\n\n    Environment=\"LC_ALL=C.UTF-8\"\n    Environment=\"LANG=C.UTF-8\"\n\nDetailed macOS setup\n--------------------\n\n(for anyone not familiar with Python and pip)\n\nEnter the following commands in your Terminal (Terminal.app, iTerm2, etc.):\n\n1. ``brew install python3``\n2. ``sudo pip3 install --upgrade lastcast``\n3. ``lastcast --wizard``\n\nThis will prompt you to create a last.fm API application and then ask for your\nlogin information, which will only be stored locally on your computer.\n\nYou may get an error on step 2 about ``cc`` missing. If this is the case,\ninstall xcode by running ``xcode-select --install`` and retry step 2.\n\nNow everything should be set up. When you want to start scrobbling, simply\nrun ``lastcast`` in the terminal.\n\nDocker setup\n------------\n\n``lastcast`` uses a Docker volume in order to link the configuration file\ninto the container.\n\n.. code:: bash\n\n   # Path to configuration file. Make sure to use an absolute path.\n   export CONFIG_PATH=/path/to/your/lastcast.toml\n\n   docker build -t lastcast .\n\n   docker run -it                   \\\n     --net=host                     \\\n     --name lastcast                \\\n     -v $CONFIG_PATH:/lastcast.toml \\\n     lastcast\n\n   # If you need to generate a config file, run the wizard:\n   docker run -it                   \\\n     --net=host                     \\\n     -v $CONFIG_PATH:/lastcast.toml \\\n     lastcast                       \\\n     lastcast --wizard\n\nNo Chromecast devices found?\n----------------------------\n\nIt is possible that an incompatible version of ``netifaces`` will prevent lastcast\nfrom finding any Chromecast devices on your network. This is known to affect\nWindows 10 with ``netifaces==0.10.5`` installed.\n\nThe fix, as described in `this StackOverflow answer\n\u003chttp://stackoverflow.com/a/41517483\u003e`_ is simply to uninstall the wrong version\nand manually install ``netifaces==0.10.4``.\n\n.. code:: bash\n\n   $ pip uninstall netifaces\n   $ pip install netifaces==0.10.4\n\nIf you still can't discover any Chromecasts, please `open an issue\n\u003chttps://github.com/erik/lastcast/issues/new\u003e`_.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferik%2Flastcast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ferik%2Flastcast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ferik%2Flastcast/lists"}