]>
Commit | Line | Data |
---|---|---|
f1a0f3b7 C |
1 | import { VideoPlaylist, VideoPlaylistElement } from '../../../../../shared/models' |
2 | ||
3 | export class PlaylistTracker { | |
4 | private currentPlaylistElement: VideoPlaylistElement | |
5 | ||
6 | constructor ( | |
7 | private readonly playlist: VideoPlaylist, | |
8 | private readonly playlistElements: VideoPlaylistElement[] | |
9 | ) { | |
10 | ||
11 | } | |
12 | ||
13 | getPlaylist () { | |
14 | return this.playlist | |
15 | } | |
16 | ||
17 | getPlaylistElements () { | |
18 | return this.playlistElements | |
19 | } | |
20 | ||
21 | hasNextPlaylistElement (position?: number) { | |
22 | return !!this.getNextPlaylistElement(position) | |
23 | } | |
24 | ||
25 | getNextPlaylistElement (position?: number): VideoPlaylistElement { | |
26 | if (!position) position = this.currentPlaylistElement.position + 1 | |
27 | ||
28 | if (position > this.playlist.videosLength) { | |
29 | return undefined | |
30 | } | |
31 | ||
32 | const next = this.playlistElements.find(e => e.position === position) | |
33 | ||
34 | if (!next || !next.video) { | |
35 | return this.getNextPlaylistElement(position + 1) | |
36 | } | |
37 | ||
38 | return next | |
39 | } | |
40 | ||
41 | hasPreviousPlaylistElement (position?: number) { | |
42 | return !!this.getPreviousPlaylistElement(position) | |
43 | } | |
44 | ||
45 | getPreviousPlaylistElement (position?: number): VideoPlaylistElement { | |
46 | if (!position) position = this.currentPlaylistElement.position - 1 | |
47 | ||
48 | if (position < 1) { | |
49 | return undefined | |
50 | } | |
51 | ||
52 | const prev = this.playlistElements.find(e => e.position === position) | |
53 | ||
54 | if (!prev || !prev.video) { | |
55 | return this.getNextPlaylistElement(position - 1) | |
56 | } | |
57 | ||
58 | return prev | |
59 | } | |
60 | ||
61 | nextVideoTitle () { | |
62 | const next = this.getNextPlaylistElement() | |
63 | if (!next) return '' | |
64 | ||
65 | return next.video.name | |
66 | } | |
67 | ||
68 | setPosition (position: number) { | |
69 | this.currentPlaylistElement = this.playlistElements.find(e => e.position === position) | |
70 | if (!this.currentPlaylistElement || !this.currentPlaylistElement.video) { | |
71 | console.error('Current playlist element is not valid.', this.currentPlaylistElement) | |
72 | this.currentPlaylistElement = this.getNextPlaylistElement() | |
73 | } | |
74 | ||
75 | if (!this.currentPlaylistElement) { | |
76 | throw new Error('This playlist does not have any valid element') | |
77 | } | |
78 | } | |
79 | ||
80 | setCurrentElement (playlistElement: VideoPlaylistElement) { | |
81 | this.currentPlaylistElement = playlistElement | |
82 | } | |
83 | ||
84 | getCurrentElement () { | |
85 | return this.currentPlaylistElement | |
86 | } | |
87 | ||
88 | getCurrentPosition () { | |
89 | if (!this.currentPlaylistElement) return -1 | |
90 | ||
91 | return this.currentPlaylistElement.position | |
92 | } | |
93 | } |