From 87366781f547e7bcebc622d9a55a74b1b09aecf5 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Thu, 2 Apr 2026 13:01:16 -0600 Subject: [PATCH] Re-branding the fork --- .envrc | 1 + .gitea/workflows/test.yml | 31 +++++++++ .github/ss-config.webp | Bin 26492 -> 0 bytes .github/ss-richpresence.webp | Bin 6276 -> 0 bytes .github/workflows/build.yml | 54 -------------- .github/workflows/create-release.yml | 89 ------------------------ .github/workflows/update-link-on-pr.yml | 38 ---------- .gitignore | 2 +- Makefile | 2 +- README.md | 20 ++---- flake.nix | 32 +++++++++ go.mod | 2 +- manifest.json | 27 ++----- 13 files changed, 81 insertions(+), 217 deletions(-) create mode 100644 .envrc create mode 100644 .gitea/workflows/test.yml delete mode 100644 .github/ss-config.webp delete mode 100644 .github/ss-richpresence.webp delete mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/create-release.yml delete mode 100644 .github/workflows/update-link-on-pr.yml create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..8392d15 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake \ No newline at end of file diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml new file mode 100644 index 0000000..2a81d24 --- /dev/null +++ b/.gitea/workflows/test.yml @@ -0,0 +1,31 @@ +name: Test + +on: + pull_request: + branches: + - main + push: + branches: + - main + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v5 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + + - name: Install TinyGo + run: | + wget https://github.com/tinygo-org/tinygo/releases/download/v0.40.1/tinygo_0.40.1_amd64.deb + sudo dpkg -i tinygo_0.40.1_amd64.deb + sudo apt install -y binaryen + + - name: Run tests + run: make test diff --git a/.github/ss-config.webp b/.github/ss-config.webp deleted file mode 100644 index cb99c3dd001b42a579a13b72d01d63aef394e778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26492 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 uPfj%^Vo!OFur manifest.tmp && mv manifest.tmp manifest.json - - - name: Append git SHA to version - if: github.event_name == 'push' - run: | - SHA=$(echo "${{ github.sha }}" | cut -c1-7) - jq --arg sha "$SHA" '.version = .version + "-" + $sha' manifest.json > manifest.tmp && mv manifest.tmp manifest.json - - - name: Build and package plugin - run: make package - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: discord-rich-presence - path: discord-rich-presence.ndp diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml deleted file mode 100644 index 318e776..0000000 --- a/.github/workflows/create-release.yml +++ /dev/null @@ -1,89 +0,0 @@ -name: Create Release - -on: - workflow_dispatch: - inputs: - version: - description: "Release version (e.g., 1.2.3, without the 'v' prefix)" - required: true - type: string - beta: - description: "Beta number (1, 2, 3...). Leave empty for stable release" - required: false - type: string - default: "" - -permissions: - contents: write - -jobs: - create-release: - name: Create Release - runs-on: ubuntu-latest - steps: - - name: Validate version format - env: - VERSION: ${{ inputs.version }} - run: | - if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "::error::Invalid version format '$VERSION'. Use X.X.X (e.g., 1.2.3)" - exit 1 - fi - - - name: Compute full version - run: | - VERSION="${{ inputs.version }}" - BETA="${{ inputs.beta }}" - if [[ -n "$BETA" && "$BETA" != "0" ]]; then - VERSION="${VERSION}-beta-${BETA}" - fi - echo "VERSION=${VERSION}" >> "$GITHUB_ENV" - - - name: Check out code - uses: actions/checkout@v5 - - - name: Check tag does not already exist - run: | - if git ls-remote --tags origin "refs/tags/v${VERSION}" | grep -q .; then - echo "::error::Tag v${VERSION} already exists" - exit 1 - fi - - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version-file: go.mod - - - name: Run tests - run: go test -race ./... - - - name: Update manifest.json version - run: | - jq --arg v "$VERSION" '.version = $v' manifest.json > manifest.tmp && mv manifest.tmp manifest.json - - - name: Commit, tag, and push - run: | - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git add manifest.json - git commit --allow-empty -m "Release v${VERSION}" - git tag "v${VERSION}" - git push origin main "v${VERSION}" - - - name: Install TinyGo - run: | - wget https://github.com/tinygo-org/tinygo/releases/download/v0.40.1/tinygo_0.40.1_amd64.deb - sudo dpkg -i tinygo_0.40.1_amd64.deb - sudo apt install -y binaryen - - - name: Build and package plugin - run: make package - - - name: Create release - uses: softprops/action-gh-release@v2 - with: - tag_name: v${{ env.VERSION }} - draft: true - prerelease: ${{ inputs.beta != '' && inputs.beta != '0' }} - files: discord-rich-presence.ndp - generate_release_notes: true diff --git a/.github/workflows/update-link-on-pr.yml b/.github/workflows/update-link-on-pr.yml deleted file mode 100644 index f1259a4..0000000 --- a/.github/workflows/update-link-on-pr.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Add download link to PR - -on: - workflow_run: - workflows: ["Build"] - types: [completed] - -jobs: - pr_comment: - if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' - runs-on: ubuntu-latest - permissions: - pull-requests: write - steps: - - name: Get PR number - id: pr - uses: actions/github-script@v7 - with: - script: | - const pulls = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - state: 'open' - }); - const pr = pulls.data.find(p => p.head.sha === '${{ github.event.workflow_run.head_sha }}'); - if (pr) { - core.setOutput('number', pr.number); - } - - - name: Add download link comment - if: steps.pr.outputs.number - uses: marocchino/sticky-pull-request-comment@v2 - with: - number: ${{ steps.pr.outputs.number }} - message: | - Download the plugin for this PR: [discord-rich-presence.zip](https://nightly.link/${{ github.repository }}/actions/runs/${{ github.event.workflow_run.id }}/discord-rich-presence.zip) - - Built from ${{ github.event.workflow_run.head_sha }} on ${{ github.event.workflow_run.updated_at }} diff --git a/.gitignore b/.gitignore index b97dcc4..7988081 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ *.wasm *.ndp tmp -discord-rich-presence \ No newline at end of file +discordrome diff --git a/Makefile b/Makefile index 8a0cd7b..96c4d57 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ SHELL := /usr/bin/env bash .PHONY: test build package clean -PLUGIN_NAME := discord-rich-presence +PLUGIN_NAME := discodrome WASM_FILE := plugin.wasm TINYGO := $(shell command -v tinygo 2> /dev/null) diff --git a/README.md b/README.md index fe6a314..360e3b4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,4 @@ -# Discord Rich Presence Plugin for Navidrome - -[![Build](https://github.com/navidrome/discord-rich-presence-plugin/actions/workflows/build.yml/badge.svg)](https://github.com/navidrome/discord-rich-presence-plugin/actions/workflows/build.yml) -[![Latest](https://img.shields.io/github/v/release/navidrome/discord-rich-presence-plugin)](https://github.com/navidrome/discord-rich-presence-plugin/releases/latest/download/discord-rich-presence.ndp) +# Discodrome, a work of Discord Rich Presence Plugin for Navidrome **Attention: This plugin requires Navidrome 0.61.0 or later.** @@ -9,7 +6,7 @@ This plugin integrates Navidrome with Discord Rich Presence, displaying your cur The goal is to demonstrate the capabilities of Navidrome's plugin system by implementing a real-time presence feature using Discord's Gateway API. It demonstrates how a Navidrome plugin can maintain real-time connections to external services while remaining completely stateless. -Based on the [Navicord](https://github.com/logixism/navicord) project. +Based on the [discord-rich-presence-plugin](https://github.com/navidrome/discord-rich-presence-plugin) project. **⚠️ WARNING: This plugin requires storing Discord user tokens, which may violate Discord's Terms of Service. Use at your own risk.** @@ -26,13 +23,12 @@ Based on the [Navicord](https://github.com/logixism/navicord) project. - Optional album art from [Cover Art Archive](https://coverartarchive.org) for MusicBrainz-tagged music - Optional image hosting via [uguu.se](https://uguu.se) for non-public Navidrome instances -Discord Rich Presence showing currently playing track with album art, artist, and playback progress ## Installation ### Step 1: Download and Install the Plugin -1. Download the `discord-rich-presence.ndp` file from the [releases page](https://github.com/navidrome/discord-rich-presence-plugin/releases) +1. Download the `discodrome.ndp` file from the [releases page](https://git.atri.dad/atridad/discodrome/releases) 2. Copy it to your Navidrome plugins folder. Default location: `/plugins/` ### Step 2: Create a Discord Application @@ -115,7 +111,6 @@ For album artwork to display in Discord, Discord needs to be able to access the Access the plugin configuration in Navidrome: **Settings > Plugins > Discord Rich Presence** -Plugin configuration panel showing all available settings ### Configuration Fields @@ -249,7 +244,7 @@ make build make package ``` -The `make package` command creates `discord-rich-presence.ndp` containing the compiled WebAssembly module and manifest. +The `make package` command creates `discodrome.ndp` containing the compiled WebAssembly module and manifest. ### Manual Build Options @@ -257,16 +252,15 @@ The `make package` command creates `discord-rich-presence.ndp` containing the co ```sh # Install TinyGo first: https://tinygo.org/getting-started/install/ tinygo build -target wasip1 -buildmode=c-shared -o plugin.wasm -scheduler=none . -zip discord-rich-presence.ndp plugin.wasm manifest.json +zip discodrome.ndp plugin.wasm manifest.json ``` #### Using Standard Go ```sh GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o plugin.wasm . -zip discord-rich-presence.ndp plugin.wasm manifest.json +zip discodrome.ndp plugin.wasm manifest.json ``` ### Output - `plugin.wasm`: The compiled WebAssembly module -- `discord-rich-presence.ndp`: The complete plugin package ready for installation - +- `discodrome.ndp`: The complete plugin package ready for installation diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..addfee2 --- /dev/null +++ b/flake.nix @@ -0,0 +1,32 @@ +{ + description = "Discodrome Development Environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = + { + nixpkgs, + flake-utils, + self, + }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + go + tinygo + gnumake + binaryen + jq + ]; + }; + } + ); +} diff --git a/go.mod b/go.mod index ad204e2..96514cf 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module discord-rich-presence +module discodrome go 1.25.0 diff --git a/manifest.json b/manifest.json index c3473df..ebef757 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { "$schema": "https://raw.githubusercontent.com/navidrome/navidrome/refs/heads/master/plugins/manifest-schema.json", - "name": "Discord Rich Presence", - "author": "Navidrome Team", + "name": "Discodrome", + "author": "Atridad Lahiji", "version": "1.0.0", "description": "Discord Rich Presence integration for Navidrome", - "website": "https://github.com/navidrome/discord-rich-presence-plugin", + "website": "https://git.atri.dad.com/atridad/discodrome", "permissions": { "users": { "reason": "To process scrobbles on behalf of users" @@ -20,9 +20,7 @@ }, "websocket": { "reason": "To maintain real-time connection with Discord gateway", - "requiredHosts": [ - "gateway.discord.gg" - ] + "requiredHosts": ["gateway.discord.gg"] }, "cache": { "reason": "To store connection state and sequence numbers" @@ -53,12 +51,7 @@ "type": "string", "title": "Activity Name Display", "description": "Choose what to display as the activity name in Discord Rich Presence", - "enum": [ - "Default", - "Track", - "Album", - "Artist" - ], + "enum": ["Default", "Track", "Album", "Artist"], "default": "Default" }, "caaenabled": { @@ -99,17 +92,11 @@ "minLength": 1 } }, - "required": [ - "username", - "token" - ] + "required": ["username", "token"] } } }, - "required": [ - "clientid", - "users" - ] + "required": ["clientid", "users"] }, "uiSchema": { "type": "VerticalLayout",