Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
3b49ca2
improve: fix faulty streaming data for clients.
ToddyTheNoobDud Dec 10, 2025
d00ffe3
update: add more itags by default for youtube
ToddyTheNoobDud Dec 11, 2025
249b5ed
fix: send stats updates to active sessions via WebSocket
1Lucas1apk Dec 11, 2025
39dbf89
improve: performance & encryptedHostFlags extractor for common
ToddyTheNoobDud Dec 11, 2025
daca99d
improve: fix more youtube memory leaks & fix youtube lives.
ToddyTheNoobDud Dec 11, 2025
799821e
update: error responses for unauthorized connections and invalid headers
1Lucas1apk Dec 11, 2025
27fdb91
fix: resolve flowery tts api voice id requirement
1Lucas1apk Dec 11, 2025
b909b4f
add basic sts cache
kikkia Dec 12, 2025
f41bd43
add: basic STS caching system #127
1Lucas1apk Dec 12, 2025
d7dc6e8
fix: enhance YouTube stream URL resolution and improve error handling
1Lucas1apk Dec 12, 2025
04011a2
fix: non sts based clients beign able to find streams
ToddyTheNoobDud Dec 12, 2025
174bae8
add: vimeo support for sources
ToddyTheNoobDud Dec 15, 2025
132af06
add: enable vimeo by default on config
ToddyTheNoobDud Dec 15, 2025
4fbd1a6
improve: vimeo performance & memory leaks fixes.
ToddyTheNoobDud Dec 15, 2025
e49a825
add: ignore functionality for IPs, userIds, and guildIds
1Lucas1apk Dec 15, 2025
d3cd76f
remove: playerBackupManager and related snapshot functionality
1Lucas1apk Dec 15, 2025
dfa812d
add: implement cache clearing for STS and HTTP/2 failed hosts
1Lucas1apk Dec 15, 2025
fa6ca9e
improve: enhance YouTube OAuth token handling with rotation
1Lucas1apk Dec 15, 2025
0ab0def
improve: refactor audio pipeline creation using stream pipeline
1Lucas1apk Dec 15, 2025
3e02b12
fix: adjust chunk size
1Lucas1apk Dec 15, 2025
02414cf
improve: streamline progressive stream handling using pipeline
1Lucas1apk Dec 15, 2025
6001d16
add: multi-language audio support and fix lyrics caption data
1Lucas1apk Dec 16, 2025
b71f020
update: rename 'album' to 'playlist'
ToddyTheNoobDud Dec 16, 2025
883988e
fix: youtube music searching / resolving
ToddyTheNoobDud Dec 16, 2025
fea58a5
fix: revert commit 883988e & add 'ytmusic' to search terms
ToddyTheNoobDud Dec 16, 2025
5082107
fix: force voice update on connection error to ensure reconnection
1Lucas1apk Dec 16, 2025
cf7b535
fix: hide version in logs when client version is undefined
1Lucas1apk Dec 16, 2025
9fb4912
fix: ytmusic not beign instanced on the source
ToddyTheNoobDud Dec 16, 2025
6e4341a
Merge branch 'dev' of https://github.com/PerformanC/NodeLink into dev
1Lucas1apk Dec 16, 2025
7662e30
add: extract tidal token without an account
ToddyTheNoobDud Dec 17, 2025
fcd5408
add: implement plugin system with custom routes and filters
1Lucas1apk Dec 18, 2025
8fc72bf
add: implement tunnel-cloudflared plugin and sample plugin structure
1Lucas1apk Dec 18, 2025
29e89fa
improve: add explicit validation errors for config values
aroradev1010 Dec 19, 2025
caedcc5
Merge pull request #131 from aroradev1010/improve-config-validation
1Lucas1apk Dec 19, 2025
f14fec3
update: add player testing & fix searchterms for sample plugin
ToddyTheNoobDud Dec 19, 2025
2791218
fix: plugins not showing on /info path
ToddyTheNoobDud Dec 19, 2025
a60890b
Merge pull request #132 from PerformanC/add-system-plugins
1Lucas1apk Dec 19, 2025
b1efe24
fix: correct isSeekable flag for streams
ToddyTheNoobDud Dec 19, 2025
ababfc8
update: update compatibility status for various clients
1Lucas1apk Dec 20, 2025
05383e3
fix: update Shoukaku compatibility status in README
1Lucas1apk Dec 20, 2025
79bec7d
improve: stream processor performance
ToddyTheNoobDud Dec 20, 2025
ac1c29c
improve: add range, enum, and cross-field config validation
aroradev1010 Dec 20, 2025
4c050d0
remove: unnecessary comments in rate limit logic
1Lucas1apk Dec 20, 2025
e68a4aa
Merge pull request #134 from aroradev1010/improve-config-validation-c…
1Lucas1apk Dec 20, 2025
d58577e
add: implement binary build process and registry generation
1Lucas1apk Dec 20, 2025
23ff35a
improve: enhance cross-build support and update build scripts
1Lucas1apk Dec 21, 2025
7adccc2
fix: update symphonia-decoder dependency version format
1Lucas1apk Dec 21, 2025
0dbf65f
add: enhance binary handling for symphonia-decoder packages
1Lucas1apk Dec 21, 2025
9e6bd54
add: enhance build script for improved module
1Lucas1apk Dec 21, 2025
9e3a6e6
update: symphonia decoder to 1.0.6
ToddyTheNoobDud Dec 21, 2025
b45f07b
Merge pull request #135 from PerformanC/add/binary-experiment
1Lucas1apk Dec 21, 2025
ef1f088
Merge branch 'v3' into dev
1Lucas1apk Dec 21, 2025
5887c53
update: bump version to 3.4.0 in package.json
1Lucas1apk Dec 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 29 additions & 13 deletions .github/workflows/build.yml → .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ jobs:
output_name: nodelink-win-x64.exe
node_arch: x64

