@christianriedl/media 1.0.303 → 1.0.304

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
@@ -364,10 +364,12 @@ export interface IPlaylistState {
364
364
  export interface IPlaylistService {
365
365
  log: ILogger;
366
366
  soundbarOn: boolean;
367
+ soundbarVolume: number;
367
368
  searchFeeds(query: Dictionary<any>, limit?: number): Promise<IRssFeed[]>;
368
369
  getFeed(rssUrl: string): Promise<IRssFeed | null>;
369
370
  play(url: string): Promise<boolean>;
370
371
  playList(urls: string[], clear: boolean, index?: number): Promise<boolean>;
371
372
  playCommand(cmd: EPlaylistCommand): Promise<boolean>;
373
+ setSoundbarVolume(value: number): Promise<boolean>;
372
374
  getState(): Promise<IPlaylistState | null>;
373
375
  }
@@ -6,6 +6,7 @@ export declare class PlaylistService implements IPlaylistService {
6
6
  mediaUrl: string;
7
7
  log: ILogger;
8
8
  soundbarOn: boolean;
9
+ soundbarVolume: number;
9
10
  setSoundbar: (name: string, value: string) => Promise<boolean>;
10
11
  getSoundbarValue: (name: string) => any;
11
12
  constructor(rest: IRest, log: ILogger, getSoundbarValue: (name: string) => any, setSoundbar: (name: string, value: string) => Promise<boolean>);
@@ -15,5 +16,6 @@ export declare class PlaylistService implements IPlaylistService {
15
16
  playList(urls: string[], clear: boolean, index?: number): Promise<boolean>;
16
17
  playCommand(cmd: EPlaylistCommand): Promise<boolean>;
17
18
  getState(): Promise<IPlaylistState | null>;
18
- ensureOn(): Promise<boolean>;
19
+ ensureSoundbarOn(): Promise<boolean>;
20
+ setSoundbarVolume(value: number): Promise<boolean>;
19
21
  }
@@ -5,6 +5,7 @@ export class PlaylistService {
5
5
  mediaUrl;
6
6
  log;
7
7
  soundbarOn;
8
+ soundbarVolume;
8
9
  setSoundbar;
9
10
  getSoundbarValue;
10
11
  constructor(rest, log, getSoundbarValue, setSoundbar) {
@@ -47,14 +48,14 @@ export class PlaylistService {
47
48
  }
48
49
  */
49
50
  async play(url) {
50
- this.soundbarOn = await this.ensureOn();
51
+ this.soundbarOn = await this.ensureSoundbarOn();
51
52
  if (!this.soundbarOn)
52
53
  return false;
53
54
  const res = await this.rest.postData(`apiplaylist/play?url=${encodeURIComponent(url)}`);
54
55
  return res.ok ? res.result : false;
55
56
  }
56
57
  async playList(urls, clear, index) {
57
- this.soundbarOn = await this.ensureOn();
58
+ this.soundbarOn = await this.ensureSoundbarOn();
58
59
  if (!this.soundbarOn)
59
60
  return false;
60
61
  let url = `apiplaylist/play?clear=${clear}`;
@@ -64,7 +65,7 @@ export class PlaylistService {
64
65
  return res.ok ? res.result : false;
65
66
  }
66
67
  async playCommand(cmd) {
67
- this.soundbarOn = await this.ensureOn();
68
+ this.soundbarOn = await this.ensureSoundbarOn();
68
69
  if (!this.soundbarOn)
69
70
  return false;
70
71
  let url = `apiplaylist/playcommand?cmd=${EPlaylistCommand[cmd]}`;
@@ -72,10 +73,11 @@ export class PlaylistService {
72
73
  return res.ok ? res.result : false;
73
74
  }
74
75
  async getState() {
76
+ this.soundbarVolume = Number(this.getSoundbarValue('Volume'));
75
77
  const res = await this.rest.getData('apiplaylist/state');
76
78
  return res.ok ? res.result : null;
77
79
  }
78
- async ensureOn() {
80
+ async ensureSoundbarOn() {
79
81
  let i = 0;
80
82
  for (i = 0; i < 5; i++) {
81
83
  if (this.getSoundbarValue('On') === true)
@@ -93,5 +95,9 @@ export class PlaylistService {
93
95
  }
94
96
  return false;
95
97
  }
98
+ async setSoundbarVolume(value) {
99
+ const result = await this.setSoundbar('VOLUME', value.toString());
100
+ return result;
101
+ }
96
102
  }
97
103
  //# sourceMappingURL=playlistService.js.map
@@ -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,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;IACrB,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,KAAsB,EAAE,KAAc;QAC3D,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAa,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAClF,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,MAAc;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAW,kBAAkB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtF,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IACD;;;;;;;;;;;;;;;;;;;;;MAqBE;IACF,KAAK,CAAC,IAAI,CAAC,GAAW;QACzB,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO,KAAK,CAAC;QACV,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAM,wBAAwB,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,IAAc,EAAE,KAAc,EAAE,KAAc;QAChE,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO,KAAK,CAAC;QACjB,IAAI,GAAG,GAAG,0BAA0B,KAAK,EAAE,CAAC;QAC5C,IAAI,KAAK,KAAK,SAAS;YACnB,GAAG,IAAI,UAAU,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAW,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,GAAqB;QAC1C,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU;YAChB,OAAO,KAAK,CAAC;QACjB,IAAI,GAAG,GAAG,+BAA+B,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAM,GAAG,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAiB,CAAC,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,QAAQ;QACV,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAiB,mBAAmB,CAAC,CAAC;QACzE,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAwB,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,QAAQ;QACjB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,IAAI;gBAC3C,MAAM;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACtD,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,SAAS;gBAClD,OAAO,IAAI,CAAC;YACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC3D,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACV,CAAC;CACJ"}
1
+ {"version":3,"file":"playlistService.js","sourceRoot":"","sources":["../src/playlistService.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@christianriedl/media",
3
- "version": "1.0.303",
3
+ "version": "1.0.304",
4
4
  "description": "RIC media interfaces",
5
5
 
6
6
  "main": "dist/index.js",
@@ -21,7 +21,6 @@
21
21
  const listhead = ref<ComponentPublicInstance | null>(null);
22
22
  const listHeight = ref(0);
23
23
  const playerNames = ['Local', 'Soundbar'];
24
- const backVisible = computed(() => !!route.query?.feed);
25
24
  const currentPlayer = ref<string>(playerNames[0]);
26
25
  const playLocal = computed(() => currentPlayer.value == 'Local');
27
26
  const playIndex = ref(-1);
@@ -33,6 +32,9 @@
33
32
  const paused = ref(false);
34
33
  const search = ref(true);
35
34
  let statusTimer = 0;
35
+ let volumeTimer = 0;
36
+ let volumeCount = 0;
37
+
36
38
  const positionText = computed(() => {
37
39
  if (playingItem.value?.duration)
38
40
  return toTime(position.value) + '/' + toTime(playingItem.value.duration);
@@ -53,7 +55,7 @@
53
55
  });
54
56
  onUnmounted(() => {
55
57
  if (statusTimer > 0) {
56
- clearTimeout(statusTimer);
58
+ window.clearTimeout(statusTimer);
57
59
  statusTimer = 0;
58
60
  }
59
61
  });
@@ -84,15 +86,14 @@
84
86
  listHeight.value = height;
85
87
  })
86
88
  }
87
-
88
89
  async function onSearch() {
89
90
  const dict: Dictionary<any> = {};
90
- if (feedType.value != EFeedType.None)
91
- dict["media"] = EFeedType[feedType];
91
+ if (feedType.value != EFeedType.Unknown)
92
+ dict["media"] = EFeedType[feedType.value];
92
93
  if (country.value != "")
93
94
  dict["country"] = country.value;;
94
95
  dict["query"] = query.value;
95
- const fds = await playlistService.searchFeeds(dict, limit.value);;
96
+ const fds = await playlistService.searchFeeds(dict, limit.value);
96
97
  feeds.splice (0, feeds.length, ...fds);
97
98
  }
98
99
  async function play() {
@@ -110,11 +111,11 @@
110
111
  return;
111
112
  playingItem.value = selectedItem.value;
112
113
  await getStatus();
113
- playlistService.log.trace(`play remote ${selectedItem.value!.title}`)
114
+ playlistService.log.trace(`play remote ${selectedItem.value!.title}`);
114
115
  }
115
- itemIndex.value = playIndex.value = feeds.findIndex((f) => f.link == selectedItem.value!.link);
116
+ itemIndex.value = playIndex.value = items.findIndex((f) => f.link == selectedItem.value!.link);
116
117
  }
117
- function listFeed(feed: IRssFeed) {{
118
+ function listFeed(feed: IRssFeed) {
118
119
  router.push ({path: 'onlinePodcasts', query: { rssUrl: feed.rssUrl }});
119
120
  }
120
121
 
@@ -131,6 +132,10 @@
131
132
  status.value = state;
132
133
  if (state)
133
134
  setPosition(Number(state.position));
135
+ if (volumeCount > 0)
136
+ volumeCount--;
137
+ else
138
+ volume.value = playlistService.soundbarVolume;
134
139
  statusTimer = window.setTimeout(async () => getStatus(), 1000);
135
140
  }
136
141
 
@@ -140,7 +145,7 @@
140
145
  return toTime(f.duration);
141
146
  }
142
147
 
143
- function toTime(s: number): string {
148
+ function toTime(s?: number): string {
144
149
  if (!s)
145
150
  return "";
146
151
  let r = "";
@@ -208,16 +213,27 @@
208
213
  function previous() {
209
214
  if (playIndex.value <= 0)
210
215
  return;
211
- selectedItem.value = feeds[playIndex.value - 1];
216
+ selectedItem.value = items[playIndex.value - 1];
212
217
  play();
213
218
  }
214
219
  function next() {
215
- if (playIndex.value >= feeds.length - 1)
220
+ if (playIndex.value >= items.length - 1)
216
221
  return;
217
- selectedItem.value = feeds[playIndex.value + 1];
222
+ selectedItem.value = items[playIndex.value + 1];
218
223
  play();
219
224
  }
220
- function changeVolume() {
225
+ async function stop() {
226
+ await playlistService.playCommand(EPlaylistCommand.Stop);
227
+ }
228
+ async function changeVolume() {
229
+ if (volumeTimer)
230
+ window.clearTimeout(volumeTimer);
231
+
232
+ volumeCount = 3;
233
+ volumeTimer = window.setTimeout(async () => {
234
+ await playlistService.setSoundbarVolume(volume.value);
235
+ volumeTimer = 0;
236
+ }, 500);
221
237
  }
222
238
 
223
239
  </script>
@@ -236,8 +252,6 @@
236
252
  </v-row>
237
253
  <v-row class="align-center">
238
254
  <v-col cols="1">
239
- <v-btn v-if="backVisible" icon="$back" class="bg-media_head" variant="tonal" @click="listBack">
240
- </v-btn>
241
255
  </v-col>
242
256
  <v-col cols="2">
243
257
  <v-select density="compact" v-model="feedType"
@@ -266,17 +280,17 @@
266
280
  <v-container v-else fluid>
267
281
  <v-row class="align-center">
268
282
  <v-col cols="1">
269
- <v-btn v-if="backVisible" icon="$back" class="bg-media_head" variant="tonal" @click="listBack">
283
+ <v-btn icon="$back" class="bg-media_head" variant="tonal" @click="listBack">
270
284
  </v-btn>
271
285
  </v-col>
272
286
  <v-col cols="1">
273
- <v-img :src="selectedFeed.imageUrl"></v-img>
287
+ <v-img :src="selectedFeed!.imageUrl"></v-img>
274
288
  </v-col>
275
- <v-col cols="1">{{selectedFeed.country}}</v-col>
276
- <v-col cols="2">{{selectedFeed.genre}}</v-col>
277
- <v-col cols="2">{{selectedFeed.owner}}</v-col>
278
- <v-col cols="5">{{selectedFeed.title}}</v-col>
279
- <v-col cols="2">
289
+ <v-col cols="1">{{selectedFeed!.country}}</v-col>
290
+ <v-col cols="2">{{selectedFeed!.genre}}</v-col>
291
+ <v-col cols="2">{{selectedFeed!.owner}}</v-col>
292
+ <v-col cols="4">{{selectedFeed!.title}}</v-col>
293
+ <v-col cols="1">
280
294
  <v-select v-model="currentPlayer" density="compact" :items="playerNames" persistent-hint
281
295
  @update:modelValue="onPlayerChange" hide-details single-line>
282
296
  </v-select>
@@ -284,14 +298,16 @@
284
298
  </v-row>
285
299
  <v-row v-if="playingItem" class="align-center">
286
300
  <v-col cols="4">
287
- <v-btn :icon="paused ? '$play' : '$pause'" @click="playpause">
288
- <v-btn icon="$prev" @click="previous">
289
- <v-btn icon="$next" @click="next">
301
+ <v-btn :icon="paused ? '$play' : '$pause'" class="bg-media_head" variant="tonal" @click="playpause"></v-btn>
302
+ <v-btn v-if="!playLocal" icon="$stop" class="bg-media_head" variant="tonal" @click="stop"></v-btn>
303
+ <v-btn icon="$prev" class="bg-media_head" variant="tonal" @click="previous"></v-btn>
304
+ <v-btn icon="$next" class="bg-media_head" variant="tonal" @click="next"></v-btn>
290
305
  </v-col>
291
306
  <v-col cols ="8">
292
307
  <v-slider v-if="!playLocal" style="width:30%" color="red" track-color="blue" track-fill-color="red" v-model="volume" hide-details density="compact"
293
308
  min="0" max="100" step="5" @update:modelValue="changeVolume">
294
309
  </v-slider>
310
+ <v-div v-else>{{playingItem.title}}</v-div>
295
311
  </v-col>
296
312
  </v-row>
297
313
  <v-row v-if="playingItem">
@@ -311,11 +327,9 @@
311
327
  </v-row>
312
328
  </v-container>
313
329
  <v-container v-else>
314
- <v-row v-for="(item,index) in items" :key="item.rssUrl" @click="listItem(item)">
315
- <v-col cols="1">{{item.title}}</v-col>
316
- <v-col cols="2">{{toTime(item.duration)}}</v-col>
317
- <v-col cols="2">{{feed.owner}}</v-col>
318
- <v-col cols="5">{{item.title}}</v-col>
330
+ <v-row v-for="(item,index) in items" :key="item.title" :class="{ active: index == playIndex }" @click="listItem(item)">
331
+ <v-col cols="6">{{item.title}}</v-col>
332
+ <v-col cols="6">{{toTime(item.duration)}}</v-col>
319
333
  </v-row>
320
334
  </v-container>
321
335
  </v-card>
@@ -370,3 +384,9 @@
370
384
  -->
371
385
  </template>
372
386
 
387
+ <style scoped>
388
+ .active {
389
+ background-color: aliceblue;
390
+ }
391
+
392
+ </style>