{"id":19102165,"url":"https://github.com/ctrueden/beets-ibroadcast","last_synced_at":"2025-08-03T00:08:25.607Z","repository":{"id":46972722,"uuid":"297098765","full_name":"ctrueden/beets-ibroadcast","owner":"ctrueden","description":"Beets plugin for iBroadcast","archived":false,"fork":false,"pushed_at":"2024-01-26T21:03:43.000Z","size":61,"stargazers_count":4,"open_issues_count":6,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-19T06:56:52.518Z","etag":null,"topics":["beets","beets-plugin","music"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/beets-ibroadcast","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ctrueden.png","metadata":{"files":{"readme":"README.md","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}},"created_at":"2020-09-20T14:52:44.000Z","updated_at":"2025-01-08T18:08:46.000Z","dependencies_parsed_at":"2024-01-26T22:23:54.530Z","dependency_job_id":"3dc2e5f8-a704-42c1-a25b-2f62a5add792","html_url":"https://github.com/ctrueden/beets-ibroadcast","commit_stats":{"total_commits":77,"total_committers":2,"mean_commits":38.5,"dds":"0.012987012987012991","last_synced_commit":"ae9f4d252bc5ac7d7222c67034c5cfac1f6088f0"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctrueden%2Fbeets-ibroadcast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctrueden%2Fbeets-ibroadcast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctrueden%2Fbeets-ibroadcast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctrueden%2Fbeets-ibroadcast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ctrueden","download_url":"https://codeload.github.com/ctrueden/beets-ibroadcast/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251741447,"owners_count":21636255,"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","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":["beets","beets-plugin","music"],"created_at":"2024-11-09T03:54:02.788Z","updated_at":"2025-04-30T16:27:15.495Z","avatar_url":"https://github.com/ctrueden.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Beets iBroadcast Plugin\n\nThis plugin lets you upload music from your [beets](https://beets.io)\nlibrary to the [iBroadcast](https://www.ibroadcast.com/) streaming service.\n\n## Setup\n\n1. Install the plugin into your local environment with:\n   ```\n   pip install beets-ibroadcast\n   ```\n\n2. Enable the plugin by adding `ibroadcast` to your `plugins:` section\n   in your beets config file.\n\n3. Configure your iBroadcast credentials:\n   ```yaml\n   ibroadcast:\n     username: \u003cyour email address\u003e\n     password: \u003cyour password\u003e\n   ```\n   Be sure to put quotes around your password if it includes any special characters.\n\n   Optionally, if you'd like to upload newly imported items from your library,\n   set `auto` to true:\n\n   ```yaml\n   ibroadcast:\n     auto: true\n     ...\n   ```\n\n## Usage\n\n```\nbeet ibroadcast \u003cquery\u003e\n```\n\n- All tracks matching the query are uploaded as needed.\n- [Usertags][1] are synced with the tags on iBroadcast.\n- [Playlists][2] are synced as playlists on iBroadcast, as long as\n  the tracks of the playlist are all covered by the given query.\n\n## FAQ\n\n### How do I know this plugin won't destroy my iBroadcast collection?\n\nYou don't. But it tries to be careful and guards against many edge cases.\nIf you want to see what the plugin will do without actually doing it, you can\npass the `-p` (for \"pretend\") flag:\n\n```\nbeet ibroadcast -p\n```\n\nI recommend starting with a small query, to get a feel for how it works. E.g.:\n\n```\nbeet ibroadcast -p artist:Offspring album:Americana\n```\n\nIf you like what you see, do it again without `-p` and see how it goes.\nOnce you have some confidence in the tool, you can go nuts with larger queries.\n\n### How does beets-ibroadcast avoid redundant uploads?\n\nWhen a track is uploaded, the plugin attaches `ib_uploadtime` and `ib_trackid`\nflexible attributes to the track. The next time that track is considered for\nupload, these attributes are examined: if the track's `mtime` is older than its\n`ib_uploadtime`, the track is assumed to be up to date, and the upload is\nskipped.\n\nFor tracks where `mtime` is newer, the track is uploaded again, and the\nprevious track ID is trashed. As such, obsolete previous versions of tracks\nwill appear in your iBroadcast trash until it is emptied.\n\nRegardless: before uploading, the track's MD5 checksum is computed, and if the\nserver already has a track with that checksum, the upload is skipped. As such,\nif you upload tracks with a different uploader than beets-ibroadcast, they will\nstill be skipped (although as of this writing, beets-ibroadcast will read such\nfiles to compute their checksums every time they match a query, which will\nimpact performance).\n\nYou can use the `-f` flag to skip these checks and force reupload of tracks.\n\n### How are tags synced?\n\nThis plugin syncs tags on the iBroadcast side with the `usertags` flexible\nattribute, in a way compatible with the [usertag plugin][1].\n\nIf you modify a track's tags locally (e.g. via `beet addtag`), those changes\nwill be synced to iBroadcast. If you modify a track's tags remotely (e.g. via\nthe iBroadcast website), those changes will be synced to the beets database.\n\nIn order to know whether a track's tags were changed locally, remotely, or\nboth since the last sync, the current state of the tags is stored in an\n`ib_tagids` flexible attribute upon each successful sync. This strategy makes\nit clear whether, for example, a tag that exists remotely but not locally was\ndeleted locally versus added remotely; as such, there cannot be tag conflicts.\n\nSee the [usertag plugin documentation][1] for details on working with tags in\nyour beets database.\n\n### How are playlists synced?\n\nThe plugin syncs playlists on the iBroadcast side with M3U playlist files\nstored locally in your playlists directory, as configured by the\n[playlist plugin][2].\n\nIf you modify a playlist locally (e.g. by editing an M3U file), those changes\nwill be synced to iBroadcast. If you modify a playlist remotely (e.g. via the\niBroadcast website), those changes will be noticed, but not acted upon;\ninstead, a message will be printed that the plugin is not smart enough to\nupdate your corresponding M3U file yet. PRs welcome to implement this feature!\nIf a playlist has been modified both locally and remotely, the plugin will\nreport the situation, but take no action.\n\nIn order to know whether a playlist's tracks were changed locally, remotely,\nor both since the last sync, the playlist's current state is stored in a hidden\nfile `.ibroadcast-playlists.json` in the base directory of your beets library.\n\nSee the [playlist plugin documentation][2] for details on working with\nplaylists in your beets library.\n\n### How can I upload all my playlists at once?\n\nOne gotcha with playlist syncing is that playlists can only be synced from\nlocal to remote when the query you pass to the plugin matches all tracks of a\nplaylist. So one simple way to sync all your playlists is to upload your entire\nbeets library, by passing an empty query:\n\n```\nbeet ibroadcast\n```\n\nWhat if you don't want to upload your entire beets library to iBroadcast,\nthough, but you still want to upload all tracks that are part of a playlist?\nHere is one way to accomplish that:\n\n```\ncat /path/to/playlists/*.m3u | sort -u \u003e /tmp/tracks-to-upload.m3u\nbeet ibroadcast playlist:/tmp/tracks-to-upload.m3u\nrm /tmp/tracks-to-upload.m3u\n```\n\nThis will merge all the playlists in `/path/to/playlists/*.m3u` into a single\ntemporary playlist file, which you then feed as your beets query; the\nibroadcast plugin will then ensure all tracks matching the query are uploaded,\nand all playlists including those tracks are synced. This trick assumes that\nyou have configured the playlist directory in your beets config as follows:\n\n```yaml\nplaylist:\n  playlist_dir: /path/to/playlists\n```\n\nOtherwise, the ibroadcast plugin can't find and sync your M3U files.\n\n### How can I get more details about why things go wrong?\n\nYou can tell beets to be more verbose in its output using the `-v` flag. E.g.:\n\n```\nbeet -v ibroadcast usertags:favorites\n```\n\nThis will cause the ibroadcast plugin to emit more detailed debugging messages.\n\n[1]: https://github.com/igordertigor/beets-usertag\n[2]: https://beets.readthedocs.io/en/stable/plugins/playlist.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctrueden%2Fbeets-ibroadcast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fctrueden%2Fbeets-ibroadcast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctrueden%2Fbeets-ibroadcast/lists"}