|
|
@ -1,3 +1,4 @@ |
|
|
|
const ID3Writer = require("browser-id3-writer"); |
|
|
|
export const FLAC_HEADER = [0x66, 0x4C, 0x61, 0x43]; |
|
|
|
export const MP3_HEADER = [0x49, 0x44, 0x33]; |
|
|
|
export const OGG_HEADER = [0x4F, 0x67, 0x67, 0x53]; |
|
|
@ -38,7 +39,7 @@ export function GetFileInfo(artist, title, filenameNoExt) { |
|
|
|
/** |
|
|
|
* @return {string} |
|
|
|
*/ |
|
|
|
export function GetCoverURL(metadata) { |
|
|
|
export function GetMetaCoverURL(metadata) { |
|
|
|
let pic_url = ""; |
|
|
|
if (metadata.common.picture !== undefined && metadata.common.picture.length > 0) { |
|
|
|
let pic = new Blob([metadata.common.picture[0].data], {type: metadata.common.picture[0].format}); |
|
|
@ -61,6 +62,56 @@ export function DetectAudioExt(data, fallbackExt) { |
|
|
|
if (IsBytesEqual(MP3_HEADER, data.slice(0, MP3_HEADER.length))) return "mp3"; |
|
|
|
if (IsBytesEqual(FLAC_HEADER, data.slice(0, FLAC_HEADER.length))) return "flac"; |
|
|
|
if (IsBytesEqual(OGG_HEADER, data.slice(0, OGG_HEADER.length))) return "ogg"; |
|
|
|
if (IsBytesEqual(M4A_HEADER, data.slice(4, 8))) return "m4a"; |
|
|
|
if (IsBytesEqual(M4A_HEADER, data.slice(4, 4 + M4A_HEADER.length))) return "m4a"; |
|
|
|
return fallbackExt; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export async function GetWebImage(pic_url) { |
|
|
|
try { |
|
|
|
let resp = await fetch(pic_url); |
|
|
|
let mime = resp.headers.get("Content-Type"); |
|
|
|
if (mime.startsWith("image/")) { |
|
|
|
let buf = await resp.arrayBuffer(); |
|
|
|
let objBlob = new Blob([buf], {type: mime}); |
|
|
|
let objUrl = URL.createObjectURL(objBlob); |
|
|
|
return {"buffer": buf, "url": objUrl, "type": mime}; |
|
|
|
} |
|
|
|
} catch (e) { |
|
|
|
} |
|
|
|
return {"buffer": null, "url": "", "type": ""} |
|
|
|
} |
|
|
|
|
|
|
|
export async function WriteMp3Meta(audioData, artistList, title, album, pictureData = null, pictureDesc = "Cover") { |
|
|
|
const writer = new ID3Writer(audioData); |
|
|
|
writer.setFrame("TPE1", artistList) |
|
|
|
.setFrame("TIT2", title) |
|
|
|
.setFrame("TALB", album); |
|
|
|
if (pictureData !== null) { |
|
|
|
writer.setFrame('APIC', { |
|
|
|
type: 3, |
|
|
|
data: pictureData, |
|
|
|
description: pictureDesc, |
|
|
|
}) |
|
|
|
} |
|
|
|
writer.addTag(); |
|
|
|
return writer.arrayBuffer; |
|
|
|
} |
|
|
|
|
|
|
|
export function RequestJsonp(url, callback_name = "callback") { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
let node; |
|
|
|
window[callback_name] = function (data) { |
|
|
|
delete window[callback_name]; |
|
|
|
if (node.parentNode) node.parentNode.removeChild(node); |
|
|
|
resolve(data) |
|
|
|
}; |
|
|
|
node = document.createElement('script'); |
|
|
|
node.type = "text/javascript"; |
|
|
|
node.src = url; |
|
|
|
node.addEventListener('error', msg => { |
|
|
|
reject(msg); |
|
|
|
}); |
|
|
|
document.head.appendChild(node); |
|
|
|
}); |
|
|
|
} |
|
|
|