Skip to content

Commit

Permalink
chore: merge version 0.1.1 to master
Browse files Browse the repository at this point in the history
  • Loading branch information
manuel-rw authored Jan 1, 2024
2 parents 1b5bf57 + 8bd6d7f commit 649742b
Show file tree
Hide file tree
Showing 11 changed files with 316 additions and 97 deletions.
20 changes: 10 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jellyfin-discord-music-bot",
"version": "0.1.0",
"version": "0.1.1",
"description": "A simple and leightweight Discord Bot, that integrates with your Jellyfin Media server and enables you to listen to your favourite music directly from discord.",
"author": "manuel-rw",
"private": true,
Expand Down Expand Up @@ -30,9 +30,9 @@
"@nestjs/common": "^9.4.0",
"@nestjs/config": "^3.0.0",
"@nestjs/core": "^9.4.0",
"@nestjs/event-emitter": "^1.3.1",
"@nestjs/event-emitter": "^2.0.3",
"@nestjs/platform-express": "^9.4.2",
"@nestjs/schedule": "^2.1.0",
"@nestjs/schedule": "^4.0.0",
"@nestjs/serve-static": "^4.0.0",
"@nestjs/terminus": "^9.2.2",
"date-fns": "^2.30.0",
Expand All @@ -44,24 +44,24 @@
"rimraf": "^5.0.1",
"rxjs": "^7.8.1",
"uuid": "^9.0.0",
"ws": "^8.13.0",
"ws": "^8.16.0",
"zod": "^3.21.4",
"zod-validation-error": "^1.3.0"
"zod-validation-error": "^2.1.0"
},
"devDependencies": {
"@nestjs/cli": "^9.4.2",
"@nestjs/schematics": "^10.0.1",
"@nestjs/testing": "^9.4.0",
"@types/cron": "^2.0.1",
"@types/express": "^4.17.13",
"@types/jest": "29.5.8",
"@types/node": "^20.5.7",
"@types/jest": "29.5.11",
"@types/node": "^20.10.6",
"@types/supertest": "^2.0.11",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"eslint": "^8.42.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.0.1",
"jest": "29.7.0",
"prettier": "^3.0.2",
"source-map-support": "^0.5.20",
Expand Down
24 changes: 22 additions & 2 deletions src/clients/discord/discord.voice.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
joinVoiceChannel,
NoSubscriberBehavior,
VoiceConnection,
VoiceConnectionStatus,
} from '@discordjs/voice';

