52 Commits

Author SHA1 Message Date
634d4513eb Merge pull request #106 from KevinMidboe/remove_verified
Remove verified
2018-07-28 16:17:43 +02:00
0a1276a474 Merge pull request #105 from KevinMidboe/plex_api_update
Plex api update
2018-07-28 16:17:33 +02:00
3a34d8995e Merge pull request #104 from KevinMidboe/misc
Misc
2018-07-28 16:15:18 +02:00
918e629a06 Merge pull request #103 from KevinMidboe/stray_fixes
Stray fixes
2018-07-28 16:15:03 +02:00
7dd016a56e Changed the python run variable for stray eps. 2018-07-28 16:05:22 +02:00
c10bbcf518 Added update function to package.json fole. 2018-07-28 15:58:02 +02:00
3402a52633 Change to log the parent name of the element instead of the name of file. 2018-07-28 10:50:57 +02:00
86e9188a5c The api from plex has changed. This reflects the changes from Video to metadata in the api url. 2018-07-28 10:46:25 +02:00
8918b7906e Merge branch 'remove_verified' of github.com:KevinMidboe/seasonedShows into HEAD 2018-05-13 19:21:52 +02:00
7e028a461d Merge branch 'master' of github.com:KevinMidboe/seasonedShows into HEAD 2018-05-13 19:21:14 +02:00
fe5f0c815e Deluge is now imported and a Deluge class is created and remove function called for name of torrent that is being verified. 2018-05-13 19:18:45 +02:00
d02e79e59e Merge pull request #100 from KevinMidboe/linting
Linting
2018-05-09 11:00:02 +02:00
5b49216c9d Fixed linting issues for json objects and tailing semicolon. 2018-05-09 10:52:08 +02:00
657ab10034 Removed unused comments. 2018-05-06 18:36:26 +02:00
ed07c77b13 Updated files with tripple === and some linting issues. 2018-05-06 18:23:29 +02:00
4fe85d9fae Change the ordering of user requests to be newest-first. 2018-05-06 18:15:54 +02:00
b99b5b32ec Updated to use abspath of the file not the call location. 2018-05-06 18:09:13 +02:00
e8058c5e4c Update README.md 2018-04-19 21:13:14 +02:00
7332b7d474 Update README.md 2018-04-19 20:22:26 +02:00
7980f14426 Update README.md 2018-04-19 20:21:44 +02:00
65540fafbd Merge pull request #99 from KevinMidboe/dependency_update
Dependency update
2018-04-10 11:29:56 +02:00
64ede43dec Added custom rule for object-shorthand and comma-dangle. 2018-04-08 11:58:16 +02:00
bed12cff72 Set branch to master for the submodule torrent_search 2018-04-08 11:50:15 +02:00
59e7f96643 Updated submodule torrent_search with new commits. 2018-04-08 11:43:12 +02:00
71e9a5a46e Merge pull request #98 from KevinMidboe/strayParser_fix
Updated when parsing for show name allow names with numbers.
2018-04-06 16:27:42 +02:00
fce6dc7658 Updated when parsing for show name allow names with numbers. 2018-04-06 16:22:58 +02:00
baff59181c Update README.md 2018-04-04 23:22:18 +02:00
0592cca16b Updated string_decoder. 2018-04-04 23:08:00 +02:00
e4d5f5085c Updated yarn lockfile. 2018-04-04 14:41:01 +02:00
66a2a06f9b Compile error, if-statement. 2018-04-03 23:02:54 +02:00
e984feeb8d Would fail if the parent was not a directory. 2018-04-03 23:00:14 +02:00
490d015f80 Update README.md 2018-03-30 15:31:15 +02:00
f1cc2c4ebe Merge pull request #97 from KevinMidboe/coverage
Added coverage stats with nyc and coveralls
2018-03-22 18:30:12 +01:00
2f4421d9e0 Merge branch 'coverage' of github.com:kevinmidboe/seasonedShows into coverage 2018-03-22 18:25:01 +01:00
92cc094787 Removed old coverage script and updated travis config. 2018-03-22 18:24:42 +01:00
f30b46c384 Update README.md 2018-03-22 17:20:14 +01:00
d9f679603a Command in travis config was doc, not cov. 2018-03-22 17:17:23 +01:00
64bd9d1e14 Added support for travis upload test coverage to coveralls. 2018-03-22 15:09:59 +01:00
721826d454 Re-added request and removed superagent. 2018-03-22 13:24:57 +01:00
242fe3515c Removed and moved some dep to dev. 2018-03-22 13:23:30 +01:00
ccf40d2161 Merge pull request #96 from KevinMidboe/snyk-fix-6de5e99f
[Snyk] Fix for 42 vulnerable dependency paths
2018-03-22 12:59:36 +01:00
832b8ba539 Added license and description to package.json. Also updated packages node packages. 2018-03-22 12:56:04 +01:00
snyk-bot
0477e49eca fix: seasoned_api/package.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/npm:qs:20170213
- https://snyk.io/vuln/npm:qs:20140806
- https://snyk.io/vuln/npm:qs:20140806-1
- https://snyk.io/vuln/npm:mime:20170907
- https://snyk.io/vuln/npm:mime:20170907
- https://snyk.io/vuln/npm:fresh:20170908
- https://snyk.io/vuln/npm:debug:20170905
- https://snyk.io/vuln/npm:ms:20170412
- https://snyk.io/vuln/npm:qs:20170213
- https://snyk.io/vuln/npm:negotiator:20160616
- https://snyk.io/vuln/npm:ms:20151024
- https://snyk.io/vuln/npm:debug:20170905
- https://snyk.io/vuln/npm:ms:20170412
- https://snyk.io/vuln/npm:ms:20151024
- https://snyk.io/vuln/npm:hoek:20180212

