Ոնց SoundCloud-ից քաշած երգի 23 պատառները իրար միացրի

Երեկ պարզեցի, որ Լանայի չհրապարակված երգերից մեկը SoundCloud-ում extended տարբերակ ունի, որ չեմ լսել էսքան ժամանակ 🗿 Ինտերնետով mp3 ֆայլն էի ման գալիս, որպեսզի քաշեմ գցեմ VK, լսեմ, բայց մի 5 րոպե փնտրտուքից հետո հասկացա, որ դեռ ոչ մի քաշելու լինկ չեմ գտել. մենակ SoundCloud-ում էր։ Ու քանի որ հավես չունեի ևս մի 5 րոպե փնտրտելու, որոշեցի հենց SoundCloud-ից քաշեմ։

Երգը, որ ուզում էի քաշել

SoundCloud-ում իհարկե մի ամբողջական mp3 ֆայլի հարցում չէր գնում: Փոխարենը, մի playlist.m3u8 անունով ֆայլ գտա, որի մեջ սիրուն նստած էին ամբողջ երգը կազմող 23 հատ 9-վայրկյանանոց mp3 ֆայլերի հասցեները։ Որոշեցի ավտոմատացնեմ դրանք ի մի բերելու պրոցեսը։ curl-ով կբերեմ բաղադրամաս ֆայլերը, իսկ ffmpeg-ով իրար կկցմցեմ։ Ի վերջո, գրեցի էս փոքրիկ snippet-ը։

#!/usr/local/bin/coffee
fs = require('fs').promises
path = require 'path'
util = require 'util'
exec = util.promisify require('child_process').exec
tracksAsCurlArgs = null
tracksAsFFMpegArgs = null
exitCode = 0
fs.mkdir(path.join __dirname, 'scl_tmp/')
.then =>
fs.readFile path.join(__dirname, process.argv[2])
.then (content) =>
trackUrls = content.toString().replace('\n#EXT-X-ENDLIST', '').split(/\n#EXTINF(?:.*)\n/g).slice 1
tracksAsCurlArgs = trackUrls.map((trackUrl, index) => "-o scl_tmp/part-#{index+1}.mp3 \"#{trackUrl}\"").join ' '
tracksAsFFMpegArgs = [1..trackUrls.length].map((i) => "scl_tmp/part-#{i}.mp3").join '|'
console.log 'Fetching parts...'
exec "curl -s #{tracksAsCurlArgs}"
.then =>
console.log 'All parts are fetched.'
console.log 'Concatenating parts...'
exec "ffmpeg -i \"concat:#{tracksAsFFMpegArgs}\" -acodec copy track-final.mp3"
.then =>
console.log 'All done!'
.catch (err) =>
console.error err
exitCode = 1
.finally =>
fs.rm path.join(__dirname, 'scl_tmp/'), recursive: yes
.catch =>
# Silence, Sir!
.finally =>
process.exit exitCode

Սրանով քաշելուց հետո ընդամենը mp3 տվյալները kid3-ով լրացրի, գցեցի VK ու վերջ 🥳


Մեկնաբանություններ