mirror of
https://github.com/movie-web/movie-web.git
synced 2024-12-26 05:31:50 +01:00
Merge pull request #596 from robertsspaceindustries/dev
Playlist download support
This commit is contained in:
commit
ed67c30e1d
@ -188,8 +188,9 @@
|
||||
"downloads": {
|
||||
"title": "Download",
|
||||
"disclaimer": "Downloads are taken directly from the provider. movie-web does not have control over how the downloads are provided.",
|
||||
"hlsExplanation": "This media is a HLS stream which cannot be downloaded on movie-web.",
|
||||
"hlsDisclaimer": "Downloads are taken directly from the provider. movie-web does not have control over how the downloads are provided. Please note that you are downloading an HLS playlist, this is intended for users familiar with advanced multimedia streaming.",
|
||||
"downloadVideo": "Download video",
|
||||
"downloadPlaylist": "Download playlist",
|
||||
"downloadCaption": "Download current caption",
|
||||
"onPc": {
|
||||
"1": "On PC, click the download button then, on the new page, right click the video and select <bold>Save video as</bold>",
|
||||
|
@ -15,6 +15,7 @@ function useDownloadLink() {
|
||||
const url = useMemo(() => {
|
||||
if (source?.type === "file" && currentQuality)
|
||||
return source.qualities[currentQuality]?.url ?? null;
|
||||
if (source?.type === "hls") return source.url;
|
||||
return null;
|
||||
}, [source, currentQuality]);
|
||||
return url;
|
||||
@ -42,6 +43,7 @@ export function DownloadView({ id }: { id: string }) {
|
||||
const { t } = useTranslation();
|
||||
const downloadUrl = useDownloadLink();
|
||||
|
||||
const sourceType = usePlayerStore((s) => s.source?.type);
|
||||
const selectedCaption = usePlayerStore((s) => s.caption?.selected);
|
||||
const subtitleUrl = useMemo(
|
||||
() =>
|
||||
@ -60,36 +62,61 @@ export function DownloadView({ id }: { id: string }) {
|
||||
</Menu.BackLink>
|
||||
<Menu.Section>
|
||||
<div>
|
||||
<Menu.ChevronLink onClick={() => router.navigate("/download/pc")}>
|
||||
{t("player.menus.downloads.onPc.title")}
|
||||
</Menu.ChevronLink>
|
||||
<Menu.ChevronLink onClick={() => router.navigate("/download/ios")}>
|
||||
{t("player.menus.downloads.onIos.title")}
|
||||
</Menu.ChevronLink>
|
||||
<Menu.ChevronLink
|
||||
onClick={() => router.navigate("/download/android")}
|
||||
>
|
||||
{t("player.menus.downloads.onAndroid.title")}
|
||||
</Menu.ChevronLink>
|
||||
{sourceType === "hls" ? (
|
||||
<>
|
||||
<Menu.Paragraph marginClass="mb-6">
|
||||
<StyleTrans k="player.menus.downloads.hlsDisclaimer" />
|
||||
</Menu.Paragraph>
|
||||
|
||||
<Menu.Divider />
|
||||
<Button className="w-full" href={downloadUrl} theme="purple">
|
||||
{t("player.menus.downloads.downloadPlaylist")}
|
||||
</Button>
|
||||
<Button
|
||||
className="w-full mt-2"
|
||||
href={subtitleUrl ?? undefined}
|
||||
disabled={!subtitleUrl}
|
||||
theme="secondary"
|
||||
download="subtitles.srt"
|
||||
>
|
||||
{t("player.menus.downloads.downloadCaption")}
|
||||
</Button>
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Menu.ChevronLink onClick={() => router.navigate("/download/pc")}>
|
||||
{t("player.menus.downloads.onPc.title")}
|
||||
</Menu.ChevronLink>
|
||||
<Menu.ChevronLink
|
||||
onClick={() => router.navigate("/download/ios")}
|
||||
>
|
||||
{t("player.menus.downloads.onIos.title")}
|
||||
</Menu.ChevronLink>
|
||||
<Menu.ChevronLink
|
||||
onClick={() => router.navigate("/download/android")}
|
||||
>
|
||||
{t("player.menus.downloads.onAndroid.title")}
|
||||
</Menu.ChevronLink>
|
||||
|
||||
<Menu.Paragraph marginClass="my-6">
|
||||
<StyleTrans k="player.menus.downloads.disclaimer" />
|
||||
</Menu.Paragraph>
|
||||
<Menu.Divider />
|
||||
|
||||
<Button className="w-full" href={downloadUrl} theme="purple">
|
||||
{t("player.menus.downloads.downloadVideo")}
|
||||
</Button>
|
||||
<Button
|
||||
className="w-full mt-2"
|
||||
href={subtitleUrl ?? undefined}
|
||||
disabled={!subtitleUrl}
|
||||
theme="secondary"
|
||||
download="subtitles.srt"
|
||||
>
|
||||
{t("player.menus.downloads.downloadCaption")}
|
||||
</Button>
|
||||
<Menu.Paragraph marginClass="my-6">
|
||||
<StyleTrans k="player.menus.downloads.disclaimer" />
|
||||
</Menu.Paragraph>
|
||||
|
||||
<Button className="w-full" href={downloadUrl} theme="purple">
|
||||
{t("player.menus.downloads.downloadVideo")}
|
||||
</Button>
|
||||
<Button
|
||||
className="w-full mt-2"
|
||||
href={subtitleUrl ?? undefined}
|
||||
disabled={!subtitleUrl}
|
||||
theme="secondary"
|
||||
download="subtitles.srt"
|
||||
>
|
||||
{t("player.menus.downloads.downloadCaption")}
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</Menu.Section>
|
||||
</>
|
||||
|
@ -37,6 +37,8 @@ export function SettingsMenu({ id }: { id: string }) {
|
||||
|
||||
const source = usePlayerStore((s) => s.source);
|
||||
|
||||
const downloadable = source?.type === "file" || source?.type === "hls";
|
||||
|
||||
return (
|
||||
<Menu.Card>
|
||||
<Menu.SectionTitle>
|
||||
@ -58,12 +60,10 @@ export function SettingsMenu({ id }: { id: string }) {
|
||||
<Menu.Link
|
||||
clickable
|
||||
onClick={() =>
|
||||
router.navigate(
|
||||
source?.type === "file" ? "/download" : "/download/unable",
|
||||
)
|
||||
router.navigate(downloadable ? "/download" : "/download/unable")
|
||||
}
|
||||
rightSide={<Icon className="text-xl" icon={Icons.DOWNLOAD} />}
|
||||
className={source?.type === "file" ? "opacity-100" : "opacity-50"}
|
||||
className={downloadable ? "opacity-100" : "opacity-50"}
|
||||
>
|
||||
{t("player.menus.settings.downloadItem")}
|
||||
</Menu.Link>
|
||||
|
Loading…
Reference in New Issue
Block a user