From edc1666ed525255eaf9ec8ba7b1024c1d78ffcc1 Mon Sep 17 00:00:00 2001 From: Faizan Asad <57537470+noFAYZ@users.noreply.github.com> Date: Wed, 26 Aug 2026 13:47:05 +0500 Subject: [PATCH 1/2] feat: add Start radio to track context menu Seeds a mix from the track via the existing getUpNext-based autoplay queue, same path generateQueueAfter already uses from the queue panel. Closes #91 --- src/ui/components/TrackContextMenu.tsx | 16 +++++++++++++++- src/ui/icons.tsx | 1 + 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ui/components/TrackContextMenu.tsx b/src/ui/components/TrackContextMenu.tsx index 410b0b34..d271a494 100644 --- a/src/ui/components/TrackContextMenu.tsx +++ b/src/ui/components/TrackContextMenu.tsx @@ -8,7 +8,7 @@ import { useState, useSyncExternalStore, } from "react"; -import { AlbumIcon, CheckIcon, CloseIcon, CompassIcon, DownloadIcon, HeartActiveIcon, HeartIcon, LinkIcon, ListIcon, PencilIcon, PlaylistAddIcon, PlaylistIcon, SearchIcon, SkipNextIcon, TrashIcon } from "@/ui/icons"; +import { AlbumIcon, CheckIcon, CloseIcon, CompassIcon, DownloadIcon, HeartActiveIcon, HeartIcon, LinkIcon, ListIcon, PencilIcon, PlaylistAddIcon, PlaylistIcon, RadioIcon, SearchIcon, SkipNextIcon, TrashIcon } from "@/ui/icons"; import type { Playlist, Track, TrackRating } from "../../datasource/types"; import { TrackContextMenuContext, @@ -303,6 +303,13 @@ export function TrackContextMenuProvider({ showToast(`"${track.title}" will play next`); }; + /** Plays the track solo and lets autoplay fill the rest, seeded from it — a YT Music mix. */ + const startRadio = () => { + if (!track) return; + setMenuPosition(null); + void playerController.playTrackById(track.id, [track], true); + }; + const copyLink = async () => { if (!track) return; const selectedTrack = track; @@ -556,6 +563,13 @@ export function TrackContextMenuProvider({