{"id":32136708,"url":"https://github.com/arkq/cmusfm","last_synced_at":"2026-02-25T13:38:00.547Z","repository":{"id":15526459,"uuid":"18260971","full_name":"arkq/cmusfm","owner":"arkq","description":"Last.fm standalone scrobbler for the cmus music player","archived":false,"fork":false,"pushed_at":"2024-12-18T18:19:24.000Z","size":224,"stargazers_count":250,"open_issues_count":3,"forks_count":5,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-10-21T04:03:15.602Z","etag":null,"topics":["cmus","last-fm","libre-fm","scrobble"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arkq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2014-03-30T09:19:03.000Z","updated_at":"2025-10-16T12:59:09.000Z","dependencies_parsed_at":"2024-06-19T17:37:21.668Z","dependency_job_id":null,"html_url":"https://github.com/arkq/cmusfm","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/arkq/cmusfm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkq%2Fcmusfm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkq%2Fcmusfm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkq%2Fcmusfm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkq%2Fcmusfm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arkq","download_url":"https://codeload.github.com/arkq/cmusfm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkq%2Fcmusfm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281787533,"owners_count":26561573,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-30T02:00:06.501Z","response_time":61,"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":["cmus","last-fm","libre-fm","scrobble"],"created_at":"2025-10-21T04:02:50.831Z","updated_at":"2025-10-30T10:15:01.972Z","avatar_url":"https://github.com/arkq.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cmusfm\n\n[Last.fm](http://www.last.fm/) standalone scrobbler for the [cmus](https://cmus.github.io/) music player.\n\n[![Build Status](https://github.com/arkq/cmusfm/actions/workflows/build-and-test.yaml/badge.svg)](https://github.com/arkq/cmusfm/actions/workflows/build-and-test.yaml)\n\n## Features\n\n* Listening now notification support\n* Off-line played track cache for later submission\n* POSIX ERE-based file name parser\n* Desktop notification support (optionally)\n* Customizable scrobbling service\n* Small memory footprint\n\n## Overview\n\nWhen discography is correctly tagged - at least artist and title field - scrobbling needs no\nfurther configuration (see: [Configuration](#configuration)). However, if this requirement is not\nmet, then one can use POSIX ERE-based file name parser feature. But what the heck is this?\n\nCmusfm allows to configure regular expression patterns for local files and for shoutcast streaming\nservices. The syntax is compatible with the [POSIX Extended Regular\nExpression](http://en.wikipedia.org/wiki/Regular_expression#Standards) (ERE) with one exception.\nMatched subexpression has to be marked with the `?` extension notation. There are four distinguish\ntypes:\n\n* `(?A...)` - match artist name\n* `(?B...)` - match album name\n* `(?N...)` - match track number\n* `(?T...)` - match track title\n\nAll extension types can be used only once, otherwise only the first occurrence will be used. Also\nnote, that using matched subexpressions without the extension notation might result in an\nunexpected behavior. Default configuration assumes formats as follows:\n\n* `format-localfile = \"^(?A.+) - (?T.+)\\.[^.]+$\"` (matches: The Beatles - Yellow Submarine.ogg)\n* `format-shoutcast = \"^(?A.+) - (?T.+)$\"` (matches: The Beatles - Yellow Submarine)\n\nScrobbling behavior and now playing notification can be controlled via the following\nself-explainable options (default is \"yes\" for all of them):\n\n* `now-playing-localfile = \"yes\"`\n* `now-playing-shoutcast = \"no\"`\n* `submit-localfile = \"yes\"`\n* `submit-shoutcast = \"no\"`\n\nCmusfm provides also one extra feature, which was mentioned earlier - desktop notifications. In\norder to have this functionality, one has to enable it during the compilation stage. Since it is\nan extra feature, it is disabled by default in the cmusfm configuration file too. Note, that cover\nart file has to be explicitly stored in the current track's directory - embedded covers are not\ndisplayed. Exemplary configuration might be as follows:\n\n* `notification = \"yes\"`\n* `format-coverfile = \"^(cover|folder)\\.jpg$\"`\n\nBy default cmusfm scrobbles to the Last.fm service. However, it is possible to change this\nbehavior by modifying `service-api-url` and `service-auth-url` options in the configuration file.\nAfterwards, one should reinitialize cmusfm (`cmusfm init`) in order to authenticate with new\nscrobbling service. In order to use [Libre.fm](https://libre.fm/) as a scrobbling service, one\nshall use configuration as follows:\n\n* `service-api-url = \"https://libre.fm/2.0/\"`\n* `service-auth-url = \"https://libre.fm/api/auth\"`\n\n\n## Installation\n\n### Dependencies\n\n* [cmus](https://cmus.github.io/)\n* [libcurl](https://curl.haxx.se/libcurl/)\n* [libnotify](https://developer.gnome.org/libnotify/) (optional)\n\n### Building and install\n\n```shell\nautoreconf --install\nmkdir build \u0026\u0026 cd build\n../configure --enable-libnotify\nmake \u0026\u0026 make install\n```\n\n## Configuration\n\nBefore usage with the cmus music player, one has to grant access for the cmusfm in the Last.fm\nservice. To do so, simply run cmusfm with the `init` argument and follow the instruction. This\naction might be also required when upgrading to the newer version with new features.\n\n```shell\ncmusfm init\n```\n\nAfter that you can safely edit `~/.config/cmus/cmusfm.conf` configuration file.\n\n~~Note, that for some changes to take place, restart of the cmusfm server process is required. To\nachieved this, one has to quit cmus player and then kill background instance of cmusfm (e.g. `pkill\ncmusfm`).~~ Above statement is not valid if one has [inotify](http://en.wikipedia.org/wiki/Inotify)\nsubsystem available.\n\nAs a final step (after the access is granted in the Last.fm service) one should set cmusfm as a\nstatus display program for cmus. This can be done by starting cmus and typing in the main window:\n\n```shell\n:set status_display_program=cmusfm\n```\n\nEnjoy!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farkq%2Fcmusfm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farkq%2Fcmusfm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farkq%2Fcmusfm/lists"}