From c85737a57d037dabea2f1e9088042768caef2977 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Sun, 29 Dec 2024 19:50:39 +0100 Subject: [PATCH] feat(lucida): Download multiple urls --- src/lucida.ts | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/lucida.ts b/src/lucida.ts index a3bfc3a..3b8a07b 100644 --- a/src/lucida.ts +++ b/src/lucida.ts @@ -1,6 +1,6 @@ -import {firefox, Page, BrowserContext, Download} from 'playwright'; +import {firefox, Page, BrowserContext, Download, Browser} from 'playwright'; -async function lucida(album: URL, timeout: number, context: BrowserContext): Promise { +async function lucida(album: URL, baseTimeout: number, context: BrowserContext): Promise { const page: Page = await context.newPage(); await page.goto('/'); @@ -20,38 +20,44 @@ async function lucida(album: URL, timeout: number, context: BrowserContext): Pro // Parse info const albumName: string = (await page.locator('h1[class="svelte-6pt9ji"]').last().innerText()).trim(); - const trackCount: string = (await page.locator('h3[class="svelte-6pt9ji"]').first().innerText()).trim(); + const trackCount: number = parseInt((await page.locator('h3[class="svelte-6pt9ji"]').first().innerText()).trim().split(' ')[0]); + + console.log(`Downloading ${albumName} (${trackCount} tracks) from ${album.href}...`); + console.log(`Setting timeout to ${baseTimeout * trackCount} ms...`); // Start download await page.getByText('download full album').click(); - console.log(`Downloading ${albumName} (${trackCount}) from ${album.href}...`); - - - page.on('download', download => download.path().then(console.log)); - const downloadPromise: Promise = page.waitForEvent('download', { timeout: timeout }); - const download: Download = await downloadPromise; - // Save the download to the Downloads folder + const download: Download = await page.waitForEvent('download', { timeout: baseTimeout * trackCount }); // TODO Set path (configurable) - await download.saveAs('/home/tdpeuter/Downloads/' + download.suggestedFilename()); + await download.saveAs('/home/tdpeuter/Downloads/lucida/' + download.suggestedFilename()); await page.close(); } (async () => { + const timeout: number = 240000; + const albums: string[] = [ + 'https://www.qobuz.com/us-en/album/you-me-disclosure-eliza-doolittle/q5q4tg0cupgwa', + 'https://www.qobuz.com/us-en/album/shes-gone-dance-on-disclosure/xrylx7j5794ab', + 'https://www.qobuz.com/us-en/album/tondo-disclosure-eko-roosevelt/tlb5v175fbyxb' + ]; + const testAlbums: string[] = [ + 'https://www.qobuz.com/us-en/album/moon-safari-air/0724384497859' + ]; + // Launch a new Firefox browser instance // TODO Allow to pass headless option as argument - const browser = await firefox.launch({ headless: true }); // Set headless: true to run without UI - const context = await browser.newContext({ + const browser: Browser = await firefox.launch({ headless: false }); // Set headless: true to run without UI + const context: BrowserContext = await browser.newContext({ acceptDownloads: true, // Enable download handling baseURL: 'https://lucida.to' }); - const album: URL = new URL('https://www.qobuz.com/us-en/album/you-me-disclosure-eliza-doolittle/q5q4tg0cupgwa'); - // const album: URL = new URL('https://www.qobuz.com/us-en/album/led-zeppelin-iv-hd-remastered-edition-led-zeppelin/0603497898503'); - const timeout: number = 240000; - await lucida(album, timeout, context); + for (const album of testAlbums) { + await lucida(new URL(album), timeout, context); + } // Close the browser await browser.close();