Skip to content

Commit b9e187a

Browse files
authored
refactor: support media titles in m3u8 playlist (#176)
1 parent 148557a commit b9e187a

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

src/hooks/useDownload.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ async function getSaveDir(rpc_url: string, rpc_secret: string) {
3838
return save_dir
3939
}
4040
export const useDownload = () => {
41-
const { rawLinks, rawLinksText } = useSelectedLink()
41+
const { rawLinks } = useSelectedLink()
4242
const t = useT()
4343
const { pathname } = useRouter()
4444
return {
@@ -159,19 +159,25 @@ export const useDownload = () => {
159159
notify.error(`failed to send to aria2: ${e}`)
160160
}
161161
},
162-
playlist_download: () => {
163-
const a = document.createElement("a")
164-
a.href = URL.createObjectURL(
165-
new Blob([rawLinksText(true)], { type: "application/x-mpegURL" }),
166-
)
167-
const selectedObjs = _selectedObjs()
162+
playlistDownloadSelected: () => {
163+
const selectedObjs = _selectedObjs().filter((obj) => !obj.is_dir)
168164
let saveName = pathBase(pathname())
169165
if (selectedObjs.length === 1) {
170166
saveName = selectedObjs[0].name
171167
}
172168
if (!saveName) {
173169
saveName = t("manage.sidemenu.home")
174170
}
171+
const m3u8Content = selectedObjs.reduce(
172+
(acc, obj, index) =>
173+
`${acc}#EXTINF:-1,${obj.name}\n${rawLinks(true)[index]}\n`,
174+
"#EXTM3U\n",
175+
)
176+
const m3u8Blob = new Blob([m3u8Content], {
177+
type: "application/x-mpegURL",
178+
})
179+
const a = document.createElement("a")
180+
a.href = URL.createObjectURL(m3u8Blob)
175181
a.download = `${saveName}.m3u8`
176182
a.click()
177183
URL.revokeObjectURL(a.href)

src/pages/home/folder/context-menu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const ContextMenu = () => {
2929
const t = useT()
3030
const { colorMode } = useColorMode()
3131
const { copySelectedRawLink, copySelectedPreviewPage } = useCopyLink()
32-
const { batchDownloadSelected, sendToAria2, playlist_download } =
32+
const { batchDownloadSelected, sendToAria2, playlistDownloadSelected } =
3333
useDownload()
3434
const canPackageDownload = () => {
3535
return UserMethods.is_admin(me()) || getSettingBool("package_download")
@@ -148,7 +148,7 @@ export const ContextMenu = () => {
148148
<Item onClick={() => bus.emit("tool", "package_download")}>
149149
{t("home.toolbar.package_download")}
150150
</Item>
151-
<Item onClick={playlist_download}>
151+
<Item onClick={playlistDownloadSelected}>
152152
{t("home.toolbar.playlist_download")}
153153
</Item>
154154
</Show>

src/pages/home/toolbar/Download.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { CenterIcon } from "./Icon"
2323
export const Download = () => {
2424
const t = useT()
2525
const colorScheme = "neutral"
26-
const { batchDownloadSelected, sendToAria2, playlist_download } =
26+
const { batchDownloadSelected, sendToAria2, playlistDownloadSelected } =
2727
useDownload()
2828
return (
2929
<Menu placement="top" offset={10}>
@@ -45,7 +45,10 @@ export const Download = () => {
4545
>
4646
{t("home.toolbar.package_download")}
4747
</MenuItem>
48-
<MenuItem colorScheme={colorScheme} onSelect={playlist_download}>
48+
<MenuItem
49+
colorScheme={colorScheme}
50+
onSelect={playlistDownloadSelected}
51+
>
4952
{t("home.toolbar.playlist_download")}
5053
</MenuItem>
5154
</Show>

0 commit comments

Comments
 (0)