]>
Commit | Line | Data |
---|---|---|
1 | import { SortMeta } from 'primeng/api' | |
2 | import { mergeMap } from 'rxjs' | |
3 | import { Component, OnInit } from '@angular/core' | |
4 | import { AuthService, Notifier, RestPagination, RestTable, ServerService } from '@app/core' | |
5 | import { DropdownAction, VideoChannelService, VideoChannelSyncService } from '@app/shared/shared-main' | |
6 | import { HTMLServerConfig } from '@shared/models/server' | |
7 | import { VideoChannelSync, VideoChannelSyncState } from '@shared/models/videos' | |
8 | ||
9 | @Component({ | |
10 | templateUrl: './my-video-channel-syncs.component.html', | |
11 | styleUrls: [ './my-video-channel-syncs.component.scss' ] | |
12 | }) | |
13 | export class MyVideoChannelSyncsComponent extends RestTable implements OnInit { | |
14 | error: string | |
15 | ||
16 | channelSyncs: VideoChannelSync[] = [] | |
17 | totalRecords = 0 | |
18 | ||
19 | videoChannelSyncActions: DropdownAction<VideoChannelSync>[][] = [] | |
20 | sort: SortMeta = { field: 'createdAt', order: 1 } | |
21 | pagination: RestPagination = { count: this.rowsPerPage, start: 0 } | |
22 | ||
23 | private static STATE_CLASS_BY_ID = { | |
24 | [VideoChannelSyncState.FAILED]: 'badge-red', | |
25 | [VideoChannelSyncState.PROCESSING]: 'badge-blue', | |
26 | [VideoChannelSyncState.SYNCED]: 'badge-green', | |
27 | [VideoChannelSyncState.WAITING_FIRST_RUN]: 'badge-yellow' | |
28 | } | |
29 | ||
30 | private serverConfig: HTMLServerConfig | |
31 | ||
32 | constructor ( | |
33 | private videoChannelsSyncService: VideoChannelSyncService, | |
34 | private serverService: ServerService, | |
35 | private notifier: Notifier, | |
36 | private authService: AuthService, | |
37 | private videoChannelService: VideoChannelService | |
38 | ) { | |
39 | super() | |
40 | } | |
41 | ||
42 | ngOnInit () { | |
43 | this.serverConfig = this.serverService.getHTMLConfig() | |
44 | this.initialize() | |
45 | ||
46 | this.videoChannelSyncActions = [ | |
47 | [ | |
48 | { | |
49 | label: $localize`List imports`, | |
50 | linkBuilder: () => [ '/my-library/video-imports' ], | |
51 | queryParamsBuilder: sync => ({ search: `videoChannelSyncId:${sync.id}` }), | |
52 | iconName: 'cloud-download' | |
53 | } | |
54 | ], | |
55 | [ | |
56 | { | |
57 | label: $localize`Delete`, | |
58 | iconName: 'delete', | |
59 | handler: videoChannelSync => this.deleteSync(videoChannelSync) | |
60 | }, | |
61 | { | |
62 | label: $localize`Fully synchronize the channel`, | |
63 | description: $localize`This fetches any missing videos on the local channel`, | |
64 | iconName: 'refresh', | |
65 | handler: videoChannelSync => this.fullySynchronize(videoChannelSync) | |
66 | } | |
67 | ] | |
68 | ] | |
69 | } | |
70 | ||
71 | protected reloadDataInternal () { | |
72 | this.error = undefined | |
73 | ||
74 | this.authService.userInformationLoaded | |
75 | .pipe(mergeMap(() => { | |
76 | const user = this.authService.getUser() | |
77 | return this.videoChannelsSyncService.listAccountVideoChannelsSyncs({ | |
78 | sort: this.sort, | |
79 | account: user.account, | |
80 | pagination: this.pagination | |
81 | }) | |
82 | })) | |
83 | .subscribe({ | |
84 | next: res => { | |
85 | this.channelSyncs = res.data | |
86 | this.totalRecords = res.total | |
87 | }, | |
88 | error: err => { | |
89 | this.error = err.message | |
90 | } | |
91 | }) | |
92 | } | |
93 | ||
94 | syncEnabled () { | |
95 | return this.serverConfig.import.videoChannelSynchronization.enabled | |
96 | } | |
97 | ||
98 | deleteSync (videoChannelSync: VideoChannelSync) { | |
99 | this.videoChannelsSyncService.deleteSync(videoChannelSync.id) | |
100 | .subscribe({ | |
101 | next: () => { | |
102 | this.notifier.success($localize`Synchronization removed successfully for ${videoChannelSync.channel.displayName}.`) | |
103 | this.reloadData() | |
104 | }, | |
105 | error: err => { | |
106 | this.error = err.message | |
107 | } | |
108 | }) | |
109 | } | |
110 | ||
111 | fullySynchronize (videoChannelSync: VideoChannelSync) { | |
112 | this.videoChannelService.importVideos(videoChannelSync.channel.name, videoChannelSync.externalChannelUrl, videoChannelSync.id) | |
113 | .subscribe({ | |
114 | next: () => { | |
115 | this.notifier.success($localize`Full synchronization requested successfully for ${videoChannelSync.channel.displayName}.`) | |
116 | }, | |
117 | error: err => { | |
118 | this.error = err.message | |
119 | } | |
120 | }) | |
121 | } | |
122 | ||
123 | getSyncCreateLink () { | |
124 | return '/my-library/video-channel-syncs/create' | |
125 | } | |
126 | ||
127 | getSyncStateClass (stateId: VideoChannelSyncState) { | |
128 | return [ 'pt-badge', MyVideoChannelSyncsComponent.STATE_CLASS_BY_ID[stateId] ] | |
129 | } | |
130 | ||
131 | getIdentifier () { | |
132 | return 'MyVideoChannelsSyncComponent' | |
133 | } | |
134 | ||
135 | getChannelUrl (name: string) { | |
136 | return '/c/' + name | |
137 | } | |
138 | } |