Latest report for kevinmidboe/seasonedshows:seasoned_api/package.json:
https://snyk.io/test/github/kevinmidboe/seasonedshows?targetFile=seasoned_api/package.json
2018-03-22 11:34:42 +00:00
451b67630a Merge pull request #95 from KevinMidboe/docs_testing
Improved testing, more linting and added paging to request/all endpoint
2018-03-21 23:53:29 +01:00
096bbdf085 Merge branch 'master' into docs_testing 2018-03-21 23:51:31 +01:00
e914e4ab45 Added ORDER BY date that was missing in sql stmt 2018-03-21 23:44:59 +01:00
c1461e1f41 Merge pull request #93 from KevinMidboe/travis
Updated travis to pull submodules
2018-03-21 14:43:36 +01:00
91bf2c1e2a Updated travis to pull submodules 2018-03-21 14:30:26 +01:00
da3df383ed Update gitmodule torrent_search url to be https 2018-03-21 14:29:51 +01:00
9816b978d3 Updated demo on readme 2018-03-21 12:13:57 +01:00
0581813ee3 Merge pull request #92 from KevinMidboe/api_filterBug
Fixes api not filtering requests/all query when filtering
2018-03-20 13:17:17 +01:00
edf1de223e When filtering the request on status the sql query for the db did not sort DESC. 2018-03-20 13:11:26 +01:00
20 changed files with 2134 additions and 835 deletions

5
.gitmodules vendored
View File

@@ -1,3 +1,6 @@
# Docs : https://git-scm.com/book/en/v2/Git-Tools-Submodules
[submodule "torrent_search"]
path = torrent_search
url = git@github.com:KevinMidboe/torrent_search.git
url = https://github.com/KevinMidboe/torrent_search.git
branch = master

View File

@@ -1,9 +1,10 @@
language: node_js
node_js: '8.7.0'
git:
submodules: false
submodules: true
script:
yarn test
- yarn test
- yarn coverage
before_install:
- cd seasoned_api
before_script: yarn

134
README.md
View File