# Windows x86 (32-bit)
# Windows x86 (32-bit) - Cross-build via download to avoid runner arch conflicts
- os: windows-latest
output_name: nodelink-win-x86.exe
node_arch: x86
node_dl_url: https://nodejs.org/dist/v22.12.0/node-v22.12.0-win-x86.zip
node_dl_path: node-v22.12.0-win-x86/node.exe
is_cross: true

# Linux x64 (Standard)
- os: ubuntu-latest
Expand All @@ -40,8 +42,8 @@ jobs:
output_name: nodelink-macos-arm64
node_arch: arm64

# macOS x64 (Intel)
- os: macos-13
# macOS x64 (Intel) - Updated to macos-15 to avoid deprecation
- os: macos-15
output_name: nodelink-macos-x64
node_arch: x64

Expand All @@ -55,8 +57,8 @@ jobs:
with:
node-version: 22

# For standard builds (Windows x86/x64, macOS, Linux x64), we can use setup-node to get the target binary
# But for Linux ARM64 on x64 host, we must download it manually.
# For standard builds (Windows x64, macOS, Linux x64), we can use setup-node
# For cross-builds (Linux ARM64, Windows x86), we download manually.

- name: Setup Target Node.js (Standard)
if: matrix.is_cross != true
Expand All @@ -65,34 +67,48 @@ jobs:
node-version: 22
architecture: ${{ matrix.node_arch }}

- name: Download Target Node.js (Cross-Build)
if: matrix.is_cross == true
- name: Download Target Node.js (Cross-Build - Linux)
if: matrix.is_cross == true && runner.os == 'Linux'
run: |
wget ${{ matrix.node_dl_url }}
tar -xzf $(basename ${{ matrix.node_dl_url }})
shell: bash

- name: Download Target Node.js (Cross-Build - Windows)
if: matrix.is_cross == true && runner.os == 'Windows'
run: |
curl -L -o node_x86.zip ${{ matrix.node_dl_url }}
unzip node_x86.zip
shell: bash

- name: Install Dependencies
run: npm ci
run: npm install

- name: Install Build Tools
run: npm install --no-save esbuild postject rcedit

- name: Set Target Binary Path (Standard Windows)
if: runner.os == 'Windows' && matrix.is_cross != true
run: echo "TARGET_NODE_EXE=$(where node)" >> $GITHUB_ENV
run: |
NODE_PATH=$(where node | head -n 1)
echo "TARGET_NODE_EXE=$(cygpath -m "$NODE_PATH")" >> $GITHUB_ENV
shell: bash

- name: Set Target Binary Path (Standard Unix)
if: runner.os != 'Windows' && matrix.is_cross != true
run: echo "TARGET_NODE_EXE=$(which node)" >> $GITHUB_ENV
shell: bash

- name: Set Target Binary Path (Cross-Build)
if: matrix.is_cross == true
- name: Set Target Binary Path (Cross-Build - Linux)
if: matrix.is_cross == true && runner.os == 'Linux'
run: echo "TARGET_NODE_EXE=$(pwd)/${{ matrix.node_dl_path }}" >> $GITHUB_ENV
shell: bash

- name: Set Target Binary Path (Cross-Build - Windows)
if: matrix.is_cross == true && runner.os == 'Windows'
run: echo "TARGET_NODE_EXE=$(pwd -W)/${{ matrix.node_dl_path }}" >> $GITHUB_ENV
shell: bash

