From 66fd6ce1b49d7a891e83d3033ff0838098dc77f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Sat, 28 Nov 2020 18:28:38 +0100 Subject: [PATCH] feat(api): custom spotify crawler interval --- README.md | 2 +- src/config/config.module.ts | 2 +- src/sources/scheduler.service.ts | 40 ++++++++++++++++++++++++++ src/sources/sources.module.ts | 3 ++ src/sources/spotify/spotify.module.ts | 1 + src/sources/spotify/spotify.service.ts | 2 -- 6 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/sources/scheduler.service.ts diff --git a/README.md b/README.md index e4528a2..cfc5651 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ All configuration must be set as environment variables. Default values are added - `SPOTIFY_CLIENT_ID`: _Required_, Spotify App Client ID - `SPOTIFY_CLIENT_SECRET`: _Required_, Spotify App Client Secret -- `SPOTIFY_FETCH_INTERVAL_MIN`: **5**: Interval for fetching recently listened tracks from Spotify. +- `SPOTIFY_FETCH_INTERVAL_SEC`: **60**: Interval for fetching recently listened tracks from Spotify. - `SPOTIFY_WEB_API_URL`: **https://api.spotify.com/**: Spotify WEB API Endpoint. - `SPOTIFY_AUTH_API_URL`: **https://accounts.spotify.com/**: Spotify Authentication API Endpoint. - `SPOTIFY_USER_FILTER`: **""**: If set, only allow Spotify users with these ids to access the app. If empty, allow all users to access the app. Seperate ids with `,` eg.: `231421323123,other_id`. diff --git a/src/config/config.module.ts b/src/config/config.module.ts index 0cc4462..81f4a25 100644 --- a/src/config/config.module.ts +++ b/src/config/config.module.ts @@ -23,7 +23,7 @@ import { ConfigModule as NestConfigModule } from "@nestjs/config"; // Spotify SPOTIFY_CLIENT_ID: Joi.string().required(), SPOTIFY_CLIENT_SECRET: Joi.string().required(), - SPOTIFY_FETCH_INTERVAL_MS: Joi.number().default(5 * 60 * 1000), + SPOTIFY_FETCH_INTERVAL_SEC: Joi.number().default(60), SPOTIFY_WEB_API_URL: Joi.string().default("https://api.spotify.com/"), SPOTIFY_AUTH_API_URL: Joi.string().default( "https://accounts.spotify.com/" diff --git a/src/sources/scheduler.service.ts b/src/sources/scheduler.service.ts new file mode 100644 index 0000000..6a6984d --- /dev/null +++ b/src/sources/scheduler.service.ts @@ -0,0 +1,40 @@ +import { + Injectable, + OnApplicationBootstrap, + OnModuleInit, +} from "@nestjs/common"; +import { ConfigService } from "@nestjs/config"; +import { SchedulerRegistry } from "@nestjs/schedule"; +import { captureException } from "@sentry/node"; +import { Logger } from "../logger/logger.service"; +import { SpotifyService } from "./spotify/spotify.service"; + +@Injectable() +export class SchedulerService implements OnApplicationBootstrap { + constructor( + private readonly config: ConfigService, + private readonly registry: SchedulerRegistry, + private readonly spotifyService: SpotifyService, + private readonly logger: Logger + ) { + this.logger.setContext(this.constructor.name); + } + + onApplicationBootstrap() { + this.setupSpotifyCrawler(); + } + + private setupSpotifyCrawler() { + const callback = () => + this.spotifyService.runCrawlerForAllUsers().catch((err) => { + captureException(err); + this.logger.error(`Spotify crawler loop crashed! ${err.stack}`); + }); + const timeoutMs = + this.config.get("SPOTIFY_FETCH_INTERVAL_SEC") * 1000; + + const interval = setInterval(callback, timeoutMs); + + this.registry.addInterval("crawler_spotify", interval); + } +} diff --git a/src/sources/sources.module.ts b/src/sources/sources.module.ts index 6814c94..97dd7c9 100644 --- a/src/sources/sources.module.ts +++ b/src/sources/sources.module.ts @@ -1,7 +1,10 @@ import { Module } from "@nestjs/common"; +import { ConfigModule } from "../config/config.module"; +import { SchedulerService } from "./scheduler.service"; import { SpotifyModule } from "./spotify/spotify.module"; @Module({ imports: [SpotifyModule], + providers: [SchedulerService], }) export class SourcesModule {} diff --git a/src/sources/spotify/spotify.module.ts b/src/sources/spotify/spotify.module.ts index e18ac87..00dbf7a 100644 --- a/src/sources/spotify/spotify.module.ts +++ b/src/sources/spotify/spotify.module.ts @@ -15,5 +15,6 @@ import { SpotifyService } from "./spotify.service"; SpotifyAuthModule, ], providers: [SpotifyService], + exports: [SpotifyService], }) export class SpotifyModule {} diff --git a/src/sources/spotify/spotify.service.ts b/src/sources/spotify/spotify.service.ts index f9a65b4..912917b 100644 --- a/src/sources/spotify/spotify.service.ts +++ b/src/sources/spotify/spotify.service.ts @@ -1,5 +1,4 @@ import { Injectable } from "@nestjs/common"; -import { Interval } from "@nestjs/schedule"; import { ListensService } from "../../listens/listens.service"; import { Logger } from "../../logger/logger.service"; import { Album } from "../../music-library/album.entity"; @@ -31,7 +30,6 @@ export class SpotifyService { this.logger.setContext(this.constructor.name); } - @Interval(20 * 1000) async runCrawlerForAllUsers(): Promise { this.logger.debug("Starting Spotify crawler loop"); const users = await this.usersService.findAll();