24 Commits

Author SHA1 Message Date
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
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
6 changed files with 60 additions and 57 deletions

2
.gitmodules vendored
View File

@@ -1,3 +1,3 @@
[submodule "torrent_search"] [submodule "torrent_search"]
path = torrent_search path = torrent_search
url = git@github.com:KevinMidboe/torrent_search.git url = https://github.com/KevinMidboe/torrent_search.git

View File

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

View File

@@ -1,9 +1,12 @@
# 🌶 seasonedShows # 🌶 seasonedShows
[![Build Status](https://travis-ci.org/KevinMidboe/seasonedShows.svg?branch=master)](https://travis-ci.org/KevinMidboe/seasonedShows) [![Build Status](https://travis-ci.org/KevinMidboe/seasonedShows.svg?branch=master)](https://travis-ci.org/KevinMidboe/seasonedShows)
[![Coverage Status](https://coveralls.io/repos/github/KevinMidboe/seasonedShows/badge.svg?branch=coverage)](https://coveralls.io/github/KevinMidboe/seasonedShows?branch=coverage)
[![Dependency Status](https://www.versioneye.com/user/projects/5ac541370fb24f4489396e02/badge.svg)](https://www.versioneye.com/user/projects/5ac541370fb24f4489396e02)
[![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) [![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)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
Your customly *seasoned* movie and show requester, downloader and organizer. Demo page can be viewed [here](https://kevinmidboe.com/request) Your customly *seasoned* movie and show requester, downloader and organizer.
📺 [Demo](https://kevinmidboe.com/request)
## About ## 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. 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.

View File

@@ -61,7 +61,7 @@ class strayEpisode(object):
return hashlib.md5("b'{}'".format(self.parent).encode()).hexdigest()[:8] return hashlib.md5("b'{}'".format(self.parent).encode()).hexdigest()[:8]
def findSeriesName(self): def findSeriesName(self):
find = re.compile("^[a-zA-Z. ]*") find = re.compile("^[a-zA-Z0-9. ]*")
m = re.match(find, self.parent) m = re.match(find, self.parent)
if m: if m:
name, hit = process.extractOne(m.group(0), getShowNames().keys()) name, hit = process.extractOne(m.group(0), getShowNames().keys())

View File

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

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