android: reorder from the sheet — a playlist row up, down or to the top; a queue row up or down
Without a drag: a playlist row's sheet moves it up, down or to the top and persists the whole order in one call (playlist_set_order, as the desktop's drop does); a queue row's sheet moves it up or down, never past the track playing. Also src-tauri/android/ship.sh — one round end to end: the mock walk, the embedded build installed, the phone walk, the commit, each step gated on the one before.
This commit is contained in:
1 parent
991d52d0cc
commit
60303c8a95
7 files changed
+127
-7
No files matched your search
+20
-2
@@ -110,6 +110,8 @@ const PROBE = `(function () {
|
||||
pltags: [].map.call(document.querySelectorAll('.pl-rows .tag'), function (t) { return t.textContent.trim(); }).join('|'),
|
||||
plkind: (document.querySelector('.rec-head.pl .kind') || {}).textContent || '',
|
||||
plfilter: !!document.querySelector('.plfilter input'),
|
||||
plfirst: (document.querySelector('.pl-rows .trk .t') || {}).textContent || '',
|
||||
qfirst: (document.querySelector('.q-face .row .t') || {}).textContent || '',
|
||||
plthumbs: document.querySelectorAll('.pl-rows .thumb img').length,
|
||||
imp: document.querySelectorAll('.imp-rows .trk').length,
|
||||
impTags: [].map.call(document.querySelectorAll('.imp-rows .tag'), function (t) { return t.textContent.trim(); }).join('|'),
|
||||
@@ -175,6 +177,9 @@ const MOCK_STEPS = [
|
||||
/* a queue row's sheet: the row removed */
|
||||
{ do: `document.querySelector('.q-face .row').dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true }))`, name: "queue-row-sheet", wait: 600 },
|
||||
{ do: `__click('.halfsheet .row', 'Remove from queue')`, name: "queue-removed", wait: 600 },
|
||||
/* the second upcoming row moved up */
|
||||
{ do: `(function () { globalThis.__q2 = document.querySelectorAll('.q-face .row')[1].querySelector('.t').textContent; document.querySelectorAll('.q-face .row')[1].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true })); })()`, wait: 600 },
|
||||
{ do: `__click('.halfsheet .row', 'Move up')`, name: "queue-moved-up", wait: 600 },
|
||||
{ do: `document.querySelectorAll('.fbtn')[1].click()`, name: "lyrics", wait: 900 },
|
||||
/* the lyrics tools: nudged half a second, another candidate chosen */
|
||||
{ do: `__click('.lyr-tools', null)`, name: "lyrics-sheet", wait: 700 },
|
||||
@@ -277,6 +282,11 @@ const MOCK_STEPS = [
|
||||
{ do: `document.querySelectorAll('.pl-rows .trk')[0].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true }))`, name: "playlist-row-sheet", wait: 700 },
|
||||
{ do: `__click('.halfsheet .row', 'Remove from playlist')`, name: "playlist-removed", wait: 900 },
|
||||
{ do: `__click('.toast.notice .na', 'Undo')`, name: "playlist-undone", wait: 1000 },
|
||||
/* reordered from the sheet: the second row up, then back down */
|
||||
{ do: `document.querySelectorAll('.pl-rows .trk')[1].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true }))`, wait: 600 },
|
||||
{ do: `__click('.halfsheet .row', 'Move up')`, name: "playlist-moved-up", wait: 900 },
|
||||
{ do: `document.querySelectorAll('.pl-rows .trk')[0].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true, cancelable: true }))`, wait: 600 },
|
||||
{ do: `__click('.halfsheet .row', 'Move down')`, name: "playlist-moved-down", wait: 900 },
|
||||
/* the bulk actions from the page's sheet: Add to library files the
|
||||
streamed row (its cache is complete); Download all finds it cached too */
|
||||
{ do: `document.querySelectorAll('.gbar .iconbtn')[1].click()`, wait: 600 },
|
||||
@@ -405,6 +415,7 @@ const MOCK_EXPECT = {
|
||||
queue: (i) => { globalThis.__qrows = i.qrows; return i.sheet.includes("up") && i.qrows >= 2; },
|
||||
"queue-row-sheet": (i) => i.half.includes("up") && /Remove from queue/.test(i.halfText) && /Play now/.test(i.halfText),
|
||||
"queue-removed": (i) => !i.half.includes("up") && i.qrows === globalThis.__qrows - 1,
|
||||
"queue-moved-up": (i) => !i.half.includes("up") && !!i.qfirst && i.qrows === globalThis.__qrows - 1,
|
||||
"library-again": (i) => i.screen.includes("tr-pop"),
|
||||
/* after the follow: the feed's lead ("Coming · ALBUM" — the upcoming
|
||||
record leads), the news, the back catalogue, recommendations,
|
||||
@@ -448,6 +459,8 @@ const MOCK_EXPECT = {
|
||||
"playlist-row-sheet": (i) => i.half.includes("up") && /Remove from playlist/.test(i.halfText),
|
||||
"playlist-removed": (i) => i.plrows === 5 && /Removed/.test(i.notice),
|
||||
"playlist-undone": (i) => i.plrows === 6 && !i.notice,
|
||||
"playlist-moved-up": (i) => i.plfirst.startsWith("Track 2"),
|
||||
"playlist-moved-down": (i) => i.plfirst.startsWith("Track 1"),
|
||||
"playlist-bulk-cached": (i) => /1 saved to library/.test(i.bulkline) && !i.half.includes("up"),
|
||||
"playlist-bulk-download": (i) => /1 saved to library/.test(i.bulkline),
|
||||
"playlist-unknown-sheet": (i) => i.half.includes("up") && /Find a local match/.test(i.halfText),
|
||||
@@ -907,8 +920,13 @@ async function main() {
|
||||
const topName = (await cdp.evaluate(HERO)).top;
|
||||
await cdp.evaluate(HELPERS);
|
||||
await cdp.evaluate(`__click('.top .btn-ghost', null)`);
|
||||
await sleep(4500);
|
||||
const hero = await cdp.evaluate(HERO);
|
||||
/* the catalog page lands when the provider answers — polled, since a fixed wait read a slow answer as a failure */
|
||||
let hero = null;
|
||||
for (let i = 0; i < 24; i++) {
|
||||
await sleep(500);
|
||||
hero = await cdp.evaluate(HERO);
|
||||
if (!hero.screen.includes("has-hero") || hero.tabs >= 1 || hero.pop >= 1) break;
|
||||
}
|
||||
await still(path.join(OUT, `${prefix}cat-hero-page.png`));
|
||||
const heroOk = hero.screen.includes("tr-push") && (!hero.screen.includes("has-hero") || hero.tabs >= 1 || hero.pop >= 1);
|
||||
if (!heroOk) problems.push("EXPECT cat-hero-page " + JSON.stringify(hero));
|
||||
|
||||
Reference in new issue
Block a user