From 27b23486b5f2d8a4fb2c5679572502e43429cc27 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 27 Nov 2020 17:33:26 +0100
Subject: [PATCH] Remove TVDB support

---
 package-lock.json       | 94 +++++++++++++++++++----------------------
 package.json            |  7 ++-
 src/api/fanart_api.js   |  2 +-
 src/directory_walker.js |  2 +-
 src/index.js            |  5 +--
 src/metadata_loader.js  | 45 ++++++--------------
 src/process_content.js  |  3 +-
 7 files changed, 65 insertions(+), 93 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3a1f0ac..ddf1f9d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -704,15 +704,6 @@
         }
       }
     },
-    "node-tvdb": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/node-tvdb/-/node-tvdb-4.1.0.tgz",
-      "integrity": "sha512-V612s3DM9xV/Nd2JkevG6AeB3H4Nn3g/Jns7xGTSaboeHZZm+GNyURY5m6yezadoNtXYaX+JNeH1OMhlhOXZ6Q==",
-      "requires": {
-        "lodash": "^4.17.4",
-        "node-fetch": "^2.0.0"
-      }
-    },
     "nopt": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
@@ -825,24 +816,23 @@
       "optional": true
     },
     "pg": {
-      "version": "8.3.3",
-      "resolved": "https://registry.npmjs.org/pg/-/pg-8.3.3.tgz",
-      "integrity": "sha512-wmUyoQM/Xzmo62wgOdQAn5tl7u+IA1ZYK7qbuppi+3E+Gj4hlUxVHjInulieWrd0SfHi/ADriTb5ILJ/lsJrSg==",
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/pg/-/pg-8.5.1.tgz",
+      "integrity": "sha512-9wm3yX9lCfjvA98ybCyw2pADUivyNWT/yIP4ZcDVpMN0og70BUWYEGXPCTAQdGTAqnytfRADb7NERrY1qxhIqw==",
       "requires": {
         "buffer-writer": "2.0.0",
         "packet-reader": "1.0.0",
-        "pg-connection-string": "^2.3.0",
-        "pg-pool": "^3.2.1",
-        "pg-protocol": "^1.2.5",
+        "pg-connection-string": "^2.4.0",
+        "pg-pool": "^3.2.2",
+        "pg-protocol": "^1.4.0",
         "pg-types": "^2.1.0",
-        "pgpass": "1.x",
-        "semver": "4.3.2"
+        "pgpass": "1.x"
       }
     },
     "pg-connection-string": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.3.0.tgz",
-      "integrity": "sha512-ukMTJXLI7/hZIwTW7hGMZJ0Lj0S2XQBCJ4Shv4y1zgQ/vqVea+FLhzywvPj0ujSuofu+yA4MYHGZPTsgjBgJ+w=="
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.4.0.tgz",
+      "integrity": "sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ=="
     },
     "pg-hstore": {
       "version": "2.3.3",
@@ -858,14 +848,14 @@
       "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
     },
     "pg-pool": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.1.tgz",
-      "integrity": "sha512-BQDPWUeKenVrMMDN9opfns/kZo4lxmSWhIqo+cSAF7+lfi9ZclQbr9vfnlNaPr8wYF3UYjm5X0yPAhbcgqNOdA=="
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.2.2.tgz",
+      "integrity": "sha512-ORJoFxAlmmros8igi608iVEbQNNZlp89diFVx6yV5v+ehmpMY9sK6QgpmgoXbmkNaBAx8cOOZh9g80kJv1ooyA=="
     },
     "pg-protocol": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.2.5.tgz",
-      "integrity": "sha512-1uYCckkuTfzz/FCefvavRywkowa6M5FohNMF5OjKrqo9PSR8gYc8poVmwwYQaBxhmQdBjhtP514eXy9/Us2xKg=="
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.4.0.tgz",
+      "integrity": "sha512-El+aXWcwG/8wuFICMQjM5ZSAm6OWiJicFdNYo+VY3QP+8vI4SvLIWVe51PppTzMhikUJR+PsyIFKqfdXPz/yxA=="
     },
     "pg-types": {
       "version": "2.2.0",
@@ -880,11 +870,11 @@
       }
     },
     "pgpass": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz",
-      "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz",
+      "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==",
       "requires": {
-        "split": "^1.0.0"
+        "split2": "^3.1.1"
       }
     },
     "pnormaldist": {
@@ -1034,11 +1024,6 @@
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
-    "semver": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
-      "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c="
-    },
     "sequelize": {
       "version": "6.3.5",
       "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.3.5.tgz",
@@ -1081,12 +1066,24 @@
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
       "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
     },
