@christianriedl/media 1.0.304 → 1.0.305
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/iMedia.d.ts
CHANGED
|
@@ -367,6 +367,7 @@ export interface IPlaylistService {
|
|
|
367
367
|
soundbarVolume: number;
|
|
368
368
|
searchFeeds(query: Dictionary<any>, limit?: number): Promise<IRssFeed[]>;
|
|
369
369
|
getFeed(rssUrl: string): Promise<IRssFeed | null>;
|
|
370
|
+
getCategories(owner: string): Promise<string[]>;
|
|
370
371
|
play(url: string): Promise<boolean>;
|
|
371
372
|
playList(urls: string[], clear: boolean, index?: number): Promise<boolean>;
|
|
372
373
|
playCommand(cmd: EPlaylistCommand): Promise<boolean>;
|
|
@@ -9,9 +9,11 @@ export declare class PlaylistService implements IPlaylistService {
|
|
|
9
9
|
soundbarVolume: number;
|
|
10
10
|
setSoundbar: (name: string, value: string) => Promise<boolean>;
|
|
11
11
|
getSoundbarValue: (name: string) => any;
|
|
12
|
+
cachedCategories: Dictionary<string[]>;
|
|
12
13
|
constructor(rest: IRest, log: ILogger, getSoundbarValue: (name: string) => any, setSoundbar: (name: string, value: string) => Promise<boolean>);
|
|
13
14
|
searchFeeds(query: Dictionary<any>, limit?: number): Promise<IRssFeed[]>;
|
|
14
15
|
getFeed(rssUrl: string): Promise<IRssFeed | null>;
|
|
16
|
+
getCategories(owner: string): Promise<string[]>;
|
|
15
17
|
play(url: string): Promise<boolean>;
|
|
16
18
|
playList(urls: string[], clear: boolean, index?: number): Promise<boolean>;
|
|
17
19
|
playCommand(cmd: EPlaylistCommand): Promise<boolean>;
|
package/dist/playlistService.js
CHANGED
|
@@ -8,6 +8,7 @@ export class PlaylistService {
|
|
|
8
8
|
soundbarVolume;
|
|
9
9
|
setSoundbar;
|
|
10
10
|
getSoundbarValue;
|
|
11
|
+
cachedCategories;
|
|
11
12
|
constructor(rest, log, getSoundbarValue, setSoundbar) {
|
|
12
13
|
this.log = log;
|
|
13
14
|
this.rest = rest;
|
|
@@ -15,6 +16,8 @@ export class PlaylistService {
|
|
|
15
16
|
this.getSoundbarValue = getSoundbarValue;
|
|
16
17
|
this.setSoundbar = setSoundbar;
|
|
17
18
|
this.soundbarOn = false;
|
|
19
|
+
this.cachedCategories = {};
|
|
20
|
+
;
|
|
18
21
|
}
|
|
19
22
|
async searchFeeds(query, limit) {
|
|
20
23
|
query['limit'] = limit ?? 50;
|
|
@@ -25,6 +28,20 @@ export class PlaylistService {
|
|
|
25
28
|
const res = await this.rest.getData('apiplaylist/feed', { rssUrl: rssUrl });
|
|
26
29
|
return res.ok ? res.result : null;
|
|
27
30
|
}
|
|
31
|
+
async getCategories(owner) {
|
|
32
|
+
let categories = this.cachedCategories[owner];
|
|
33
|
+
if (!categories) {
|
|
34
|
+
const res = await this.rest.getData('apiplaylist/feed/categories', { owner: owner });
|
|
35
|
+
if (!res.ok || !res.result) {
|
|
36
|
+
return [''];
|
|
37
|
+
}
|
|
38
|
+
categories = [''];
|
|
39
|
+
categories.push(...res.result);
|
|
40
|
+
this.cachedCategories[owner] = categories;
|
|
41
|
+
;
|
|
42
|
+
}
|
|
43
|
+
return categories;
|
|
44
|
+
}
|
|
28
45
|
/*
|
|
29
46
|
async getTitles(): Promise<string[]> {
|
|
30
47
|
const res = await this.rest.getData<string[]>('apiplaylist/title');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playlistService.js","sourceRoot":"","sources":["../src/playlistService.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,MAAM,EAAc,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAY,gBAAgB,EAAoC,MAAM,UAAU,CAAC;AAExF,MAAM,OAAO,eAAe;IACxB,IAAI,CAAQ;IACZ,QAAQ,CAAS;IACjB,GAAG,CAAU;IACb,UAAU,CAAU;IACpB,cAAc,CAAS;IACvB,WAAW,CAAoD;IAC/D,gBAAgB,CAAwB;IACxC,YAAY,IAAW,EAAE,GAAY,EAAE,gBAAuC,EAAE,WAA8D;QAC1I,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"playlistService.js","sourceRoot":"","sources":["../src/playlistService.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
const listHeight = ref(0);
|
|
23
23
|
const playerNames = ['Local', 'Soundbar'];
|
|
24
24
|
const currentPlayer = ref<string>(playerNames[0]);
|
|
25
|
+
const orf = ref(true);
|
|
25
26
|
const playLocal = computed(() => currentPlayer.value == 'Local');
|
|
26
27
|
const playIndex = ref(-1);
|
|
27
28
|
const itemIndex = ref(0);
|
|
@@ -43,21 +44,25 @@
|
|
|
43
44
|
});
|
|
44
45
|
|
|
45
46
|
const feedTypes = Helper.getEnumOptions(EFeedType);
|
|
46
|
-
const feedType = ref<EFeedType>(
|
|
47
|
+
const feedType = ref<EFeedType>(EFeedType.Podcast);
|
|
47
48
|
const countries = ["", "AT", "DE", "US"];
|
|
48
49
|
const country = ref("");
|
|
49
50
|
const query = ref("");
|
|
51
|
+
const categories = ref<string[]>([]);
|
|
52
|
+
const category = ref("");
|
|
53
|
+
|
|
50
54
|
const limit = ref(50);
|
|
51
55
|
|
|
52
56
|
onMounted(async () => {
|
|
57
|
+
statusTimer = 0;
|
|
53
58
|
playlistService.log.info('OnlinePodcastsPage created');
|
|
54
59
|
await start();
|
|
55
60
|
});
|
|
56
61
|
onUnmounted(() => {
|
|
57
62
|
if (statusTimer > 0) {
|
|
58
63
|
window.clearTimeout(statusTimer);
|
|
59
|
-
statusTimer = 0;
|
|
60
64
|
}
|
|
65
|
+
statusTimer = -1;
|
|
61
66
|
});
|
|
62
67
|
async function start() {
|
|
63
68
|
if (route.query?.rssUrl) {
|
|
@@ -70,6 +75,9 @@
|
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
else {
|
|
78
|
+
if (categories.value.length == 0) {
|
|
79
|
+
categories.value = await playlistService.getCategories('ORF');
|
|
80
|
+
}
|
|
73
81
|
search.value = true;
|
|
74
82
|
}
|
|
75
83
|
computeListHeight();
|
|
@@ -88,10 +96,17 @@
|
|
|
88
96
|
}
|
|
89
97
|
async function onSearch() {
|
|
90
98
|
const dict: Dictionary<any> = {};
|
|
91
|
-
if (
|
|
92
|
-
dict[
|
|
93
|
-
|
|
94
|
-
|
|
99
|
+
if (orf.value) {
|
|
100
|
+
dict['owner'] = 'ORF';
|
|
101
|
+
if (category.value)
|
|
102
|
+
dict['category'] = category.value;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
if (feedType.value != EFeedType.Unknown)
|
|
106
|
+
dict["media"] = EFeedType[feedType.value];
|
|
107
|
+
if (country.value != "")
|
|
108
|
+
dict["country"] = country.value;;
|
|
109
|
+
}
|
|
95
110
|
dict["query"] = query.value;
|
|
96
111
|
const fds = await playlistService.searchFeeds(dict, limit.value);
|
|
97
112
|
feeds.splice (0, feeds.length, ...fds);
|
|
@@ -136,7 +151,8 @@
|
|
|
136
151
|
volumeCount--;
|
|
137
152
|
else
|
|
138
153
|
volume.value = playlistService.soundbarVolume;
|
|
139
|
-
|
|
154
|
+
if (statusTimer >= 0)
|
|
155
|
+
statusTimer = window.setTimeout(async () => getStatus(), 1000);
|
|
140
156
|
}
|
|
141
157
|
|
|
142
158
|
function toSubTitle(f: IRssFeed): string {
|
|
@@ -223,7 +239,12 @@
|
|
|
223
239
|
play();
|
|
224
240
|
}
|
|
225
241
|
async function stop() {
|
|
226
|
-
|
|
242
|
+
if (playLocal.value) {
|
|
243
|
+
audio.value!.pause();
|
|
244
|
+
audio.value!.currentTime = 0;
|
|
245
|
+
}
|
|
246
|
+
else
|
|
247
|
+
await playlistService.playCommand(EPlaylistCommand.Stop);
|
|
227
248
|
}
|
|
228
249
|
async function changeVolume() {
|
|
229
250
|
if (volumeTimer)
|
|
@@ -243,28 +264,37 @@
|
|
|
243
264
|
<audio ref="audio" preload="none" @ended="onEnded" @timeupdate="onTimeUpdate">
|
|
244
265
|
</audio>
|
|
245
266
|
<v-container v-if="search" fluid>
|
|
246
|
-
<v-row class="align-center">
|
|
247
|
-
<v-col cols="1"
|
|
267
|
+
<v-row class="align-center" density="compact">
|
|
268
|
+
<v-col cols="1">ORF</v-col>
|
|
248
269
|
<v-col cols="2">Type</v-col>
|
|
249
270
|
<v-col cols="1">Country</v-col>
|
|
250
271
|
<v-col cols="6">Query</v-col>
|
|
251
272
|
<v-col cols="1">Limit</v-col>
|
|
252
273
|
</v-row>
|
|
253
|
-
<v-row class="align-center">
|
|
274
|
+
<v-row class="align-center" density="compact">
|
|
254
275
|
<v-col cols="1">
|
|
276
|
+
<v-checkbox v-model="orf" hide-details density="compact"></v-checkbox>
|
|
255
277
|
</v-col>
|
|
256
|
-
<v-col cols="
|
|
257
|
-
<v-select density="compact" v-model="
|
|
258
|
-
:items="
|
|
278
|
+
<v-col v-if="orf" cols="3">
|
|
279
|
+
<v-select density="compact" v-model="category"
|
|
280
|
+
:items="categories"
|
|
259
281
|
persistent-hint hide-details single-line>
|
|
260
282
|
</v-select>
|
|
261
283
|
</v-col>
|
|
262
|
-
<v-
|
|
263
|
-
<v-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
284
|
+
<template v-else>
|
|
285
|
+
<v-col cols="2">
|
|
286
|
+
<v-select density="compact" v-model="feedType"
|
|
287
|
+
:items="feedTypes"
|
|
288
|
+
persistent-hint hide-details single-line>
|
|
289
|
+
</v-select>
|
|
290
|
+
</v-col>
|
|
291
|
+
<v-col cols="1">
|
|
292
|
+
<v-combobox density="compact" v-model="country"
|
|
293
|
+
:items="countries"
|
|
294
|
+
persistent-hint hide-details single-line>
|
|
295
|
+
</v-combobox>
|
|
296
|
+
</v-col>
|
|
297
|
+
</template>
|
|
268
298
|
<v-col cols="6">
|
|
269
299
|
<v-text-field v-model="query" hide-details density="compact"></v-text-field>
|
|
270
300
|
</v-col>
|
|
@@ -278,7 +308,7 @@
|
|
|
278
308
|
</v-row>
|
|
279
309
|
</v-container>
|
|
280
310
|
<v-container v-else fluid>
|
|
281
|
-
<v-row class="align-center">
|
|
311
|
+
<v-row class="align-center" density="compact">
|
|
282
312
|
<v-col cols="1">
|
|
283
313
|
<v-btn icon="$back" class="bg-media_head" variant="tonal" @click="listBack">
|
|
284
314
|
</v-btn>
|
|
@@ -296,10 +326,10 @@
|
|
|
296
326
|
</v-select>
|
|
297
327
|
</v-col>
|
|
298
328
|
</v-row>
|
|
299
|
-
<v-row v-if="playingItem" class="align-center">
|
|
329
|
+
<v-row v-if="playingItem" class="align-center" density="compact">
|
|
300
330
|
<v-col cols="4">
|
|
301
331
|
<v-btn :icon="paused ? '$play' : '$pause'" class="bg-media_head" variant="tonal" @click="playpause"></v-btn>
|
|
302
|
-
<v-btn
|
|
332
|
+
<v-btn icon="$stop" class="bg-media_head" variant="tonal" @click="stop"></v-btn>
|
|
303
333
|
<v-btn icon="$prev" class="bg-media_head" variant="tonal" @click="previous"></v-btn>
|
|
304
334
|
<v-btn icon="$next" class="bg-media_head" variant="tonal" @click="next"></v-btn>
|
|
305
335
|
</v-col>
|
|
@@ -310,7 +340,7 @@
|
|
|
310
340
|
<v-div v-else>{{playingItem.title}}</v-div>
|
|
311
341
|
</v-col>
|
|
312
342
|
</v-row>
|
|
313
|
-
<v-row v-if="playingItem">
|
|
343
|
+
<v-row v-if="playingItem" density="compact">
|
|
314
344
|
<v-col cols="12">
|
|
315
345
|
<v-progress-linear v-model="positionLength" color="blue" height="25"><strong>{{positionText}}</strong></v-progress-linear>
|
|
316
346
|
</v-col>
|
|
@@ -319,7 +349,7 @@
|
|
|
319
349
|
</v-card>
|
|
320
350
|
<v-card :height="listHeight" density="compact" class="overflow-y-auto bg-media">
|
|
321
351
|
<v-container v-if="search" fluid>
|
|
322
|
-
<v-row v-for="(feed,index) in feeds" :key="feed.rssUrl" @click="listFeed(feed)">
|
|
352
|
+
<v-row v-for="(feed,index) in feeds" :key="feed.rssUrl" density="compact" @click="listFeed(feed)">
|
|
323
353
|
<v-col cols="1">{{feed.country}}</v-col>
|
|
324
354
|
<v-col cols="2">{{feed.genre}}</v-col>
|
|
325
355
|
<v-col cols="2">{{feed.owner}}</v-col>
|
|
@@ -327,7 +357,7 @@
|
|
|
327
357
|
</v-row>
|
|
328
358
|
</v-container>
|
|
329
359
|
<v-container v-else>
|
|
330
|
-
<v-row v-for="(item,index) in items" :key="item.title" :class="{ active: index == playIndex }" @click="listItem(item)">
|
|
360
|
+
<v-row v-for="(item,index) in items" :key="item.title" density="compact" :class="{ active: index == playIndex }" @click="listItem(item)">
|
|
331
361
|
<v-col cols="6">{{item.title}}</v-col>
|
|
332
362
|
<v-col cols="6">{{toTime(item.duration)}}</v-col>
|
|
333
363
|
</v-row>
|