From 2eadb53b8f5c47eb2591d241fedc244a30ea000e Mon Sep 17 00:00:00 2001
From: Nemo <commits@captnemo.in>
Date: Thu, 29 Jul 2021 11:28:30 +0530
Subject: [PATCH] Add prettier as linter

---
 index.js                     | 54 +++++++++++++++++++++++++++++++++++++++---------------
 package-lock.json            | 25 +++++++++++++++++++++++++
 package.json                 |  6 ++++--
 src/cue.js                   | 13 ++++++++-----
 src/parser.js                | 29 +++++++++++++++--------------
 test/parser_test.js          | 32 +++++++++++++++++++++-----------
 .github/workflows/action.yml | 15 ++++++++-------
 7 files changed, 103 insertions(+), 71 deletions(-)

diff --git a/index.js b/index.js
index 441756e..0aa84b2 100755
--- a/index.js
+++ a/index.js
@@ -1,16 +1,16 @@
 #!/usr/bin/env node
-import ytdl from 'ytdl-core';
-import getArtistTitle from 'get-artist-title'
-import {parse} from './src/parser.js'
-import {generate} from './src/cue.js'
-import minimist from 'minimist'
-import exit from 'process'
+import ytdl from "ytdl-core";
+import getArtistTitle from "get-artist-title";
+import { parse } from "./src/parser.js";
+import { generate } from "./src/cue.js";
+import minimist from "minimist";
+import exit from "process";
 
 let argv = minimist(process.argv.slice(2), {
-  string: 'audio-file'
+  string: "audio-file",
 });
 
