Skip to content

feat(playlists): launch the Ultimate Video Player from a playlist row - #63

Merged
iFlip721 merged 1 commit into
mainfrom
iss-53
Sep 3, 2026
Merged

feat(playlists): launch the Ultimate Video Player from a playlist row#63
iFlip721 merged 1 commit into
mainfrom
iss-53

Conversation

@iFlip721

@iFlip721 iFlip721 commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Issue: #53

Adds a play button to every playlist row — on Playlists and on the Dashboard's Playlists panel — that opens the Ultimate Player scoped to that playlist. Until now the player was reachable from exactly one place: open a playlist, open a channel, then the slide-out's Launch button — and only when Settings → Video Config → Video player was set to Ultimate. There was no way to say "just start watching this playlist".

The player itself needed no change. UplApp.boot() already falls back to the first channel when the hash carries no &ch=, so /player.html#pl= was already a working URL that nothing was constructing. The launch lands on the first row of the rail's CURRENT order, so it follows the viewer's A-Z / # preference (#51).

The button is shown regardless of the videoPlayer setting: that setting decides which player the channel SLIDE-OUT renders, which is a separate question from a per-row launcher. It is disabled while a playlist has no channels — a built-in is a zero-channel shell until its first sync, and launching one would open the player on a dead "No channel". No explanatory title there: .btn:disabled sets pointer-events:none globally so it would never show, and the row's own "0 channels" stat already says it.

Order in the action cell is pin → play → waffle, keeping the waffle as the row's last control — which also keeps RowActionsMenu (position:absolute; right:0 against that cell) anchored under the waffle rather than shifting right.

The launch now has three call sites, so ChannelDrawer.launchUpl's body moves to a shared openUltimatePlayer helper: the synchronous-window.open rule, the fixed 'masq-upl' window name, the features string, and the pop-up-blocked toast, along with the comments explaining why each is the way it is. The drawer keeps its own guard and delegates in one line. PlaylistRow.vue is untouched — it stays purely presentational, with each host supplying its own #actions.

Issue: #53

Adds a play button to every playlist row — on Playlists and on the Dashboard's
Playlists panel — that opens the Ultimate Player scoped to that playlist. Until
now the player was reachable from exactly one place: open a playlist, open a
channel, then the slide-out's Launch button — and only when Settings → Video
Config → Video player was set to Ultimate. There was no way to say "just start
watching this playlist".

The player itself needed no change. UplApp.boot() already falls back to the
first channel when the hash carries no &ch=, so /player.html#pl=<id> was already
a working URL that nothing was constructing. The launch lands on the first row
of the rail's CURRENT order, so it follows the viewer's A-Z / # preference (#51).

The button is shown regardless of the videoPlayer setting: that setting decides
which player the channel SLIDE-OUT renders, which is a separate question from a
per-row launcher. It is disabled while a playlist has no channels — a built-in
is a zero-channel shell until its first sync, and launching one would open the
player on a dead "No channel". No explanatory title there: .btn:disabled sets
pointer-events:none globally so it would never show, and the row's own "0
channels" stat already says it.

Order in the action cell is pin → play → waffle, keeping the waffle as the row's
last control — which also keeps RowActionsMenu (position:absolute; right:0
against that cell) anchored under the waffle rather than shifting right.

The launch now has three call sites, so ChannelDrawer.launchUpl's body moves to
a shared openUltimatePlayer helper: the synchronous-window.open rule, the fixed
'masq-upl' window name, the features string, and the pop-up-blocked toast, along
with the comments explaining why each is the way it is. The drawer keeps its own
guard and delegates in one line. PlaylistRow.vue is untouched — it stays purely
presentational, with each host supplying its own #actions.
@iFlip721
iFlip721 merged commit 97f2b07 into main Sep 3, 2026
6 checks passed
@iFlip721
iFlip721 deleted the iss-53 branch September 3, 2026 20:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant