diff --git a/src/common/yt/urlCache.ts b/src/common/yt/urlCache.ts index b3a21f2..8adcc63 100644 --- a/src/common/yt/urlCache.ts +++ b/src/common/yt/urlCache.ts @@ -52,7 +52,9 @@ async function put(url: string | null, id: string): Promise { return await new Promise((resolve, reject) => { const store = db?.transaction("store", "readwrite").objectStore("store") if (!store) return resolve() - const request = store.put({ value: url, expireAt: !url ? new Date(Date.now() + 1 * 60 * 60 * 1000) : new Date(Date.now() + 15 * 24 * 60 * 60 * 1000) }, id) + const expireAt = !url ? new Date(Date.now() + 1 * 60 * 60 * 1000) : new Date(Date.now() + 15 * 24 * 60 * 60 * 1000) + const request = store.put({ value: url, expireAt }, id) + console.log('caching', id, url, 'until:', expireAt) request.addEventListener('success', () => resolve()) request.addEventListener('error', () => reject(request.error)) }) @@ -76,6 +78,7 @@ async function get(id: string): Promise { await clearExpired() return undefined } + console.log('cache found', id, response.value) return response.value } diff --git a/src/scripts/background.ts b/src/scripts/background.ts index ffe4467..c30af4f 100644 --- a/src/scripts/background.ts +++ b/src/scripts/background.ts @@ -1,23 +1,35 @@ -import { parseProtocolUrl } from '../common/lbry-url' import { resolveById, YtIdResolverDescriptor } from '../common/yt/urlResolve' + async function resolveYT(descriptor: YtIdResolverDescriptor) { - const lbryProtocolUrl: string | null = await resolveById([descriptor]).then(a => a[0]) - const segments = parseProtocolUrl(lbryProtocolUrl || '', { encode: true }) - if (segments.length === 0) return - return segments.join('/') + const lbryProtocolUrl: string | null = (await resolveById([descriptor]).then(a => a[0])) ?? null + if (!lbryProtocolUrl) return null + return lbryProtocolUrl.replaceAll('#', ':') + /* const segments = parseProtocolUrl(lbryProtocolUrl || '', { encode: true }) + if (segments.length === 0) throw new Error() + return segments.join('/') */ } -const onGoingLbryPathnameRequest: Record> = {} -async function lbryPathnameFromVideoId(videoId: string): Promise { +const onGoingLbryPathnameRequest: Record> = {} +async function lbryPathnameFromVideoId(videoId: string): Promise { // Don't create a new Promise for same ID until on going one is over. - const promise = onGoingLbryPathnameRequest[videoId] ?? (onGoingLbryPathnameRequest[videoId] = resolveYT({ id: videoId, type: 'video' })) - await promise - delete onGoingLbryPathnameRequest[videoId] - return await promise + try { + const promise = onGoingLbryPathnameRequest[videoId] ?? (onGoingLbryPathnameRequest[videoId] = resolveYT({ id: videoId, type: 'video' })) + console.log('lbrypathname request', videoId, await promise) + return await promise + } catch (error) { + throw error + } + finally { + delete onGoingLbryPathnameRequest[videoId] + } } chrome.runtime.onMessage.addListener(({ videoId }: { videoId: string }, sender, sendResponse) => { - lbryPathnameFromVideoId(videoId).then((lbryPathname) => sendResponse(lbryPathname)).catch((err) => sendResponse(err)) + lbryPathnameFromVideoId(videoId).then((lbryPathname) => sendResponse(lbryPathname)).catch((err) => + { + sendResponse('error') + console.error(err) + }) return true }) diff --git a/src/scripts/ytContent.tsx b/src/scripts/ytContent.tsx index 482c602..5a0de20 100644 --- a/src/scripts/ytContent.tsx +++ b/src/scripts/ytContent.tsx @@ -80,8 +80,8 @@ async function findVideoElement() { // We should get this from background, so the caching works and we don't get errors in the future if yt decides to impliment CORS async function requestLbryPathname(videoId: string) { - const response = await new Promise((resolve) => chrome.runtime.sendMessage({ videoId }, resolve)) - if (response instanceof Error) throw response + const response = await new Promise((resolve) => chrome.runtime.sendMessage({ videoId }, resolve)) + if (response === 'error') throw new Error("Background error.") return response } @@ -95,6 +95,7 @@ async function requestLbryPathname(videoId: string) { if (areaName !== 'local') return Object.assign(settings, Object.fromEntries(Object.entries(changes).map(([key, change]) => [key, change.newValue]))) if (changes.redirect) await onModeChange() + await updater() }) /* @@ -174,7 +175,6 @@ async function requestLbryPathname(videoId: string) { updateButton(mountPoint, target) } } - await updater() }