Use mp4/m4a for dash extensions

This commit is contained in:
the1812 2019-11-08 23:04:48 +08:00
parent ec35b9f160
commit d2acf71d01
10 changed files with 37 additions and 32 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -47,7 +47,7 @@
"download-video-package.min.js": "B10FF11DE7DFBACEC38F195B8E836511E527215B5E177CB1D223D14F30EB1435", "download-video-package.min.js": "B10FF11DE7DFBACEC38F195B8E836511E527215B5E177CB1D223D14F30EB1435",
"download-video.min.css": "95FF9DA3C1FFF1C1134D70AE3BB609049B7D5D3FBB71CAAAE84C8742C51AD841", "download-video.min.css": "95FF9DA3C1FFF1C1134D70AE3BB609049B7D5D3FBB71CAAAE84C8742C51AD841",
"download-video.min.html": "2727789E8423E8DBC8801FF6AC0D8181AC684A643A83CD446A5D69318DDBF9F6", "download-video.min.html": "2727789E8423E8DBC8801FF6AC0D8181AC684A643A83CD446A5D69318DDBF9F6",
"download-video.min.js": "2485F8AB5A4A4E5E7F40388ACD1657C9ABD1B2279C62BEA4AA3728E80F706C0F", "download-video.min.js": "4013A2F8DB6B2859DF83EFEC32274158ABA1769536D8656537E2FCDF96560AD8",
"dpi-img.vue.min.js": "3D9D93079365DCABA8DC8970F051AD1A7F25C3EFFF850CD1000C4312E9B910DD", "dpi-img.vue.min.js": "3D9D93079365DCABA8DC8970F051AD1A7F25C3EFFF850CD1000C4312E9B910DD",
"expand-danmaku.min.js": "B21658C40085AEA8DC49652AE62EB8610BB2EBEAF7A9C9AF69EF3B11E08EEC8D", "expand-danmaku.min.js": "B21658C40085AEA8DC49652AE62EB8610BB2EBEAF7A9C9AF69EF3B11E08EEC8D",
"expand-description.min.css": "58C7710A50521B80F7D872BDC4C652610D84C4FABC6874BA66DA37B4F8759224", "expand-description.min.css": "58C7710A50521B80F7D872BDC4C652610D84C4FABC6874BA66DA37B4F8759224",
@ -56,7 +56,7 @@
"feeds-apis.min.js": "ED1FFDEBC22680C5089F9D30CF667535FB99881C96A969DB47BC70BF095A99E8", "feeds-apis.min.js": "ED1FFDEBC22680C5089F9D30CF667535FB99881C96A969DB47BC70BF095A99E8",
"feeds-filter-card.vue.min.js": "3A7F8F402EA46E43B718506329814953C9E358A8AF94088D4E5745D48296D80B", "feeds-filter-card.vue.min.js": "3A7F8F402EA46E43B718506329814953C9E358A8AF94088D4E5745D48296D80B",
"feeds-filter.min.js": "10557E498B8BADA3C1C03E8C1DCD6FB24DBA2DA27A5A03BD861054F7E2989D46", "feeds-filter.min.js": "10557E498B8BADA3C1C03E8C1DCD6FB24DBA2DA27A5A03BD861054F7E2989D46",
"ffmpeg-support.min.js": "E3D90A111457F7093BE2DBBC011B268B497351CCFF987394A34171F77146A9B2", "ffmpeg-support.min.js": "CB33E150098394ABCACE6FC45CC1C6DA1B71012C77265D93F23C555A532016A1",
"fill-with-comments.min.js": "5D52ACB5057267C2EEBA5AA74EEE5D4086215645623560825C25AAA133536F2F", "fill-with-comments.min.js": "5D52ACB5057267C2EEBA5AA74EEE5D4086215645623560825C25AAA133536F2F",
"filter-type-switch.vue.min.js": "E06B00EF48F3CCFACC82B858A266CE0DF48F8332C5900B3AD579330D4C6D3125", "filter-type-switch.vue.min.js": "E06B00EF48F3CCFACC82B858A266CE0DF48F8332C5900B3AD579330D4C6D3125",
"fix-fullscreen.min.js": "C0628A7CABB4421FCBD7663700EF9965C96F6D79979B9F7523A9F9B0B009C8B6", "fix-fullscreen.min.js": "C0628A7CABB4421FCBD7663700EF9965C96F6D79979B9F7523A9F9B0B009C8B6",

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>{return(e,t)=>{const n=(e,t,n)=>{if(e<2){return null}const r=[];for(let s=1;s<=e;s++){r.push(escapeFilename(`file '${t} - ${s}${n}'`))}return r.join("\n")};const r=(e,t)=>{const n=e=>e.fragments.length>1;const r=e.filter(n);if(r.length===0){return null}const s=new Map;r.forEach(e=>{s.set(escapeFilename(`ffmpeg-files-${e.title}.txt`),e.fragments.map((n,r)=>{return escapeFilename(`file '${e.title} - ${r+1}${t}'`)}).join("\n"))});return s};const s=(e,t)=>{const n=[];e.forEach(e=>{e.fragments.forEach((r,s)=>{let i="";if(e.fragments.length>1){i=` - ${s+1}`}n.push(escapeFilename(`file '${e.title}${i}${t}'`))})});return n.join("\n")};return{export:{getFragmentsList:n,getBatchFragmentsList:r,getBatchEpisodesList:s}}}})(); (()=>{return(e,t)=>{const n=(e,t,n)=>{if(e<2){return null}const s=[];for(let r=1;r<=e;r++){let e=` - ${r}`;if(n.includes(".m4a")){e=""}s.push(escapeFilename(`file '${t}${e}${n[r-1]}'`))}return s.join("\n")};const s=(e,t)=>{const n=e=>e.fragments.length>1;const s=e.filter(n);if(s.length===0){return null}const r=new Map;s.forEach(e=>{r.set(escapeFilename(`ffmpeg-files-${e.title}.txt`),e.fragments.map((n,s)=>{return escapeFilename(`file '${e.title} - ${s+1}${t[s]}'`)}).join("\n"))});return r};const r=(e,t)=>{const n=[];e.forEach(e=>{e.fragments.forEach((s,r)=>{let i="";if(e.fragments.length>1&&!t.includes(".m4a")){i=` - ${r+1}`}n.push(escapeFilename(`file '${e.title}${i}${t[r]}'`))})});return n.join("\n")};return{export:{getFragmentsList:n,getBatchFragmentsList:s,getBatchEpisodesList:r}}}})();