- name: Build Executable
run: node scripts/build.js

Expand All @@ -111,4 +127,4 @@ jobs:
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.output_name }}
path: dist/${{ matrix.output_name }}
path: dist/${{ matrix.output_name }}
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

!.github
!.github/**
!plugins/**
!plugins
!docs
!docs/**
!src
Expand All @@ -20,4 +22,6 @@
!commitlint.config.mjs
!.gitmessage
!docker-compose.yml
!ytmusic_videodata_1765292622656.json
!scripts
!scripts/**
!sea-config.json
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,21 +98,22 @@ However, some clients may not work properly, since NodeLink changes certain beha
| [DisGoLink](https://github.com/disgoorg/disgolink) | Go | unknown | No | v1 and v2 |
| [Lavalink.py](https://github.com/devoxin/lavalink.py) | Python | unknown | No | v1 and v2 |
| [Mafic](https://github.com/ooliver1/mafic) | Python | unknown | No | v1 and v2 |
| [Wavelink](https://github.com/PythonistaGuild/Wavelink) | Python | unknown | No | v1 and v2 |
| [Wavelink](https://github.com/PythonistaGuild/Wavelink) | Python | Yes | No | v1, v2, v3 |
| [Pomice](https://github.com/cloudwithax/pomice) | Python | unknown | No | v1 and v2 |
| [lava-lyra](https://github.com/ParrotXray/lava-lyra) | Python | Yes | No | v3 |
| [Hikari-ongaku](https://github.com/MPlatypus/hikari-ongaku) | Python | unknown | No | v1 and v2 |
| [Moonlink.js](https://github.com/1Lucas1apk/moonlink.js) | TypeScript | unknown | No | v1 and v2 |
| [Moonlink.js](https://github.com/1Lucas1apk/moonlink.js) | TypeScript | Yes | No | v1, v2, v3 |
| [Magmastream](https://github.com/Blackfort-Hosting/magmastream) | TypeScript | unknown | No | v1 |
| [Lavacord](https://github.com/lavacord/Lavacord) | TypeScript | unknown | No | v1 and v2 |
| [Shoukaku](https://github.com/Deivu/Shoukaku) | TypeScript | unknown | No | v1 and v2 |
| [Shoukaku](https://github.com/Deivu/Shoukaku) | TypeScript | Yes | No | v1, v2, v3 |
| [Lavalink-Client](https://github.com/tomato6966/Lavalink-Client) | TypeScript | Yes | No | v1 and v3 |
| [Rainlink](https://github.com/RainyXeon/Rainlink) | TypeScript | unknown | No | v1 and v2 |
| [Poru](https://github.com/parasop/Poru) | TypeScript | unknown | No | v1 and v2 |
| [Blue.ts](https://github.com/ftrapture/blue.ts) | TypeScript | unknown | No | v1 and v2 |
| [FastLink](https://github.com/PerformanC/FastLink) | Node.js | unknown | No | v1 and v2 |
| [Riffy](https://github.com/riffy-team/riffy) | Node.js | unknown | No | v1 and v2 |
| [FastLink](https://github.com/PerformanC/FastLink) | Node.js | Yes | No | v1, v2, v3 |
| [Riffy](https://github.com/riffy-team/riffy) | Node.js | Yes | No | v1, v2, v3 |
| [TsumiLink](https://github.com/Fyphen1223/TsumiLink) | Node.js | unknown | No | v1 and v2 |
| [AquaLink](https://github.com/ToddyTheNoobDud/AquaLink) | JavaScript | unknown | No | v1 and v2 |
| [AquaLink](https://github.com/ToddyTheNoobDud/AquaLink) | JavaScript | Yes | No | v1, v2, v3 |
| [DisCatSharp](https://github.com/Aiko-IT-Systems/DisCatSharp) | .NET | unknown | No | v1 and v2 |
| [Lavalink4NET](https://github.com/angelobreuer/Lavalink4NET) | .NET | unknown | No | v1 and v2 |
| [Nomia](https://github.com/DHCPCD9/Nomia) | .NET | unknown | No | v1 and v2 |
Expand Down
29 changes: 25 additions & 4 deletions config.default.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ export default {
http: {
enabled: true
},
vimeo: {
// Note: not 100% of the songs are currently working (but most should.), because i need to code a different extractor for every year (2010, 2011, etc. not all are done)
enabled: true,
},
flowery: {
enabled: true,
voice: 'Salli',
Expand Down Expand Up @@ -131,7 +135,7 @@ export default {
resolve: ['AndroidVR', 'TV', 'TVEmbedded', 'IOS', 'Web'], // Clients used for resolving detailed track information (channel, external links, etc.)
settings: {
TV: {
refreshToken: ''
refreshToken: [""] // You can use a string "token" or an array ["token1", "token2"] for rotation/fallback
}
}
},
Expand Down Expand Up @@ -172,7 +176,7 @@ export default {
},
tidal: {
enabled: true,
token: '', //get from tidal web player devtools; using login google account
token: 'token_here', //manually | or "token_here" to get a token automatically, get from tidal web player devtools; using login google account
countryCode: 'US',
playlistLoadLimit: 2, // 0 = no limit, 1 = 50 tracks, 2 = 100 tracks, etc.
playlistPageLoadConcurrency: 5 // How many pages to load simultaneously
Expand Down Expand Up @@ -241,7 +245,12 @@ export default {
maxRequests: 20,
timeWindowMs: 5000 // 5 seconds
},
ignorePaths: []
ignorePaths: [],
ignore: {
userIds: [],
guildIds: [],
ips: []
}
},
dosProtection: {
enabled: true,
Expand All @@ -252,6 +261,11 @@ export default {
mitigation: {
delayMs: 500,
blockDurationMs: 300000 // 5 minutes
},
ignore: {
userIds: [],
guildIds: [],
ips: []
}
},
metrics: {
Expand All @@ -266,5 +280,12 @@ export default {
defaultVolume: 0.8,
maxLayersMix: 5,
autoCleanup: true
}
},
plugins: [
/* {
name: 'nodelink-sample-plugin',
source: 'local'
} */
],
pluginConfig: {}
}
12 changes: 6 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"name": "nodelink",
"version": "3.3.0",
"version": "3.4.0",
"scripts": {
"prebuild": "node scripts/prebuild.js",
"build": "node scripts/build.js",
"start": "node --dns-result-order=ipv4first --openssl-legacy-provider src/index.js",
"start:bun": "bun run --dns-result-order=ipv4first src/index.js",
"prepare": "husky"
Expand All @@ -15,15 +15,15 @@
"@ecliptia/seekable-stream": "github:1Lucas1apk/seekable-stream",
"@performanc/pwsl-server": "github:performanc/internals#PWSL-server",
"@performanc/voice": "github:PerformanC/voice",
"@toddynnn/symphonia-decoder": "1.0.3",
"@toddynnn/symphonia-decoder": "1.0.6",
"mp4box": "^2.3.0",
"myzod": "^1.12.1",
"toddy-mediaplex": "^2.0.0"
},
"devDependencies": {
"@biomejs/biome": "^2.3.8",
"@commitlint/cli": "20.1.0",
"@commitlint/config-conventional": "20.0.0",
"@biomejs/biome": "^2.3.10",
"@commitlint/cli": "20.2.0",
"@commitlint/config-conventional": "20.2.0",
"dotenv": "^17.2.3",
"husky": "9.1.7"
},
Expand Down
47 changes: 47 additions & 0 deletions plugins/@1lucas1apk/tunnel-cloudflared/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import fs from "node:fs"
import { spawn } from "node:child_process"