-    "split": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
-      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+    "split2": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+      "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
       "requires": {
-        "through": "2"
+        "readable-stream": "^3.0.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
       }
     },
     "sqlite3": {
@@ -1158,11 +1155,6 @@
         "inherits": "2"
       }
     },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
     "topo": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz",
@@ -1209,9 +1201,9 @@
       "optional": true
     },
     "typescript": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
-      "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg=="
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz",
+      "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ=="
     },
     "underscore": {
       "version": "1.11.0",
@@ -1241,9 +1233,9 @@
       "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
     },
     "uuid": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
-      "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ=="
+      "version": "8.3.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz",
+      "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg=="
     },
     "validator": {
       "version": "10.11.0",
diff --git a/package.json b/package.json
index eaf04aa..fed1cc2 100644
--- a/package.json
+++ b/package.json
@@ -12,15 +12,14 @@
   "dependencies": {
     "fs": "0.0.1-security",
     "node-fetch": "^2.6.1",
-    "node-tvdb": "^4.1.0",
     "path": "^0.12.7",
-    "pg": "^8.3.3",
+    "pg": "^8.5.1",
     "pg-hstore": "^2.3.3",
     "pnormaldist": "^1.0.2",
     "sequelize": "^6.3.5",
     "sqlite3": "^5.0.0",
-    "typescript": "^4.0.3",
-    "uuid": "^8.3.0",
+    "typescript": "^4.1.2",
+    "uuid": "^8.3.1",
     "xml2json": "^0.12.0"
   }
 }