-if (argv._.length <1 || argv.help ){
+if (argv._.length < 1 || argv.help) {
   console.log(`Usage
     $ youtube-cue [--audio-file audio.m4a] <youtube_url> [output_file]
 
@@ -36,32 +36,38 @@
     $ 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
     $ youtube-cue "https://youtu.be/THzUassmQwE" folklore.cue
-      folklore.cue saved`)
+      folklore.cue saved`);
 } else {
-  let url = argv._[0]
+  let url = argv._[0];
 
-  ytdl.getInfo(url).then(info=>{
-    let audioFile = argv['audio-file']? argv['audio-file'] : `${info.videoDetails.title}.m4a`
+  ytdl.getInfo(url).then((info) => {
+    let audioFile = argv["audio-file"]
+      ? argv["audio-file"]
+      : `${info.videoDetails.title}.m4a`;
 
-    let output_file = argv._[1]? argv._[1] : `${info.videoDetails.title}.cue`
+    let output_file = argv._[1] ? argv._[1] : `${info.videoDetails.title}.cue`;
 
-    let forceTimestamps = argv['timestamps']? argv['timestamps'] : false;
+    let forceTimestamps = argv["timestamps"] ? argv["timestamps"] : false;
 
-    let forceDurations = argv['durations']? argv['durations'] : false;
+    let forceDurations = argv["durations"] ? argv["durations"] : false;
 
     if (forceTimestamps && forceDurations) {
       console.error("You can't pass both --timestamps and durations");
-      exit(1)
+      exit(1);
     }
 
-    let res = getArtistTitle(info.videoDetails.title,{
+    let res = getArtistTitle(info.videoDetails.title, {
       defaultArtist: "Unknown Artist",
-      defaultTitle: info.videoDetails.title
+      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})
-    generate({tracks, artist, audioFile, album}, output_file)
-    console.log(`"${output_file}" saved`)
-  })
+    let [artist, album] = res;
+    artist = info.videoDetails.media ? info.videoDetails.media.artist : artist;
+    let tracks = parse(info.videoDetails.description, {
+      artist,
+      forceTimestamps,
+      forceDurations,
+    });
+    generate({ tracks, artist, audioFile, album }, output_file);
+    console.log(`"${output_file}" saved`);
+  });
 }
diff --git a/package-lock.json b/package-lock.json
index dfb8d2c..0c9c467 100644
--- a/package-lock.json
+++ a/package-lock.json
@@ -1,11 +1,11 @@
 {
   "name": "youtube-cue",
-  "version": "1.0.5",
+  "version": "1.0.6",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
-      "version": "1.0.5",
+      "version": "1.0.6",
       "license": "MIT",
       "dependencies": {
         "console-log-level": "^1.4.1",
@@ -17,7 +17,8 @@
         "youtube-cue": "index.js"
       },
       "devDependencies": {
-        "mocha": "^9.0.0"
+        "mocha": "^9.0.0",
+        "prettier": "^2.3.2"
       }
     },
     "node_modules/@ungap/promise-all-settled": {
@@ -794,6 +795,18 @@
       },
       "funding": {
         "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/prettier": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
+      "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
+      "dev": true,
+      "bin": {
+        "prettier": "bin-prettier.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
       }
     },
     "node_modules/randombytes": {
@@ -1714,6 +1727,12 @@
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
       "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+      "dev": true
+    },
+    "prettier": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz",
+      "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==",
       "dev": true
     },
     "randombytes": {
diff --git a/package.json b/package.json
index c72b0f2..ca15e29 100644
--- a/package.json
+++ a/package.json
@@ -1,16 +1,18 @@
 {
   "name": "youtube-cue",
   "version": "1.0.6",
   "description": "Generates Cue sheet from Youtube URL",
   "main": "index.js",
   "scripts": {
-    "test": "mocha"
+    "test": "mocha",
+    "lint": "prettier --check *.js src/*.js test/*.js"
   },
   "bin": "index.js",
   "author": "Nemo <npm@captnemo.in>",
   "license": "MIT",
   "devDependencies": {
-    "mocha": "^9.0.0"
+    "mocha": "^9.0.0",
+    "prettier": "^2.3.2"
   },
   "dependencies": {
     "console-log-level": "^1.4.1",
diff --git a/src/cue.js b/src/cue.js
index 718cae1..df1a630 100644
--- a/src/cue.js
+++ a/src/cue.js
@@ -1,21 +1,24 @@
-import fs from 'fs';
+import fs from "fs";
 
 // https://en.wikipedia.org/wiki/Cue_sheet_(computing)
 export function generate(data, outputFile) {
   try {
-    fs.truncateSync(outputFile)
+    fs.truncateSync(outputFile);
   } catch {}
   fs.appendFileSync(outputFile, `REM Generated using youtube-cue\n`);
   fs.appendFileSync(outputFile, `PERFORMER "${data.artist}"\n`);
   fs.appendFileSync(outputFile, `TITLE "${data.album}"\n`);
   fs.appendFileSync(outputFile, `FILE "${data.audioFile}" M4A\n`);
-  for(var i in data.tracks) {
+  for (var i in data.tracks) {
     let song = data.tracks[i];
-    let minutes = (song.start.hh * 60) + (song.start.mm)
+    let minutes = song.start.hh * 60 + song.start.mm;
     fs.appendFileSync(outputFile, `  TRACK ${song.track} AUDIO\n`);
     fs.appendFileSync(outputFile, `    TITLE "${song.title}"\n`);
     fs.appendFileSync(outputFile, `    PERFORMER "${song.artist}"\n`);
     // Cue File is always MINUTES:SECONDS:FRAME, where FRAME is 00
-    fs.appendFileSync(outputFile, `    INDEX 01 ${minutes}:${song.start.ss}:00\n`);
+    fs.appendFileSync(
+      outputFile,
+      `    INDEX 01 ${minutes}:${song.start.ss}:00\n`
+    );
   }
 }
diff --git a/src/parser.js b/src/parser.js
index 5e4b701..ad966d3 100644
--- a/src/parser.js
+++ a/src/parser.js
@@ -20,7 +20,8 @@
  *
  * It is suggested to check their lengths and pick one to parse as the Track Title
  */
-const TS_REGEX = /^((?<trackl>\d{1,3})\.)? *(?<text_1>.*?) *[\(\[]?(?<start_ts>((?<start_hh>\d{1,2}):)?(?<start_mm>\d{1,2}):(?<start_ss>\d{1,2})) *-? *[\)\]]?(?<end_ts>(?<end_hh>\d{1,2}:)?(?<end_mm>\d{1,2}):(?<end_ss>\d{1,2}))? *((?<trackr>\d{1,3})\.)? *(?<text_2>.*?)$/;
+const TS_REGEX =
+  /^((?<trackl>\d{1,3})\.)? *(?<text_1>.*?) *[\(\[]?(?<start_ts>((?<start_hh>\d{1,2}):)?(?<start_mm>\d{1,2}):(?<start_ss>\d{1,2})) *-? *[\)\]]?(?<end_ts>(?<end_hh>\d{1,2}:)?(?<end_mm>\d{1,2}):(?<end_ss>\d{1,2}))? *((?<trackr>\d{1,3})\.)? *(?<text_2>.*?)$/;
 import getArtistTitle from "get-artist-title";
 var _options = {};
 
@@ -30,12 +31,12 @@
 }
 
 // Only picks out lines which have a timestamp in them
-var filterTimestamp = function(line) {
+var filterTimestamp = function (line) {
   return TS_REGEX.test(line);
 };
 
 // Parse each line as per the regex
-var firstPass = function(line) {
+var firstPass = function (line) {
   let matches = line.match(TS_REGEX);
   let track = matches.groups["trackl"]
     ? +matches.groups["trackl"]
@@ -71,7 +72,7 @@
 };
 
 // Add a calc attribute with total seconds
-var calcTimestamp = function(obj) {
+var calcTimestamp = function (obj) {
   if (obj.end) {
     obj.end.calc = convertTime(obj.end.hh, obj.end.mm, obj.end.ss);
   }
@@ -80,7 +81,7 @@
 };
 
 // Pick the longer "text" from left or right side.
-var parseTitle = function(obj) {
+var parseTitle = function (obj) {
   obj.title =
     obj._.left_text.length > obj._.right_text.length
       ? obj._.left_text
@@ -89,7 +90,7 @@
 };
 
 // Parse the text as the title/artist
-var parseArtist = function(obj) {
+var parseArtist = function (obj) {
   let [artist, title] = getArtistTitle(obj.title, {
     defaultArtist: _options.artist,
     defaultTitle: obj.title,
@@ -100,7 +101,7 @@
 };
 
 // If track numbers are not present, add them accordingly
-var addTrack = function(obj, index) {
+var addTrack = function (obj, index) {
   if (obj.track == null) {
     obj.track = index + 1;
   }
@@ -108,7 +109,7 @@
 };
 
 // Add "end" timestamps as next start timestamps
-var addEnd = function(obj, index, arr) {
+var addEnd = function (obj, index, arr) {
   if (!obj.end) {
     if (arr.length != index + 1) {
       let next = arr[index + 1];
@@ -119,7 +120,7 @@
   return obj;
 };
 
-var timeToObject = function(obj) {
+var timeToObject = function (obj) {
   let d = new Date(obj.calc * 1000).toISOString();
   obj.hh = +d.substr(11, 2);
   obj.mm = +d.substr(14, 2);
@@ -131,7 +132,7 @@
 // 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) {
+var fixDurations = function (list) {
   for (let i in list) {
     if (i == 0) {
       // Set the first one to start of track.
@@ -167,7 +168,7 @@
   if (!options.forceTimestamps) {
     // If our timestamps are not in increasing order
     // Assume that we've been given a duration list instead
-    if (result[0].start.calc!=0) {
+    if (result[0].start.calc != 0) {
       result.forEach((current, index, list) => {
         if (index > 0) {
           let previous = list[index - 1];
@@ -183,9 +184,5 @@
     }
   }
 
-  return result
-    .map(parseTitle)
-    .map(parseArtist)
-    .map(addTrack)
-    .map(addEnd);
+  return result.map(parseTitle).map(parseArtist).map(addTrack).map(addEnd);
 }
diff --git a/test/parser_test.js b/test/parser_test.js
index bb3e592..3085c67 100644
--- a/test/parser_test.js
+++ a/test/parser_test.js
@@ -24,21 +24,21 @@
 
 const TEXT_WITH_ARTIST = "12:23 Rolling Stones - Hello World";
 
-describe("Parser", function() {
+describe("Parser", function () {
   var big_result;
-  before(function() {
+  before(function () {
     big_result = parse(TEXT);
   });
-  it("should find all timestamps", function() {
+  it("should find all timestamps", function () {
     assert.equal(big_result.length, 15);
   });
 
-  it("should find artist names", function() {
+  it("should find artist names", function () {
     let result = parse(TEXT_WITH_ARTIST);
     assert.equal(result[0].artist, "Rolling Stones");
   });
 
-  it("should find track numbers", function() {
+  it("should find track numbers", function () {
     assert.equal(big_result[3].track, 1);
     assert.equal(big_result[4].track, 2);
     assert.equal(big_result[5].track, 3);
@@ -51,7 +51,7 @@
     assert.equal(big_result[12].track, 10);
   });
 
-  it("should ensure ending timestamps for all", function() {
+  it("should ensure ending timestamps for all", function () {
     assert.deepEqual(big_result[13].end, {
       calc: 3023,
       hh: 0,
@@ -63,8 +63,9 @@
     assert.deepEqual(big_result[14].end, null);
   });
 
-  it("should parse timestamps with square brackets", function() {
-    let result = parse(`[00:00:00] 1. Steve Kroeger x Skye Holland - Through The Dark
+  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 `);
     assert.deepEqual(result[0], {
       artist: "Steve Kroeger x Skye Holland",
@@ -79,7 +80,7 @@
     });
   });
 
-  it("should parse durations when given", function() {
+  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`);
@@ -113,7 +114,7 @@
     });
   });
 