View File

@ -325,7 +325,7 @@ class VideoDownloader {
const option = settings.aria2RpcOption const option = settings.aria2RpcOption
const params = this.fragments.map((fragment, index) => { const params = this.fragments.map((fragment, index) => {
let indexNumber = '' let indexNumber = ''
if (this.fragments.length > 1) { if (this.fragments.length > 1 && !this.isDash) {
indexNumber = ' - ' + (index + 1) indexNumber = ' - ' + (index + 1)
} }
const params = [] const params = []
@ -355,7 +355,7 @@ class VideoDownloader {
# https://github.com/the1812/Bilibili-Evolved/ # https://github.com/the1812/Bilibili-Evolved/
${this.fragments.map((it, index) => { ${this.fragments.map((it, index) => {
let indexNumber = '' let indexNumber = ''
if (this.fragments.length > 1) { if (this.fragments.length > 1 && !this.isDash) {
indexNumber = ' - ' + (index + 1) indexNumber = ' - ' + (index + 1)
} }
return ` return `
@ -380,10 +380,11 @@ ${it.url}
const match = [ const match = [
'.flv', '.flv',
'.mp4', '.mp4',
'.m4s',
].find(it => f.url.includes(it)) ].find(it => f.url.includes(it))
if (match) { if (match) {
return match return match
} else if (f.url.includes('.m4s')) {
return this.fragments.indexOf(f) === 0 ? '.mp4' : '.m4a'
} else { } else {
console.warn('No extension detected.') console.warn('No extension detected.')
return '.flv' return '.flv'
@ -488,14 +489,12 @@ ${it.url}
downloadedData.forEach((data, index) => { downloadedData.forEach((data, index) => {
let filename: string let filename: string
const fragment = this.fragments[index] const fragment = this.fragments[index]
if (downloadedData.length > 1) { if (downloadedData.length > 1 && !this.isDash) {
filename = `${title} - ${index + 1}${this.extension(fragment)}` filename = `${title} - ${index + 1}${this.extension(fragment)}`
} else { } else {
filename = `${title}${this.extension(fragment)}` filename = `${title}${this.extension(fragment)}`
} }
pack.add(filename, new Blob(Array.isArray(data) ? data : [data], { pack.add(filename, new Blob(Array.isArray(data) ? data : [data]))
type: this.extension(fragment) === '.flv' ? 'video/x-flv' : 'video/mp4'
}))
}) })
const danmaku = await this.downloadDanmaku() const danmaku = await this.downloadDanmaku()
pack.add( pack.add(
@ -746,7 +745,7 @@ async function loadPanel() {
} else { } else {
const { getFragmentsList } = await import('./ffmpeg-support') const { getFragmentsList } = await import('./ffmpeg-support')
const pack = new DownloadVideoPackage() const pack = new DownloadVideoPackage()
pack.add('ffmpeg-files.txt', getFragmentsList(videoDownloader.fragments.length, getFriendlyTitle(), videoDownloader.extension(videoDownloader.fragments[0]))) pack.add('ffmpeg-files.txt', getFragmentsList(videoDownloader.fragments.length, getFriendlyTitle(), videoDownloader.fragments.map(f => videoDownloader.extension(f))))
await pack.emit() await pack.emit()
} }
break break
@ -833,7 +832,8 @@ async function loadPanel() {
const items = await batchExtractor.getRawItems(format) const items = await batchExtractor.getRawItems(format)
const videoDownloader = new VideoDownloader(format, items[0].fragments) const videoDownloader = new VideoDownloader(format, items[0].fragments)
const { getBatchFragmentsList } = await import('./ffmpeg-support') const { getBatchFragmentsList } = await import('./ffmpeg-support')
const map = getBatchFragmentsList(items, videoDownloader.extension()) const extensions = this.dash ? ['.mp4', 'm4a'] : [videoDownloader.extension()]
const map = getBatchFragmentsList(items, extensions)
if (!map) { if (!map) {
Toast.info('所有选择的分P都没有分段.', '分段列表', 3000) Toast.info('所有选择的分P都没有分段.', '分段列表', 3000)
} else { } else {
@ -850,7 +850,8 @@ async function loadPanel() {
const items = await batchExtractor.getRawItems(format) const items = await batchExtractor.getRawItems(format)
const videoDownloader = new VideoDownloader(format, items[0].fragments) const videoDownloader = new VideoDownloader(format, items[0].fragments)
const { getBatchEpisodesList } = await import('./ffmpeg-support') const { getBatchEpisodesList } = await import('./ffmpeg-support')
const content = getBatchEpisodesList(items, videoDownloader.extension()) const extensions = this.dash ? ['.mp4', 'm4a'] : [videoDownloader.extension()]
const content = getBatchEpisodesList(items, extensions)
const pack = new DownloadVideoPackage() const pack = new DownloadVideoPackage()
pack.add('ffmpeg-files.txt', content) pack.add('ffmpeg-files.txt', content)
await pack.emit() await pack.emit()

View File

@ -1,16 +1,20 @@
import { RawItem } from './batch-download' import { RawItem } from './batch-download'
export const getFragmentsList = (count: number, originalTitle: string, extension: string) => { export const getFragmentsList = (count: number, originalTitle: string, extensions: string[]) => {
if (count < 2) { if (count < 2) {
return null return null
} }
const names = [] const names = []
for (let index = 1; index <= count; index++) { for (let index = 1; index <= count; index++) {
names.push(escapeFilename(`file '${originalTitle} - ${index}${extension}'`)) let indexNumber = ` - ${index}`
if (extensions.includes('.m4a')) {
indexNumber = ''
}
names.push(escapeFilename(`file '${originalTitle}${indexNumber}${extensions[index - 1]}'`))
} }
return names.join('\n') return names.join('\n')
} }
export const getBatchFragmentsList = (items: RawItem[], extension: string) => { export const getBatchFragmentsList = (items: RawItem[], extensions: string[]) => {
const multipleFragments = (item: RawItem) => item.fragments.length > 1 const multipleFragments = (item: RawItem) => item.fragments.length > 1
const fragmentsItems = items.filter(multipleFragments) const fragmentsItems = items.filter(multipleFragments)
if (fragmentsItems.length === 0) { if (fragmentsItems.length === 0) {
@ -19,20 +23,20 @@ export const getBatchFragmentsList = (items: RawItem[], extension: string) => {
const names = new Map<string, string>() const names = new Map<string, string>()
fragmentsItems.forEach(item => { fragmentsItems.forEach(item => {
names.set(escapeFilename(`ffmpeg-files-${item.title}.txt`), item.fragments.map((_, index) => { names.set(escapeFilename(`ffmpeg-files-${item.title}.txt`), item.fragments.map((_, index) => {
return escapeFilename(`file '${item.title} - ${index + 1}${extension}'`) return escapeFilename(`file '${item.title} - ${index + 1}${extensions[index]}'`)
}).join('\n')) }).join('\n'))
}) })
return names return names
} }
export const getBatchEpisodesList = (items: RawItem[], extension: string) => { export const getBatchEpisodesList = (items: RawItem[], extensions: string[]) => {
const names: string[] = [] const names: string[] = []
items.forEach(item => { items.forEach(item => {
item.fragments.forEach((f, index) => { item.fragments.forEach((_, index) => {
let indexNumber = '' let indexNumber = ''
if (item.fragments.length > 1) { if (item.fragments.length > 1 && !extensions.includes('.m4a')) {
indexNumber = ` - ${index + 1}` indexNumber = ` - ${index + 1}`
} }
names.push(escapeFilename(`file '${item.title}${indexNumber}${extension}'`)) names.push(escapeFilename(`file '${item.title}${indexNumber}${extensions[index]}'`))
}) })
}) })
return names.join('\n') return names.join('\n')