Releases: PerformanC/NodeLink
v3.7.0
NodeLink v3.7.0
v3.7.0 is essentially us gutting the project and rebuilding it from the floor up. We spent 320 commits ripping out the legacy JS logic and hot-swapping the entire spine for a strict TypeScript architecture. This wasn't about "polishing"—it was about nuking the deep-seated memory leaks and audio stutters that were baked into the old core.
On the audio side, we threw out basic linear resampling for Cubic Hermite Spline (Catmull-Rom) interpolation. This means the new Tape\Scratch effects actually maintain spectral integrity instead of sounding like digital garbage when they ramp down. We also implemented EBU R128 normalization with proper K-weighting so tracks don't blow out your ears anymore.
Under the hood, we slashed IPC overhead by moving from JSON strings to V8 binary serialization, making the communication between the master and workers way more responsive. The proxy layer isn't just a static list anymore; it's a feedback-based triage pool that monitors 403/429 error codes and latency in real-time to rotate URL fetching before YouTube cuts you off. We also added a proper hibernation mode where idle workers drop to PRIORITY_LOW and trigger V8 size optimizations to save host resources.
This release is the end of the "patching things as they break" era. We finally started engineering this thing.
Commit count in v3.6.0..3.7.0: 320. Full changelog:
Added
- 0362c05 ToddyTheNoobDud: add: mpd/dash_mpeg support for monochrome
- 2ffe80c 1lucas1apk: add: monochrome lyrics and source integration
- 80e18cf ToddyTheNoobDud: add: support local files for spotify
- 24b5974 Bernard: Create netease.js
- 627b521 1lucas1apk: add: scratch effect
- 60d72b4 Bernard: Create iheartradio.js
- b63272f ToddyTheNoobDud: add: ipc traffic logger & internal conversations
- 2f05e9b 1lucas1apk: add: runtime config options for worker exec argv
- be7a71c 1lucas1apk: add: support worker old-space limits via env
- 8dd85e3 ToddyTheNoobDud: add: thumbnail & title extraction for discord attachments
- 37bb379 1lucas1apk: add: build artifacts and complete feature integration
- 4c4754d 1lucas1apk: add: apple music editorial videos and tape effect improvements
- 991ba1d 1lucas1apk: add: implement high-quality tape start/stop effects
- 64b7c7e ToddyTheNoobDud: add: ts-node support
- a47c1a1 ParrotXray: feat: add short URL and multi-page video support
- 9e3aa6e 1lucas1apk: add: realistic phonograph filter with advanced DSP simulation
- a6c7594 1lucas1apk: add: crossfade concepter
- 33a56d0 ToddyTheNoobDud: add: deezer lyrics support
- 0d25dc8 1lucas1apk: add: implement LazyPy TTS
- 517979d 1Lucas1.apk: add: nodelink API version headers to responses
- b874558 Lucas Morais Rodrigues: add: Hoshimi client
- d1f4355 1lucas1apk: add: loudness normalization features and AGC support
- f311649 a.....: add: add proxy support for all HTTP requests and HLS fetching
Fixed
- 19be26b ToddyTheNoobDud: fix: prevent YouTube stream recovery loop when paused
- 46848b3 ToddyTheNoobDud: fix: bound AACDecoderStream pendingChunks, optimize _tightBuffer, and fix DASH stuck loops
- 063560f ToddyTheNoobDud: fix: resolve event listener accumulation on stream events
- a12e389 1Lucas1apk: fix: improve monochrome instance selection and latency
- b003855 1Lucas1apk: fix: stuck tracks and endings with tape/scratch effects
- 50a8284 ToddyTheNoobDud: fix: ringbuffer memory leaks & slow pool draining on reads
- e15ea1e ToddyTheNoobDud: fix: argument cannot be greater than 1000 for spotify
- 4591fbf ToddyTheNoobDud: fix: oembed beign skipped for tv clients
- 5f22104 ToddyTheNoobDud: fix: playerplugininfo not imported
- cd53ada ToddyTheNoobDud: fix: reportproxystaus undefined in playlists resolving
- 1b6167a 1lucas1apk: fix: resolve 40 TypeScript build errors
- d7fbc41 ToddyTheNoobDud: fix: http being stuck on recovery when left alone in channel
- abbd0d8 ToddyTheNoobDud: fix: mp4 streams instantly emitting finishbuffering
- c1cd0a6 ToddyTheNoobDud: fix: androidvr playback not working (?)
- c86ca23 Kiyomi F. (aka. iaMJ): fix simple typos
- cd618d9 ToddyTheNoobDud: fix: seek only using native seek for every source
- 8ca597f 1lucas1apk: fix: optimize crossfade buffering and fix resource destruction
- 6d826ed 1lucas1apk: fix: prevent crossfade completion reentry and repeated stream starts
- fda0497 1lucas1apk: fix: stabilize crossfade seek transition timing and stream swaps
- 6962db2 1lucas1apk: fix: preserve crossfade state after seek and duplicate preload
- 629da0e 1lucas1apk: fix: handle zero-duration scratch reset correctly
- 4dc82be ToddyTheNoobDud: fix: player beign stuck on a recovery state forever
- 3ba1cfe ToddyTheNoobDud: fix: loadstream erroing when making a request
- aa4ebb1 1lucas1apk: fix: enhance crossfade state management and buffer handling
- c62f5ec 1lucas1apk: fix: improve crossfade controller stability and completion timing
- 8855fbb 1lucas1apk: fix: add full crossfade debug logs with direct logger calls
- 2e0c9e2 1lucas1apk: fix: resolve seek scratch races and stabilize crossfade timing
- 81a3cc3 ToddyTheNoobDud: fix: correctly load the lyrics in subscribe lyrics events
- e3be2b8 1lucas1apk: fix: harden stream cleanup during track replacement
- 5b09876 1lucas1apk: fix: prevent extra worker spawns and dedupe player creation
- d7cf9f7 1lucas1apk: fix: expose host memory and render machine free on unified bar
- b0aeb98 1lucas1apk: fix: recover broken ipc sockets and cleanup unix socket files
- 8cfa64a...
v3.6.0
NodeLink v3.6.0
NodeLink v3.6.0 is a big update: more sources (newsources++) and 154 commits focused on core improvements. The audio pipeline was cleaned up by consolidating previously scattered streaming logic into a single, sturdier HLSHandler, bringing Twitter, Bilibili, Mixcloud, SoundCloud, and Gaana into one high-performance flow.
This release also adds SABR (Self-Adaptive Bitrate) by porting the same system used by the YouTube Web client, improving parity with native behavior and making YouTube streams recover more intelligently. With TrackCacheManager and a full refactor of source handling, every source in NodeLink is now seekable.
On top of that, the Deezer integration was rebuilt with native Blowfish-CBC decryption and full seek support, YouTube Lyrics Alignment was added for tight synchronization, and the FlowController now handles fading and gapless preloading. Client headers were refreshed for 2026, and validation was migrated to fastest-validator for faster API performance.
Commit count in v3.5.0..dev: 154. This file includes all commits from that range.
Added
- 2087e0a add: implement SabrStream for adaptive bitrate streaming
- 1e15863 add: implement Yandex Music source and lyrics integration
- 8e9de73 add: bluesky source support with direct hls/mp4 streaming
- 9847638 add: anghami source support
- 8c577cb add: source Qobuz
- a7ff46b add: source Twitter
- 191634e add: source Tumblr
- eca6973 add: eternalbox source integration with streaming
- 602a747 add: implement letrasmus source and related functionality
- 73abdf3 add: implement meanings functionality with letrasmus support
- f264c51 add: enhance letrasmus meaning extraction
- f6e493e add: implement Piper TTS source with configuration
- a9de0be add: implement FlowController for managing audio processing flow
- 0e131ec add: fading configuration and processing for audio playback
- f37ae69 add: implement preload functionality for gapless track transitions
- 5172ba0 add: implement YouTube lyrics alignment and enhance lyrics loading logic
- 9a12694 add: implement mobile token handling and canvas fetching for Spotify
- 852dbb4 add: include sp_dc for mobile token retrieval in configuration
- b060ddb add: implement WikipediaMeaning class
- 152cee6 add: youtube live chat support via websocket
- 6ca26a6 add: audius source implementation
- 52892db add: implement lyrics subscription and unsubscription endpoints
- a017053 add: finishbuffering event to sabr
- 3da9059 add: webParentTools client and update Android SDK version
- 98bb706 add: webremix client support
- 2531ae5 add: native spotify auth tokener
- 3d28928 add: initialize _lyricsBasePackets in track start logic
- 4dbff0f add: feature request template for Winter of Code
- 867497d add: Winter of Code issue report template
- d630c79 add: include star history section in README.md
- 67dce8d add: architecture diagram in README.md
- 998e8c4 add: implement Blowfish CBC decryption for Deezer stream
- 69070ca add: eventTimeoutMs config & use in waitEvent
Fixed
- afd5db2 fix: prevent Denial of Service (DoS) via memory exhaustion
- ee983a9 fix: youtube OAuth class not found, credentialManager being undefined
- 1b2b913 fix: set IV for Blowfish CBC decryption in Deezer source
- 87d72cc fix: change module export to ES6 default export for BlowfishCBC
- ab50a6c fix: deezer playback and add seekeable support
- 8790860 fix: auto-inject openssl-legacy-provider if bf-cbc is missing
- 17a4616 fix: resolve 500 errors on youtube mix playlists for android
- 54bd9d8 fix: enhance waitEvent method with timeout handling
- dda7af3 fix: soundcloud playback & caching
- 1593394 fix: shazam duration not beign extracted
- 01609ab fix: correct highWaterMark value in FlowController constructor
- 52025fb fix: race condition on finishBuffering
- 929552b fix: filter out invalid spacer elements in android client search
- e430d48 fix: update regex patterns in Deezer and Tidal sources
- d03f692 fix: add missing getBestMatch import in deezer
- d4d5aaa fix: anghami source search term and artwork url
- 00b45c4 fix: add youtube mirror fallback to audiomack if stream url is not found
- e2dc48f fix: add youtube fallback to gaana and jiosaavn
- 519ef87 fix: disable hacky fix for bun
- fe26ad6 fix: playlist title extraction for ytmusic
- 5b0a0b0 fix: webremix client exporting
- 7e9b9a1 fix: lyricsline event not beign sent
- b975122 fix: improve HTML decoding in LetrasMusMeaning
- 9e3cc05 fix: enhance lyrics processing and synchronization in Player class
- 5069274 fix: remove duplicated compositeBuffer
- 71cda9b fix: enhance decoding loop management in SymphoniaDecoderStream
- 107d13d fix: update _lyricsBasePackets initialization
- 57c714c fix: improve audius configuration validation
- 47a61b2 fix: correctly decode and validate basic auth for metrics
- 3b4aa72 fix: enhance player request handling with dynamic signature timestamp
Updated & Improved
- c961e7d improve: implement universal and robust HLS handler (HLSHANDLER)
- 2cb3c71 improve: implement TrackCacheManager and all source seekable
- 1e4dbbd improve: fully refactor the SABR implementation
- f9959c6 update: implement SABR recovery mechanism for stream stalls
- c801703 update: add bandwidth estimator for sabr segments
- c95d81a improve: reduce sabr allocations & potoken bugfixes
- 0f1b6d9 update: add sabr and potoken flags to config
- 6f1b773 update: rename potoke -> potoken
- 651769a update: move sabr files into a folder
- 795340b update: migrate Twitter to HLSHandler
- a4db2e5 update: migrate Bilibili to HLSHandler
- cf89082 update: migrate Mixcloud to HLSHandler
- e6ed545 update: migrate Gaana and SoundCloud to HLSHandler
- 25aef1b update: migrate YouTube HLS to HLSHandler
- fa1a9af improve: implement HLSHandler and PlaylistParser
- afd7923 improve: add spotify isrc extraction & optimize metadata
- 6c39ebc update: add seek support for sabr & format with biome
- 2a19350 improve: spotify source with native autogenerated playlist support
- d15594b improve: replace myzod with fastest-validator
- https://github.com/PerformanC/N...
v3.5.0
NodeLink v3.5.0
NodeLink v3.5.0 delivers a big expansion in sources, audio capabilities, and server tooling. The worker architecture is reworked into specialized source and voice execution paths with stronger isolation, plus a command socket and improved orchestration for worker control. New integrations include Telegram, Bilibili, Genius, Amazon Music mirroring, Pinterest, Mixcloud, Audiomack, Gaana, and Shazam, plus richer source recommendations and specialized searches for YouTube and SoundCloud. On the platform side, worker management gains a dedicated API, improved scaling, stability, and source validation. The audio pipeline sees memory and CPU optimization, new filters (reverb and flanger), voice receive, and a raw PCM streaming endpoint. YouTube and Spotify stability continue to improve, and client headers are refreshed for 2026.
Commit count in v3.4.0..dev: 115 (requested 114). This file includes all commits from that range.
Added
- 95e662d add: source Telegram integration with video extraction
- 05b92ef add: bilibili source support with flv playback and lyrics
- c4ac97d add: genius source support with smart mirror
- b0fb9c3 add: amazon music as a mirror source
- 710d739 add: pinterest source
- 79d5192 add: mixcloud source and fix hls memory leak
- 3cc5e7f add: implement getSource method in SourcesManager
- bdaec03 feat: add reverb and flanger audio filters
- d9936ee add: endpoint /v4/loadstream for raw PCM audio streaming
- 14ccb6c add: specialized search support for playlists and artists on YouTube
- 9a9861f add: specialized search support for playlists, albums, users, tracks for soundcloud
- f1ea03c add: speak prefix to google-tts by default
- 4ec116d add: soundcloud clientId to nodelink config
- 44d58dc add: endpoint configuration and worker management API
- 2a20a91 add: implement command socket communication for worker management
- dd2630c add: voice receive
- 3215510 add: track recommendations from the sources
- 7907280 add: implement YouTube recommendations and enhance playlist handling
- 00f3745 add: audiomack source support
- 5c98b5c add: implement Gaana source support
- d1cea42 add: support for shazam source
Fixed
- 9b53c08 fix: handle socket close event on session resume to prevent leaks
- a031dd2 fix: define missing helper functions in YouTube source
- 7234ca9 fix: improve video stream handling in Telegram source
- 54008a0 fix: force kill cloudflared process on exit to prevent zombies
- 0788e0a fix: resolve webm seeking crash and http recursion bug
- 66d0c58 fix: replace process.on with process.once for shutdown
- bcdaa91 fix: improve shutdown handling by removing redundant signal listeners
- 8897f14 fix: streamline worker cleanup and shutdown handling
- 26cc5b5 fix: enhance shutdown handling in NodelinkServer and WorkerManager
- 2d7aead fix: enhance tunnel logging
- f6f3c34 fix: implement forceSave method in CredentialManager
- 5c89014 fix: enhance token fetching in PandoraSource with remote
- c0739c0 fix: add remote token URL configuration for PandoraSource
- 618db45 fix: add clear() methods to filters to prevent audio artifacts
- c8bb14e fix: correctly close the session sockets
- 9cf6de4 fix: resolve logger reference error and improve stream error handling
- bd275e5 fix: use mirrored track info for loadstream and mix layers
- 967faec fix: bun websocket not beign created if useBunServer is false & fix other misc issues.
- ba78a6f fix: remove unused ,
- a8478e3 fix: remove accidental applewebkit on android vr headers
- 65ab49c fix: replace ` with '
- 89f6a45 fix: correct extract the track author on internal tracks
- 9c3ab61 fix: soundcloud regex for client id retrieval
- 573709d fix: make socket destroy chain optional
- 3930a79 fix: playerManager create race condition
- ad5b7e0 fix: improve error handling in track encoding and decoding functions
- 51ad8a3 fix: avoid null padding in track details and add seekable meta tag
- 5eb74c1 fix: refactor decodeTrack and encodeTrack
- 1d964bf fix: enhance source worker management with load tracking and task
- 7288adf fix: load stream functionality with error handling and streaming support
- 84f7590 fix: youtube lives having frequently duplicated audios
- e72dcf5 fix: make res.on('close') an optional chain
- 0e96327 fix: fix loadlyrics endpoint & improve loadchapters speed
- 605e59a fix: bilibili making loadlyrics crash
Updated & Improved
- 28c7963 improve: add source-specific configuration validation
- 581b48c Merge pull request #137 from aroradev1010/improve-source-config-validation
- c64394e update: streamline YouTube OAuth validation process
- 8d9be4c Merge branch 'dev' of https://github.com/PerformanC/NodeLink into dev
- d2d8dac update: clear searchTerms in Telegram and search method
- 9cb0fe3 improve: youtube recovery on aborted connections
- 939fb3e update: improve vkmusic with native HLS and session refresh
- b61fae4 improve: optimize audio processing and buffer managem...
v3.4.0
NodeLink v3.4.0
Finally got v3.4.0 ready. The big highlight here is definitely the Plugin System. Now you can just drop a local plugin or install one via NPM, and it works—giving you direct access to the internal server instance to add custom routes and filters easily.
I also played around with Node.js SEA to get standalone binaries working. This means you can just run the executable without worrying about npm install or having Node set up perfectly on the machine. It's still a bit of an experiment, but it's a huge step for making deployment easier. https://github.com/PerformanC/NodeLink/actions/runs/20412069429
YouTube got a lot of attention too. I fixed those memory leaks that were killing the process and added STS Caching. OAuth tokens also rotate now, which helps keep things stable. Plus, Vimeo is now built-in and enabled by default.
The config validator is also much better now. Instead of just crashing, it actually tells you what part of the config is broken so you can fix it quickly.
Added
- fcd5408 add: implement plugin system with custom routes and filters
- d58577e add: implement binary build process and registry generation
- 1efa458 add: gitHub Actions workflow for building binaries
- 174bae8 add: vimeo support for sources
- f41bd43 add: basic STS caching system #127
- 6001d16 add: multi-language audio support and fix lyrics caption data
- 8fc72ff add: implement tunnel-cloudflared plugin and sample plugin structure
- e49a825 add: ignore functionality for IPs, userIds, and guildIds
- 7662e30 add: extract tidal token without an account
- dfa812d add: implement cache clearing for STS and HTTP/2 failed hosts
- 9e6bd54 add: enhance build script for improved module
- 0dbf65f add: enhance binary handling for symphonia-decoder packages
Fixed
- d7dc6e8 fix: enhance YouTube stream URL resolution and improve error handling
- 883988e fix: youtube music searching / resolving
- 5082107 fix: force voice update on connection error to ensure reconnection
- 27fdb91 fix: resolve flowery tts api voice id requirement
- 249b5ed fix: send stats updates to active sessions via WebSocket
- cf7b535 fix: hide version in logs when client version is undefined
- 2791218 fix: plugins not showing on /info path
- b1efe24 fix: correct isSeekable flag for streams
- 7adccc2 fix: update symphonia-decoder dependency version format
- 9fb4912 fix: ytmusic not beign instanced on the source
- 04011a2 fix: non sts based clients beign able to find streams
Updated & Improved
- fa6ca9e improve: enhance YouTube OAuth token handling with rotation
- ac1c29c improve: add range, enum, and cross-field config validation
- daca99d improve: fix more youtube memory leaks & fix youtube lives.
- 4fbd1a6 improve: vimeo performance & memory leaks fixes.
- 29e89fa improve: add explicit validation errors for config values
- 23ff35a improve: enhance cross-build support and update build scripts
- 0ab0def improve: refactor audio pipeline creation using stream pipeline
- 39dbf89 improve: performance & encryptedHostFlags extractor for common
- 79bec7d improve: stream processor performance
- 02414cf improve: streamline progressive stream handling using pipeline
What's Changed
- add: basic STS caching system by @kikkia in #127
- update: readme to mark (TS) Lavalink-Client V3 Supported by @UnschooledGamer in #129
- improve: add explicit validation errors for config values by @aroradev1010 in #131
- add: system plugins by @1Lucas1apk in #132
- improve: add range, enum, and cross-field config validation by @aroradev1010 in #134
- add: implement binary build process and registry generation by @1Lucas1apk in #135
- merge: dev → v3 with Vimeo support, plugin system, YouTube/OAuth improvements, config validation, and multiple fixes by @1Lucas1apk in #136
New Contributors
- @kikkia made their first contribution in #127
- @aroradev1010 made their first contribution in #131
Full Changelog: v3.3.0...v3.4.0
v3.3.0
NodeLink v3.3.0
This release introduces the Audio Mixer, a powerful engine capable of overlaying auxiliary audio tracks (TTS, SFX) over active streams in real-time using PCM mixing. It also brings native Flowery TTS support and dynamic YouTube OAuth & Config APIs to manage tokens without restarts.
Significant stability improvements were made to the YouTube source, specifically addressing a massive memory leak in the range-based streaming system and correcting buffering logic. The metrics system has been overhauled to provide granular per-worker statistics, and critical fixes were applied to ytmsearch, NicoVideo, and FMP4 parsing.
Added
- 4e42559 feat: implement audio mixing functionality with dynamic layer management
- b20420e feat: implement Flowery TTS source with configuration options
- d404670 feat: add youtube config (
/v4/youtube/config) and oauth (/v4/youtube/oauth) management apis - 43ca38f feat: enhance stats tracking with detailed metrics for workers, requests count, and latency
- 581e06a feat: expose detailed worker metrics to prometheus
- 16905c6 feat: add unique worker identity and start time tracking
Fixed
- 3ace21f fix: resolve massive memory leak in YouTube range-based streaming system
- 4e62a52 fix: resolve YouTube Music search (
ytmsearch) issues and handle null playerscript scenarios - 363ccac fix: patch sensitive session information leak in
/statsendpoint response - 3cdbfb1 fix: resolve NicoVideo playback failures and enhance track handling
- 1445293 fix: correct null token handling in Cipher API calls
- c36bda9 fix: correct FMP4 atom parsing and AAC extraction logic
- 8ce2eca fix: preserve video ID in Music playlist fallback URLs
- 7e9c207 fix: reset refresh counters on URL change to prevent stale request logic in YouTubeSource
Updated
- e7255d8 update: optimize buffering logic by increasing
CHUNK_SIZEfor stability - 04a316d update: implement
streamKeyusage for YouTube streams to improve connectivity - be40b82 update: add language support to Google TTS source
- 850702b improve: refactor cleanup process and URL pre-flight checks for YouTube streams
What's Changed
- sync: dev branch is not up to date. by @1Lucas1apk in #123
- merge: dev → v3 with new metrics system, YouTube OAuth/config APIs, Flowery TTS source and multiple fixes by @1Lucas1apk in #125
- add: implement audio mixing functionality with dynamic layer management by @1Lucas1apk in #126
Full Changelog: v3.2.0...v3.3.0
v3.2.0
NodeLink v3.2.0
This release introduces Prometheus metrics support, Docker deployment, log rotation, JioSaavn and Pandora source integrations, and significant performance improvements through Rust-based stream processing. The update enhances YouTube streaming with range-based mode and chapter loading, improves lyrics handling with language support, and strengthens session management with robust resume capabilities.
The release includes major refactors to the stream processor using Rust implementation for better performance, improved SoundCloud format selection, and optimized volume transformation using in-place buffer operations. Track streaming capabilities were enhanced with itag selection support, and the README was updated with comprehensive documentation references.
Several critical fixes address volume bursts on track start, stuck track detection, seek handling, and voice connection resets. The system now properly handles MP4 track conditions and includes better error management across multiple components. Commitlint was integrated to enforce code quality standards, and the codebase was reorganized for better maintainability.
Added
- 267d6f5 add: log rotation and automatic cleanup system
- 70f5169 add: experimental YouTube range-based streaming mode
- b2814b1 add: environment variable for config and add Docker support
- 07ab442 add: create .dockerignore file and update makeRequest
- 09a28ac add: support for specific itag in track stream
- a7c62d6 add: commitlint setup to enforce custom guidelines
- a7e69dc add: enhance frame statistics tracking in worker and getStats functions
- 363ccac add: implement metrics endpoint with authorization and update stats handling
- 1aa7d95 add: Prometheus metrics support and update authorization handling
- 37f8383 feat(websocket): add native bun.serve support
- 6e1e341 feat(config): add useBun option
- 04d7d67 feat(pandora): add Pandora source integration with authentication and track resolution
- d4b9115 feat(config): add optional csrftoken option to pandora
- 81589cd feat(pandora): add manual token config & reformat style
- 70fbd8d feat(trackstream): implement track stream endpoint with validation and error handling
- 731adc3 add(sources): jiosaavn support
- 633a128 feat(config): enabled jiosaavn by default
- 0fe9c9e feat(instagram): add /audio/ urls support
- 2c1856f feat: implement chapter loading functionality for YouTube tracks
- 57f1667 feat: add language support for loading lyrics
- 2cf051d feat(youtube): include language code in translated track information
- fbc6d56 feat(audio): add resampling quality options and itag configuration for audio streams
- d13c4d1 feat(BaseClient): enhance audio format resolution and logging for YouTube streams
- b5d42d2 feat(youtube): enhance HLS stream handling and improve error logging
- 9d505a7 feat(info): add isNodelink property to response object
- f9e4066 feat: Implement robust session resume and cluster player management
- 0e9f149 feat(opus): implement an circular buffer system
Fixed
- 0ec8cb6 fix: sanitize config URL and enhance User-Agent header in requests
- 775782e fix: allow seeking to 0 if track has played > 2s
- 0913c51 fix: clean artist/title for improved search accuracy
- 949cc09 fix: move holo data to pluginInfo to maintain track
- 7753253 fix: apply initial volume on track start to prevent loud bursts
- 779451a fix: husky is not configured to be called on commit
- 355aab8 fix: update server statistics in single-process mode
- 42e2af4 fix: conditionally log requests to exclude metrics endpoint
- f482165 fix: prevent track stuck condition when no track is set
- 28e9880 fix(streamprocessor): quality selections for fastest and zero
- 93b22b9 fix(player): enhance error handling for voice connection resets with reconnect cooldown logic
- b66c27a fix(player): improve seek handling and add stream info URL checks
- 5e1d48b fix(mp4): reduce sample extraction to improve performance
- 81cab4b fix(Player): handle MP4 track stuck condition and improve error handling in stream processors
- 8fd4f28 fix(Player): simplify condition for track stuck detection
- e09021d fix(playerManager): handle player destruction without throwing errors in cluster mode
- e09021d fix(player): prevent stuck track detection when last stream data time is not set
- 05691a6 fix(opus): cannot convert "undefined" to int on opusscript
Refactor
- 6b7e870 improve(streamprocessor): replace npm packages with rust implementation
- 2d6ec0b refactor: remove unused export of NodelinkServer
- e9dae34 refactor(player): improve logging and connection handling
- 3cdbfb1 refactor(player, streamProcessor, nicovideo): enhance track handling and error management
- ab2d7a7 refactor(play): improve track playback handling with promise-based flow
- c36bda9 refactor: streamprocessor fmp4/aac handler
- a8f8e5d refactor: soundcloud format selection
- d7ae414 refactor(volume): use in-place transformation instead of creating a new buffer
Removed
- 93702f9 remove: console.log debug line
- e29da52 feat: switch to toddy-mediaplex for opus bindings & removed node-opus
Updated
- 3eb7b53 update: clarify dependency maintenance symbols in README
- ede1563 update: enhance README with documentation
- 1445293 update: change cipher API URL and set token to null
- https://github.com/Performan...
v3.1.1
NodeLink v3.1.1
This release adds support for Apple Music, compatibility with the Bun runtime, and an important restructuring of the worker manager, reorganizing how CPU, memory, and timeouts are handled. The update expands the track-matching logic for Apple Music and Spotify and replaces the use of prism-media with a native Opus and WebM implementation integrated directly into NodeLink.
The volume system was rewritten to include fade-out transitions and smoother adjustments between volume levels, using a custom frame-based transformer to avoid abrupt changes during playback. Internal validation was also revised by moving from Joi to Myzod.
The release includes integration with LrcLib for lyrics and introduces the PlayerBackupManager for state restoration. Maintenance interfaces were added for web, TV, iOS, and Android VR. Several memory leaks were fixed, including issues related to YouTube, audio filters, HTTP/WebSocket agents, and event handling, along with adjustments to the equalizer, routes, URI handling, and event emission.
A plugin system was briefly added but reverted shortly after. The update also removes components that are no longer needed and reorganizes documentation, dependencies, and internal configurations.
Added
- 042e585 feat(applemusic, spotify): enhance best match scoring logic and improve token handling
- 637c7b5 feat(applemusic, spotify): refactor best match logic to support async operations and improve scoring criteria
- 305f056 feat(applemusic): refactor YouTube source handling and improve advanced search logic
- 9971866 feat(applemusic, spotify): enhance track URI handling and improve best match scoring logic
- 9f03e98 feat(applemusic): implement token caching and automatic token fetching
- 1502184 feat(applemusic): enhance setup process and improve token handling
- 6e11147 feat(spotify): include explicit flag in track URI and handle it in getTrackUrl
- 617e02e add: Apple Music source implementation
- 77f8b39 added apple music lyrics source
- 41d5f6c feat: implement Opus encoder and decoder with WebM support
- fef8d64 feat: add startbun script
- 5598794 add: bun support #115
- 222f456 add: bun support for handleUpgrade
- 98605f9 add: bun support in sendResponse
- 72f65b6 feat: implement VolumeTransformer for dynamic volume control in audio processing
- d405bc8 feat(youtube): enhance source with advanced metadata and improve system stability
- 02a71ce feat: introduce plugin system with routes/hooks, metadata, tests, and docs #113
- 70573a3 feat: enhance worker stats tracking with CPU and memory metrics
- 8974e58 feat: enhance audio cache plugin settings with maxSize and protection options
- 95003b7 feat(core): add multi-bot player isolation using composite playerKey (guildId:userId)
- 0cbaae3 feat: update configuration loading and refine .gitignore entries
- ffc7115 feat: add integration tests for example and audio-cache plugins
- c582967 feat: add audioCache and prebuffer plugin configurations to default settings
- c4323e9 feat: add plugin metadata for audio-cache, example, and prebuffer plugins
- c0aa141 feat: enhance plugin metadata extraction and initialization process
- a970e92 feat: add cleanupHttpAgents method
- c970923 feat: clean websocket and http agents, fixes a memory leak
- 49f8fe1 feat: add _stopHealthCheck to fix memory leaks
- da3844c feat: Implement plugin system for NodeLink
- 73b024d feat: implement PlayerBackupManager for player state management and restoration
- ea1a543 feat: enhance worker management with health checks and command timeouts
- fddcdc7 feat: player maintance web
- a1d69be feat: player maintance tv
- 49b2bfb feat: player maintance ios
- 0a308de feat: player maintance android_vr
- 75ca984 feat: implement lrclib integration for lyrics #108
- f211ed6 feat: lrclib integration for lyrics
- 8384b22 feat: improve lyricsmanager fallback and add lrclib
- 928268e feat: add lrclib config to options
Fixed
- 6d935b4 fix: fixed encoded tracks with "+" not working
- c2efe17 fix: remove unnecessary debug logging in BaseClient class
- 688b016 fix: enhance logging for command timeouts to include command type and payload
- b2065ae fix: correct property name from packetsExpect to packetsExpected in getStats function
- 043b14a fix: sort dynamic routes in loadRoutes function and remove unused line in sessions.id.js
- b0d4600 fix: update clients for resolving track information to include additional platforms
- 990f400 fix: add GET method support to session handler and clean up imports in index.js
- ccacb68 fix: correct script name from startbun to start:bun in package.json
- de657f6 fix: adjust makeup gain calculation and clamp output values in equalizer
- 5b6de45 fix: update player to handle equalizer filter settings correctly
- 071604f fix: update player schema to deprecate encodedTrack field and improve queryParamsSchema
- e8d80f7 fix: critical youtube/stream memory leak
- d9b4a6d fix: karaoke mass volume gains
- 45dcd73 fix: fix equalizer filter bands calculation.
- 8f9c3d0 fix(youtube): improve error handling for stream disconnections and aborts fix(worker): enhance uncaught exception logging for stream-related errors
- 057f0a2 fix: update plugin retrieval method in API response
- ea4f532 fix: small memory leaks #112
- ef52b02 fix: youtube memory leaks on events
- 9eb6acb fix:...
v3.0.0
NodeLink Rewrite (v2-legacy → v3)
This release is a complete reboot of NodeLink, designed to make everything more stable. All sources have been rewritten from scratch and are now fully working. The system can play music for over 24 hours straight without needing to destroy or recreate processes, without using resume or complicated features — just play and queue, plain and simple.
We also now have YouTube with OAuth fully working, remote cipher support, and native audio decoding for multiple formats, removing the need for FFmpeg. On top of that, we've added worker management, DoS protection, new source integrations, and smarter error handling, making everything more reliable for day-to-day use.
Breaking Changes
- 65a30df Completely removed FFmpeg dependency, transitioning to native audio decoding. This is a major architectural change.
Removed
- 5f7fc82 Purged repository for rewrite branch.
- c9453ac Removed unused search terms from Google TTS and Reddit sources.
- 40ab40f Removed JioSaavn configuration from default settings.
Fixed
- 186495e fixed corrupted streams beign passed as the first ones
- 0999ffa improve segment downloader loop condition and handle output stream destruction
- 6e3760a add missing allowExplict
- a1934d9 streamline GraphQL fetch call in InstagramSource and improve error handling
- 92a8da8 correct Instagram video extraction for carousels
- cf1f857 update loadType from 'playlist' to 'album' in SpotifySource
- baba8b7 update loadType from 'album' to 'playlist' in SpotifySource
- 4689a74 album loading logic with pagination and concurrency control
- 9452084 player update logic with validation and error handling for track playback
- a99eaf8 enhance null checks for voice connection and improve error logging
- 2ea65ef voice update logic to skip unnecessary updates and improve logging
- 4e55d65 add error handling for player update to improve logging and stability
- 3117155 standardize promise syntax and improve logging in various managers
- d16559a improve player command error handling and response consistency
- 452eaaa add optional chaining for rateLimit configuration
- 302437b update HTTP source to use new request method and improve error handling
- a6c5f46 improve request handling and error checking in player methods
- 90602f2 set isSeekable to false for Instagram, Kwai, Reddit, and Twitch sources
- ef8704a update dependencies and memory leak
- 417157f handle potential null stream in event emitter methods
- 40795e6 memory leak youtube livestream
- 4d41885 update ASCII art banner for consistency and clarity
- eafc2a3 youtube radio lists not beign correctly fetched #102
- 68da845 youtube radio lists not beign correctly fetched
- 09feb71 youtube music urls and androidvr user-agent. #101
- 7dbbc4b androidvr user-agent is undefined
- d62252f youtube music urls
- 88714e3 soundcloud encoding and streaming issues #100
- 6a889ce soundcloud encoding and streaming issues
- f235384 remove stale player placeholders for affected guilds in worker failure handling
- 164d10b improve JSON body parsing error logging with additional context
- 2c59d2d add playlistLoadLimit configuration to Spotify settings
- 7800a7b add playlistLoadLimit configuration and enhance playlist loading logic in SpotifySource
- f7f8ea4 update guild assignment check to use workerManager in NodelinkServer
- bd80c22 update SeekeableNode dependency and enhance error handling in audio resource creation
- 80b2e7f enhance error handling in StreamAudioResource and log errors for better debugging
- 6c84c75 enhance error handling for SoundCloud asset loading and YouTube player script fetching
- 43a32e0 improve error handling and response messages in track encoding and decoding
- 2d05988 enhance session deletion logic and handle ECONNRESET error in Player class
- 0746ac6 noise
- ac5c4e8 correct rounding method in clamp16Bit function
- 0faa90a add priority property to filter classes and sort active filters by priority
- 841b472 enhance filter settings handling in Player class
- 27aa895 simplify filter settings update in Player class
- 09f9d9c add session ID to connection details and log reconnecting state for player
- 2d59a5f enhance player recovery mechanism and prevent stopping on destroyed connection
- b97129d update FiltersManager constructor to use provided options for filter initialization
- becdf98 refactor timescale processing to use cubic interpolation for smoother output
- cda9d72 update video ID pattern to correctly match YouTube Shorts URLs
- b15c6be update server host and password, disable all debug logging
- f906539 correct depth assignment in vibrato filter update method
- 6da3c00 memory leak
- 3f146f2 remove socket port from IP hash calculation for worker selection
- 619f1a8 improve worker selection by including socket port in IP hash calculation
- 44502d2 enable cluster support and set workers to 1 in config.default.js
- f2ffae4 add error handling for missing UDP info in voice connection before playback
- 06de8c1 enhance track URL retrieval by adding duration-based ...
v2.3.0
Fixed
- 059454b YouTube not initializing
bypassAgeRestricted - 9ecd477 YouTube source not handling network errors
- 257a116 Deezer source accessing non-existent field
- 8c55db6 YouTube live memory leak
- edaa650 YouTube playlists not loading completely
- dd78edd applying filters immaturely
- 9dcd5a7 typos in
README.md - 4df1fa1
positionas 0 when player is paused - a2b2059 partially YouTube login
- 53f8f1d HLS-based tracks taking a long time to start
- 27c643e 6b5f105 b5c935c 98e72ea SoundCloud logging
- a2f7a73 use of undeclared variable
- 585a6c6 Spotify token retrieval error
- 9a91c47 Spotify
artistloadTypemissinginfokey in response - be76e1e sending of
startSpeakingwithout waitingtimeout - 86f3189
seekfilter not updatingposition
Updated
Added
- 1c1c45b Poru to the list
- 58946d7
requestsTimeoutoption - 72f3f02 Brotli compression to Bun
- b9063dc option to disable native MP3 playback
- 70080af
openssl-legacy-providerdocumentation - 16961e8 information about
logFileinformation - 1ddefcb Moonlink.js as supporting all NodeLink features
- 3fe6c4d missing
removeAllListenersinNodeLinkStreamclass
Improved
- a09b1cc sources loading
- 4b4516e connection error handling
- e7bd3fe dependencies list
- cda469d
createAudioResourceby using constants - e998f7d sources initialization network error handling
Full Changelog
v2.2.0
Removed
Fixed
- a50d465 SoundCloud regex
- 2297c2c SoundCloud tracks with undefined
isrc - abcc10f SoundCloud playlist loading
- 6bcd6a6 not loading small Spotify playlist and albums
- ecdce2c YouTube (Music) regex
- e05ca32 crash on early trackException
- 56bbd90 crash upon unpausing dead connection
- 4a0d358 MD files syntax
- a52ec98 Tsumi
NodeLink features supportmessage - f7991a9 emitting
TrackExceptionEventwithout a playing track - d4efe0f Rainlink client marked as pure Node.js/JS
- 46a4001 not defaulting timescale filter values
- e5ef1f9
rotationfilter implementation - 7e784a9 fdb5dd6
vibratofilter implementation - ccbf670 crash using
seekfilter - 1f3e734 not properly applying filters
- aa7ba27 23bfeb8 5e26288
playingPlayersvalue - 4ab6cec
resolvenot declared - 2921f82 Spotify loadLyrics fallback to Genius
- 49dd795 missing body compressing headers
- 9cf8b07 track encoder
- e19c0ef track decoder
- baf30ba NodeLink internal functions position
- e871afa Dockerfile to build properly
- e443d1c crash using YouTube regex
- 9a1f5e3 crash connecting to unknown WebSocket path on Windows
- 4afb4c5da3ca19efa03e02019591c5d244cada91missing word on README
- 903a481 crash loading YouTube with
bypassAgeRestrictedenabled - 0097636
/v4/decodeTracksnot decoding all tracks
Updated
- e50763c Tsumi
NodeLink features supportstate - 1ed4633 used dependencies list
- 3ad13a5 NodeLink version
Added
- ceeca18 for SoundCloud sets
- 230de1a usage of
@performanc/pwsl-server - 9b66343 Tsumi client to clients list
- e5ef1f9 more native filters
- ad0df86 native Deezer and BandCamp playback (mp3)
- 0886d98 needed dependencies
- 806755c Bun support
- 3d4c652 Blue.ts client to client list
Improved
- d239b61 Docker image weight
- bb533ef
.dockerignoreand.gitignore - deabfd6 filters organization
- e7d812d filtering speed
- 8cca76a filter's code organization
- dbad780 track encoder and decoder