{"version":3,"sources":["jsdelivr-header.js","/npm/ytmp@1.1.1/index.js"],"names":[],"mappings":"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","file":"/npm/ytmp@1.1.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ytmp@1.1.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const fs = require('fs')\nconst {spawn} = require('child_process')\n\nconst ytdl = require('ytdl-core')\nconst ytsr = require('ytsr')\nconst ytpl = require('ytpl')\n\nasync function main(str, options = {}) {\n\tconst {play: single = false, radio = false, mix = false, search = false, id = false} = options\n\tconst def = !single && !radio && !mix\n\t\n\tif (!search) {\n\n\t\tif (ytpl.validateURL(str)) {\n\t\t\tlet info = play(str, options)\n\t\t\tif (mix) info = playMix(info, options)\n\t\t\tif (radio) info = playRadio(info, options)\n\t\t\treturn info\n\t\t}\n\n\t\tif (ytdl.validateURL(str) || ytdl.validateID(str)) {\n\t\t\tlet info = play(str, options)\n\t\t\tif (mix) info = playMix(info, options)\n\t\t\tif (radio || def) info = playRadio(info, options)\n\t\t\treturn info\n\t\t}\n\n\t\tif (typeof id === false) throw new Error(JSON.stringify(id) + \" is neither a valid ID or URL\")\n\t}\n\n\tif (typeof id !== false) {\n\n\t\tconst results = await ytsr(str)\n\n\t\tif (!results.items.length) throw new Error(\"Search returned no results\")\n\n\t\tconst link = results.items[0].link\n\t\t// todo interactive selection\n\n\t\tif (ytpl.validateURL(link)) {\n\t\t\tlet info = play(link, options)\n\t\t\tif (mix) info = playMix(info, options)\n\t\t\tif (radio || def) info = playRadio(info, options)\n\t\t\treturn info\n\t\t}\n\n\t\tif (ytdl.validateURL(link)) {\n\t\t\tlet info = play(link, options)\n\t\t\tif (mix || def) info = playMix(info, options)\n\t\t\tif (radio || def) info = playRadio(info, options)\n\t\t\treturn info\n\t\t}\n\n\t\tthrow new Error(JSON.stringify(link) + \" is neither a valid video or playlist URL\")\n\t}\n\n\tthrow new Error(\"Nothing to do.\")\n}\nmodule.exports = main\n\nasync function play(id, options = {}) {\n\tconst {audio = false, video = false, player = 'mpv',\n\t\tsaveinfo = false, quiet = false, verbose = false} = options\n\n\tif (typeof id === 'string' && ytpl.validateURL(id)) {\n\t\tconst playlist = await ytpl(id)\n\n\t\tif (verbose) console.error(\"Playing playlist: %s\", playlist.title)\n\n\t\tlet info\n\t\tfor (let item of playlist.items) {\n\t\t\tinfo = await play(item.id)\n\t\t}\n\n\t\tif (verbose) console.error(\"End of playlist\")\n\n\t\treturn info\n\t} else {\n\t\tconst info = typeof id === 'string'\n\t\t\t? await ytdl.getInfo(id)\n\t\t\t: await id\n\n\t\tif (saveinfo !== false) {\n\t\t\tfs.writeFileSync(typeof saveinfo === 'boolean' ? __dirname + \"/info.json\"\n\t\t\t\t: String(saveinfo) || \"info.json\", JSON.stringify(info, null, 4))\n\t\t}\n\t\t\n\t\tconst format = ytdl.chooseFormat(info.formats, {\n\t\t\tquality: video ? 'highestvideo' : 'highestaudio',\n\t\t\tfilter: video ? 'audioandvideo' : audio && 'audioonly' || 'audio',\n\t\t})\n\t\tif (!format) throw new Error(\"Could not get an appropriate format\")\n\n\t\tconst url = format.url\n\n\t\tif (!quiet) console.log(info.title)\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst playerProcess = spawn(player, [url], {stdio: 'inherit'})\n\t\t\t\t.on('error', reject)\n\t\t\t\t.on('exit', code => code\n\t\t\t\t\t? reject(new Error(\"Player exited with status \" + code))\n\t\t\t\t\t: resolve(info))\n\t\t})\n\t}\n}\nmodule.exports.play = play\n\nasync function playRadio(id, options = {}) {\n\tconst {verbose = false} = options\n\n\tlet info\n\tif (typeof id === 'string') {\n\t\tinfo = await play(id, options)\n\t} else {\n\t\tinfo = await id\n\t}\n\n\tif (verbose) console.error(\"Playing radio for %s\", info.title)\n\n\treturn playRadioRecursive(info)\n}\nmodule.exports.playRadio = playRadio\n\nasync function playRadioRecursive(info, options = {}) {\n\tfor (let i of info['related_videos']\n\t\t.map(i => {\n\t\t\tlet {view_count} = i\n\t\t\tview_count = view_count.replace(/,/, '')\n\t\t\tconst postfix = /(Mrd|[KMG])$/.exec(view_count)\n\t\t\tview_count = parseFloat(view_count)\n\t\t\tswitch (postfix) {\n\t\t\t\tcase \"K\": view_count *= 1000; break\n\t\t\t\tcase \"M\": view_count *= 1000000; break\n\t\t\t\tcase \"Mrd\": view_count *= 1000000000; break\n\t\t\t}\n\t\t\treturn {...i, view_count}\n\t\t})\n\t\t.sort((a, b) => {\n\t\t\tif (a.view_count < b.view_count) return 1\n\t\t\tif (a.view_count > b.view_count) return -1\n\t\t\treturn 0\n\t\t})\n\t) {\n\t\ttry {\n\t\t\tinfo = play(i.id, options)\n\t\t\tinfo = await playRadioRecursive(info)\n\t\t} catch (e) {\n\t\t\tcontinue\n\t\t}\n\t}\n\n\treturn info\n}\n\nasync function playMix(id, options = {}) {\n\tconst {verbose = false} = options\n\n\tlet info\n\tif (typeof id === 'string') {\n\t\tinfo = await play(id, options)\n\t} else {\n\t\tinfo = await id\n\t}\n\n\tif (verbose) console.error(\"Playing YouTube Mix of: \" + info.title)\n\n\tfor (let i of info.related_videos) {\n\t\tinfo = await play(i.id)\n\t}\n\n\tif (verbose) console.error(\"Mix is over\")\n\n\treturn info\n}\nmodule.exports.playMix = playMix\n"]}