diff --git a/.direnv/flake-profile b/.direnv/flake-profile new file mode 120000 index 0000000..0c05709 --- /dev/null +++ b/.direnv/flake-profile @@ -0,0 +1 @@ +flake-profile-1-link \ No newline at end of file diff --git a/.direnv/flake-profile-1-link b/.direnv/flake-profile-1-link new file mode 120000 index 0000000..815d486 --- /dev/null +++ b/.direnv/flake-profile-1-link @@ -0,0 +1 @@ +/nix/store/vvmz1kzp0iwsxsmlh0ss6snzn6mx9g4j-nix-shell-env \ No newline at end of file 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 cb99c3d..0000000 Binary files a/.github/ss-config.webp and /dev/null differ diff --git a/.github/ss-richpresence.webp b/.github/ss-richpresence.webp deleted file mode 100644 index f800bfc..0000000 Binary files a/.github/ss-richpresence.webp and /dev/null differ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index dec0b97..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Build - -on: - pull_request: - branches: - - main - push: - branches: - - main - -jobs: - build: - name: Build - 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 - - - name: Append PR info to version - if: github.event_name == 'pull_request' - run: | - PR_NUM=${{ github.event.pull_request.number }} - SHA=$(echo "${{ github.event.pull_request.head.sha }}" | cut -c1-7) - SUFFIX="PR${PR_NUM}-${SHA}" - jq --arg suffix "$SUFFIX" '.version = .version + "-" + $suffix' manifest.json > 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 76dcd7d..d44acd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *.wasm *.ndp tmp -discord-rich-presence + +discordrome .DS_Store 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.lock b/flake.lock new file mode 100644 index 0000000..03cb250 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1775036866, + "narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "6201e203d09599479a3b3450ed24fa81537ebc4e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} 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 d549e92..520a4d7 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,13 +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", - "Custom" - ], + "enum": ["Default", "Track", "Album", "Artist", "Custom"], "default": "Default" }, "activitynametemplate": { @@ -106,17 +98,11 @@ "minLength": 1 } }, - "required": [ - "username", - "token" - ] + "required": ["username", "token"] } } }, - "required": [ - "clientid", - "users" - ] + "required": ["clientid", "users"] }, "uiSchema": { "type": "VerticalLayout",