diff --git a/src/lib/prompts/settings.ts b/src/lib/prompts/settings.ts index 1e43b311..c9a3fe31 100644 --- a/src/lib/prompts/settings.ts +++ b/src/lib/prompts/settings.ts @@ -1,5 +1,5 @@ import prompts from "prompts"; -import type { Extras, Resolution } from "../types.js"; +import { Channels, PROMPT_CONFIRM, Settings, type Extras, type Resolution } from "../types.js"; import { Video } from "../Video.js"; /** @@ -79,3 +79,26 @@ export const daysToKeepVideos = async (initial: number): Promise => min: 1, }) ).daysToKeepVideos || initial; + +export const multiSelectChannelPrompt = async (initial: Channels): Promise => { + return ( + await prompts({ + type: "multiselect", + name: "downloadChannels", + message: "Enable/Disable channels:", + choices: initial.map((initial) => ({ title: initial.title, value: initial.title, selected: !initial.skip })), + hint: "- Space to select. Return to submit", + }) + ).downloadChannels; +}; + +export const selectSubscriptionPrompt = async (initial: Settings["subscriptions"]): Promise => { + return ( + await prompts({ + type: "select", + name: "subscription", + message: "Select a subscription", + choices: [...Object.keys(initial).map((option) => ({ title: initial[option].plan, value: option })), { title: "Confirm", value: PROMPT_CONFIRM }], + }) + ).subscription; +}; diff --git a/src/lib/types.ts b/src/lib/types.ts index 488c4b8a..efc75abe 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -69,3 +69,5 @@ export type Settings = { contributeMetrics: boolean; }; }; + +export const PROMPT_CONFIRM = "confirm"; diff --git a/src/quickStart.ts b/src/quickStart.ts index 3796daa3..c925dd03 100644 --- a/src/quickStart.ts +++ b/src/quickStart.ts @@ -4,8 +4,9 @@ import { args, settings, fApi } from "./lib/helpers/index.js"; import { MyPlexAccount } from "@ctrl/plex"; import * as prompts from "./lib/prompts/index.js"; -import type { Extras } from "./lib/types.js"; +import { PROMPT_CONFIRM, Settings, type Extras } from "./lib/types.js"; import { Video } from "./lib/Video.js"; +import { multiSelectChannelPrompt, selectSubscriptionPrompt } from "./lib/prompts/settings.js"; export const promptPlexSections = async (): Promise => { const plexApi = await new MyPlexAccount(undefined, undefined, undefined, settings.plex.token).connect(); @@ -41,6 +42,52 @@ export const validatePlexSettings = async (): Promise => { } }; +export const promptSubscriptionSection = async (): Promise => { + const userSubscription = await fApi.user.subscriptions(); + const channels = await fApi.creator.channels(userSubscription.map((channel) => channel.creator)); + + const subscriptions = userSubscription.reduce((acc, subscription) => { + acc[subscription.creator] = { + creatorId: subscription.creator, + plan: subscription.plan.title, + skip: false, + channels: channels + .filter((channel) => channel.creator === subscription.creator) + .map((channel) => ({ + title: channel.title, + skip: false, + isChannel: + channel.id === "6413623f5b12cca228a28e78" + ? `(post, video) => isChannel(post, '${channel.id}') && !video?.title?.toLowerCase().startsWith('caption')` + : `(post) => isChannel(post, '${channel.id}')`, + })), + }; + return acc; + }, {}); + + let selectedSubscriptionId: string | undefined = undefined; + + while (selectedSubscriptionId !== PROMPT_CONFIRM) { + selectedSubscriptionId = await selectSubscriptionPrompt(subscriptions); + + const subscription = subscriptions[selectedSubscriptionId]; + + if (subscription) { + const selectedChannels = await multiSelectChannelPrompt(subscription.channels); + subscription.channels = subscription.channels.map((channel) => ({ ...channel, skip: !selectedChannels.includes(channel.title) })); + } + } + + for (const subscription of Object.values(subscriptions)) { + settings.subscriptions[subscription.creatorId] ??= { + creatorId: subscription.creatorId, + plan: subscription.plan, + skip: false, + channels: subscription.channels.map((channel) => ({ title: channel.title, skip: channel.skip, isChannel: channel.isChannel })), + }; + } +}; + export const quickStart = async (): Promise => { console.log("Welcome to Floatplane Downloader! Thanks for checking it out <3."); console.log("According to your settings.json this is your first launch! So lets go through the basic setup...\n"); @@ -62,6 +109,9 @@ export const quickStart = async (): Promise => { for (const extra in settings.extras) settings.extras[extra as keyof Extras] = extras.indexOf(extra) > -1 ? true : false; } + console.log("\n== \u001b[38;5;208mSubscriptions\u001b[0m ==\n"); + await promptSubscriptionSection(); + console.log("\n== \u001b[38;5;208mPlex\u001b[0m ==\n"); settings.plex.enabled = await prompts.plex.usePlex(settings.plex.enabled); if (settings.plex.enabled) {