Browse Source

Add Seeker IPC and movie-added notification. Make year nullable again in movie model

master
David Ludwig 4 years ago
parent
commit
8cc6f3e83c
5 changed files with 141 additions and 3 deletions
  1. +3
    -2
      src/server/database/entities/MovieTicket.ts
  2. +0
    -1
      src/server/services/MovieSearch.ts
  3. +134
    -0
      src/server/services/SeekerIpc.ts
  4. +2
    -0
      src/server/services/WebServer/routes/api.ts
  5. +2
    -0
      src/server/services/index.ts

+ 3
- 2
src/server/database/entities/MovieTicket.ts View File

@ -16,8 +16,8 @@ export class MovieTicket extends BaseEntity
@Column({ type: "varchar" })
title!: string;
@Column({ type: "year" })
year!: number;
@Column({ type: "year", nullable: true })
year!: number | null;
@CreateDateColumn()
createdAt!: Date;
@ -69,6 +69,7 @@ export class MovieTicket extends BaseEntity
let ticket = new MovieTicket();
ticket.imdbId = movie.imdb_id;
ticket.title = movie.title;
ticket.year = parseInt(movie.release_date.slice(0, 4));
ticket.user = user;
ticket.info = info;
return await ticket.save();


+ 0
- 1
src/server/services/MovieSearch.ts View File

@ -119,7 +119,6 @@ export default class MovieSearch extends Service
*/
public async details(id: number) {
if (id in this.movieCache) {
console.log("Returning the cached movie");
if (!this.movieCache[id].movie.is_requested) {
let isRequested = await MovieInfo.count({tmdbId: id}) > 0;
this.movieCache[id].movie.is_requested = isRequested;


+ 134
- 0
src/server/services/SeekerIpc.ts View File

@ -0,0 +1,134 @@
import ipc from "node-ipc";
import { Socket } from "net";
import Service from "./Service";
import Application from "../Application";
import RawIPC = require("node-ipc");
interface IResponse {
response?: any,
error?: string | Error
}
export default class SeekerIpc extends Service
{
/**
* Indicate if there is an active connection to the IPC
*/
private __isConnected: boolean;
/**
* HOLY @#$@% WHOEVER MADE THE TYPES FOR node-ipc SHOULDB BE HANGED
*/
protected ipc;
/**
* The active IPC socket
*/
protected socket!: Socket;
/**
* Create a new IPC client for the Seeker
*/
constructor(app: Application) {
super("Seeker IPC", app);
this.ipc = new RawIPC.IPC();
this.ipc.config.id = "request";
this.ipc.config.retry = 1500;
this.ipc.config.silent = true;
this.__isConnected = false;
}
/**
* Boot the seeker client IPC service
*/
public boot() {
return new Promise<void>((resolve, reject) => {
this.ipc.connectTo("seeker", process.env["SEEKER_IPC_SOCKET"], () => {
this.socket = this.ipc.of["seeker"];
this.installSocketEventHandlers(this.socket);
this.installSocketMessageHandlers(this.socket);
resolve();
});
});
}
/**
* Shutdown the seeker IPC service
*/
public async shutdown() {
this.ipc.disconnect("seeker");
}
/**
* Install the event handlers for the IPC socket
*/
protected installSocketEventHandlers(socket: Socket) {
socket.on("connect", () => this.onConnect());
socket.on("error", (error: any) => this.onError(error));
socket.on("disconnect", () => this.onDisconnect());
socket.on("destroy", () => this.onDestroy());
}
protected installSocketMessageHandlers(socket: Socket) {
}
// Socket Event Handlers -----------------------------------------------------------------------
protected onConnect() {
this.log("Seeker IPC: Connection established");
this.__isConnected = true;
}
protected onError(error: string | Error) {
this.log("Seeker IPC: Error occurred:", error);
}
protected onDisconnect() {
this.log("Seeker IPC: Disconnected");
this.__isConnected = false;
}
protected onDestroy() {
this.log("Seeker IPC: Destroyed");
}
// Methods -------------------------------------------------------------------------------------
/**
* Perform a general request to the Seeker
*/
protected async request(method: string, message?: any) {
return new Promise<IResponse>((resolve, reject) => {
if (!this.isConnected) {
throw new Error("Not connected to Seeker");
}
let respond = (response: any) => {
clearTimeout(timeout);
resolve(response);
}
// Include timeout mechanism in the off chance something breaks
let timeout = setTimeout(() => {
this.socket.off(method, respond);
reject("Seeker IPC request timeout")
}, 1000);
this.socket.once(method, respond);
this.socket.emit(method, message);
});
}
/**
* Notify Seeker that a movie was added
*/
public notifyMovieRequested(ticketId: number) {
this.request("search_movie", ticketId).catch((e) => {
this.log("No response from seeker notifying added movie");
});
}
// Accessors -----------------------------------------------------------------------------------
get isConnected() {
return this.__isConnected;
}
}

+ 2
- 0
src/server/services/WebServer/routes/api.ts View File

@ -1,4 +1,5 @@
import Application from "@server/Application";
import SeekerIpc from "@server/services/SeekerIpc";
import MovieSearch from "@server/services/MovieSearch";
import RequestImdbMovieRequest from "../requests/RequestImdbMovieRequest";
import { auth } from "../middleware/auth";
@ -67,6 +68,7 @@ export default function register(factory: RouteRegisterFactory, app: Application
// Create the movie request ticket
let user = request.middlewareParams.auth.user;
let ticket = await MovieTicket.requestTmdb(user, tmdbId, movieDetails);
app.service<SeekerIpc>("Seeker IPC").notifyMovieRequested(ticket.id);
return reply.send({ status: "Success", data: { ticket_id: ticket.id }});
}));


+ 2
- 0
src/server/services/index.ts View File

@ -1,6 +1,7 @@
import Database from "./Database";
import DiscordBot from "./DiscordBot";
import MovieSearch from "./MovieSearch";
import SeekerIpc from "./SeekerIpc";
import TorrentClientIpc from "./TorrentClientIpc";
import TvDb from "./TvDb";
import WebServer from "./WebServer";
@ -10,6 +11,7 @@ export default {
// DiscordBot,
MovieSearch,
// TorrentClientIpc,
SeekerIpc,
TvDb,
WebServer
}

Loading…
Cancel
Save