13 KiB
13 KiB
ytplayer — Feature Ideas & Enhancement Roadmap
Status: Research & Proposed Roadmap
Target: Web PWA, Tauri (Windows), zero-native (macOS / Linux)
Date: October 2026
1. Context & Architecture Baseline
ytplayer is an ad-free, privacy-preserving media engine with a dual identity:
- Ad-Free Media Player & Offline PWA: Built with vanilla JS on the frontend and Bun + Hono on the backend (libsql SQLite database). It uses
yt-dlpand InnerTube for direct stream extraction without Google accounts, and caches media locally (OPFS in browser, single-file H.264/HEVC faststart on server, WebRTC P2P mesh between devices). - Live Worship & Stage Performance Tool: Equipped with Service Mode (wake-locked setlist view, auto-scaling lyric fonts, per-song arrangement notes), synchronized LRC lyrics with section/cue tags, and a Presenter screen (
/?present=<code>) with QR pairing.
This document synthesizes high-value feature opportunities gathered from research into modern YouTube frontends (FreeTube, ReVanced, SmartTube, Namida), modern music players (Plexamp, Spotube), and live stage tools (Planning Center Music Stand, OnSong, MultiTracks Playback).
2. Feature Proposals by Domain
Domain 1: Smart YouTube & Playback Experience
1.1 SponsorBlock & Non-Music Segment Skipping
- The Concept: Automatically skip or visually mark sponsored segments, self-promos, interaction reminders, and non-music sections.
- Why it matters: Music videos frequently feature skits, prolonged silent pauses, or spoken intros. Skipping
music_offtopicensures the music starts immediately. - Technical Path:
- Free, unauthenticated REST API:
GET https://sponsor.ajay.app/api/skipSegments?videoID=<id>&categories=["sponsor","intro","outro","music_offtopic","selfpromo"]. - Highlight segments as color-coded spans over the seek bar (
#timeline/ Glass Stage scrubber). - During the playback tick in
frontend/app.js, ifcurrentTimeenters a skippable segment and auto-skip is enabled in Settings, seek to the segment end and show an "Unskip" toast. - Server media cache can optionally apply
--sponsorblock-markduring ffmpeg intake.
- Free, unauthenticated REST API:
1.2 Automatic YouTube Chapter Extraction & Interactive Scrubber
- The Concept: Automatically parse video chapters from YouTube metadata and display chapter splits on the progress bar.
- Why it matters: Currently, chapters are only created manually. Full albums, sermons, conference talks, and live sets already have timestamps in video descriptions.
- Technical Path:
- In
server/server.js(/api/streams), exposechapters: [{ start_time, end_time, title }]directly from InnerTube oryt-dlp. - Render tick marks / gaps on the progress scrubber for each chapter boundary.
- Display the current chapter title next to the timestamp.
- Add keyboard shortcuts:
[(previous chapter) and](next chapter).
- In
1.3 Return YouTube Dislike (RYD) & Quality Rating
- The Concept: Show community like/dislike ratios and ratings for videos.
- Why it matters: Helps identify misleading arrangements, clickbait, poor audio rips, or broken videos before playback.
- Technical Path:
- Query
https://returnyoutubedislikeapi.com/votes?videoId=<id>(public, CORS-enabled). - Display a discreet like ratio bar or percentage badge on the video card and now-playing details.
- Query
1.4 On-Screen Subtitles & Closed Captions (CC) Overlay
- The Concept: Render synchronized captions directly over the video playback stage.
- Why it matters:
ytplayercurrently only uses captions for transcript search or importing into lyrics. Spoken sermons, tutorials, foreign tracks, and non-musical videos need readable on-screen subtitles. - Technical Path:
- Add a
CCbutton on the player controls. - Fetch timed lines from
/api/notes/:id/captions. - Render an HTML overlay synchronized to
Player.master.currentTimewith settings for font size, background opacity, and positioning.
- Add a
1.5 Silence Skipping (Talk & Sermon Mode)
- The Concept: Automatically speed up or skip past silent gaps in spoken-word media.
- Why it matters: Long sermons, podcasts, and talks often have pauses; skipping silence saves 10–20% of listening time without altering speech tone.
- Technical Path:
- Connect an
AnalyserNodeorAudioWorkletin the Web Audio graph. - If audio energy (RMS) stays below -45 dB for >800 ms, ramp
playbackRateto 2.5× until speech resumes.
- Connect an
Domain 2: Audiophile & Music Player Polish
2.1 EBU R128 / LUFS Loudness Normalization
- The Concept: Eliminate jarring volume jumps between tracks in playlists and queues.
- Why it matters: YouTube master volumes vary widely (-24 LUFS to -8 LUFS). Normalization ensures consistent listening levels.
- Technical Path:
- When generating waveform peaks in
server/media-cache.js, run ffmpeg'sebur128filter once to measure integrated loudness (LUFS). - Store
lufsin the database and pass it via/api/streamsand/api/media/:id. - In
frontend/app.js, apply a Web AudioGainNodeto normalize tracks to a standard -14 LUFS target.
- When generating waveform peaks in
2.2 Real-Time Pitch Shifting & Independent Tempo Adjustment
- The Concept: Transpose playback key (±6 semitones) without altering tempo, or slow down tempo without changing pitch.
- Why it matters: Singers and worship teams often need to adapt songs to a band's vocal key. Instrumentalists need to slow down fast sections to learn them.
- Technical Path:
- Use an AudioWorklet running a Phase Vocoder or
SoundTouchJSDSP processor. - Provide stepper controls for semitone transposition and tempo percentage (0.5×–1.5×).
- Use an AudioWorklet running a Phase Vocoder or
2.3 Ambient Glow / Reactive Lighting Mode
- The Concept: A soft dynamic glow behind the video player that mirrors current video colors (similar to YouTube Ambient Mode or Apple Music dynamic art).
- Technical Path:
- Render video frames onto an offscreen 16×16
<canvas>at ~10 FPS. - Display a blurred canvas (
filter: blur(50px)) directly behind the player container with smooth CSS opacity. - Auto-disable when
settings.perfModeis active or underprefers-reduced-motion.
- Render video frames onto an offscreen 16×16
2.4 Smart Autoplay Radio / Endless Mix
- The Concept: Keep playing related songs when the active playlist or queue concludes.
- Technical Path:
- Fetch candidate related tracks via InnerTube
nextcontinuity tokens. - Re-rank candidates using the client's local
StatsTrack(playCount, listening duration, and skips) to favor familiar favorites while avoiding immediate repeats.
- Fetch candidate related tracks via InnerTube
Domain 3: Live Worship, Band & Stage Performance Engine
3.1 Interactive ChordPro Sheets & Live Transposition
- The Concept: Display chords inline or above lyrics with 1-tap live transposition and capo calculation.
- Why it matters: Replaces the need for external music stand apps (Planning Center Music Stand, OnSong) on stage.
- Technical Path:
- Extend
frontend/lyrics-core.jsto parse ChordPro directives ([G],[D/F#],{key: G}). - Add a Transpose controller (+1 / -1 semitone, Capo selector) that dynamically recalculates chord symbols in real time.
- Add a view toggle: "Lyrics Only" vs. "Chords & Lyrics".
- Extend
3.2 Bluetooth Foot Pedal / Page-Turner Support
- The Concept: Hands-free navigation for musicians on stage using standard Bluetooth foot pedals (AirTurn, PageFlip, Donner, Stomp).
- Why it matters: Musicians cannot remove their hands from instruments while playing.
- Technical Path:
- Standard foot pedals map to keyboard keys:
PageDown,PageUp,ArrowUp,ArrowDown. - Extend the global
keydownlistener infrontend/app.jsto handle pedal events in Service Mode:PageDown/PageUp: Scroll down / up by one lyric section.- Configurable actions: Next/Previous track, trigger A-B loop, or jump to Chorus.
- Standard foot pedals map to keyboard keys:
3.3 Confidence Monitor & Stage Clock (Presenter Mode)
- The Concept: A high-visibility stage display mode for the Presenter screen (
/?present=<code>). - Why it matters: Singers and worship leaders need glanceable cues for upcoming lyrics, section names, and remaining time.
- Technical Path:
- In
Presenter(frontend/app.js), provide a Confidence Monitor layout:- Current Line: Extra-large, high-contrast text.
- Next Line Preview: Smaller, dimmed text directly underneath.
- Section Badge: Prominent label (e.g.
# CHORUS 2). - Stage Clock & Timer: Current wall clock plus elapsed/remaining song timer.
- In
3.4 Section Quick-Jump Pad
- The Concept: A grid of buttons representing song sections (
[Intro],[Verse 1],[Chorus],[Bridge],[Outro]). - Why it matters: Worship teams often repeat choruses or spontaneously transition between sections during live services.
- Technical Path:
- Parse
# Sectionheaders from synced lyrics infrontend/lyrics-core.js. - Render an arrangement button strip in Service Mode.
- Tapping a section immediately seeks playback to that section's start timestamp.
- Parse
3.5 Visual Metronome & Count-In Click
- The Concept: Visual flash or gentle audio click count-in before track playback begins.
- Why it matters: Enables the band to start playing on beat before the recorded track introduces audio.
- Technical Path:
- When
@ 70 BPMmetadata is present in song notes, offer an optional 4-beat visual flash on the stage frame or Web Audio click before playback starts.
- When
Domain 4: Library, Offline & Sync Innovations
4.1 Visual Download Manager & Storage Dashboard
- The Concept: A unified management dashboard in Settings for offline media.
- Why it matters: Gives clear visibility into queued, active, and completed downloads with storage usage breakdowns.
- Technical Path:
- Show active download tasks with real-time progress bars.
- List storage usage grouped by playlist, audio vs. video format, and OPFS vs. server cache.
- Add controls: "Pause All", "Resume All", and "Retry Failed".
4.2 Smart Auto-Offline Favorites
- The Concept: Keep a user's most essential songs available offline automatically.
- Technical Path:
- Setting: "Keep Top 25 Most-Played Songs Offline" or "Keep Active Setlist Offline".
- Automated background routine checks local
playCountand triggers cache downloads for missing items during idle time.
4.3 Self-Contained Offline Playlist Bundling (Zip Export)
- The Concept: Export a full offline bundle containing playlist JSON plus the saved audio/video files for complete air-gapped device migration.
Domain 5: Collaboration & Watch Parties
5.1 Collaborative Setlists & Playlists
- The Concept: Multiple devices editing a single playlist simultaneously with live sync.
- Why it matters: Band leaders and team members can collaborate on Sunday setlists from different locations.
- Technical Path:
- Extend playlist sync in
server/db.jswith shared write keys. - Broadcast item reordering and song additions over the existing WebSocket hub in
server/party.js.
- Extend playlist sync in
5.2 Watch Party DJ Mode & Upvote Queue
- The Concept: Allow guests in a watch party (
/ws/party) to submit song requests that the group can upvote. - Technical Path:
- Add a "Suggested Queue" tab in the watch party drawer.
- Upvotes dynamically sort songs; when current playback finishes, the highest-voted song plays next.
3. Implementation Matrix & Recommended Phases
| Phase | Feature | Effort | Prerequisites & Reused Modules |
|---|---|---|---|
| Phase 1: Quick Wins | SponsorBlock & Non-Music Skip | Low | Free SponsorBlock API, playback tick in frontend/app.js |
| Automatic YouTube Chapter Ticks | Low | InnerTube metadata in server/server.js, timeline scrubber |
|
| Bluetooth Foot Pedal Shortcuts | Low | Keydown event listener in frontend/app.js |
|
| Section Quick-Jump Pad | Low | Lyric section parser in frontend/lyrics-core.js |
|
| Phase 2: Stage & Audio | EBU R128 LUFS Normalization | Medium | ffmpeg ebur128 in server/media-cache.js, Web Audio GainNode |
| ChordPro Display & Transpose | Medium | frontend/lyrics-core.js, chord parser |
|
| Confidence Monitor Stage View | Medium | Presenter & fitLyricLines in frontend/app.js |
|
| On-Screen Subtitles (CC) | Medium | /api/notes/:id/captions, overlay renderer |
|
| Phase 3: Deep Capabilities | Pitch Shift & Tempo Worklet | High | AudioWorklet / SoundTouchJS DSP |
| Ambient Glow Lighting | Low-Med | Offscreen <canvas> + CSS blur |
|
| Smart Autoplay Radio Mix | Medium | InnerTube next API, frontend/stats-core.js |
|
| Collaborative Setlists | High | WebSocket hub in server/party.js |