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({
Add to queue
+ {/* Needs a YouTube video id to seed the mix — a local file has nothing to seed from. */}
+ {track.source !== "local" && (
+
+ )}