Join the Agent Deck Discord Server!
Check out the Agent Deck community on Discord – hang out with 357 other members and enjoy free voice and text chat.
What Vibo listeners share about the music they play: cue sheets, lyric sheets, comments, mixtapes and Subsonic servers.
SocialJavaScript · ShellGitHub @outcast1000OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Viboplr plugin: share Now Playing cue sheets on Viboplr Community and import ones others made
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗community)This plugin is the Viboplr client for Viboplr Community, where listeners share things with each other. Browsing is the website's, and so is "what I shared": since 1.7 the plugin has no view of its own and does only what needs the app — publish what's on this computer, take a shared item into the app, the Community tab on Viboplr's own pages, and what runs while you listen. The website shows everything shared and, on a member's page, everything they added (with Edit and Unpublish).
community_track / community_album / community_artist, display kind plugin_view — app 1.0.97+). It holds everything shared about that page, each action answered in place (the tab is redrawn with api.informationTypes.setSectionData):
PUT /v1/likes); neither the tab nor the website likes them (since 1.7.1 — the server answers 410 to PUT /v1/subjects/{id}/like), so Community can't drift from the app./v1/subjects/{id}/children).settingsPanel, Extensions → Viboplr Community → Configuration): Account (signed in as whom, Sign out; or Sign in with GitHub / with a code, and the code while a sign-in waits; Open my page / Open website), While you listen (seek-bar ticks, shared cue sheets in Now Playing), Send from Viboplr (plays, likes), Share with Viboplr Community (waveforms).INTEGRATIONS in index.js, keyed by kind) add what only app code can do:
api.cues. A sheet imported from the community that you haven't changed isn't yours to publish.api.lyrics.save, the same write as the in-app lyrics editor. The plugin is not a lyrics provider; it keeps only lyricsImports (song → item id + version) for the badges and Undo. Importing over synced lyrics the song already has asks first — in the song's tab when imported from there, else in a notice — and says where the current ones came from. Undo lyrics import (the song's tab) re-walks the user's provider chain. Publish shares whatever synced lyrics the app has for the song, from any source.{ communityId, communityVersion } in its playlist metadata. Only title, artist, album and length are ever sent.viboplr://add-collection).api.playback.setMarkers), the comment shown when you point at one. With them on, every song you play is looked up on the server, which is why they start off.api.ui.getContext / onContextChanged, permission ui:read — the view or audio fullscreen, the window visible, not the mini player), signed in, and the song has no sheet of yours: GET /v1/items?kind=cue_sheet asked anonymously, your own published sheets dropped, the most imported first. A sheet fits when its durationSecs is within 3 s of the playing copy; when either side has no length the fit can't be checked, so auto never imports it and notify offers it only when nothing fits exactly, saying the timing wasn't checked. Notify shows a toast with Import; auto goes through the ordinary import (provenance kept, so Undo import works). A suggested import never raises the Replace? question: it re-reads api.cues.get first and leaves a sheet of yours alone. The toast's button is one fixed UI action (the host runs it with no payload, and actions can't be unregistered), so what each toast offers is kept by song and Import imports the offer for the song playing now, or nothing. Each song is checked once ever, counted only once the check has an answer (own sheet, nothing fits, offered or imported) — a failed lookup or a song that changed meanwhile is asked again (cueAsked in storage, capped at 1000; checks in flight are kept in memory so one song is asked once at a time).api.waveforms.onLookup / onShare, POST /v1/waveforms/lookup and PUT /v1/waveforms as the member, so Community keeps a private record of which songs the member holds and in what format (removable with Delete my play history on the website) besides the anonymous public format stats. A lookup arriving before the saved session is read back waits for it, inside the app's ~3 s budget; routine failures (offline, timeouts, 429, 5xx) log as warnings./v1/subjects/resolve, asked anonymously and kept a minute for the header line, the mini player item and the ticks; the tab asks fresh, as you): the track page's header shows "♥ 128 · 2 cue sheets · 1 lyric sheet on Community" (community_shared, title_line, which Viboplr keeps for six hours), and the mini player's Shared on Community item says the same — off by default, for the same reason as the ticks.Adding a module: declare it on the server (src/modules.rs in viboplr-community). It then shows on the website and on viboplr.com's Community page, and is named in the counts here, without a release. Add an INTEGRATIONS entry only when the module should do something in the app beyond opening its page.
Sign-in and links:
viboplr://plugin/community/auth, and the plugin trades it for a revocable token using PKCE.POST /auth/device, shows it, and opens community.viboplr.com/device?code=…. You sign in there and confirm the code, in that browser or on any other device. Meanwhile the plugin polls POST /auth/device/token and receives the same kind of token once you confirm. Nothing has to come back from the browser, so this works behind company proxies that isolate the browser, where the viboplr:// link can't reach the app. Starting one sign-in gives up the other, so a late link from an abandoned browser sign-in is ignored.
viboplr://plugin/community/open?id=… (the Open in Viboplr button on a cue sheet, lyrics or mixtape page) ask in a notice — "Import this cue sheet?", "Save this mixtape?" — whose button does it; unanswered, it waits in the app's notifications list. A notice's button carries no payload, so the latest question is the one answered, and a question that would replace something the song has ("Replace your cue sheet?") has its own button (answer-replace, a warning), so a leftover Import can never be what replaces it. Anything else (a Subsonic server, a kind this build doesn't know) opens its page on the website.viboplr://plugin/community/subject?id=… (the Open in Viboplr button on a song, album or artist page) opens Viboplr's own page for it, on its Community tab.It needs Viboplr 1.0.97+, the first release with interactive information tabs (plugin_view), api.informationTypes.setSectionData, api.ui.navigateToEntity and api.playback.setMarkers. It runs on the worker runtime with these permissions:
network:community.viboplr.comsystem:opencues:read / cues:writeplayback:read (the playing song's moment for a comment)playback:markers (the seek-bar ticks, only once you switch them on)library:read / library:write (read a playlist you publish; save a mixtape)lyrics:write (put lyrics you import in place)plugins:call (read a song's lyrics through the app's lyrics providers to publish them, and look a song up again on Undo import)It needs the Viboplr Community server with music areas (subject search, activity, likes, comments, /v1/subjects/{id}/children).
The server lives in outcast1000/viboplr-community.
node --test # tests (fake host in test/harness)
node --check index.js
scripts/package.sh # community.zip + update.json
Release by pushing a v<version> tag that matches manifest.json. CI then publishes the release.
To live-test against a local server:
SERVER at it.permissions.devPluginPath).