import { Injectable } from '@nestjs/common';
Expand Down Expand Up @@ -96,7 +97,12 @@ export class DiscordVoiceService {
if (this.voiceConnection === undefined) {
this.voiceConnection = getVoiceConnection(member.guild.id);
}

this.voiceConnection?.on(VoiceConnectionStatus.Disconnected, () => {
if (this.voiceConnection !== undefined) {
const playlist = this.playbackService.getPlaylistOrDefault().clear();
this.disconnect();
}
});
return {
success: true,
reply: {},
Expand Down Expand Up @@ -129,6 +135,10 @@ export class DiscordVoiceService {
@OnEvent('internal.voice.controls.pause')
pause() {
this.createAndReturnOrGetAudioPlayer().pause();
const track = this.playbackService.getPlaylistOrDefault().getActiveTrack();
if(track) {
track.playing = false;
}
this.eventEmitter.emit('playback.state.pause', true);
}

Expand All @@ -137,14 +147,24 @@ export class DiscordVoiceService {
*/
@OnEvent('internal.voice.controls.stop')
stop(force: boolean): boolean {
return this.createAndReturnOrGetAudioPlayer().stop(force);
const hasStopped = this.createAndReturnOrGetAudioPlayer().stop(force);
if (hasStopped) {
const playlist = this.playbackService.getPlaylistOrDefault();
this.eventEmitter.emit('internal.audio.track.finish', playlist.getActiveTrack());
playlist.clear();
}
return hasStopped;
}

/**
* Unpauses the current audio player
*/
unpause() {
this.createAndReturnOrGetAudioPlayer().unpause();
const track = this.playbackService.getPlaylistOrDefault().getActiveTrack();
if(track) {
track.playing = true;
}
this.eventEmitter.emit('playback.state.pause', false);
}

Expand Down
6 changes: 3 additions & 3 deletions src/clients/jellyfin/jellyfin.playstate.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,9 @@ export class JellyinPlaystateService {

@Interval(1000)
private async onPlaybackProgress() {
const track = this.playbackService.getPlaylistOrDefault().getActiveTrack();

if (!track) {
const playlist = this.playbackService.getPlaylistOrDefault();
const track = playlist.getActiveTrack();
if (!track || !playlist.hasAnyPlaying()) {
return;
}

Expand Down
2 changes: 1 addition & 1 deletion src/clients/jellyfin/jellyfin.search.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ export class JellyfinSearchService {
includeItemTypes,
});

if (!data.Items || data.Items.length !== 1) {
if (!data.Items || data.Items.length === 0) {
this.logger.warn(`Failed to retrieve item via id '${ids}'`);
return [];
}
Expand Down
2 changes: 1 addition & 1 deletion src/clients/jellyfin/jellyfin.websocket.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export class JellyfinWebSocketService implements OnModuleDestroy {
`Processing ${ids.length} ids received via websocket and adding them to the queue`,
);
const searchHints = await this.jellyfinSearchService.getAllById(ids);
const tracks = flatMapTrackItems(searchHints, this.jellyfinSearchService);
const tracks = await flatMapTrackItems(searchHints, this.jellyfinSearchService);
this.playbackService.getPlaylistOrDefault().enqueueTracks(tracks);
break;
case SessionMessageType[SessionMessageType.Playstate]:
Expand Down
2 changes: 1 addition & 1 deletion src/models/music/Playlist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ export class Playlist {
this.activeTrackIndex = undefined;
}

private hasAnyPlaying() {
hasAnyPlaying() {
return this.tracks.some((track) => track.playing);
}

Expand Down
20 changes: 19 additions & 1 deletion src/models/search/AlbumSearchItem.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SearchHint as JellyfinSearchHint } from '@jellyfin/sdk/lib/generated-client/models';
import { BaseItemDto, SearchHint as JellyfinSearchHint } from '@jellyfin/sdk/lib/generated-client/models';

import { Track } from '../music/Track';
import { JellyfinSearchService } from '../../clients/jellyfin/jellyfin.search.service';
Expand Down Expand Up @@ -29,6 +29,24 @@ export class AlbumSearchItem extends SearchItem {
);
}

static constructFromBaseItem(baseItem: BaseItemDto) {
if (baseItem.Id === undefined || !baseItem.Name || !baseItem.RunTimeTicks) {
throw new Error(
'Unable to construct search hint from base item, required properties were undefined',
);
}
var artist = ""
if(baseItem.AlbumArtist) {
artist = baseItem.AlbumArtist + " - "
}

return new AlbumSearchItem(
baseItem.Id,
trimStringToFixedLength(artist + baseItem.Name, 70),
baseItem.RunTimeTicks / 10000,
);
}

override async toTracks(
searchService: JellyfinSearchService,
): Promise<Track[]> {
Expand Down
16 changes: 15 additions & 1 deletion src/models/search/PlaylistSearchItem.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SearchHint as JellyfinSearchHint } from '@jellyfin/sdk/lib/generated-client/models';
import { BaseItemDto, SearchHint as JellyfinSearchHint } from '@jellyfin/sdk/lib/generated-client/models';

import { Track } from '../music/Track';
import { JellyfinSearchService } from '../../clients/jellyfin/jellyfin.search.service';
Expand All @@ -25,6 +25,20 @@ export class PlaylistSearchItem extends SearchItem {
hint.RunTimeTicks / 10000,
);
}

static constructFromBaseItem(baseItem: BaseItemDto) {
if (baseItem.Id === undefined || !baseItem.Name || !baseItem.RunTimeTicks) {
throw new Error(
'Unable to construct playlist search hint, required properties were undefined',
);
}

return new PlaylistSearchItem(
baseItem.Id,
trimStringToFixedLength(baseItem.Name, 50),
baseItem.RunTimeTicks / 10000,
);
}

override async toTracks(
searchService: JellyfinSearchService,
Expand Down
2 changes: 1 addition & 1 deletion src/utils/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ export const Constants = {
Version: {
Major: 0,
Minor: 1,
Patch: 0,
Patch: 1,
All: () =>
`${Constants.Metadata.Version.Major}.${Constants.Metadata.Version.Minor}.${Constants.Metadata.Version.Patch}`,
},
Expand Down
2 changes: 1 addition & 1 deletion src/utils/trackConverter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const flatMapTrackItems = (
let tracks: Track[] = [];
hints.forEach(async (hint) => {
const searchedTracks = await hint.toTracks(jellyfinSearchService);
tracks = [...tracks, ...searchedTracks];
searchedTracks.forEach((track) => tracks.push(track));
});
return tracks;
};
Loading

0 comments on commit 649742b

Please sign in to comment.