@@ -1,11 +1,133 @@
# 🌶 seasonedShows
[![Build Status](https://travis-ci.org/KevinMidboe/seasonedShows.svg?branch=master)](https://travis-ci.org/KevinMidboe/seasonedShows)
[![Known Vulnerabilities](https://snyk.io/test/github/KevinMidboe/seasonedShows/badge.svg?targetFile=seasoned_api/package.json)](https://snyk.io/test/github/KevinMidboe/seasonedShows?targetFile=seasoned_api/package.json)
[![DUB](https://img.shields.io/dub/l/vibe-d.svg)]()
Your customly *seasoned* movie and show requester, downloader and organizer. Demo page can be viewed [here](https://kevinmidboe.com/request)
<h1 align="center">
🌶 seasonedShows
</h1>
<h4 align="center"> Season your media library with the shows and movies that you and your friends want.</h4>
<p align="center">
<a href="https://travis-ci.org/KevinMidboe/seasonedShows">
<img src="https://travis-ci.org/KevinMidboe/seasonedShows.svg?branch=master"
alt="Travis CI">
</a>
<a href="https://coveralls.io/github/KevinMidboe/seasonedShows?branch=coverage">
<img src="https://coveralls.io/repos/github/KevinMidboe/seasonedShows/badge.svg?branch=coverage" alt="">
</a>
<a href="https://www.versioneye.com/user/projects/5ac541370fb24f4489396e02">
<img src="https://www.versioneye.com/user/projects/5ac541370fb24f4489396e02/badge.svg" alt="">
</a>
<a href="https://snyk.io/test/github/KevinMidboe/seasonedShows?targetFile=seasoned_api/package.json">
<img src="https://snyk.io/test/github/KevinMidboe/seasonedShows/badge.svg?targetFile=seasoned_api/package.json" alt="">
</a>
<a href="https://opensource.org/licenses/MIT">
<img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="">
</a>
</p>
<p align="center">
<a href="#demo-documentation">D & D</a>
<a href="#about">About</a>
<a href="#key-features">Key features</a>
<a href="#installation">Installation</a>
<a href="#setup">Setup</a>
<a href="#running">Running</a>
<a href="#daemon">Setup daemon</a>
<a href="#contributing">Contributing</a>
</p>
## <a name="demo-documentation"></a> Demo & Documentation
📺 [DEMO](https://kevinmidboe.com/request)
📝 Documentation of the api.
💖 Checkout my [fancy vue.js page](https://github.com/KevinMidboe/seasonedRequest) for interfacing the api.
## <a name="about"></a> About
This is the backend api for [seasoned request] that allows for uesrs to request movies and shows by fetching movies from themoviedb api and checks them with your plex library to identify if a movie is already present or not. This api allows to search my query, get themoviedb movie lists like popular and now playing, all while checking if the item is already in your plex library. Your friends can create users to see what movies or shows they have requested and searched for.
The api also uses torrent_search to search for matching torrents and returns results from any site or service available from torrent_search. As a admin of the site you can query torrent_search and return a magnet link that can be added to a autoadd folder of your favorite torrent client.
## <a name="key-features"></a> Key features
### Code
- Uses [tmdb api](https://www.themoviedb.org/documentation/api) with over 350k movies and 70k tv shows
- Written asynchronously
- Uses caching for external requests
- Test coverage
- CI and dependency integrated
- Use either config file or env_variables
### Functionality
- Queries plex library to check if items exists
- Create admin and normal user accounts
- [torrent_search](https://github.com/KevinMidboe/torrent_search) to search for torrents
- Fetch curated lists from tmdb
## <a name="installation"></a> Installation
Before we can use seasonedShows we need to download node and a package manager. For instructions on how to install [yarn](https://yarnpkg.com/en/) or [npm](https://www.npmjs.com) package managers refer to [wiki: install package manager](https://github.com/KevinMidboe/seasonedShows/wiki/Install-package-manager). This api is written with express using node.js as the JavaScript runtime engine. To download node.js head over the the official [node.js download page](https://nodejs.org/en/download/).
### Install seasonedShows
After you have downloaded a package manager and node.js javascript engine, the following will guide you through how to download, install and run seasonedShows.
### macOS
- Open terminal
- Install git. This can be done by running `xcode-select --install` in your favorite terminal.
- Install a package manager, refer to this [wiki page] for yarn or [wiki page] for npm
- Type: `git clone https://github.com/KevinMidboe/seasonedShows.git`
- Type: `cd seasonedShows/`
- Install required packages
* yarn: `yarn install`
* npm: `npm install`
- Start server:
* yarn: `yarn start`
* npm: `npm run start`
- seasonedShows will now be running at http://localhost:31459
- To have seasonedShows run headless on startup, check out this wiki page to [install as a daemon].
### Linux
- Open terminal
- Install git
* Ubuntu/Debian: `sudo apt-get install git-core`
* Fedora: `sudo yum install git`
- Type: `git clone https://github.com/KevinMidboe/seasonedShows.git`
- Type: `cd seasonedShows/`
- Install required packages
* yarn: `yarn install`
* npm: `npm install`
- Start server:
* yarn: `yarn start`
* npm: `npm run start`
- seasonedShows will now be running at http://localhost:31459
- To have seasonedShows run headless on startup, check out this wiki page to [install as a daemon].
-- same --
(install yarn or npm in a different way)
After you have installed the required packages you will have a node_modules directory with all the packages required in packages.json.
### Requirements
- Node 7.6 < [wiki page]
- Plex library
## <a name="setup"></a> Setup and/ configuration
There is a config file template, what the values mean and how to change them.
Also show how to hide file from git if not want to show up as uncommitted file.
Also set variables in environment.
## <a name="running"></a> Running/using
yarn/npm start. (can also say this above)
How to create service on linux. This means that
## <a name="daemon"></a> Setup a daemon
The next step is to setup seasonedShows api to run in the background as a daemon. I have written a [wiki page](https://github.com/KevinMidboe/seasonedShows/wiki/Install-as-a-daemon) on how to create a daemon on several unix distors and macOS.
*Please don't hesitate to add your own system if you get it running on something that is not yet lists on the formentioned wiki page.*
## <a name="contributing"></a> Contributing
- Fork it!
- Create your feature branch: git checkout -b my-new-feature
- Commit your changes: git commit -am 'Add some feature'
- Push to the branch: git push origin my-new-feature
- Submit a pull request
## Api documentation
## About
The goal of this project is to create a full custom stack that can to everything surround downloading, organizing and notifiyng of new media. From the top down we have a website using [tmdb](https://www.themoviedb.com) api to search for from over 350k movies and 70k tv shows. Using [hjone72](https://github.com/hjone72/PlexAuth) great PHP reverse proxy we can have a secure way of allowing users to login with their plex credentials which limits request capabilites to only users that are authenticated to use your plex library.
seasonedShows is a intelligent organizer for your tv show episodes. It is made to automate and simplify to process of renaming and moving newly downloaded tv show episodes following Plex file naming and placement.

View File

@@ -3,7 +3,7 @@
# @Author: KevinMidboe
# @Date: 2017-04-05 18:40:11
# @Last Modified by: KevinMidboe
# @Last Modified time: 2017-06-18 21:49:33
# @Last Modified time: 2018-04-03 22:58:20
import os.path, hashlib, time, glob, sqlite3, re, json, tweepy
import logging
from functools import reduce
@@ -61,7 +61,7 @@ class strayEpisode(object):
return hashlib.md5("b'{}'".format(self.parent).encode()).hexdigest()[:8]
def findSeriesName(self):
find = re.compile("^[a-zA-Z. ]*")
find = re.compile("^[a-zA-Z0-9. ]*")
m = re.match(find, self.parent)
if m:
name, hit = process.extractOne(m.group(0), getShowNames().keys())
@@ -188,6 +188,9 @@ def XOR(list1, list2):
return set(list1) ^ set(list2)
def filterChildItems(parent):
if (not os.path.isdir(parent)):
strayEpisode(parent[:-4], parent)
return
try:
children = getDirContent('/'.join([env.input_dir, parent]))
if children:

View File

@@ -3,13 +3,15 @@
# @Author: KevinMidboe
# @Date: 2017-04-12 23:27:51
# @Last Modified by: KevinMidboe
# @Last Modified time: 2017-06-27 15:58:09
# @Last Modified time: 2018-05-13 19:17:17
import sys, sqlite3, json, os.path
import logging
import env_variables as env
import shutil
import delugeClient.deluge_cli as delugeCli
class episode(object):
def __init__(self, id):
self.id = id
@@ -91,8 +93,18 @@ def moveStray(strayId):
except FileNotFoundError:
logging.warning('Cannot remove ' + ep.typeDir('parent_input') + ', file no longer exists.')
# Remove from deluge client
logging.info('Removing {} for deluge'.format(ep.parent))
deluge = delugeCli.Deluge()
response = deluge.remove(ep.parent)
logging.info('Deluge response after delete: {}'.format(response))
if __name__ == '__main__':
if (os.path.exists(env.logfile)):
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
if (os.path.exists(os.path.join(dname, env.logfile))):
logging.basicConfig(filename=env.logfile, level=logging.INFO)
else:
print('Logfile could not be found at ' + env.logfile + '. Verifiy presence or disable logging in config.')

View File

@@ -7,6 +7,8 @@
"prefer-destructuring": 0,
"camelcase": 0,
"import/no-unresolved": 0,
"import/no-extraneous-dependencies": 0
"import/no-extraneous-dependencies": 0,
"object-shorthand": 0,
"comma-dangle": 0
}
}

View File

@@ -1,38 +1,43 @@
{
"name": "seasoned-api",
"main": "webserver/server.js",
"scripts": {
"start": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/webserver/server.js",
"test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --recursive test",
"coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. istanbul cover -x script/autogenerate-documentation.js --include-all-sources --dir test/.coverage node_modules/mocha/bin/_mocha --recursive test/**/* -- --report lcovonly && cat test/.coverage/lcov.info | coveralls && rm -rf test/.coverage",
"lint": "./node_modules/.bin/eslint src/"
},
"dependencies": {
"bcrypt-nodejs": "^0.0.3",
"blanket": "^1.2.3",
"body-parser": "~1.0.1",
"codecov": "^3.0.0",
"cross-env": "^3.1.3",
"express": "~4.11.0",
"jsonwebtoken": "^8.0.1",
"mocha-lcov-reporter": "^1.3.0",
"mongoose": "^3.6.13",
"moviedb": "^0.2.10",
"node-cache": "^4.1.1",
"nodemailer": "^4.0.1",
"python-shell": "^0.4.0",
"raven": "^2.2.1",
"request": "^2.81.0",
"request-promise": "^4.2",
"sqlite3": "3.1.13"
},
"devDependencies": {
"eslint": "^4.9.0",
"eslint-config-airbnb-base": "^12.1.0",
"eslint-plugin-import": "^2.8.0",
"istanbul": "^0.4.5",
"mocha": "^5.0.4",
"supertest": "^2.0.1",
"supertest-as-promised": "^4.0.1"
}
"name": "seasoned-api",
"description": "Packages needed to build and commands to run seasoned api node server.",
"license": {
"type": "MIT",
"url": "https://www.opensource.org/licenses/mit-license.php"
},
"main": "webserver/server.js",
"scripts": {
"start": "cross-env SEASONED_CONFIG=conf/development.json PROD=true NODE_PATH=. node src/webserver/server.js",
"test": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. mocha --recursive test",
"coverage": "cross-env SEASONED_CONFIG=conf/test.json NODE_PATH=. nyc mocha --recursive test && nyc report --reporter=text-lcov | coveralls",
"lint": "./node_modules/.bin/eslint src/",
"update": "cross-env SEASONED_CONFIG=conf/development.json NODE_PATH=. node src/plex/updateRequestsInPlex.js"
},
"dependencies": {
"bcrypt-nodejs": "^0.0.3",
"body-parser": "~1.18.2",
"cross-env": "~5.1.4",
"express": "~4.16.0",
"jsonwebtoken": "^8.0.1",
"mongoose": "~5.0.11",
"moviedb": "^0.2.10",
"node-cache": "^4.1.1",
"python-shell": "^0.5.0",
"request": "^2.85.0",
"request-promise": "^4.2",
"sqlite3": "4.0.0"
},
"devDependencies": {
"coveralls": "^3.0.0",
"eslint": "^4.9.0",
"eslint-config-airbnb-base": "^12.1.0",
"eslint-plugin-import": "^2.8.0",
"istanbul": "^0.4.5",
"mocha": "^5.0.4",
"mocha-lcov-reporter": "^1.3.0",
"nyc": "^11.6.0",
"raven": "^2.4.2",
"supertest": "^3.0.0",
"supertest-as-promised": "^4.0.1"
}
}

View File

@@ -15,6 +15,7 @@ class PlexRepository {
}
search(query) {
console.log('searching:', query)
const options = {
uri: `http://10.0.0.44:32400/search?query=${query}`,
headers: {
@@ -39,7 +40,8 @@ class PlexRepository {
}
else {
plexResult.results.map((plexItem) => {
if (tmdb.title === plexItem.title && tmdb.year === plexItem.year) { tmdb.matchedInPlex = true; }
if (tmdb.title === plexItem.title && tmdb.year === plexItem.year)
tmdb.matchedInPlex = true;
return tmdb;
});
}
@@ -50,6 +52,7 @@ class PlexRepository {
mapResults(response) {
return Promise.resolve()
.then(() => {
console.log('plexResponse:', response)
if (!response.MediaContainer.hasOwnProperty('Metadata')) return [[], 0];
const mappedResults = response.MediaContainer.Metadata.filter((element) => {
@@ -72,7 +75,7 @@ class PlexRepository {
return rp(options)
.then((result) => {
if (result.MediaContainer.size > 0) {
const playing = result.MediaContainer.Video.map(convertPlexToStream);
const playing = result.MediaContainer.Metadata.map(convertPlexToStream);
return { size: Object.keys(playing).length, video: playing };
}
return { size: 0, video: [] };

View File

@@ -8,21 +8,17 @@ const plexRepository = new PlexRepository();
const cache = new Cache();
const tmdb = new TMDB(cache, configuration.get('tmdb', 'apiKey'));
const MailTemplate = require('src/plex/mailTemplate');
const nodemailer = require('nodemailer');
class RequestRepository {
constructor(cache, database) {
constructor(database) {
this.database = database || establishedDatabase;
this.queries = {
insertRequest: `INSERT INTO requests(id,title,year,poster_path,background_path,requested_by,ip,user_agent,type)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
fetchRequestedItems: 'SELECT * FROM requests ORDER BY date DESC LIMIT 25 OFFSET ?*25-25',
fetchRequestedItemsByStatus: 'SELECT * FROM requests WHERE status IS ? AND type LIKE ? DESC LIMIT 25 OFFSET ?*25-25',
fetchRequestedItemsByStatus: 'SELECT * FROM requests WHERE status IS ? AND type LIKE ? ORDER BY date DESC LIMIT 25 OFFSET ?*25-25',
updateRequestedById: 'UPDATE requests SET status = ? WHERE id is ? AND type is ?',
checkIfIdRequested: 'SELECT * FROM requests WHERE id IS ? AND type IS ?',
userRequests: 'SELECT * FROM requests WHERE requested_by IS ?'
userRequests: 'SELECT * FROM requests WHERE requested_by IS ? ORDER BY date DESC',
};
this.cacheTags = {
search: 'se',
@@ -51,10 +47,7 @@ class RequestRepository {
.then(() => this.database.get(this.queries.checkIfIdRequested, [tmdbMovie.id, tmdbMovie.type]))
.then((result, error) => {
if (error) { throw new Error(error); }
let already_requested = false;
if (result) { already_requested = true; }
tmdbMovie.requested = already_requested;
tmdbMovie.requested = result ? true : false;
return tmdbMovie;
});
}
@@ -85,13 +78,15 @@ class RequestRepository {
}
userRequests(user) {
return Promise.resolve()
return Promise.resolve()
.then(() => this.database.all(this.queries.userRequests, user.username))
.catch((error) => {
if (String(error).includes('no such column')) { throw new Error('Username not found'); }
else { throw new Error('Unable to fetch your requests')}
if (String(error).includes('no such column')) {
throw new Error('Username not found');
}
throw new Error('Unable to fetch your requests');
})
.then((result) => { return result })
.then((result) => { return result; });
}
updateRequestedById(id, type, status) {

View File

@@ -43,7 +43,7 @@ class StrayRepository {
assert.notEqual(row, undefined, `Stray '${strayId}' already verified.`);
const options = {
pythonPath: '/usr/bin/python3',
pythonPath: '../app/env/bin/python3',
args: [strayId],
};

View File

@@ -8,7 +8,7 @@ const TMDB_METHODS = {
nowplaying: { movie: 'miscNowPlayingMovies', show: 'tvOnTheAir' },
similar: { movie: 'movieSimilar', show: 'tvSimilar' },
search: { movie: 'searchMovie', show: 'searchTv', multi: 'searchMulti' },
info: { movie: 'movieInfo', show: 'tvInfo' },
info: { movie: 'movieInfo', show: 'tvInfo' }
};
class TMDB {
@@ -65,7 +65,7 @@ class TMDB {
.catch(() => this.tmdb(TMDB_METHODS['search'][type], query))
.catch(() => { throw new Error('Could not search for movies/shows at tmdb.'); })
.then(response => this.cache.set(cacheKey, response))
.then(response => this.mapResults(response))
.then(response => this.mapResults(response));
}
/**
@@ -76,15 +76,15 @@ class TMDB {
* @returns {Promise} dict with query results, current page and total_pages
*/
listSearch(listName, type = 'movie', page = '1') {
const query = { page: page }
console.log(query)
const query = { page: page };
console.log(query);
const cacheKey = `${this.cacheTags[listName]}:${type}:${page}`;
return Promise.resolve()
.then(() => this.cache.get(cacheKey))
.catch(() => this.tmdb(TMDB_METHODS[listName][type], query))
.catch(() => { throw new Error('Error fetching list from tmdb.')})
.catch(() => { throw new Error('Error fetching list from tmdb.'); })
.then(response => this.cache.set(cacheKey, response))
.then(response => this.mapResults(response, type))
.then(response => this.mapResults(response, type));
}
/**
@@ -94,13 +94,18 @@ class TMDB {
* @returns {Promise} dict with tmdb results, mapped as movie/show objects.
*/
mapResults(response, type) {
console.log(response.page)
console.log(response.page);
return Promise.resolve()
.then(() => {
const mappedResults = response.results.filter((element) => {
return (element.media_type === 'movie' || element.media_type === 'tv' || element.media_type === undefined);
}).map((element) => convertTmdbToSeasoned(element, type));
return {results: mappedResults, page: response.page, total_pages: response.total_pages, total_results: response.total_results}
return {
results: mappedResults,
page: response.page,
total_pages: response.total_pages,
total_results: response.total_results
}
})
.catch((error) => { throw new Error(error); });
}

View File

@@ -41,7 +41,7 @@ class UserRepository {
assert(row, 'The user does not exist.');
return row.password;
})
.catch((err) => console.log('there was a error when getting hash', err));
.catch((err) => { console.log(error); throw new Error('Unable to find your user.'); });
}
/**
@@ -57,7 +57,7 @@ class UserRepository {
checkAdmin(user) {
return this.database.get(this.queries.getAdminStateByUser, user.username).then((row) => {
return row.admin;
})
});
}
}

View File

@@ -17,9 +17,6 @@ app.use(bodyParser.json());
// router.use(bodyParser.urlencoded({ extended: true }));
/* Decode the Authorization header if provided */
// router.use(tokenToUser);
const router = express.Router();
const allowedOrigins = ['https://kevinmidboe.com', 'http://localhost:8080'];
@@ -27,9 +24,7 @@ const allowedOrigins = ['https://kevinmidboe.com', 'http://localhost:8080'];
// router.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// This is probably a correct middleware/router setup
/* Translate the user token to a user name */
/* Decode the Authorization header if provided */
router.use(tokenToUser);
// TODO: Should have a separate middleware/router for handling headers.

File diff suppressed because one or more lines are too long

View File

@@ -10,7 +10,7 @@ const searchHistory = new SearchHistory();
function searchRequestController(req, res) {
const user = req.loggedInUser;
const { query, page, type } = req.query;
const username = user == undefined ? undefined : user.username;
const username = user === undefined ? undefined : user.username;
Promise.resolve()
.then(() => searchHistory.create(username, query))

View File

@@ -10,7 +10,7 @@ const searchHistory = new SearchHistory();
*/
function historyController(req, res) {
const user = req.loggedInUser;
const username = user == undefined ? undefined : user.username;
const username = user === undefined ? undefined : user.username;
searchHistory.read(username)
.then((searchQueries) => {

View File

@@ -22,7 +22,7 @@ function loginController(req, res) {
.then(() => userRepository.checkAdmin(user))
.then((checkAdmin) => {
const token = new Token(user).toString(secret);
const admin_state = checkAdmin == 1 ? true : false;
const admin_state = checkAdmin === 1 ? true : false;
res.send({ success: true, token, admin: admin_state });
})
.catch((error) => {

View File

@@ -22,8 +22,10 @@ function registerController(req, res) {
.then(() => userRepository.checkAdmin(user))
.then((checkAdmin) => {
const token = new Token(user).toString(secret);
const admin_state = checkAdmin == 1 ? true : false;
res.send({ success: true, message: 'Welcome to Seasoned!', token, admin: admin_state });
const admin_state = checkAdmin === 1 ? true : false;
res.send({
success: true, message: 'Welcome to Seasoned!', token, admin: admin_state,
});
})
.catch((error) => {
res.status(401).send({ success: false, error: error.message });

File diff suppressed because it is too large Load Diff