import type { GetServerSideProps, NextPage } from "next"; import { getSession, useSession } from "next-auth/react"; import { useState } from "react"; import { dehydrate, QueryClient, useQuery } from "react-query"; import { CustomHead } from "../components/CustomHead"; import { Layout } from "../components/Layout"; import NextImage from "next/image"; import { getDownloads, sendDeleteAllQueuedIgnored, sendDeleteVideoQueuedIgnored, sendMoveVideoQueuedIgnored } from "../lib/getDownloads"; import { sendDownloads } from "../lib/getDownloads"; import RescanIcon from "../images/icon-rescan.svg"; import DownloadIcon from "../images/icon-download.svg"; import AddIcon from "../images/icon-add.svg"; import GridViewIcon from "../images/icon-gridview.svg"; import ListViewIcon from "../images/icon-listview.svg"; import StopIcon from "../images/icon-stop.svg"; import CloseIcon from "../images/icon-close.svg"; import { getTAUrl } from "../lib/constants"; const TA_BASE_URL = getTAUrl(); type ViewStyle = "grid" | "list"; type IgnoredStatus = boolean; type FormHidden = boolean; type ErrorMessage = boolean; export const getServerSideProps: GetServerSideProps = async (context) => { const queryClient = new QueryClient(); const session = await getSession(context); if (!session) { return { redirect: { destination: "/auth/login", permanent: false, }, }; } await queryClient.prefetchQuery(["downloads", session.ta_token.token, false], () => getDownloads(session.ta_token.token, false) ); return { props: { dehydratedState: dehydrate(queryClient), session, }, }; }; const Download: NextPage = () => { const { data: session } = useSession(); const [ignoredStatus, setIgnoredStatus] = useState(false); const { data: downloads, error, isLoading, refetch, } = useQuery( ["downloads", session.ta_token.token, ignoredStatus], () => getDownloads(session.ta_token.token, ignoredStatus), { enabled: !!session?.ta_token?.token, refetchInterval: 1500, refetchIntervalInBackground: false, } ); const [formHidden, setFormHidden] = useState(true); const [viewStyle, setViewStyle] = useState(downloads?.config?.default_view?.downloads); const [errorMessage, setErrorMessage] = useState(false); const handleSetViewstyle = (selectedViewStyle: ViewStyle) => { setViewStyle(selectedViewStyle); }; const handleSetIgnoredStatus = (selectedIgnoredStatus: IgnoredStatus) => { setIgnoredStatus(selectedIgnoredStatus); refetch(); }; const handleSetFormHidden = (selectedFormHidden: FormHidden) => { setFormHidden(selectedFormHidden); }; const handleSetErrorMessage = (selectedErrorMessage: ErrorMessage) => { setErrorMessage(selectedErrorMessage); }; const addToDownloadQueue = event => { event.preventDefault(); sendDownloads(session.ta_token.token, event.target.vid_url.value).then((response) => !response.message ? handleSetErrorMessage(false) : handleSetErrorMessage(true)); errorMessage ? handleSetFormHidden(false) : handleSetFormHidden(true); } return ( <>

Downloads

{error &&

{downloads?.message}

} {errorMessage &&

Failed to extract links.

Not a video, channel, playlist ID or URL

} { //
//

Adding new videos to download queue.

//

Extracting lists

//

Progress: 0/0

//
} { //
//

Rescanning channels and playlists.

//

Looking for new videos.

//
} { //
//

Downloading: `VIDEO_TITLE`

//

processing

//

`DOWNLOADED_PERCENTAGE`% of `VIDEO_SIVE``VIDEO_SIZE_UNIT` at `DOWNLOAD_SPEED``DOWNLOAD_SPEED_UNIT` - time left: `DOWNLOAD_TIME_LEFT`

//

processing

//

Moving

//

Completed

//
}
{/* Appears when video is downloading */} {/*
console.log("stopQueue()")} /> console.log("killQueue()")} />
*/}
console.log("rescanPending()")} /> {/* rescan-icon */}

Rescan subscriptions

console.log("dlPending()")} /> {/* download-icon */}

Start download

formHidden ? handleSetFormHidden(false) : handleSetFormHidden(true)} />

Add to download queue

{!formHidden &&