youtube-cue/src/process.js

75 lines
2.1 KiB
JavaScript

import fs from 'fs';
import { parse } from './parser.js';
import getArtistTitle from 'get-artist-title';
import ytdl from 'ytdl-core';
import exit from 'process';
const DEFAULT_AUDIO_FILE = 'audio.m4a';
const DEFAULT_ARTIST = 'Unknown Artist';
const DEFAULT_ALBUM = 'Unknown Album';
const DEFAULT_OUTPUT_FILE = 'output.cue';
function validateArgs(argv) {
if (forceTimestamps(argv) && forceDurations(argv)) {
console.error("You can't pass both --timestamps and durations");
exit(1);
}
}
function forceTimestamps(argv) {
return argv['timestamps'] ? argv['timestamps'] : false;
}
function forceDurations(argv) {
argv['durations'] ? argv['durations'] : false;
}
export function processFile(inputFile, argv) {
validateArgs(argv);
let audioFile = argv['audio-file'] ? argv['audio-file'] : `audio.m4a`;
let contents = fs.readFileSync(inputFile, 'utf8');
let tracks = parse(contents, {
artist: DEFAULT_ARTIST,
forceTimestamps: forceTimestamps(argv),
forceDurations: forceDurations(argv),
});
let artist = argv['cue-performer'] ? argv['cue-performer'] : DEFAULT_ARTIST;
let album = argv['cue-title'] ? argv['cue-title'] : DEFAULT_ALBUM;
return {
tracks: tracks,
artist: artist,
audioFile: audioFile,
album: album,
outputFile: argv._[1] ? argv._[1] : DEFAULT_OUTPUT_FILE,
};
}
export async function processYoutube(url, argv) {
let info = await ytdl.getInfo(url);
let audioFile = argv['audio-file']
? argv['audio-file']
: `${info.videoDetails.title}.m4a`;
let outputFile = argv._[1] ? argv._[1] : `${info.videoDetails.title}.cue`;
let res = getArtistTitle(info.videoDetails.title, {
defaultArtist: DEFAULT_ARTIST,
defaultTitle: info.videoDetails.title,
});
let [artist, album] = res;
artist = info.videoDetails.media ? info.videoDetails.media.artist : artist;
let tracks = parse(info.videoDetails.description, {
artist,
forceTimestamps,
forceDurations,
});
return {
tracks: tracks,
artist: artist,
audioFile: audioFile,
album: album,
outputFile: argv._[1] ? argv._[1] : DEFAULT_OUTPUT_FILE,
};
}