From 10981c62ce7c8fbbf513f93ea448e6f6e217d661 Mon Sep 17 00:00:00 2001 From: Nemo Date: Wed, 21 Jul 2021 13:30:42 +0530 Subject: [PATCH] Force timestamps using --timestamps-only --- index.js | 6 +++- src/parser.js | 28 +++++++++------ test/parser_test.js | 88 +++++++++++++++++++++++++++++---------------- 3 files changed, 80 insertions(+), 42 deletions(-) diff --git a/index.js b/index.js index 6f59533..a8e0da3 100755 --- a/index.js +++ b/index.js @@ -22,6 +22,8 @@ if (argv._.length <1 || argv.help ){ where $VIDEOTITLE is the title of the YouTube video. + --timestamps-only Do not try to parse the timestamps as track durations + Examples $ youtube-cue --audio-file audio.m4a "https://www.youtube.com/watch?v=THzUassmQwE" "T A Y L O R S W I F T – Folklore [Full album].cue" saved @@ -35,13 +37,15 @@ if (argv._.length <1 || argv.help ){ let output_file = argv._[1]? argv._[1] : `${info.videoDetails.title}.cue` + let timestampsOnly = argv['timestamps-only']? argv['timestamps-only'] : false; + let res = getArtistTitle(info.videoDetails.title,{ defaultArtist: "Unknown 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}) + let tracks = parse(info.videoDetails.description, {artist,timestampsOnly}) generate({tracks, artist, audioFile, album}, output_file) console.log(`"${output_file}" saved`) }) diff --git a/src/parser.js b/src/parser.js index 2ab6f0d..36609b3 100644 --- a/src/parser.js +++ b/src/parser.js @@ -128,6 +128,9 @@ var timeToObject = function(obj) { return obj; }; +// Instead of timestamps, some tracklists use durations +// If durations are provided, use them to re-calculate +// the starting and ending timestamps var fixDurations = function(list) { for (let i in list) { if (i == 0) { @@ -149,7 +152,7 @@ var fixDurations = function(list) { } }; -export function parse(text, options = { artist: "Unknown" }) { +export function parse(text, options = { artist: "Unknown", timestampsOnly : false }) { _options = options; let durations = false; let result = text @@ -158,18 +161,21 @@ export function parse(text, options = { artist: "Unknown" }) { .map(firstPass) .map(calcTimestamp); - result.forEach((current, index, list) => { - if (index > 0) { - let previous = list[index - 1]; - if (current.start.calc < previous.start.calc) { - durations = true; + if (options.timestampsOnly == false) { + // If our timestamps are not in increasing order + // Assume that we've been given a duration list instead + result.forEach((current, index, list) => { + if (index > 0) { + let previous = list[index - 1]; + if (current.start.calc < previous.start.calc) { + durations = true; + } } - } - }); + }); - if (durations) { - // console.error("Detected durations instead of timestamps. \nIf this is incorrect, pass the --timestamps-only flag and create an issue at \nhttps://github.com/captn3m0/youtube-cue/issues/new/choose") - fixDurations(result); + if (durations) { + fixDurations(result); + } } return result diff --git a/test/parser_test.js b/test/parser_test.js index eaa875f..27fd294 100644 --- a/test/parser_test.js +++ b/test/parser_test.js @@ -65,46 +65,74 @@ describe("Parser", function() { it("should parse timestamps with square brackets", function() { let result = parse(`[00:00:00] 1. Steve Kroeger x Skye Holland - Through The Dark - [00:02:53] 2. Gabri Ponte x Jerome - Lonely `) + [00:02:53] 2. Gabri Ponte x Jerome - Lonely `); assert.deepEqual(result[0], { - artist: "Steve Kroeger x Skye Holland", - title: "Through The Dark", - track: 1, - start: { ts: "00:00:00", hh: 0, mm: 0, ss: 0, calc: 0 }, - end: { ts: "00:02:53", hh: 0, mm: 2, ss: 53, calc: 173 }, - _: { left_text: "", right_text: "Steve Kroeger x Skye Holland - Through The Dark" }, - }) + artist: "Steve Kroeger x Skye Holland", + title: "Through The Dark", + track: 1, + start: { ts: "00:00:00", hh: 0, mm: 0, ss: 0, calc: 0 }, + end: { ts: "00:02:53", hh: 0, mm: 2, ss: 53, calc: 173 }, + _: { + left_text: "", + right_text: "Steve Kroeger x Skye Holland - Through The Dark", + }, + }); }); it("should parse durations when given", function() { let result = parse(`1. Artist - Title 6:19 2. Another Artist - Another Title 6:59 -3. Yet Another Artist - Yet another title 5:12`) +3. Yet Another Artist - Yet another title 5:12`); assert.deepEqual(result[0], { - artist: "Artist", - title: "Title", - track: 1, - start: { ts: "00:00:00", hh: 0, mm: 0, ss: 0, calc: 0 }, - end: { ts: "00:06:19", hh: 0, mm: 6, ss: 19, calc: 379 }, - _: { left_text: "Artist - Title", right_text: "" }, - }) + artist: "Artist", + title: "Title", + track: 1, + start: { ts: "00:00:00", hh: 0, mm: 0, ss: 0, calc: 0 }, + end: { ts: "00:06:19", hh: 0, mm: 6, ss: 19, calc: 379 }, + _: { left_text: "Artist - Title", right_text: "" }, + }); assert.deepEqual(result[1], { - artist: "Another Artist", - title: "Another Title", - track: 2, - start: { ts: "00:06:19", hh: 0, mm: 6, ss: 19, calc: 379 }, - end: { ts: "00:13:18", hh: 0, mm: 13, ss: 18, calc: 798 }, - _: { left_text: "Another Artist - Another Title", right_text: "" }, - }) + artist: "Another Artist", + title: "Another Title", + track: 2, + start: { ts: "00:06:19", hh: 0, mm: 6, ss: 19, calc: 379 }, + end: { ts: "00:13:18", hh: 0, mm: 13, ss: 18, calc: 798 }, + _: { left_text: "Another Artist - Another Title", right_text: "" }, + }); assert.deepEqual(result[2], { - artist: "Yet Another Artist", - title: "Yet another title", - track: 3, - start: { ts: "00:13:18", hh: 0, mm: 13, ss: 18, calc: 798 }, - end: { ts: "00:18:30", hh: 0, mm: 18, ss: 30, calc: 1110 }, - _: { left_text: "Yet Another Artist - Yet another title", right_text: "" }, - }) + artist: "Yet Another Artist", + title: "Yet another title", + track: 3, + start: { ts: "00:13:18", hh: 0, mm: 13, ss: 18, calc: 798 }, + end: { ts: "00:18:30", hh: 0, mm: 18, ss: 30, calc: 1110 }, + _: { + left_text: "Yet Another Artist - Yet another title", + right_text: "", + }, + }); + }); + + it("should parse durations as timestamps when forced", function() { + let result = parse( + `1. Artist - Title 5:00 +2. Another Artist - Another Title 4:20`, + { timestampsOnly: true } + ); + assert.deepEqual(result[0].end, { + ts: "00:4:20", + hh: 0, + mm: 4, + ss: 20, + calc: 260, + }); + assert.deepEqual(result[1].start, { + ts: "00:4:20", + hh: 0, + mm: 4, + ss: 20, + calc: 260, + }); }); it("should parse taylor swift", function() {