-  it("should parse as timestamps if first timestamp is 00:00", function() {
+  it("should parse as timestamps if first timestamp is 00:00", function () {
     let result = parse(`1. Artist - Title 00:00
 2. Another Artist - Another Title 01:00
 3. Yet Another Artist - Yet another title 02:00`);
@@ -140,11 +141,14 @@
       track: 3,
       end: null,
       start: { ts: "00:02:00", hh: 0, mm: 2, ss: 0, calc: 120 },
-      _: { left_text: "Yet Another Artist - Yet another title", right_text: "" },
+      _: {
+        left_text: "Yet Another Artist - Yet another title",
+        right_text: "",
+      },
     });
   });
 
-  it("should parse durations as timestamps when forced", function() {
+  it("should parse durations as timestamps when forced", function () {
     let result = parse(
       `1. Artist - Title 5:00
 2. Another Artist - Another Title 4:20`,
@@ -166,7 +170,7 @@
     });
   });
 
-  it("should parse timestamps as durations when forced", function() {
+  it("should parse timestamps as durations when forced", function () {
     let result = parse(
       `1. Artist - Title 1:00
 2. Another Artist - Another Title 1:15`,
@@ -214,7 +218,7 @@
     });
   });
 
-  it("should parse taylor swift", function() {
+  it("should parse taylor swift", function () {
     let result = parse(`0:00 the 1
     3:29 cardigan
     9:30 the last great american dynasty
diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml
index 0a3c917..a3c340e 100644
--- a/.github/workflows/action.yml
+++ a/.github/workflows/action.yml
@@ -1,16 +1,17 @@
 on: push
 name: Main Workflow
 jobs:
   tests:
     strategy:
       matrix:
-        node: ['16', '14', '12']
+        node: ["16", "14", "12"]
     name: Run NPM Stuff
     runs-on: ubuntu-latest
     steps:
-    - uses: actions/checkout@v1
-    - uses: actions/setup-node@v2
-      with:
-        node-version: ${{matrix.node}}
-    - run: npm install
-    - run: npm test
+      - uses: actions/checkout@v1
+      - uses: actions/setup-node@v2
+        with:
+          node-version: ${{matrix.node}}
+      - run: npm install
+      - run: npm run lint
+      - run: npm run test
--
rgit 0.1.5