From 2d58c9ac634cda0adbbcee3ab916b1272829fc15 Mon Sep 17 00:00:00 2001 From: an-lee Date: Fri, 17 May 2024 11:36:35 +0800 Subject: [PATCH] Fix audible provider & add more YT channel (#618) * add more youtube channel * fix audible provider * fix youtube video card style --- enjoy/src/main/providers/audible-provider.ts | 12 +++---- enjoy/src/main/providers/ted-provider.ts | 16 ++++----- enjoy/src/main/providers/youtube-provider.ts | 34 ++++++++++++------- enjoy/src/preload.ts | 4 +-- .../videos/youtube-videos-segment.tsx | 19 ++++++----- enjoy/src/renderer/pages/home.tsx | 8 ++--- enjoy/src/types/enjoy-app.d.ts | 2 +- 7 files changed, 49 insertions(+), 46 deletions(-) diff --git a/enjoy/src/main/providers/audible-provider.ts b/enjoy/src/main/providers/audible-provider.ts index 86e33011..370d07f7 100644 --- a/enjoy/src/main/providers/audible-provider.ts +++ b/enjoy/src/main/providers/audible-provider.ts @@ -16,20 +16,18 @@ export class AudibleProvider { return new Promise((resolve, _reject) => { const view = new WebContentsView(); view.webContents.loadURL(this.baseURL + path); - view.webContents.on("did-finish-load", () => { - logger.debug(`Scraped ${this.baseURL + path}`); + view.webContents.on("did-stop-loading", () => { + logger.debug(`Finish loading ${this.baseURL + path}`); view.webContents .executeJavaScript(`document.documentElement.innerHTML`) .then((html) => { resolve(html as string); }) + .catch((err) => { + resolve(""); + }) .finally(() => view.webContents.close()); }); - view.webContents.on("did-fail-load", () => { - logger.warn(`Failed to scrape ${this.baseURL + path}`); - view.webContents.close(); - resolve(""); - }); }); }; diff --git a/enjoy/src/main/providers/ted-provider.ts b/enjoy/src/main/providers/ted-provider.ts index 516d3168..196f27de 100644 --- a/enjoy/src/main/providers/ted-provider.ts +++ b/enjoy/src/main/providers/ted-provider.ts @@ -11,23 +11,19 @@ export class TedProvider { view.webContents.loadURL(url); logger.debug("started scraping", url); - view.webContents.on("did-finish-load", () => { - logger.debug("finished scraping", url); + view.webContents.on("did-stop-loading", () => { + logger.debug("finished loading", url); view.webContents .executeJavaScript(`document.documentElement.innerHTML`) .then((html) => resolve(html as string)) + .catch((error) => { + logger.warn("Failed to scrape", url, error); + resolve(""); + }) .finally(() => { view.webContents.close(); }); }); - view.webContents.on( - "did-fail-load", - (_event, _errorCode, error, validatedURL) => { - logger.warn("Failed to scrape", url, error, validatedURL); - view.webContents.close(); - resolve(""); - } - ); }); }; diff --git a/enjoy/src/main/providers/youtube-provider.ts b/enjoy/src/main/providers/youtube-provider.ts index 317b9689..94883472 100755 --- a/enjoy/src/main/providers/youtube-provider.ts +++ b/enjoy/src/main/providers/youtube-provider.ts @@ -11,11 +11,15 @@ export class YoutubeProvider { view.webContents.loadURL(url); logger.debug("started scraping", url); - view.webContents.on("did-finish-load", () => { - logger.debug("finished scraping", url); + view.webContents.on("did-stop-loading", () => { + logger.debug("finished loading", url); view.webContents .executeJavaScript(`document.documentElement.innerHTML`) .then((html) => resolve(html as string)) + .catch((error) => { + logger.warn("Failed to scrape", url, error); + resolve(""); + }) .finally(() => { view.webContents.close(); }); @@ -45,12 +49,13 @@ export class YoutubeProvider { const videoList = videoContents .filter((i: any) => i.richItemRenderer) .map((video: any) => { + const thumbnails = + video.richItemRenderer.content.videoRenderer.thumbnail.thumbnails; + return { title: video.richItemRenderer.content.videoRenderer.title.runs[0].text, - thumbnail: - video.richItemRenderer.content.videoRenderer.thumbnail - .thumbnails[0].url, + thumbnail: thumbnails[thumbnails.length - 1].url, videoId: video.richItemRenderer.content.videoRenderer.videoId, duration: video.richItemRenderer.content.videoRenderer.lengthText @@ -65,18 +70,21 @@ export class YoutubeProvider { } }; - videos = async () => { - const html = await this.scrape("https://www.youtube.com/@CNN/videos"); + videos = async (channel: string) => { + const html = await this.scrape(`https://www.youtube.com/${channel}/videos`); return this.extractVideos(html); }; registerIpcHandlers = () => { - ipcMain.handle("youtube-provider-videos", async () => { - try { - return await this.videos(); - } catch (error) { - logger.error(error); + ipcMain.handle( + "youtube-provider-videos", + async (_event, channel: string) => { + try { + return await this.videos(channel); + } catch (error) { + logger.error(error); + } } - }); + ); }; } diff --git a/enjoy/src/preload.ts b/enjoy/src/preload.ts index 3445ef84..802288d6 100644 --- a/enjoy/src/preload.ts +++ b/enjoy/src/preload.ts @@ -85,8 +85,8 @@ contextBridge.exposeInMainWorld("__ENJOY_APP__", { }, }, youtube: { - videos: () => { - return ipcRenderer.invoke("youtube-provider-videos"); + videos: (channel: string) => { + return ipcRenderer.invoke("youtube-provider-videos", channel); }, }, }, diff --git a/enjoy/src/renderer/components/videos/youtube-videos-segment.tsx b/enjoy/src/renderer/components/videos/youtube-videos-segment.tsx index 80050b16..4bda8136 100755 --- a/enjoy/src/renderer/components/videos/youtube-videos-segment.tsx +++ b/enjoy/src/renderer/components/videos/youtube-videos-segment.tsx @@ -15,7 +15,8 @@ import { import { useNavigate } from "react-router-dom"; import { LoaderIcon } from "lucide-react"; -export const YoutubeVideosSegment = () => { +export const YoutubeVideosSegment = (props: { channel: string }) => { + const { channel } = props; const navigate = useNavigate(); const { EnjoyApp } = useContext(AppSettingsProviderContext); const [videos, setvideos] = useState([]); @@ -46,18 +47,20 @@ export const YoutubeVideosSegment = () => { }; const fetchYoutubeVideos = async () => { - const cachedVideos = await EnjoyApp.cacheObjects.get("youtube-videos"); + const cachedVideos = await EnjoyApp.cacheObjects.get( + `youtube-videos-${channel}` + ); if (cachedVideos) { setvideos(cachedVideos); return; } EnjoyApp.providers.youtube - .videos() + .videos(channel) .then((videos) => { if (!videos) return; - EnjoyApp.cacheObjects.set("youtube-videos", videos, 60 * 10); + EnjoyApp.cacheObjects.set(`youtube-videos-${channel}`, videos, 60 * 10); setvideos(videos); }) .catch((err) => { @@ -90,7 +93,7 @@ export const YoutubeVideosSegment = () => {

- {t("from")} Youtube CNN + {t("from")} Youtube {channel}

@@ -183,18 +186,18 @@ const YoutubeVideoCard = (props: { return (
-
+
{video.title}
{video.duration}
-
+
{video.title}
diff --git a/enjoy/src/renderer/pages/home.tsx b/enjoy/src/renderer/pages/home.tsx index 1fd0d0ae..dd2f826c 100644 --- a/enjoy/src/renderer/pages/home.tsx +++ b/enjoy/src/renderer/pages/home.tsx @@ -2,9 +2,7 @@ import { AudiosSegment, AudibleBooksSegment, StoriesSegment, - TedIdeasSegment, VideosSegment, - TedTalksSegment, YoutubeVideosSegment, } from "@renderer/components"; @@ -16,9 +14,9 @@ export default () => { - - - + + +
); diff --git a/enjoy/src/types/enjoy-app.d.ts b/enjoy/src/types/enjoy-app.d.ts index 1766af22..60de1365 100644 --- a/enjoy/src/types/enjoy-app.d.ts +++ b/enjoy/src/types/enjoy-app.d.ts @@ -42,7 +42,7 @@ type EnjoyAppType = { downloadTalk: (url: string) => Promise<{ audio: string; video: string }>; }; youtube: { - videos: () => Promise; + videos: (channel: string) => Promise; }; }; view: {