export default async function(nodelink, config, context) {
if (context.type !== 'master') return

const logger = (msg, level = 'info') => nodelink.logger(level, 'Cloudflared', msg)

const token = config.token || process.env.CF_TUNNEL_TOKEN
const port = nodelink.options.server.port || 3000

if (!token) {
logger('CF_TUNNEL_TOKEN not found. Plugin disabled.', 'warn')
return
}

let cloudflared
try {
cloudflared = await import("cloudflared")
} catch (e) {
logger('Package "cloudflared" not found. Please install it in the plugin folder.', 'error')
return
}

const { bin, install } = cloudflared

if (!fs.existsSync(bin)) {
logger('Installing cloudflared binary...')
await install(bin)
}

const tunnel = spawn(
bin,
["tunnel", "run", "--token", token, "--url", `http://127.0.0.1:${port}`],
{ stdio: "inherit", env: process.env }
)

const stopAll = () => {
try { tunnel.kill("SIGTERM") } catch {}
}

process.on("SIGINT", stopAll)
process.on("SIGTERM", stopAll)
process.on("beforeExit", stopAll)

logger(`Tunnel started on port ${port}`)
}
12 changes: 12 additions & 0 deletions plugins/@1lucas1apk/tunnel-cloudflared/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "@1lucas1apk/tunnel-cloudflared",
"version": "1.0.0",
"description": "Cloudflare Tunnel integration for NodeLink",
"type": "module",
"main": "index.js",
"author": "1lucas1apk",
"license": "MIT",
"dependencies": {
"cloudflared": "^0.7.1"
}
}
Loading