diff --git a/src/api/fanart_api.js b/src/api/fanart_api.js
index 7576a4a..0da4b5c 100644
--- a/src/api/fanart_api.js
+++ b/src/api/fanart_api.js
@@ -6,7 +6,7 @@ class FanartApi {
 
     constructor(apiKey, baseUrl) {
         this.apiKey = apiKey;
-        this.baseUrl = baseUrl || "http://webservice.fanart.tv/v3/";
+        this.baseUrl = baseUrl || "https://webservice.fanart.tv/v3/";
     }
 
     request(path, options) {
diff --git a/src/directory_walker.js b/src/directory_walker.js
index faf5a33..29465d1 100644
--- a/src/directory_walker.js
+++ b/src/directory_walker.js
@@ -115,7 +115,7 @@ class FileManager {
         )
 
         const previewFilePath = path.join(base, "spritesheets", "preview.vtt");
-        const previewFileExists = (await fsPromises.stat(previewFilePath)).isFile();
+        const previewFileExists = (await fsPromises.stat(previewFilePath).catch(() => null))?.isFile() === true;
         const previewFile = previewFileExists ? previewFilePath : null;
 
         const mediaFiles = dashManifest ? [dashManifest] : files.filter(fileName =>
diff --git a/src/index.js b/src/index.js
index 4678796..fae5e47 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,7 +3,6 @@ import sequelize from "sequelize";
 
 import ImdbApi from './api/imdb_api';
 import TmdbApi from './api/tmdb_api';
-import TvdbApi from 'node-tvdb';
 import FanartApi from './api/fanart_api';
 
 import MetadataLoader from "./metadata_loader";
@@ -23,7 +22,6 @@ async function main() {
     const imdbApi = new ImdbApi(process.env.IMDB_PATH);
     const tmdbApi = new TmdbApi(process.env.TMDB_API_KEY);
     await tmdbApi.updateConfiguration();
-    const tvdbApi = new TvdbApi(process.env.TVDB_API_KEY);
     const fanartApi = new FanartApi(process.env.FANART_API_KEY);
 
     console.info("Setting up backend");
@@ -36,6 +34,7 @@ async function main() {
             host: process.env.DB_HOST,
             port: +process.env.DB_PORT,
             ssl: !!process.env.DB_SSL,
+            logging: false,
         }
     ));
     console.info("Migrating backend database");
@@ -44,7 +43,7 @@ async function main() {
 
     console.info("Setting up media ingestion tools");
     const videoMimeParser = new VideoMimeParser(process.env.MP4INFO_PATH || "mp4info", process.env.FFPROBE_PATH || "ffprobe");
-    const loader = new MetadataLoader(imdbApi, tmdbApi, tvdbApi, fanartApi, storage);
+    const loader = new MetadataLoader(imdbApi, tmdbApi, fanartApi, storage);
     const fileManager = new FileManager(basePath, videoMimeParser);
     await fileManager.updateConfiguration();
 
diff --git a/src/metadata_loader.js b/src/metadata_loader.js
index fb7cea2..d7e1098 100644
--- a/src/metadata_loader.js
+++ b/src/metadata_loader.js
@@ -22,14 +22,12 @@ import {
 class MetadataLoader {
     imdb;
     tmdb;
-    tvdb;
     fanart;
     storage;
 
-    constructor(imdb, tmdb, tvdb, fanart, storage) {
+    constructor(imdb, tmdb, fanart, storage) {
         this.imdb = imdb;
         this.tmdb = tmdb;
-        this.tvdb = tvdb;
         this.fanart = fanart;
         this.storage = storage;
     }
@@ -183,7 +181,6 @@ class MetadataLoader {
             kind: "episode",
             imdb_id: imdbResult.id,
             tmdb_id: tmdbResult.id,
-            tvdb_id: null,
             original_language: showTitle.original_language,
             runtime: imdbResult.runtime,
         }, {returning: true});
@@ -324,39 +321,25 @@ class MetadataLoader {
     }
 
     async identifyShow(showTitle, showYear) {
-        const tvdbResults = await this.tvdb.getSeriesByName(showTitle)
-        if (!tvdbResults) return null;
+        const results = await this.tmdb.request(`search/tv`, {
+            query: showTitle,
+            first_air_date_year: showYear
+        }).catch((e) => console.error(e));
+        if (!results) return null;
 
-        const result = tvdbResults.find(show => {
-            const {year} = /^(?<year>\d+)(?:-(?<month>\d+)(?:-(?<day>\d+))?)?$/.exec(show.firstAired).groups;
-            return year === showYear;
-        });
+        const result = results.results.sort((a, b) => {
+            return b.popularity - a.popularity;
+        })[0];
         if (!result) return null;
 
-        const tvdbId = result.id;
-        if (!tvdbId) return null;
-
-        const tvdbSeries = await this.tvdb.getSeriesById(tvdbId);
-        if (!tvdbSeries) return null;
-
-        const imdbId = tvdbSeries.imdbId;
-        const tmdbResults = (await this.tmdb.request(`find/${imdbId}`, {
-            external_source: "imdb_id"
-        })) || (await this.tmdb.request(`find/${tvdbId}`, {
-            external_source: "tvdb_id"
-        }))
-        if (!tmdbResults) return null;
-
-        const tmdbSeries = tmdbResults.tv_results ? tmdbResults.tv_results[0] : null;
-        if (!tmdbSeries) return null;
-
-        const tmdbId = tmdbSeries.id;
+        const tmdbResult = await this.tmdb.request(`tv/${result.id}/external_ids`);
+        if (!tmdbResult) return null;
 
         return {
             uuid: uuidv4(),
-            imdb: imdbId,
-            tvdb: tvdbId,
-            tmdb: tmdbId,
+            imdb: tmdbResult.imdb_id,
+            tvdb: tmdbResult.tvdb_id,
+            tmdb: result.id,
         }
     }
 
diff --git a/src/process_content.js b/src/process_content.js
index 8c925c2..fd6c32f 100644
--- a/src/process_content.js
+++ b/src/process_content.js
@@ -19,12 +19,12 @@ async function processContent(basePath, fileManager, loader) {
         await loader.processImageMetadata(title, imageData);
         await loader.processMediaMetadata(title, media);
 
+        fsPromises.wr
         await fsPromises.writeFile(path.join(filePath, "ids.json"), JSON.stringify(ids, null, 2));
         console.info(`Finished movie ${name} (${year})`);
     }
 
     async function processEpisode(showIds, episodeIdentifier, filePath) {
-        console.info(`Processing episode`, episodeIdentifier);
         const [media, {title, images}] = await Promise.all([
             fileManager.findMedia(filePath),
             loader.loadEpisodeMetadata(showIds, episodeIdentifier),
@@ -32,7 +32,6 @@ async function processContent(basePath, fileManager, loader) {
         const imageData = await loader.processImages(basePath, filePath, images);
         await loader.processImageMetadata(title, imageData);
         await loader.processMediaMetadata(title, media);
-        console.info(`Finished episode`, episodeIdentifier);
     }
 
     async function processShow(filePath) {
-- 
GitLab