From fddb7b6a5cf59c8818ae869da0283adc4e598e49 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sat, 17 Aug 2024 22:57:29 +0200 Subject: [PATCH 01/33] =?UTF-8?q?=F0=9F=91=BD=EF=B8=8F=20upgraded=20code?= =?UTF-8?q?=20to=20socket.io=20usage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- connector.js | 99 +++++++++++++++++++++++++++++----------------------- index.html | 5 ++- 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/connector.js b/connector.js index abaa0f3..d668eab 100644 --- a/connector.js +++ b/connector.js @@ -20,64 +20,77 @@ function startWebSocket() { // Connect to the websocket server console.debug('[DEBUG] [Init] Configuring websocket connection...'); - const CiderApp = new WebSocket('ws://localhost:10766/ws'); - window.app = CiderApp; + const CiderApp = io("http://localhost:10767/", { + transports: ['websocket'] + }); - CiderApp.addEventListener("open", (event) => { - console.debug('[DEBUG] [Init] Websocket connection established!'); + CiderApp.on("connect", (event) => { + console.debug('[DEBUG] [Init] Socket.io connection established!'); document.getElementById("title").innerText = "Cider4OBS Connector | Connection established!"; document.getElementById("artist").innerText = "Start playing something!"; document.getElementById("album").innerText = "-/-"; }); // Set up websocket artwork/information handling - CiderApp.addEventListener("message", (event) => { - if (event.data !== undefined || event.data !== null) { - try { - let playbackInfo = JSON.parse(event.data); - - if (playbackInfo.data?.status !== undefined || playbackInfo.data?.artwork?.url !== undefined || playbackInfo.data?.name !== undefined) { - updateComponents(playbackInfo.data); - if (pauseTimer && playbackInfo.data?.isPlaying) { - clearTimeout(pauseTimer); - pauseTimer = undefined; - document.getElementById("content").style.opacity = 1; - } + CiderApp.on("API:Playback", ({ data, type }) => { + // actual data change + if (type == "playbackStatus.playbackStateDidChange") { + // fade handler + if (data.state == "paused" && !pauseTimer && settings.fade_on_stop) { + pauseTimer = setTimeout(() => { + document.getElementById("content").style.opacity = 0; + }, settings.fade_delay); + } + else if (data.state == "playing" && pauseTimer) { + clearTimeout(pauseTimer); + pauseTimer = undefined; + document.getElementById("content").style.opacity = 1; + } - // console.debug(playbackInfo.data); - } else { - if (!playbackInfo.data?.isPlaying && !pauseTimer && settings.fade_on_stop) { - pauseTimer = setTimeout(() => { - document.getElementById("content").style.opacity = 0; - }, settings.fade_delay); - } - console.debug("[DEBUG] [WS] PlaybackInfo is undefined or null, skipping to avoid errors.") - console.debug(event) - } - } catch (error) { - console.debug('[DEBUG] [WS] Websocket parsing error:', error); + // data handler + document.getElementById("title").innerText = data.attributes.name; + document.getElementById("artist").innerText = data.attributes.artistName; + document.getElementById("album").innerText = data.attributes.albumName; + let aw = data.attributes.artwork; + let tmp = aw.url.replace("{w}", aw.width); + tmp = tmp.replace("{h}", aw.height); + // console.debug(tmp); + document.getElementById("albumimg").src = tmp; + } + // playback updates + else if (type == "playbackStatus.playbackTimeDidChange") { + if (document.getElementById("artist").innerText == "Start playing something!") { + document.getElementById("artist").innerText = "Please pause and unpause the track to update track info!"; + document.getElementById("title").innerText = "Cider4OBS Connector | Connection established, but incomplete data!"; } - } else { - console.log("[DEBUG] [WS] Websocket message is undefined or null, skipping.") + // progress bar handler + document.getElementById("progressBar").style.width = ( + ((data.currentPlaybackTime / data.currentPlaybackDuration) * 100) + "%" + ); + } + else { + // just in case + console.debug(type, data); } }); - CiderApp.addEventListener("close", (event) => { - document.getElementById("title").innerText = "Cider4OBS Connector | Connection failed! Retrying..."; - document.getElementById("artist").innerText = "Are you sure Cider (version 2.3 and above) is running and you have WebSockets enabled? (Settings > Connectivity > WebSockets API)"; - document.getElementById("album").innerText = "-/-" - console.debug('[DEBUG] [Init] Websocket connection closed!'); - console.debug("[DEBUG] [Init] Retrying in 5 seconds...") - setTimeout(startWebSocket, 5000); + + CiderApp.on("disconnect", (event) => { + document.getElementById("title").innerText = "Cider4OBS Connector | Disconnected! Retrying..."; + document.getElementById("artist").innerText = "-/-"; + document.getElementById("album").innerText = "-/-"; + document.getElementById("albumimg").src = "c4obs.png"; + console.debug('[DEBUG] [Init] Socket.io connection closed!'); + console.debug("[DEBUG] [Init] Retrying automatically...") }); - CiderApp.addEventListener("error", (error) => { - console.debug('[DEBUG] [Init] Websocket error:', error); - console.debug("[DEBUG] [Init] Retrying in 5 seconds...") - setTimeout(startWebSocket, 5000); + + CiderApp.on("connect_error", (error) => { + document.getElementById("albumimg").src = "c4obs.png"; + console.debug("[DEBUG] [Init] Retrying automatically...") }); + } catch (error) { console.debug('[DEBUG] [Init] Code error:', error); - console.debug("[DEBUG] [Init] Retrying in 5 seconds...") - setTimeout(startWebSocket, 1000); + console.debug("[DEBUG] [Init] Retrying automatically...") } } function updateComponents(pb) { diff --git a/index.html b/index.html index ee6b411..07651ec 100644 --- a/index.html +++ b/index.html @@ -5,13 +5,16 @@ Cider4OBS +
- +
Cider4OBS Connector | Connecting...
-/-
From bad29984a20db40464311b5cc7816bee6d25e6b4 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sat, 17 Aug 2024 22:57:42 +0200 Subject: [PATCH 02/33] =?UTF-8?q?=E2=9C=A8=20added=20logo=20lmao?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c4obs.png | Bin 0 -> 158202 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 c4obs.png diff --git a/c4obs.png b/c4obs.png new file mode 100644 index 0000000000000000000000000000000000000000..193550c4657465e766c30b752fb8399cb12de68b GIT binary patch literal 158202 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

R2 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%0DPcnfAoImSO(9Gy$N|uJb}(r2oN67fy?wz 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

  • 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 Date: Sat, 17 Aug 2024 23:01:08 +0200 Subject: [PATCH 03/33] oops accidentally broke that --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 07651ec..8b0cd0b 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@
    - +
    Cider4OBS Connector | Connecting...
    -/-
    From 21ffea7c0dbe3326a4dd1fc8d01e9d64163960bc Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sat, 17 Aug 2024 23:04:39 +0200 Subject: [PATCH 04/33] readded connect error --- connector.js | 1 + 1 file changed, 1 insertion(+) diff --git a/connector.js b/connector.js index d668eab..77d6ed2 100644 --- a/connector.js +++ b/connector.js @@ -85,6 +85,7 @@ function startWebSocket() { CiderApp.on("connect_error", (error) => { document.getElementById("albumimg").src = "c4obs.png"; + console.debug("[DEBUG] [Init] Connect Error: " + error); console.debug("[DEBUG] [Init] Retrying automatically...") }); From a721fd45b7c1e2078af744b4b514055256027667 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sat, 17 Aug 2024 23:11:04 +0200 Subject: [PATCH 05/33] =?UTF-8?q?=F0=9F=93=9D=20updated=20documentary=20af?= =?UTF-8?q?ter=20#4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6005755..9da9854 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,15 @@ ## ❗ Requirements * [Open Broadcaster Software](https://obsproject.com/) -* [Cider 2.3+](https://cider.sh) +* [Cider 2.5+](https://cider.sh) * An Apple Music subscription (duh) ## 🛠 Setup -1. Setup Cider if you haven't done so already and open the settings. Go to "Connectivity" and scroll down all the way. Enable the Switch "WebSockets API". +1. Setup Cider if you haven't done so already and open the settings. Go to "Connectivity" and scroll down all the way. Enable the Switch "WebSockets API". This isn't technically needed anymore, but it's good to have it enabled nevertheless. 2. Create a new Browser Source in OBS and set the URL to [`https://ryzetech.github.io/cider4obs/`](https://ryzetech.github.io/cider4obs/). 3. The source will spawn with a width of `800` by default. Resize it if necessary (my personal sweet spot is `400`) and change the height to `170` or something like that. 4. The browser in OBS will now attempt to connect to Cider every five seconds and reestablish the connection if necessary! +5. If you want to customize how the app is looking, read below. Add the options into the Custom CSS box of OBS! ## 🎨 Customization & Settings Unhappy with the way the app looks and behaves by default? You can change the settings with the "Custom CSS" box in the OBS browser source. I have compiled some **examples** below to just copy and change to your liking. From 63f5641e26da996ef9186dbd2d53684a09e95457 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 18 Aug 2024 10:56:12 +0200 Subject: [PATCH 06/33] =?UTF-8?q?=F0=9F=90=9B=20fixes=20#5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- connector.js | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/connector.js b/connector.js index 77d6ed2..d4383c4 100644 --- a/connector.js +++ b/connector.js @@ -33,7 +33,7 @@ function startWebSocket() { // Set up websocket artwork/information handling CiderApp.on("API:Playback", ({ data, type }) => { - // actual data change + // data update on play/pause if (type == "playbackStatus.playbackStateDidChange") { // fade handler if (data.state == "paused" && !pauseTimer && settings.fade_on_stop) { @@ -47,15 +47,11 @@ function startWebSocket() { document.getElementById("content").style.opacity = 1; } - // data handler - document.getElementById("title").innerText = data.attributes.name; - document.getElementById("artist").innerText = data.attributes.artistName; - document.getElementById("album").innerText = data.attributes.albumName; - let aw = data.attributes.artwork; - let tmp = aw.url.replace("{w}", aw.width); - tmp = tmp.replace("{h}", aw.height); - // console.debug(tmp); - document.getElementById("albumimg").src = tmp; + updateComponents(data.attributes); + } + // data update on "track rollover" + else if (type == "playbackStatus.nowPlayingItemDidChange") { + updateComponents(data); } // playback updates else if (type == "playbackStatus.playbackTimeDidChange") { @@ -94,12 +90,11 @@ function startWebSocket() { console.debug("[DEBUG] [Init] Retrying automatically...") } } -function updateComponents(pb) { - document.getElementById("title").innerText = pb.name; - document.getElementById("artist").innerText = pb.artistName; - document.getElementById("album").innerText = pb.albumName; - document.getElementById("progressBar").style.width = (((pb.currentPlaybackTime / pb.durationInMillis) * 100000) + "%"); - let aw = pb.artwork; +function updateComponents(data) { + document.getElementById("title").innerText = data.name; + document.getElementById("artist").innerText = data.artistName; + document.getElementById("album").innerText = data.albumName; + let aw = data.artwork; let tmp = aw.url.replace("{w}", aw.width); tmp = tmp.replace("{h}", aw.height); // console.debug(tmp); From b4ead2cbd24676989465495b8476cc6e6b876230 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 18 Aug 2024 19:31:55 +0200 Subject: [PATCH 07/33] =?UTF-8?q?=F0=9F=93=9D=20beatutified=20readme=20onc?= =?UTF-8?q?e=20more?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9da9854..d602750 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,16 @@ +
    + + # 🎵 Cider 4 OBS 🔴 ### Connect your Cider Client to OBS and show what you're listening to! +![Apple Music](https://img.shields.io/badge/Apple_Music-9933CC?style=for-the-badge&logo=apple-music&logoColor=white) +![JavaScript](https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge&logo=javascript&logoColor=%23F7DF1E) +![Socket.io](https://img.shields.io/badge/Socket.io-black?style=for-the-badge&logo=socket.io&badgeColor=010101) +![Github Pages](https://img.shields.io/badge/github%20pages-121013?style=for-the-badge&logo=github&logoColor=white) + +
    + ## ❗ Requirements * [Open Broadcaster Software](https://obsproject.com/) * [Cider 2.5+](https://cider.sh) @@ -78,24 +88,42 @@ Customizable elements are `#progressBg, #progressBar`. Some settings adjusting the behavior of certain elements. ```css body { - /* general key: 1=on, 0=off */ + /* general key unless stated otherwise: 1=on, 0=off */ /* fade the box in and out depending on whether music is playing or not */ --fade-on-stop: 1; - /* how long playback must be paused until the box fades (if enabled) */ + /* how long playback must be paused in milliseconds until the box fades (if enabled) */ --fade-delay: 1000; } ``` ## 💜 Trusted by streamers -Thank you for supporting this project with links and by word-of-mouth! You are my heroes! +Thank you for supporting this project by using and spreading it! You are my heroes! -| [ 🥇 iamtheratio](https://www.twitch.tv/iamtheratio) | -|:-----------------------------------------------------------------------------------------:| +
    + +| [ 🥇 iamtheratio](https://www.twitch.tv/amtheratio) | +|:-:| | [![iamtheratio](https://zip.finnley.dev/r/DErk2u.png)](https://www.twitch.tv/iamtheratio) | +
    + Do you want to appear here? Open a new issue and outline your involvement. I'll be happy to add you here! +## ❤ Special Thanks +A list of entities I want to thank for supporting me in different ways! + +
    + +| [![logo](https://avatars.githubusercontent.com/u/87914859?s=70)
    Cider Collective](https://github.com/ciderapp/) | +| :-: | +| Thank you so much for giving me access to early builds,
    making change response much faster! | + +| [![logo](https://static-cdn.jtvnw.net/jtv_user_pictures/245fe4a9-fc34-411f-8db8-c27728ca6e7e-profile_image-70x70.png)
    Aquasius](https://www.twitch.tv/aquasius) | +| :-: | +| Thanks for the original idea, initial feedback,
    and the driving force to make this open source! | +
    + ## Issues, Ideas, Comments? Tell me in the issues tab! <3 \ No newline at end of file From 6d9a6ba0b9a17bb2e966c7be28ff3ec31aa4d8bc Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 20 Aug 2024 21:38:11 +0200 Subject: [PATCH 08/33] Add issue templates --- .github/ISSUE_TEMPLATE/i-have-an-idea-.md | 20 ++++++++++++ .../something-isn-t-working-.md | 31 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/i-have-an-idea-.md create mode 100644 .github/ISSUE_TEMPLATE/something-isn-t-working-.md diff --git a/.github/ISSUE_TEMPLATE/i-have-an-idea-.md b/.github/ISSUE_TEMPLATE/i-have-an-idea-.md new file mode 100644 index 0000000..61c57e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/i-have-an-idea-.md @@ -0,0 +1,20 @@ +--- +name: I have an idea! +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/something-isn-t-working-.md b/.github/ISSUE_TEMPLATE/something-isn-t-working-.md new file mode 100644 index 0000000..9e2e026 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/something-isn-t-working-.md @@ -0,0 +1,31 @@ +--- +name: Something isn't working! +about: Create a report to help me fix issues +title: '' +labels: bug +assignees: '' + +--- + +**Preamble** +[ ] I have checked previous open and closed issues and didn't find any help +[ ] I agree to follow the [code of conduct](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) + +**Cider Version used** +e.g. 2.5.0 + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Additional context** +Add any other context about the problem here. From 40191c6c1bc6020e16283b9c34d6883b414d2364 Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 20 Aug 2024 21:39:33 +0200 Subject: [PATCH 09/33] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..ffb518d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +conduct@finnley.dev. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From 2ea861977d15ff1649467d52aa07adec7f380b36 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Mon, 2 Sep 2024 19:37:57 +0200 Subject: [PATCH 10/33] =?UTF-8?q?=E2=9C=A8=20=20Add=20support=20for=20disc?= =?UTF-8?q?onnect=20fade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- connector.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/connector.js b/connector.js index d4383c4..3ae459a 100644 --- a/connector.js +++ b/connector.js @@ -1,4 +1,5 @@ let pauseTimer; +let disconnectTimer; let settings; function getVarFromBody(name) { return window.getComputedStyle(document.body).getPropertyValue(name); } @@ -6,6 +7,7 @@ function getVarFromBody(name) { return window.getComputedStyle(document.body).ge function getSettings() { return { fade_on_stop: getVarFromBody('--fade-on-stop') == 1, + fade_on_disconnect: getVarFromBody('--fade-on-disconnect') == 1, fade_delay: getVarFromBody('--fade-delay') || 2000, } } @@ -29,6 +31,12 @@ function startWebSocket() { document.getElementById("title").innerText = "Cider4OBS Connector | Connection established!"; document.getElementById("artist").innerText = "Start playing something!"; document.getElementById("album").innerText = "-/-"; + + if (disconnectTimer) { + clearTimeout(disconnectTimer); + disconnectTimer = undefined; + document.getElementById("content").style.opacity = 1; + } }); // Set up websocket artwork/information handling @@ -76,7 +84,13 @@ function startWebSocket() { document.getElementById("album").innerText = "-/-"; document.getElementById("albumimg").src = "c4obs.png"; console.debug('[DEBUG] [Init] Socket.io connection closed!'); - console.debug("[DEBUG] [Init] Retrying automatically...") + console.debug("[DEBUG] [Init] Retrying automatically..."); + + if (!disconnectTimer && settings.fade_on_disconnect) { + disconnectTimer = setTimeout(() => { + document.getElementById("content").style.opacity = 0; + }, settings.fade_delay); + } }); CiderApp.on("connect_error", (error) => { From 3b29e4b7845d39b2f6cb50ca4c35f6f375a87118 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Mon, 2 Sep 2024 19:38:28 +0200 Subject: [PATCH 11/33] =?UTF-8?q?=F0=9F=93=9D=20updated=20documentation=20?= =?UTF-8?q?to=20f6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d602750..00b1c94 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![Apple Music](https://img.shields.io/badge/Apple_Music-9933CC?style=for-the-badge&logo=apple-music&logoColor=white) ![JavaScript](https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge&logo=javascript&logoColor=%23F7DF1E) ![Socket.io](https://img.shields.io/badge/Socket.io-black?style=for-the-badge&logo=socket.io&badgeColor=010101) -![Github Pages](https://img.shields.io/badge/github%20pages-121013?style=for-the-badge&logo=github&logoColor=white) +![GitHub Pages](https://img.shields.io/badge/github%20pages-121013?style=for-the-badge&logo=github&logoColor=white)
    @@ -93,6 +93,9 @@ body { /* fade the box in and out depending on whether music is playing or not */ --fade-on-stop: 1; + /* the box will fade out when Cider disconnects and appears on reconnecting */ + --fade-on-disconnect: 1; + /* how long playback must be paused in milliseconds until the box fades (if enabled) */ --fade-delay: 1000; } From 5dedb9a162a8037e1400dbe660c9324871a14829 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Mon, 2 Sep 2024 20:44:03 +0200 Subject: [PATCH 12/33] =?UTF-8?q?=E2=9C=A8=20added=20addtitional=20fade=20?= =?UTF-8?q?delay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++-- connector.js | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 00b1c94..1a54290 100644 --- a/README.md +++ b/README.md @@ -93,11 +93,14 @@ body { /* fade the box in and out depending on whether music is playing or not */ --fade-on-stop: 1; + /* how long playback must be paused in milliseconds until the box fades (if enabled) */ + --fade-delay: 1000; + /* the box will fade out when Cider disconnects and appears on reconnecting */ --fade-on-disconnect: 1; - /* how long playback must be paused in milliseconds until the box fades (if enabled) */ - --fade-delay: 1000; + /* the delay in milliseconds after the player has disconnected until the box fades */ + --fade-disconnect-delay: 3000; } ``` diff --git a/connector.js b/connector.js index 3ae459a..105c5a5 100644 --- a/connector.js +++ b/connector.js @@ -9,6 +9,7 @@ function getSettings() { fade_on_stop: getVarFromBody('--fade-on-stop') == 1, fade_on_disconnect: getVarFromBody('--fade-on-disconnect') == 1, fade_delay: getVarFromBody('--fade-delay') || 2000, + fade_disconnect_delay: getVarFromBody('--fade-disconnect-delay') || getVarFromBody('--fade-delay') || 2000, } } @@ -89,7 +90,7 @@ function startWebSocket() { if (!disconnectTimer && settings.fade_on_disconnect) { disconnectTimer = setTimeout(() => { document.getElementById("content").style.opacity = 0; - }, settings.fade_delay); + }, settings.fade_disconnect_delay); } }); From 94bb6b5057d27f915210126d40463f64697e5fb2 Mon Sep 17 00:00:00 2001 From: Finn Date: Thu, 19 Sep 2024 20:38:22 +0200 Subject: [PATCH 13/33] Updated contact ways --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1a54290..e3c77cc 100644 --- a/README.md +++ b/README.md @@ -132,4 +132,5 @@ A list of entities I want to thank for supporting me in different ways!
    ## Issues, Ideas, Comments? -Tell me in the issues tab! <3 \ No newline at end of file +Tell me in the issues tab! <3 +Don't have a GitHub account? Feel free to contact me on [Discord](discord://-/users/373135347791560706), [Telegram](https://t.me/finnleyfox), or via [Mail](mailto:cider4obs@finnley.dev) From 812955351607d16ef42440695798445670b033f7 Mon Sep 17 00:00:00 2001 From: Finn Date: Thu, 19 Sep 2024 20:43:18 +0200 Subject: [PATCH 14/33] reupdate readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e3c77cc..caa5670 100644 --- a/README.md +++ b/README.md @@ -133,4 +133,4 @@ A list of entities I want to thank for supporting me in different ways! ## Issues, Ideas, Comments? Tell me in the issues tab! <3 -Don't have a GitHub account? Feel free to contact me on [Discord](discord://-/users/373135347791560706), [Telegram](https://t.me/finnleyfox), or via [Mail](mailto:cider4obs@finnley.dev) +Don't have a GitHub account? Feel free to contact me on [Discord](https://discord.com/users/373135347791560706), [Telegram](https://t.me/finnleyfox), or via [Mail](mailto:cider4obs@finnley.dev) From d8970845173a5628b697f617a6866252d3b2f4d1 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Mon, 6 Jan 2025 22:17:47 +0100 Subject: [PATCH 15/33] =?UTF-8?q?=E2=9C=A8=20add=20hide=5Fon=5Fidle=5Fconn?= =?UTF-8?q?ect=20setting=20to=20control=20content=20visibility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- connector.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/connector.js b/connector.js index 105c5a5..9a38262 100644 --- a/connector.js +++ b/connector.js @@ -10,6 +10,7 @@ function getSettings() { fade_on_disconnect: getVarFromBody('--fade-on-disconnect') == 1, fade_delay: getVarFromBody('--fade-delay') || 2000, fade_disconnect_delay: getVarFromBody('--fade-disconnect-delay') || getVarFromBody('--fade-delay') || 2000, + hide_on_idle_connect: getVarFromBody('--hide-on-idle-connect') == 1 } } @@ -33,6 +34,8 @@ function startWebSocket() { document.getElementById("artist").innerText = "Start playing something!"; document.getElementById("album").innerText = "-/-"; + if (settings.hide_on_idle_connect) document.getElementById("content").style.opacity = 0; + if (disconnectTimer) { clearTimeout(disconnectTimer); disconnectTimer = undefined; @@ -40,6 +43,12 @@ function startWebSocket() { } }); + /* itsy bitsy teeny weeny debuggy webuggy + CiderApp.onAny((event, ...args) => { + console.debug(Date.now().toString().substring(10) + ' [DEBUG] [Init] Event:', event, args); + }); + */ + // Set up websocket artwork/information handling CiderApp.on("API:Playback", ({ data, type }) => { // data update on play/pause @@ -50,7 +59,7 @@ function startWebSocket() { document.getElementById("content").style.opacity = 0; }, settings.fade_delay); } - else if (data.state == "playing" && pauseTimer) { + else if (data.state == "playing" && (pauseTimer || settings.hide_on_idle_connect)) { clearTimeout(pauseTimer); pauseTimer = undefined; document.getElementById("content").style.opacity = 1; @@ -67,6 +76,7 @@ function startWebSocket() { if (document.getElementById("artist").innerText == "Start playing something!") { document.getElementById("artist").innerText = "Please pause and unpause the track to update track info!"; document.getElementById("title").innerText = "Cider4OBS Connector | Connection established, but incomplete data!"; + document.getElementById("content").style.opacity = 1; } // progress bar handler document.getElementById("progressBar").style.width = ( From 6df0ce286c7975179668f88f5f571486a975c63a Mon Sep 17 00:00:00 2001 From: ryzetech Date: Mon, 6 Jan 2025 22:18:44 +0100 Subject: [PATCH 16/33] =?UTF-8?q?=F0=9F=93=9D=20updated=20documentation=20?= =?UTF-8?q?to=20align=20with=20f7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index caa5670..172679a 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,9 @@ body { /* the delay in milliseconds after the player has disconnected until the box fades */ --fade-disconnect-delay: 3000; + + /* hides the box when connection has been established but Cider is idle */ + --hide-on-idle-connect: 1; } ``` From 0c73896346424066cd770bb2a04a9435ec1419ea Mon Sep 17 00:00:00 2001 From: yuma-dev Date: Fri, 10 Jan 2025 15:32:19 +0100 Subject: [PATCH 17/33] hide unless playing --- connector.js | 34 +++++++++++++++++++++------------- style.css | 27 ++++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/connector.js b/connector.js index 9a38262..c057a22 100644 --- a/connector.js +++ b/connector.js @@ -10,7 +10,8 @@ function getSettings() { fade_on_disconnect: getVarFromBody('--fade-on-disconnect') == 1, fade_delay: getVarFromBody('--fade-delay') || 2000, fade_disconnect_delay: getVarFromBody('--fade-disconnect-delay') || getVarFromBody('--fade-delay') || 2000, - hide_on_idle_connect: getVarFromBody('--hide-on-idle-connect') == 1 + hide_on_idle_connect: getVarFromBody('--hide-on-idle-connect') == 1, + hide_unless_playing: getVarFromBody('--hide-unless-playing') == 1 } } @@ -34,12 +35,16 @@ function startWebSocket() { document.getElementById("artist").innerText = "Start playing something!"; document.getElementById("album").innerText = "-/-"; - if (settings.hide_on_idle_connect) document.getElementById("content").style.opacity = 0; + if (settings.hide_on_idle_connect || settings.hide_unless_playing) { + document.getElementById("content").style.opacity = 0; + } if (disconnectTimer) { clearTimeout(disconnectTimer); disconnectTimer = undefined; - document.getElementById("content").style.opacity = 1; + if (!settings.hide_unless_playing) { + document.getElementById("content").style.opacity = 1; + } } }); @@ -54,16 +59,19 @@ function startWebSocket() { // data update on play/pause if (type == "playbackStatus.playbackStateDidChange") { // fade handler - if (data.state == "paused" && !pauseTimer && settings.fade_on_stop) { - pauseTimer = setTimeout(() => { - document.getElementById("content").style.opacity = 0; - }, settings.fade_delay); - } - else if (data.state == "playing" && (pauseTimer || settings.hide_on_idle_connect)) { - clearTimeout(pauseTimer); - pauseTimer = undefined; - document.getElementById("content").style.opacity = 1; - } + if (data.state == "paused" && !pauseTimer && + (settings.fade_on_stop || settings.hide_unless_playing)) { + pauseTimer = setTimeout(() => { + document.getElementById("content").style.opacity = 0; + }, settings.fade_delay); + } + else if (data.state == "playing") { + if (pauseTimer) { + clearTimeout(pauseTimer); + pauseTimer = undefined; + } + document.getElementById("content").style.opacity = 1; + } updateComponents(data.attributes); } diff --git a/style.css b/style.css index c31a5d1..e1a1117 100644 --- a/style.css +++ b/style.css @@ -1,6 +1,10 @@ +body { + background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; +} + #content { width: 90%; - background-color: #55555555; + background-color: rgba(69, 69, 69, 0); border-radius: 5px; margin: 10px; padding: 10px; @@ -21,14 +25,21 @@ span { #albumimg { border-radius: 5px; + filter: drop-shadow(0px 0px 10px #000000); } #title { font-weight: bold; + filter: drop-shadow(0px 0px 10px #000000); +} + +#artist { + filter: drop-shadow(0px 0px 10px #000000); } #album { font-style: italic; + filter: drop-shadow(0px 0px 10px #000000); } #progressBg { @@ -36,11 +47,21 @@ span { width: 100%; height: auto; border-radius: 5px; - background-color: #55555555; + background: linear-gradient(to right, #a64ac9, #d668ff); + filter: drop-shadow(0px 0px 10px #000000); } #progressBar { border-radius: 5px; height: 10px; background-color: #70e000; -} \ No newline at end of file +} + +/* CSS Variables for configuration: + --fade-on-stop: 1 or 0 (default: 0) + --fade-on-disconnect: 1 or 0 (default: 0) + --fade-delay: time in ms (default: 2000) + --fade-disconnect-delay: time in ms (default: same as fade-delay) + --hide-on-idle-connect: 1 or 0 (default: 0) + --hide-unless-playing: 1 or 0 (default: 0) - Hides everything unless music is actively playing +*/ \ No newline at end of file From 047830328c4fc1534194d1e5fd64ab86a5bf9bb8 Mon Sep 17 00:00:00 2001 From: yuma-dev Date: Fri, 10 Jan 2025 15:35:58 +0100 Subject: [PATCH 18/33] . --- connector.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/connector.js b/connector.js index c057a22..024f7e2 100644 --- a/connector.js +++ b/connector.js @@ -81,12 +81,14 @@ function startWebSocket() { } // playback updates else if (type == "playbackStatus.playbackTimeDidChange") { - if (document.getElementById("artist").innerText == "Start playing something!") { - document.getElementById("artist").innerText = "Please pause and unpause the track to update track info!"; - document.getElementById("title").innerText = "Cider4OBS Connector | Connection established, but incomplete data!"; - document.getElementById("content").style.opacity = 1; + if (!settings.hide_unless_playing) { // Only show these messages if hide_unless_playing is disabled + if (document.getElementById("artist").innerText == "Start playing something!") { + document.getElementById("artist").innerText = "Please pause and unpause the track to update track info!"; + document.getElementById("title").innerText = "Cider4OBS Connector | Connection established, but incomplete data!"; + document.getElementById("content").style.opacity = 1; + } } - // progress bar handler + // progress bar handler - keep this part document.getElementById("progressBar").style.width = ( ((data.currentPlaybackTime / data.currentPlaybackDuration) * 100) + "%" ); @@ -104,8 +106,13 @@ function startWebSocket() { document.getElementById("albumimg").src = "c4obs.png"; console.debug('[DEBUG] [Init] Socket.io connection closed!'); console.debug("[DEBUG] [Init] Retrying automatically..."); - - if (!disconnectTimer && settings.fade_on_disconnect) { + + // Hide immediately if hide_unless_playing is enabled + if (settings.hide_unless_playing) { + document.getElementById("content").style.opacity = 0; + } + // Otherwise use the normal fade behavior + else if (!disconnectTimer && settings.fade_on_disconnect) { disconnectTimer = setTimeout(() => { document.getElementById("content").style.opacity = 0; }, settings.fade_disconnect_delay); From 5d9c1d8a26e21eb15353aa43d268656a9ac4aaff Mon Sep 17 00:00:00 2001 From: yuma-dev Date: Fri, 10 Jan 2025 15:40:21 +0100 Subject: [PATCH 19/33] revert css changes --- style.css | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/style.css b/style.css index e1a1117..c31a5d1 100644 --- a/style.css +++ b/style.css @@ -1,10 +1,6 @@ -body { - background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; -} - #content { width: 90%; - background-color: rgba(69, 69, 69, 0); + background-color: #55555555; border-radius: 5px; margin: 10px; padding: 10px; @@ -25,21 +21,14 @@ span { #albumimg { border-radius: 5px; - filter: drop-shadow(0px 0px 10px #000000); } #title { font-weight: bold; - filter: drop-shadow(0px 0px 10px #000000); -} - -#artist { - filter: drop-shadow(0px 0px 10px #000000); } #album { font-style: italic; - filter: drop-shadow(0px 0px 10px #000000); } #progressBg { @@ -47,21 +36,11 @@ span { width: 100%; height: auto; border-radius: 5px; - background: linear-gradient(to right, #a64ac9, #d668ff); - filter: drop-shadow(0px 0px 10px #000000); + background-color: #55555555; } #progressBar { border-radius: 5px; height: 10px; background-color: #70e000; -} - -/* CSS Variables for configuration: - --fade-on-stop: 1 or 0 (default: 0) - --fade-on-disconnect: 1 or 0 (default: 0) - --fade-delay: time in ms (default: 2000) - --fade-disconnect-delay: time in ms (default: same as fade-delay) - --hide-on-idle-connect: 1 or 0 (default: 0) - --hide-unless-playing: 1 or 0 (default: 0) - Hides everything unless music is actively playing -*/ \ No newline at end of file +} \ No newline at end of file From affba98fa71215d42b997d86e861c8faa5080778 Mon Sep 17 00:00:00 2001 From: yuma-dev Date: Fri, 10 Jan 2025 15:45:06 +0100 Subject: [PATCH 20/33] fixed --- style.css | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/style.css b/style.css index c31a5d1..a1406bc 100644 --- a/style.css +++ b/style.css @@ -1,12 +1,18 @@ #content { width: 90%; - background-color: #55555555; + background-color: rgba(69, 69, 69, 0); border-radius: 5px; margin: 10px; padding: 10px; transition: opacity 1s; } +body { + background-color: rgba(0, 0, 0, 0); + margin: 0px auto; + overflow: hidden; +} + #mainbox { display: flex; align-items: center; @@ -21,14 +27,21 @@ span { #albumimg { border-radius: 5px; + filter: drop-shadow(0px 0px 10px #000000); } #title { font-weight: bold; + filter: drop-shadow(0px 0px 10px #000000); +} + +#artist { + filter: drop-shadow(0px 0px 10px #000000); } #album { font-style: italic; + filter: drop-shadow(0px 0px 10px #000000); } #progressBg { @@ -37,10 +50,11 @@ span { height: auto; border-radius: 5px; background-color: #55555555; + filter: drop-shadow(0px 0px 10px #000000); } #progressBar { border-radius: 5px; height: 10px; - background-color: #70e000; + background: linear-gradient(to right, #a64ac9, #d668ff); } \ No newline at end of file From df8b6c5203d36971a63dbd160e3d234044849acf Mon Sep 17 00:00:00 2001 From: yuma-dev Date: Sat, 11 Jan 2025 16:27:54 +0100 Subject: [PATCH 21/33] initial state hidden --- connector.js | 5 +++++ index.html | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/connector.js b/connector.js index 024f7e2..c93455d 100644 --- a/connector.js +++ b/connector.js @@ -21,6 +21,11 @@ function startWebSocket() { // why does this work lmao setTimeout(() => { settings = getSettings(); + + // Add this new block to handle initial state + if (settings.hide_unless_playing) { + document.getElementById("content").style.opacity = 0; + } }, 100); // Connect to the websocket server diff --git a/index.html b/index.html index 8b0cd0b..4521a08 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,7 @@ -
    +
    From a1c10886b4d4d4e1fe7fd8c47817780a5edc16e7 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Mon, 13 Jan 2025 14:18:15 +0100 Subject: [PATCH 22/33] =?UTF-8?q?=E2=9C=A8=20progress=20bar=20smooth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/style.css b/style.css index c31a5d1..615fb60 100644 --- a/style.css +++ b/style.css @@ -43,4 +43,5 @@ span { border-radius: 5px; height: 10px; background-color: #70e000; + transition: width 0.25s; } \ No newline at end of file From 85e57661b900c1c4e9e044201b02b4f4e1905282 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Mon, 13 Jan 2025 14:22:49 +0100 Subject: [PATCH 23/33] forgot linear definiton woops --- style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/style.css b/style.css index 615fb60..d5453fc 100644 --- a/style.css +++ b/style.css @@ -43,5 +43,5 @@ span { border-radius: 5px; height: 10px; background-color: #70e000; - transition: width 0.25s; + transition: linear width 0.25s; } \ No newline at end of file From 8dcd8d3c0d9bbbb7ced89c714ddcb53fd9efe4fa Mon Sep 17 00:00:00 2001 From: Finn Date: Wed, 14 May 2025 13:32:40 +0200 Subject: [PATCH 24/33] update readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 172679a..78ed24b 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,9 @@ ![Socket.io](https://img.shields.io/badge/Socket.io-black?style=for-the-badge&logo=socket.io&badgeColor=010101) ![GitHub Pages](https://img.shields.io/badge/github%20pages-121013?style=for-the-badge&logo=github&logoColor=white) + +#### This project is NOT dormant, I'm always open for suggestions and issues! :) +
    ## ❗ Requirements From 5bff5ae158e111ec1f605a3542e1b899cab3c2a3 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 00:50:19 +0100 Subject: [PATCH 25/33] fix crossorigin issues --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 8b0cd0b..2937d88 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@
    - +
    Cider4OBS Connector | Connecting...
    -/-
    From 30924d5d9503e2206cd173916ed00d35bc751463 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 00:50:34 +0100 Subject: [PATCH 26/33] more ignoring on my part --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 470d402..5abc224 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ CiderWSPlaying.json +.vscode/settings.json +.history/ \ No newline at end of file From c427904d7b2639a67ab8afe7cd68819fc5a6943d Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 01:37:21 +0100 Subject: [PATCH 27/33] MAJOR refractors, no breaks! --- README.md | 66 +++++++----- connector.js | 291 ++++++++++++++++++++++++++++++--------------------- index.html | 26 +++-- style.css | 50 +++++---- 4 files changed, 261 insertions(+), 172 deletions(-) diff --git a/README.md b/README.md index 78ed24b..49e8ff1 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,14 @@ * An Apple Music subscription (duh) ## 🛠 Setup -1. Setup Cider if you haven't done so already and open the settings. Go to "Connectivity" and scroll down all the way. Enable the Switch "WebSockets API". This isn't technically needed anymore, but it's good to have it enabled nevertheless. -2. Create a new Browser Source in OBS and set the URL to [`https://ryzetech.github.io/cider4obs/`](https://ryzetech.github.io/cider4obs/). -3. The source will spawn with a width of `800` by default. Resize it if necessary (my personal sweet spot is `400`) and change the height to `170` or something like that. -4. The browser in OBS will now attempt to connect to Cider every five seconds and reestablish the connection if necessary! -5. If you want to customize how the app is looking, read below. Add the options into the Custom CSS box of OBS! +1. Setup Cider if you haven't done so already and open the settings. Go to **Connectivity** and scroll down all the way. Enable the **WebSockets API** switch. This isn't technically needed anymore, but it's good to have it enabled nevertheless. +2. Create a new **Browser Source** in OBS and set the URL to [`https://ryzetech.github.io/cider4obs/`](https://ryzetech.github.io/cider4obs/). +3. The source will spawn with a default width of `800`. Resize it if necessary (recommended: `400` width) and set the height to approximately `170`. +4. The browser will automatically attempt to connect to Cider and reestablish the connection if needed! +5. To customize appearance and behavior, see the customization section below. Add your custom CSS to the **Custom CSS** box in the OBS browser source settings! ## 🎨 Customization & Settings -Unhappy with the way the app looks and behaves by default? You can change the settings with the "Custom CSS" box in the OBS browser source. I have compiled some **examples** below to just copy and change to your liking. +Not happy with the default appearance and behavior? You can customize everything using the **Custom CSS** box in the OBS browser source settings. Here are some examples to copy and modify: To pick colors, I recommend https://rgbacolorpicker.com/. @@ -43,7 +43,7 @@ To pick colors, I recommend https://rgbacolorpicker.com/. ``` ### Text Customization -Customizable elements are `span, #title, #artist, #album` +Customizable elements are `span, .track-title, .track-artist, .track-album` ```css /* to change the text color, do */ span { @@ -52,19 +52,24 @@ span { } /* to make the title look neutral instead of bold, do: */ -#title { +.track-title { font-weight: normal; } /* similar with the album name (pay attention to the attribute!) */ -#album { +.track-album { font-style: normal; } /* you can even hide elements: */ -#album { +.track-album { display: none; } + +/* or target by ID if you prefer: */ +#title, #artist, #album { + /* your styles here */ +} ``` @@ -87,26 +92,39 @@ Customizable elements are `#progressBg, #progressBar`. } ``` -### Settings -Some settings adjusting the behavior of certain elements. +## ⚙️ Configuration Options + +You can control the behavior of the Cider4OBS overlay using CSS custom properties. Add these to the `body` selector in the OBS browser source's Custom CSS box: + ```css body { - /* general key unless stated otherwise: 1=on, 0=off */ - - /* fade the box in and out depending on whether music is playing or not */ - --fade-on-stop: 1; + /* Fade the box in/out when music is paused or stopped */ + --fade-on-stop: 1; /* 1 = enabled, 0 = disabled */ - /* how long playback must be paused in milliseconds until the box fades (if enabled) */ - --fade-delay: 1000; + /* Fade the box in/out when Cider disconnects */ + --fade-on-disconnect: 1; /* 1 = enabled, 0 = disabled */ - /* the box will fade out when Cider disconnects and appears on reconnecting */ - --fade-on-disconnect: 1; + /* Delay (ms) before fading out after pausing/stopping */ + --fade-delay: 2000; /* Default: 2000ms */ - /* the delay in milliseconds after the player has disconnected until the box fades */ - --fade-disconnect-delay: 3000; + /* Delay (ms) before fading out after disconnecting */ + --fade-disconnect-delay: 2000; /* Default: 2000ms, falls back to --fade-delay if not set */ - /* hides the box when connection has been established but Cider is idle */ - --hide-on-idle-connect: 1; + /* Hide the box when connected but Cider is idle */ + --hide-on-idle-connect: 1; /* 1 = enabled, 0 = disabled */ + + /* Hide the box unless music is playing */ + --hide-unless-playing: 1; /* 1 = enabled, 0 = disabled */ +} +``` + +**Tip:** You can combine these options to customize exactly when the overlay appears or fades out. For example, to only show the overlay when music is playing and fade out quickly when paused: + +```css +body { + --fade-on-stop: 1; + --fade-delay: 1000; + --hide-unless-playing: 1; } ``` diff --git a/connector.js b/connector.js index c93455d..9a0f06c 100644 --- a/connector.js +++ b/connector.js @@ -1,147 +1,204 @@ +// Constants +const CIDER_SOCKET_URL = "http://localhost:10767/"; +const SETTINGS_LOAD_DELAY = 100; +const DEFAULT_FADE_DELAY = 2000; + +// Element IDs +const ELEMENTS = { + content: 'content', + title: 'title', + artist: 'artist', + album: 'album', + albumImg: 'albumimg', + progressBar: 'progressBar' +}; + +// State let pauseTimer; let disconnectTimer; let settings; +let elements = {}; -function getVarFromBody(name) { return window.getComputedStyle(document.body).getPropertyValue(name); } +/** + * Cache DOM elements for better performance + */ +function cacheElements() { + Object.keys(ELEMENTS).forEach(key => { + elements[key] = document.getElementById(ELEMENTS[key]); + }); +} +/** + * Get CSS variable value from body + */ +function getCSSVariable(name) { + return window.getComputedStyle(document.body).getPropertyValue(name); +} + +/** + * Parse settings from CSS variables + */ function getSettings() { return { - fade_on_stop: getVarFromBody('--fade-on-stop') == 1, - fade_on_disconnect: getVarFromBody('--fade-on-disconnect') == 1, - fade_delay: getVarFromBody('--fade-delay') || 2000, - fade_disconnect_delay: getVarFromBody('--fade-disconnect-delay') || getVarFromBody('--fade-delay') || 2000, - hide_on_idle_connect: getVarFromBody('--hide-on-idle-connect') == 1, - hide_unless_playing: getVarFromBody('--hide-unless-playing') == 1 + fade_on_stop: getCSSVariable('--fade-on-stop') === '1', + fade_on_disconnect: getCSSVariable('--fade-on-disconnect') === '1', + fade_delay: parseInt(getCSSVariable('--fade-delay')) || DEFAULT_FADE_DELAY, + fade_disconnect_delay: parseInt(getCSSVariable('--fade-disconnect-delay')) || + parseInt(getCSSVariable('--fade-delay')) || DEFAULT_FADE_DELAY, + hide_on_idle_connect: getCSSVariable('--hide-on-idle-connect') === '1', + hide_unless_playing: getCSSVariable('--hide-unless-playing') === '1' + }; +} + +/** + * Set element opacity with optional delay + */ +function setOpacity(element, value, delay = 0) { + if (delay > 0) { + return setTimeout(() => { + element.style.opacity = value; + }, delay); + } + element.style.opacity = value; + return null; +} + +/** + * Clear and reset timer + */ +function clearTimer(timer) { + if (timer) { + clearTimeout(timer); + } + return undefined; +} + +/** + * Update display components with track data + */ +function updateComponents(data) { + elements.title.innerText = data.name; + elements.artist.innerText = data.artistName; + elements.album.innerText = data.albumName; + + const artworkUrl = data.artwork.url + .replace("{w}", data.artwork.width) + .replace("{h}", data.artwork.height); + elements.albumImg.src = artworkUrl; +} + +/** + * Handle playback state changes + */ +function handlePlaybackStateChange(state) { + if (state === "paused" && !pauseTimer && (settings.fade_on_stop || settings.hide_unless_playing)) { + pauseTimer = setOpacity(elements.content, 0, settings.fade_delay); + } else if (state === "playing") { + pauseTimer = clearTimer(pauseTimer); + elements.content.style.opacity = 1; + } +} + +/** + * Handle connection state + */ +function handleConnect() { + console.debug('[DEBUG] [Init] Socket.io connection established!'); + elements.title.innerText = "Cider4OBS Connector | Connection established!"; + elements.artist.innerText = "Start playing something!"; + elements.album.innerText = "-/-"; + + if (settings.hide_on_idle_connect || settings.hide_unless_playing) { + elements.content.style.opacity = 0; + } + + if (disconnectTimer) { + disconnectTimer = clearTimer(disconnectTimer); + if (!settings.hide_unless_playing) { + elements.content.style.opacity = 1; + } } } +/** + * Handle disconnection state + */ +function handleDisconnect() { + elements.title.innerText = "Cider4OBS Connector | Disconnected! Retrying..."; + elements.artist.innerText = "-/-"; + elements.album.innerText = "-/-"; + elements.albumImg.src = "c4obs.png"; + console.debug('[DEBUG] [Init] Socket.io connection closed!'); + console.debug("[DEBUG] [Init] Retrying automatically..."); + + if (settings.hide_unless_playing) { + elements.content.style.opacity = 0; + } else if (!disconnectTimer && settings.fade_on_disconnect) { + disconnectTimer = setOpacity(elements.content, 0, settings.fade_disconnect_delay); + } +} + +/** + * Handle playback API events + */ +function handlePlaybackEvent({ data, type }) { + switch (type) { + case "playbackStatus.playbackStateDidChange": + handlePlaybackStateChange(data.state); + updateComponents(data.attributes); + break; + + case "playbackStatus.nowPlayingItemDidChange": + updateComponents(data); + break; + + case "playbackStatus.playbackTimeDidChange": + if (!settings.hide_unless_playing && elements.artist.innerText === "Start playing something!") { + elements.artist.innerText = "Please pause and unpause the track to update track info!"; + elements.title.innerText = "Cider4OBS Connector | Connection established, but incomplete data!"; + elements.content.style.opacity = 1; + } + elements.progressBar.style.width = + `${(data.currentPlaybackTime / data.currentPlaybackDuration) * 100}%`; + break; + + default: + console.debug(type, data); + } +} + +/** + * Initialize WebSocket connection + */ function startWebSocket() { try { - // pausing so obs has time to inject the css - // why does this work lmao + // Pause to allow OBS to inject CSS setTimeout(() => { + cacheElements(); settings = getSettings(); - // Add this new block to handle initial state + // Set initial state if (settings.hide_unless_playing) { - document.getElementById("content").style.opacity = 0; + elements.content.style.opacity = 0; } - }, 100); + }, SETTINGS_LOAD_DELAY); - // Connect to the websocket server console.debug('[DEBUG] [Init] Configuring websocket connection...'); - const CiderApp = io("http://localhost:10767/", { + const CiderApp = io(CIDER_SOCKET_URL, { transports: ['websocket'] }); - CiderApp.on("connect", (event) => { - console.debug('[DEBUG] [Init] Socket.io connection established!'); - document.getElementById("title").innerText = "Cider4OBS Connector | Connection established!"; - document.getElementById("artist").innerText = "Start playing something!"; - document.getElementById("album").innerText = "-/-"; - - if (settings.hide_on_idle_connect || settings.hide_unless_playing) { - document.getElementById("content").style.opacity = 0; - } - - if (disconnectTimer) { - clearTimeout(disconnectTimer); - disconnectTimer = undefined; - if (!settings.hide_unless_playing) { - document.getElementById("content").style.opacity = 1; - } - } - }); - - /* itsy bitsy teeny weeny debuggy webuggy - CiderApp.onAny((event, ...args) => { - console.debug(Date.now().toString().substring(10) + ' [DEBUG] [Init] Event:', event, args); - }); - */ - - // Set up websocket artwork/information handling - CiderApp.on("API:Playback", ({ data, type }) => { - // data update on play/pause - if (type == "playbackStatus.playbackStateDidChange") { - // fade handler - if (data.state == "paused" && !pauseTimer && - (settings.fade_on_stop || settings.hide_unless_playing)) { - pauseTimer = setTimeout(() => { - document.getElementById("content").style.opacity = 0; - }, settings.fade_delay); - } - else if (data.state == "playing") { - if (pauseTimer) { - clearTimeout(pauseTimer); - pauseTimer = undefined; - } - document.getElementById("content").style.opacity = 1; - } - - updateComponents(data.attributes); - } - // data update on "track rollover" - else if (type == "playbackStatus.nowPlayingItemDidChange") { - updateComponents(data); - } - // playback updates - else if (type == "playbackStatus.playbackTimeDidChange") { - if (!settings.hide_unless_playing) { // Only show these messages if hide_unless_playing is disabled - if (document.getElementById("artist").innerText == "Start playing something!") { - document.getElementById("artist").innerText = "Please pause and unpause the track to update track info!"; - document.getElementById("title").innerText = "Cider4OBS Connector | Connection established, but incomplete data!"; - document.getElementById("content").style.opacity = 1; - } - } - // progress bar handler - keep this part - document.getElementById("progressBar").style.width = ( - ((data.currentPlaybackTime / data.currentPlaybackDuration) * 100) + "%" - ); - } - else { - // just in case - console.debug(type, data); - } - }); - - CiderApp.on("disconnect", (event) => { - document.getElementById("title").innerText = "Cider4OBS Connector | Disconnected! Retrying..."; - document.getElementById("artist").innerText = "-/-"; - document.getElementById("album").innerText = "-/-"; - document.getElementById("albumimg").src = "c4obs.png"; - console.debug('[DEBUG] [Init] Socket.io connection closed!'); - console.debug("[DEBUG] [Init] Retrying automatically..."); - - // Hide immediately if hide_unless_playing is enabled - if (settings.hide_unless_playing) { - document.getElementById("content").style.opacity = 0; - } - // Otherwise use the normal fade behavior - else if (!disconnectTimer && settings.fade_on_disconnect) { - disconnectTimer = setTimeout(() => { - document.getElementById("content").style.opacity = 0; - }, settings.fade_disconnect_delay); - } - }); - + CiderApp.on("connect", handleConnect); + CiderApp.on("API:Playback", handlePlaybackEvent); + CiderApp.on("disconnect", handleDisconnect); CiderApp.on("connect_error", (error) => { - document.getElementById("albumimg").src = "c4obs.png"; + elements.albumImg.src = "c4obs.png"; console.debug("[DEBUG] [Init] Connect Error: " + error); - console.debug("[DEBUG] [Init] Retrying automatically...") + console.debug("[DEBUG] [Init] Retrying automatically..."); }); } catch (error) { console.debug('[DEBUG] [Init] Code error:', error); - console.debug("[DEBUG] [Init] Retrying automatically...") + console.debug("[DEBUG] [Init] Retrying automatically..."); } -} -function updateComponents(data) { - document.getElementById("title").innerText = data.name; - document.getElementById("artist").innerText = data.artistName; - document.getElementById("album").innerText = data.albumName; - let aw = data.artwork; - let tmp = aw.url.replace("{w}", aw.width); - tmp = tmp.replace("{h}", aw.height); - // console.debug(tmp); - document.getElementById("albumimg").src = tmp; } \ No newline at end of file diff --git a/index.html b/index.html index 49e40ec..1b6b511 100644 --- a/index.html +++ b/index.html @@ -6,25 +6,31 @@ Cider4OBS + integrity="sha384-2huaZvOR9iDzHqslqwpR87isEmrfxqyWOF7hr7BY6KG0+hVKLoEXMPUJw3ynWuhO" + crossorigin="anonymous"> -
    +
    - -
    - Cider4OBS Connector | Connecting...
    - -/-
    - -/- + Album artwork +
    + Cider4OBS Connector | Connecting... + -/- + -/-
    -
    +
    -
    +
    diff --git a/style.css b/style.css index 2a1ad78..eafbdf0 100644 --- a/style.css +++ b/style.css @@ -1,53 +1,61 @@ +/* Body and root container */ +body { + background-color: rgba(0, 0, 0, 0); + margin: 0; + overflow: hidden; +} + #content { width: 90%; background-color: rgba(69, 69, 69, 0); border-radius: 5px; margin: 10px; padding: 10px; + opacity: 0; transition: opacity 1s; } -body { - background-color: rgba(0, 0, 0, 0); - margin: 0px auto; - overflow: hidden; -} - +/* Layout */ #mainbox { display: flex; align-items: center; - justify-content: left; + justify-content: flex-start; +} + +.track-info { + padding-left: 10px; + display: flex; + flex-direction: column; + gap: 2px; } +/* Text styles */ span { text-overflow: ellipsis; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - color:white; -} - -#albumimg { - border-radius: 5px; + color: white; filter: drop-shadow(0px 0px 10px #000000); } -#title { +.track-title { font-weight: bold; - filter: drop-shadow(0px 0px 10px #000000); } -#artist { - filter: drop-shadow(0px 0px 10px #000000); +.track-album { + font-style: italic; } -#album { - font-style: italic; +/* Album artwork */ +#albumimg { + border-radius: 5px; filter: drop-shadow(0px 0px 10px #000000); } +/* Progress bar */ #progressBg { margin-top: 10px; width: 100%; - height: auto; + height: 10px; border-radius: 5px; background-color: #55555555; filter: drop-shadow(0px 0px 10px #000000); @@ -55,7 +63,7 @@ span { #progressBar { border-radius: 5px; - height: 10px; + height: 100%; background-color: #70e000; - transition: linear width 0.25s; + transition: width 0.25s linear; } \ No newline at end of file From 0a25ef9bf2f49973148d1c8cc49d0fb9976a4fe9 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 02:01:07 +0100 Subject: [PATCH 28/33] Add time labels to progress bar and format playback time --- connector.js | 28 ++++++++++++++++++++++++++-- index.html | 8 ++++++-- style.css | 17 +++++++++++++++-- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/connector.js b/connector.js index 9a0f06c..2096935 100644 --- a/connector.js +++ b/connector.js @@ -10,7 +10,9 @@ const ELEMENTS = { artist: 'artist', album: 'album', albumImg: 'albumimg', - progressBar: 'progressBar' + progressBar: 'progressBar', + currentTime: 'currentTime', + duration: 'duration' }; // State @@ -46,10 +48,27 @@ function getSettings() { fade_disconnect_delay: parseInt(getCSSVariable('--fade-disconnect-delay')) || parseInt(getCSSVariable('--fade-delay')) || DEFAULT_FADE_DELAY, hide_on_idle_connect: getCSSVariable('--hide-on-idle-connect') === '1', - hide_unless_playing: getCSSVariable('--hide-unless-playing') === '1' + hide_unless_playing: getCSSVariable('--hide-unless-playing') === '1', + show_time_labels: getCSSVariable('--show-time-labels') === '1' }; } +/** + * Format seconds to M:SS or H:MM:SS format + */ +function formatTime(seconds) { + if (!seconds || isNaN(seconds)) return '0:00'; + + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + const secs = Math.floor(seconds % 60); + + if (hours > 0) { + return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; + } + return `${minutes}:${secs.toString().padStart(2, '0')}`; +} + /** * Set element opacity with optional delay */ @@ -160,6 +179,11 @@ function handlePlaybackEvent({ data, type }) { } elements.progressBar.style.width = `${(data.currentPlaybackTime / data.currentPlaybackDuration) * 100}%`; + + if (settings.show_time_labels) { + elements.currentTime.innerText = formatTime(data.currentPlaybackTime); + elements.duration.innerText = formatTime(data.currentPlaybackDuration); + } break; default: diff --git a/index.html b/index.html index 1b6b511..4e1161a 100644 --- a/index.html +++ b/index.html @@ -27,8 +27,12 @@ -/-
    -
    -
    +
    + 0:00 +
    +
    +
    + 0:00
    diff --git a/style.css b/style.css index eafbdf0..f8460bb 100644 --- a/style.css +++ b/style.css @@ -52,9 +52,15 @@ span { } /* Progress bar */ -#progressBg { +#progressContainer { + display: flex; + align-items: center; + gap: 8px; margin-top: 10px; - width: 100%; +} + +#progressBg { + flex: 1; height: 10px; border-radius: 5px; background-color: #55555555; @@ -66,4 +72,11 @@ span { height: 100%; background-color: #70e000; transition: width 0.25s linear; +} + +.time-label { + font-size: 0.85em; + min-width: 40px; + text-align: center; + display: var(--show-time-labels, none); } \ No newline at end of file From 8cf02cc8eeddfc9533cdeb463a8ef8e4e85c2d33 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 02:06:03 +0100 Subject: [PATCH 29/33] fix pause/unpause nag --- connector.js | 40 +++++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/connector.js b/connector.js index 2096935..eb253f9 100644 --- a/connector.js +++ b/connector.js @@ -106,6 +106,25 @@ function updateComponents(data) { elements.albumImg.src = artworkUrl; } +/** + * Fetch current now playing information from API + */ +async function fetchNowPlaying() { + try { + const response = await fetch(`${CIDER_SOCKET_URL}api/v1/playback/now-playing`); + const data = await response.json(); + + if (data.status === 'ok' && data.info) { + updateComponents(data.info); + return true; + } + return false; + } catch (error) { + console.debug('[DEBUG] [API] Failed to fetch now playing:', error); + return false; + } +} + /** * Handle playback state changes */ @@ -121,14 +140,22 @@ function handlePlaybackStateChange(state) { /** * Handle connection state */ -function handleConnect() { +async function handleConnect() { console.debug('[DEBUG] [Init] Socket.io connection established!'); - elements.title.innerText = "Cider4OBS Connector | Connection established!"; - elements.artist.innerText = "Start playing something!"; - elements.album.innerText = "-/-"; + + // Try to fetch current track information + const hasTrack = await fetchNowPlaying(); + + if (!hasTrack) { + elements.title.innerText = "Cider4OBS Connector | Connection established!"; + elements.artist.innerText = "Start playing something!"; + elements.album.innerText = "-/-"; + } if (settings.hide_on_idle_connect || settings.hide_unless_playing) { elements.content.style.opacity = 0; + } else { + elements.content.style.opacity = 1; } if (disconnectTimer) { @@ -172,11 +199,6 @@ function handlePlaybackEvent({ data, type }) { break; case "playbackStatus.playbackTimeDidChange": - if (!settings.hide_unless_playing && elements.artist.innerText === "Start playing something!") { - elements.artist.innerText = "Please pause and unpause the track to update track info!"; - elements.title.innerText = "Cider4OBS Connector | Connection established, but incomplete data!"; - elements.content.style.opacity = 1; - } elements.progressBar.style.width = `${(data.currentPlaybackTime / data.currentPlaybackDuration) * 100}%`; From 96850f75391726dc0ed6da73d37364001ed9c741 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 02:29:19 +0100 Subject: [PATCH 30/33] added time labels and next in queue feature --- README.md | 25 +++++++++++++- connector.js | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++-- index.html | 17 ++++++++++ style.css | 38 +++++++++++++++++++++ 4 files changed, 173 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 49e8ff1..75858d5 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## ❗ Requirements * [Open Broadcaster Software](https://obsproject.com/) -* [Cider 2.5+](https://cider.sh) +* [Cider Version 3+](https://cider.sh) * An Apple Music subscription (duh) ## 🛠 Setup @@ -128,6 +128,29 @@ body { } ``` +### [NEW] Additional Display Options + +- `--show-time-labels`: Set to `inline-block` to show current playback time and song duration on either end of the progress bar. Default: `none` (hidden) + ```css + #overlay { + --show-time-labels: inline-block; + } + ``` + +- `--show-next-in-queue`: Set to `block` to show a box with the next song in queue that fades/slides in before the current song ends. Default: `none` (hidden) + ```css + #overlay { + --show-next-in-queue: block; + } + ``` + +- `--next-in-queue-reveal-time`: Number of seconds before the current song ends to reveal the next-in-queue box. Default: `10` + ```css + #overlay { + --next-in-queue-reveal-time: 15; + } + ``` + ## 💜 Trusted by streamers Thank you for supporting this project by using and spreading it! You are my heroes! diff --git a/connector.js b/connector.js index eb253f9..9c78692 100644 --- a/connector.js +++ b/connector.js @@ -2,6 +2,7 @@ const CIDER_SOCKET_URL = "http://localhost:10767/"; const SETTINGS_LOAD_DELAY = 100; const DEFAULT_FADE_DELAY = 2000; +const DEFAULT_QUEUE_REVEAL_TIME = 10; // Element IDs const ELEMENTS = { @@ -12,7 +13,11 @@ const ELEMENTS = { albumImg: 'albumimg', progressBar: 'progressBar', currentTime: 'currentTime', - duration: 'duration' + duration: 'duration', + nextInQueue: 'nextInQueue', + nextTitle: 'nextTitle', + nextArtist: 'nextArtist', + nextAlbumImg: 'nextAlbumImg' }; // State @@ -20,6 +25,7 @@ let pauseTimer; let disconnectTimer; let settings; let elements = {}; +let currentTrackName = null; /** * Cache DOM elements for better performance @@ -49,7 +55,9 @@ function getSettings() { parseInt(getCSSVariable('--fade-delay')) || DEFAULT_FADE_DELAY, hide_on_idle_connect: getCSSVariable('--hide-on-idle-connect') === '1', hide_unless_playing: getCSSVariable('--hide-unless-playing') === '1', - show_time_labels: getCSSVariable('--show-time-labels') === '1' + show_time_labels: getCSSVariable('--show-time-labels') === '1', + show_next_in_queue: getCSSVariable('--show-next-in-queue') === '1', + next_in_queue_reveal_time: parseInt(getCSSVariable('--next-in-queue-reveal-time')) || DEFAULT_QUEUE_REVEAL_TIME }; } @@ -100,6 +108,9 @@ function updateComponents(data) { elements.artist.innerText = data.artistName; elements.album.innerText = data.albumName; + // Store current track name for queue matching + currentTrackName = data.name; + const artworkUrl = data.artwork.url .replace("{w}", data.artwork.width) .replace("{h}", data.artwork.height); @@ -125,6 +136,76 @@ async function fetchNowPlaying() { } } +/** + * Fetch queue and update next in queue display + */ +async function fetchQueue() { + if (!settings.show_next_in_queue) return; + + try { + const response = await fetch(`${CIDER_SOCKET_URL}api/v1/playback/queue`); + const queue = await response.json(); + + if (Array.isArray(queue) && queue.length > 0 && currentTrackName) { + // Find the currently playing track by matching the track name + const currentIndex = queue.findIndex(track => + track.attributes && track.attributes.name === currentTrackName + ); + + // Get the next track after the currently playing one + if (currentIndex >= 0 && currentIndex < queue.length - 1) { + const nextTrack = queue[currentIndex + 1]; + if (nextTrack.attributes) { + updateNextInQueue(nextTrack.attributes); + // Don't show immediately, wait for time-based reveal + return; + } + } + } + + hideNextInQueue(); + } catch (error) { + console.debug('[DEBUG] [API] Failed to fetch queue:', error); + hideNextInQueue(); + } +} + +/** + * Update next in queue display + */ +function updateNextInQueue(data) { + elements.nextTitle.innerText = data.name; + elements.nextArtist.innerText = data.artistName; + + const artworkUrl = data.artwork.url + .replace("{w}", data.artwork.width) + .replace("{h}", data.artwork.height); + elements.nextAlbumImg.src = artworkUrl; +} + +/** + * Hide next in queue display + */ +function hideNextInQueue() { + elements.nextInQueue.classList.remove('visible'); +} + +/** + * Check if next in queue should be revealed based on time remaining + */ +function checkQueueReveal(currentTime, duration) { + if (!settings.show_next_in_queue) return; + + const timeRemaining = duration - currentTime; + const shouldReveal = timeRemaining <= settings.next_in_queue_reveal_time; + + if (shouldReveal && elements.nextTitle.innerText !== '-') { + elements.nextInQueue.classList.add('visible'); + } else if (!shouldReveal) { + elements.nextInQueue.classList.remove('visible'); + } +} + /** * Handle playback state changes */ @@ -146,6 +227,11 @@ async function handleConnect() { // Try to fetch current track information const hasTrack = await fetchNowPlaying(); + // Fetch queue if enabled + if (settings.show_next_in_queue) { + await fetchQueue(); + } + if (!hasTrack) { elements.title.innerText = "Cider4OBS Connector | Connection established!"; elements.artist.innerText = "Start playing something!"; @@ -196,6 +282,9 @@ function handlePlaybackEvent({ data, type }) { case "playbackStatus.nowPlayingItemDidChange": updateComponents(data); + if (settings.show_next_in_queue) { + fetchQueue(); + } break; case "playbackStatus.playbackTimeDidChange": @@ -206,6 +295,9 @@ function handlePlaybackEvent({ data, type }) { elements.currentTime.innerText = formatTime(data.currentPlaybackTime); elements.duration.innerText = formatTime(data.currentPlaybackDuration); } + + // Check if next in queue should be revealed + checkQueueReveal(data.currentPlaybackTime, data.currentPlaybackDuration); break; default: diff --git a/index.html b/index.html index 4e1161a..41f897a 100644 --- a/index.html +++ b/index.html @@ -35,6 +35,23 @@ 0:00
    + +
    +
    + Next track artwork +
    + Next in Queue + - + - +
    +
    +
    diff --git a/style.css b/style.css index f8460bb..39dfb7f 100644 --- a/style.css +++ b/style.css @@ -79,4 +79,42 @@ span { min-width: 40px; text-align: center; display: var(--show-time-labels, none); +} + +/* Next in Queue */ +#nextInQueue { + width: 90%; + margin: 0 10px; + max-height: 0; + opacity: 0; + overflow: hidden; + transition: max-height 0.5s ease-out, opacity 0.5s ease-out, margin-top 0.5s ease-out; + display: var(--show-next-in-queue, none); +} + +#nextInQueue.visible { + max-height: 200px; + opacity: 1; + margin-top: 10px; +} + +#nextQueueBox { + background-color: rgba(69, 69, 69, 0); + border-radius: 5px; + padding: 10px; + display: flex; + align-items: center; + justify-content: flex-start; +} + +#nextAlbumImg { + border-radius: 5px; + filter: drop-shadow(0px 0px 10px #000000); +} + +.queue-label { + font-size: 0.75em; + opacity: 0.7; + text-transform: uppercase; + letter-spacing: 0.5px; } \ No newline at end of file From 2698475c1962ab524132e999674934c520314e04 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 15:08:22 +0100 Subject: [PATCH 31/33] minor style improvements --- .gitignore | 3 ++- connector.js | 4 ++-- style.css | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 5abc224..ccd8dd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ CiderWSPlaying.json .vscode/settings.json -.history/ \ No newline at end of file +.history/ +exampleData.jsonc diff --git a/connector.js b/connector.js index 9c78692..1e2645a 100644 --- a/connector.js +++ b/connector.js @@ -197,11 +197,11 @@ function checkQueueReveal(currentTime, duration) { if (!settings.show_next_in_queue) return; const timeRemaining = duration - currentTime; - const shouldReveal = timeRemaining <= settings.next_in_queue_reveal_time; + const shouldReveal = timeRemaining <= settings.next_in_queue_reveal_time && timeRemaining > 0.5; if (shouldReveal && elements.nextTitle.innerText !== '-') { elements.nextInQueue.classList.add('visible'); - } else if (!shouldReveal) { + } else { elements.nextInQueue.classList.remove('visible'); } } diff --git a/style.css b/style.css index 39dfb7f..bf8773e 100644 --- a/style.css +++ b/style.css @@ -100,6 +100,7 @@ span { #nextQueueBox { background-color: rgba(69, 69, 69, 0); + margin-left: 15px; border-radius: 5px; padding: 10px; display: flex; From 3c255dc03d74764346657c3049ea89861ef6ba07 Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 20:30:32 +0100 Subject: [PATCH 32/33] Add slide direction feature for next in queue box --- README.md | 7 +++++++ connector.js | 14 ++++++++++++-- style.css | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 75858d5..41509d8 100644 --- a/README.md +++ b/README.md @@ -151,6 +151,13 @@ body { } ``` +- `--next-in-queue-slide-direction`: Direction from which the next-in-queue box slides in. Options: `top`, `bottom`, `left`, `right`, or `none` to disable slide animation. Default: `top` + ```css + #overlay { + --next-in-queue-slide-direction: left; + } + ``` + ## 💜 Trusted by streamers Thank you for supporting this project by using and spreading it! You are my heroes! diff --git a/connector.js b/connector.js index 1e2645a..77eb181 100644 --- a/connector.js +++ b/connector.js @@ -15,6 +15,7 @@ const ELEMENTS = { currentTime: 'currentTime', duration: 'duration', nextInQueue: 'nextInQueue', + nextQueueBox: 'nextQueueBox', nextTitle: 'nextTitle', nextArtist: 'nextArtist', nextAlbumImg: 'nextAlbumImg' @@ -34,6 +35,14 @@ function cacheElements() { Object.keys(ELEMENTS).forEach(key => { elements[key] = document.getElementById(ELEMENTS[key]); }); + + // Set slide direction attribute on nextQueueBox element + if (elements.nextQueueBox && settings) { + const direction = settings.next_in_queue_slide_direction; + if (['top', 'bottom', 'left', 'right'].includes(direction)) { + elements.nextQueueBox.setAttribute('data-slide', direction); + } + } } /** @@ -57,7 +66,8 @@ function getSettings() { hide_unless_playing: getCSSVariable('--hide-unless-playing') === '1', show_time_labels: getCSSVariable('--show-time-labels') === '1', show_next_in_queue: getCSSVariable('--show-next-in-queue') === '1', - next_in_queue_reveal_time: parseInt(getCSSVariable('--next-in-queue-reveal-time')) || DEFAULT_QUEUE_REVEAL_TIME + next_in_queue_reveal_time: parseInt(getCSSVariable('--next-in-queue-reveal-time')) || DEFAULT_QUEUE_REVEAL_TIME, + next_in_queue_slide_direction: getCSSVariable('--next-in-queue-slide-direction').trim() || 'top' }; } @@ -312,8 +322,8 @@ function startWebSocket() { try { // Pause to allow OBS to inject CSS setTimeout(() => { - cacheElements(); settings = getSettings(); + cacheElements(); // Set initial state if (settings.hide_unless_playing) { diff --git a/style.css b/style.css index bf8773e..89fd518 100644 --- a/style.css +++ b/style.css @@ -106,6 +106,24 @@ span { display: flex; align-items: center; justify-content: flex-start; + transition: transform 0.5s ease-out; + transform: translate(0, 0); +} + +#nextInQueue:not(.visible) #nextQueueBox[data-slide="top"] { + transform: translateY(-20px); +} + +#nextInQueue:not(.visible) #nextQueueBox[data-slide="bottom"] { + transform: translateY(20px); +} + +#nextInQueue:not(.visible) #nextQueueBox[data-slide="left"] { + transform: translateX(-20px); +} + +#nextInQueue:not(.visible) #nextQueueBox[data-slide="right"] { + transform: translateX(20px); } #nextAlbumImg { From 84ac3f4ec124a09fd05070070d7eed9205d7953a Mon Sep 17 00:00:00 2001 From: ryzetech Date: Sun, 30 Nov 2025 21:45:35 +0100 Subject: [PATCH 33/33] Revert "Merge branch 'f3_customizer' into main" This reverts commit bf2a77cc060d871d1e2724cb33edc9e06920962f, reversing changes made to 3c255dc03d74764346657c3049ea89861ef6ba07. --- configurator.html | 54 ----------------------------------------------- 1 file changed, 54 deletions(-) delete mode 100644 configurator.html diff --git a/configurator.html b/configurator.html deleted file mode 100644 index 208f1f8..0000000 --- a/configurator.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - Cider4OBS Configurator - - - - -
    -
    - -
    - Cider4OBS Connector | Connecting...
    - -/-
    - -/- -
    -
    -
    -
    -
    -
    - -
    - -

    Configuration

    - - -

    - -
    -
    - - -
    -
    - - -

    - - -
    -
    - -
    - - - - \ No newline at end of file