@saooti/octopus-sdk 41.0.9-SNAPSHOT → 41.0.9

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.
Files changed (55) hide show
  1. package/package.json +3 -1
  2. package/plateform.conf +1 -1
  3. package/src/App.vue +3 -7
  4. package/src/api/classicApi.ts +1 -1
  5. package/src/components/composable/player/usePlayerLive.ts +2 -2
  6. package/src/components/composable/radio/usefetchRadioData.ts +29 -12
  7. package/src/components/composable/route/useAdvancedParamInit.ts +1 -1
  8. package/src/components/composable/route/useSimplePageParam.ts +11 -5
  9. package/src/components/display/categories/CategoryChooser.vue +4 -0
  10. package/src/components/display/comments/CommentList.vue +1 -1
  11. package/src/components/display/emission/EmissionList.vue +5 -8
  12. package/src/components/display/filter/AdvancedSearch.vue +0 -3
  13. package/src/components/display/list/ListPaginate.vue +1 -10
  14. package/src/components/display/live/RadioCurrently.vue +2 -5
  15. package/src/components/display/participant/ParticipantList.vue +6 -9
  16. package/src/components/display/playlist/PlaylistList.vue +5 -8
  17. package/src/components/display/playlist/PodcastList.vue +1 -1
  18. package/src/components/display/podcasts/PodcastFilterList.vue +4 -2
  19. package/src/components/display/podcasts/PodcastList.vue +7 -10
  20. package/src/components/display/podcasts/PodcastPlayButton.vue +4 -1
  21. package/src/components/display/sharing/PlayerParameters.vue +0 -8
  22. package/src/components/display/sharing/SharePlayer.vue +0 -5
  23. package/src/components/display/sharing/SubscribeButtons.vue +4 -2
  24. package/src/components/form/ClassicInputText.vue +3 -0
  25. package/src/components/form/ClassicMultiselect.vue +33 -8
  26. package/src/components/misc/ClassicAccordion.vue +4 -4
  27. package/src/components/misc/ClassicSpinner.vue +1 -1
  28. package/src/components/misc/HomeDropdown.vue +3 -110
  29. package/src/components/misc/MobileMenu.vue +59 -64
  30. package/src/components/misc/TopBar.vue +4 -11
  31. package/src/components/misc/TopBarMainContent.vue +1 -2
  32. package/src/components/misc/UserButtonContent.vue +159 -0
  33. package/src/components/misc/player/elements/PlayerImage.vue +0 -1
  34. package/src/components/misc/player/elements/PlayerTitle.vue +3 -3
  35. package/src/components/misc/player/radio/RadioHistory.vue +3 -2
  36. package/src/components/misc/player/video/PlayerVideo.vue +2 -2
  37. package/src/components/pages/EmissionPage.vue +2 -2
  38. package/src/components/pages/PageLogout.vue +1 -6
  39. package/src/components/pages/ParticipantPage.vue +2 -2
  40. package/src/components/pages/PlaylistPage.vue +1 -1
  41. package/src/components/pages/PodcastPage.vue +0 -1
  42. package/src/components/pages/VideoPage.vue +5 -2
  43. package/src/locale/de.ts +3 -3
  44. package/src/locale/en.ts +3 -3
  45. package/src/locale/es.ts +3 -3
  46. package/src/locale/fr.ts +3 -3
  47. package/src/locale/it.ts +3 -3
  48. package/src/locale/sl.ts +3 -3
  49. package/src/stores/FilterStore.ts +1 -1
  50. package/src/stores/PlayerStore.ts +6 -1
  51. package/src/stores/class/conference/conference.ts +2 -0
  52. package/src/stores/class/general/player.ts +2 -2
  53. package/src/style/_variables.scss +3 -0
  54. package/src/style/general.scss +12 -0
  55. package/src/helper/radio/radioHelper.ts +0 -15
@@ -89,7 +89,7 @@ onUnmounted(()=>{
89
89
  async function fetchCurrentlyPlaying(): Promise<void> {
90
90
  fetchRadioMetadata(
91
91
  playerStore.playerRadio?.canalId ?? 0,
92
- playerStore.playerRadio?.metadata.title ?? "",
92
+ playerStore.playerRadio?.metadata?.title ?? "",
93
93
  updateMetadata,
94
94
  updateAdvertising,
95
95
  );
@@ -98,11 +98,11 @@ function updateAdvertising(nextAdvertising: NextAdvertising): void {
98
98
  playerStore.playerRadioUpdateNextAdvertising(nextAdvertising);
99
99
  }
100
100
  function updateMetadata(
101
- metadata: MediaRadio,
101
+ metadata: MediaRadio|undefined,
102
102
  podcast: Podcast | undefined,
103
103
  history: Array<MediaRadio>,
104
104
  ): void {
105
- playerStore.playerMetadata(metadata, history);
105
+ playerStore.playerMetadata(metadata, history); //TODO
106
106
  playerStore.playerRadioPodcast(podcast);
107
107
  }
108
108
  </script>
@@ -40,10 +40,10 @@ import ChevronLeftIcon from "vue-material-design-icons/ChevronLeft.vue";
40
40
  import ChevronRightIcon from "vue-material-design-icons/ChevronRight.vue";
41
41
  import { usePlayerStore } from "../../../../stores/PlayerStore";
42
42
  import dayjs from "dayjs";
43
- import radioHelper from "../../../../helper/radio/radioHelper";
44
43
  import { computed, nextTick, onMounted, onUnmounted, ref, useTemplateRef, watch } from "vue";
45
44
  import { MediaRadio } from "@/stores/class/general/player";
46
45
  import { useI18n } from "vue-i18n";
46
+ import { useFetchRadio } from "../../../composable/radio/usefetchRadioData";
47
47
 
48
48
 
49
49
  //Data
@@ -54,6 +54,7 @@ const historyListContainerRef = useTemplateRef('historyListContainer');
54
54
  //Composables
55
55
  const { t } = useI18n();
56
56
  const playerStore = usePlayerStore();
57
+ const {displayTitle} = useFetchRadio();
57
58
 
58
59
 
59
60
  //Computed
@@ -119,7 +120,7 @@ function displayPreviousItem(item: MediaRadio): string {
119
120
  if (item.podcastId) {
120
121
  return item.title;
121
122
  }
122
- return radioHelper.displayTitle(item);
123
+ return displayTitle(item);
123
124
  }
124
125
  </script>
125
126
  <style lang="scss">
@@ -39,10 +39,10 @@ const playerStore = usePlayerStore();
39
39
  //Computed
40
40
  const isSecured = computed(() => "SECURED" === playerStore.playerLive?.organisation?.privacy);
41
41
  const hlsVideoUrl = computed(() => {
42
- if (!playerStore.playerLive) {
42
+ if (!playerStore.playerHlsIdentifier) {
43
43
  return "";
44
44
  }
45
- return `${apiStore.hlsUrl}live/video_dev.${playerStore.playerLive.conferenceId}/index.m3u8`;
45
+ return `${apiStore.hlsUrl}live/video_${playerStore.playerHlsIdentifier}/index.m3u8`;
46
46
  });
47
47
 
48
48
  onMounted(()=>{
@@ -71,16 +71,16 @@
71
71
  />
72
72
  <PodcastFilterList
73
73
  v-if="isInit"
74
+ v-model:query="searchPattern"
74
75
  class="mx-2"
75
76
  :first="paginateFirst"
76
77
  :size="ps"
77
- v-model:query="searchPattern"
78
78
  :show-count="true"
79
79
  :emission-id="emissionId"
80
80
  :category-filter="false"
81
81
  :edit-right="editRight"
82
82
  :productor-id="[emission.orga.id]"
83
- :forceUpdateParameters="true"
83
+ :force-update-parameters="true"
84
84
  @fetch="podcastsFetched"
85
85
  />
86
86
  </section>
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <section
3
- class="page-box page-box-absolute page-logout"
3
+ class="page-box page-box-absolute page-logout bg-gradient"
4
4
  >
5
5
  <div class="logout-section">
6
6
  <h1 class="mb-3">{{ t("Logout") }}</h1>
@@ -19,11 +19,6 @@ const { t } = useI18n();
19
19
  </script>
20
20
  <style lang="scss">
21
21
  .octopus-app .page-logout {
22
- background: linear-gradient(
23
- 90deg,
24
- var(--octopus-primary) 0%,
25
- var(--octopus-tertiary) 100%
26
- );
27
22
  display: flex;
28
23
  align-items: center;
29
24
  justify-content: center;
@@ -48,16 +48,16 @@
48
48
  <!-- productorId define to avoid overwrite #12817 -->
49
49
  <PodcastFilterList
50
50
  v-if="isInit"
51
+ v-model:query="searchPattern"
51
52
  :first="paginateFirst"
52
53
  :size="ps"
53
- v-model:query="searchPattern"
54
54
  :participant-id="participantId"
55
55
  :name="name"
56
56
  :category-filter="true"
57
57
  :productor-id="['']"
58
58
  :reload="reload"
59
59
  :show-count="true"
60
- :forceUpdateParameters="true"
60
+ :force-update-parameters="true"
61
61
  />
62
62
  </template>
63
63
  <ClassicLoading
@@ -43,9 +43,9 @@
43
43
  <section class="module-box">
44
44
  <PodcastList
45
45
  v-if="isInit"
46
+ v-model:query="searchPattern"
46
47
  :first="paginateFirst"
47
48
  :size="ps"
48
- v-model:query="searchPattern"
49
49
  :playlist="playlist"
50
50
  />
51
51
  </section>
@@ -255,7 +255,6 @@ async function fetchConferenceStatus() {
255
255
  api: 9,
256
256
  path: "conference/info/" + podcast.value?.conferenceId,
257
257
  });
258
-
259
258
  fetchConference.value = {...fetchConference.value, ...data};
260
259
  } catch {
261
260
  //Do nothing
@@ -193,7 +193,7 @@ const hlsVideoUrl = computed(() => {
193
193
  if (!recordingLive.value || !podcastConference.value) {
194
194
  return "";
195
195
  }
196
- return `${apiStore.hlsUrl}live/video_dev.${podcastConference.value.conferenceId}/index.m3u8`;
196
+ return `${apiStore.hlsUrl}live/video_${podcastConference.value.hlsIdentifier}/index.m3u8`;
197
197
  });
198
198
  const isSecured = computed(() => {
199
199
  return "SECURED" === podcast.value?.organisation?.privacy;
@@ -255,7 +255,10 @@ async function getPodcastDetails(): Promise<void> {
255
255
  playerStore.playerPlay(
256
256
  {
257
257
  ...podcast.value,
258
- ...{ conferenceId: podcast.value.conferenceId },
258
+ ...{
259
+ conferenceId: podcast.value.conferenceId,
260
+ hlsIdentifier: podcastConference.value?.hlsIdentifier,
261
+ },
259
262
  },
260
263
  true,
261
264
  );
package/src/locale/de.ts CHANGED
@@ -146,8 +146,8 @@ export default {
146
146
  "Sort score": "Nach Relevanz",
147
147
  "Sort name": "Nach Titel",
148
148
  "Sort last": "Nach Datum",
149
- "Choose color": "Farbe wählen",
150
- "Choose theme": "Design wählen",
149
+ "Choose color": "Akzentfarbe",
150
+ "Choose theme": "Thema (Spielerhintergrund)",
151
151
  "Podcast no visible": "Podcast nicht sichtbar",
152
152
  "Display episodes": "Folgen anzeigen",
153
153
  "Podcast published in future": "Podcast geplant",
@@ -167,7 +167,6 @@ export default {
167
167
  "open left Menu": "Menü öffnen/schließen",
168
168
  Participant: "Sprecher",
169
169
  "Number of player podcasts": "Anzahl der Podcasts im Player",
170
- "Proceed reading": "Weiterhören",
171
170
  "Without topic": "Ohne Thema",
172
171
  "Without rubric": "Ohne Rubrik",
173
172
  "Consider podcasts no visible":
@@ -414,4 +413,5 @@ export default {
414
413
  "Code copied!":"Code kopiert!",
415
414
  "Copied!":"Kopiert!",
416
415
  "Color of the QR Code": "Farbe des QR-Codes",
416
+ "Silent stream":"Stiller Fluss",
417
417
  }
package/src/locale/en.ts CHANGED
@@ -145,8 +145,8 @@ export default {
145
145
  "Sort score": "Sorted by relevancy score",
146
146
  "Sort name": "Sorted title",
147
147
  "Sort last": "Sorted last",
148
- "Choose color": "Choose color",
149
- "Choose theme": "Choose theme",
148
+ "Choose color": "Accent color",
149
+ "Choose theme": "Theme (player background)",
150
150
  "Podcast no visible": "Podcast not visible",
151
151
  "Display episodes": "Display episodes",
152
152
  "Podcast published in future": "Podcast published in the future",
@@ -166,7 +166,6 @@ export default {
166
166
  "open left Menu": "Open/Close Menu",
167
167
  Participant: "Speaker",
168
168
  "Number of player podcasts": "Number of podcasts in the player ",
169
- "Proceed reading": "Continue Listening",
170
169
  "Without topic": "Without a topic",
171
170
  "Without rubric": "Without a rubric",
172
171
  "Consider podcasts no visible":
@@ -417,4 +416,5 @@ export default {
417
416
  "Code copied!":"Code copied!",
418
417
  "Copied!":"Copied!",
419
418
  "Color of the QR Code": "Color of the QR Code",
419
+ "Silent stream":"Silent stream",
420
420
  };
package/src/locale/es.ts CHANGED
@@ -145,8 +145,8 @@ export default {
145
145
  "Sort score": "Clasificación por pertinencia",
146
146
  "Sort name": "Clasificación por título",
147
147
  "Sort last": "Clasificación por fecha más reciente",
148
- "Choose color": "Elegir color",
149
- "Choose theme": "Elegir tema",
148
+ "Choose color": "Color de acento",
149
+ "Choose theme": "Tema (fondo del jugador)",
150
150
  "Podcast no visible": "Este pódcast no puede visualizarse",
151
151
  "Display episodes": "Mostrar episodios",
152
152
  "Podcast published in future": "Pódcast pendiente de publicación",
@@ -167,7 +167,6 @@ export default {
167
167
  "open left Menu": "Abrir/Cerrar menú",
168
168
  Participant: "Participante",
169
169
  "Number of player podcasts": "Número de pódcast en el reproductor",
170
- "Proceed reading": "Seguir escuchando",
171
170
  "Without topic": "Sin tema",
172
171
  "Without rubric": "Sin sección",
173
172
  "Consider podcasts no visible":
@@ -415,4 +414,5 @@ export default {
415
414
  "Code copied!":"¡Código copiado!",
416
415
  "Copied!":"¡Copiado!",
417
416
  "Color of the QR Code": "Color del código QR",
417
+ "Silent stream":"Flujo silencioso",
418
418
  }
package/src/locale/fr.ts CHANGED
@@ -146,8 +146,8 @@ export default {
146
146
  "Sort score": "Pertinence",
147
147
  "Sort name": "Alphabétique",
148
148
  "Sort last": "Antéchronologique",
149
- "Choose color": "Couleur",
150
- "Choose theme": "Thème",
149
+ "Choose color": "Couleur d'accent",
150
+ "Choose theme": "Thème (fond du player)",
151
151
  "Podcast no visible": "Épisode non visible actuellement",
152
152
  "Display episodes": "Affichage des épisodes",
153
153
  "Podcast publish in future": "Épisode publié dans le futur",
@@ -168,7 +168,6 @@ export default {
168
168
  "open left Menu": "Ouvrir/Fermer le menu",
169
169
  Participant: "Intervenant",
170
170
  "Number of player podcasts": "Nombre d'épisodes dans le miniplayer",
171
- "Proceed reading": "Poursuivre la lecture",
172
171
  "Without topic": "Sans rubriquage",
173
172
  "Without rubric": "Non rubriqué",
174
173
  "Consider podcasts no visible":
@@ -424,4 +423,5 @@ export default {
424
423
  "Code copied!":"Code copié !",
425
424
  "Copied!":"Copié !",
426
425
  "Color of the QR Code": "Couleur du Qr Code",
426
+ "Silent stream":"Flux silencieux",
427
427
  };
package/src/locale/it.ts CHANGED
@@ -141,8 +141,8 @@ export default{
141
141
  'Sort score': 'Suddiviso per grado di rilevanza',
142
142
  'Sort name': 'Suddividi titolo',
143
143
  'Sort last': 'Suddividi ultimo',
144
- 'Choose color': 'Seleziona colore',
145
- 'Choose theme': 'Seleziona tema',
144
+ 'Choose color': 'Colore accento',
145
+ 'Choose theme': 'Tema (sfondo del giocatore)',
146
146
  'Podcast no visible': 'Podcast non visibile',
147
147
  'Display episodes': 'Mostra episodi',
148
148
  'Podcast published in future': 'Podcast pubblicato in futuro',
@@ -163,7 +163,6 @@ export default{
163
163
  'open left Menu': 'Apri/Chiudi Menu',
164
164
  Participant: 'Speaker',
165
165
  'Number of player podcasts': "Numero di podcast nel lettore",
166
- 'Proceed reading': 'Continua ad ascoltare',
167
166
  'Without topic': 'Senza un tema',
168
167
  'Without rubric': 'Senza una rubrica',
169
168
  'Consider podcasts no visible':
@@ -411,4 +410,5 @@ export default{
411
410
  "Code copied!":"Codice copiato!",
412
411
  "Copied!":"Copiato!",
413
412
  "Color of the QR Code": "Colore del codice QR",
413
+ "Silent stream":"Flusso silenzioso",
414
414
  };
package/src/locale/sl.ts CHANGED
@@ -142,8 +142,8 @@ export default {
142
142
  "Sort score": "Razvrščeno po relevantnosti",
143
143
  "Sort name": "Naslov",
144
144
  "Sort last": "Zadnje",
145
- "Choose color": "Izberi barvo",
146
- "Choose theme": "Izberi temo",
145
+ "Choose color": "Poudarjena barva",
146
+ "Choose theme": "Tema (ozadje igralca)",
147
147
  "Podcast no visible": "Podkast je skrit",
148
148
  "Display episodes": "Prikaži epizode",
149
149
  "Podcast published in future": "Podkast bo objavljen v prihodnje",
@@ -163,7 +163,6 @@ export default {
163
163
  "open left Menu": "Meni odpri/zapri",
164
164
  Participant: "Sodelujoči",
165
165
  "Number of player podcasts": "Število podkastov v predvajalniku",
166
- "Proceed reading": "Nadaljuj s poslušanjem",
167
166
  "Without topic": "Brez teme",
168
167
  "Without rubric": "Brez rubrike",
169
168
  "Consider podcasts no visible": "Občinstvu skriti podkasti",
@@ -406,4 +405,5 @@ export default {
406
405
  "Code copied!":"Koda kopirana!",
407
406
  "Copied!":"Kopirano!",
408
407
  "Color of the QR Code": "Barva kode QR",
408
+ "Silent stream":"Tihi tok",
409
409
  }
@@ -52,7 +52,7 @@ export const useFilterStore = defineStore("FilterStore", {
52
52
  this.filterRubrique = rubriqueFilter;
53
53
  },
54
54
  filterUpdateRubriqueDisplay(rubriques: Array<Rubrique>) {
55
- this.filterRubriqueDisplay = rubriques;
55
+ this.filterRubriqueDisplay = rubriques.filter(rubrique=> rubrique);
56
56
  },
57
57
  filterUpdateMedia(filter: {
58
58
  type?: string;
@@ -32,6 +32,7 @@ interface PlayerState {
32
32
  playerChaptering?: Chaptering;
33
33
  playerDelayStitching: number;
34
34
  playerHlsUrl?: string;
35
+ playerHlsIdentifier?:string;
35
36
  }
36
37
  export const usePlayerStore = defineStore("PlayerStore", {
37
38
  state: (): PlayerState => ({
@@ -49,6 +50,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
49
50
  playerVideo: false,
50
51
  playerChaptering: undefined,
51
52
  playerDelayStitching: 0,
53
+ playerHlsIdentifier: undefined,
52
54
  }),
53
55
  getters: {
54
56
  playerChapteringPercent(): ChapteringPercent | undefined {
@@ -146,6 +148,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
146
148
  this.playerPodcast = undefined;
147
149
  this.playerMedia = undefined;
148
150
  this.playerLive = undefined;
151
+ this.playerHlsIdentifier = undefined;
149
152
  this.playerRadio = undefined;
150
153
  this.playerElapsed = 0;
151
154
  this.playerVideo = false;
@@ -168,6 +171,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
168
171
  this.playerPodcast = undefined;
169
172
  this.playerMedia = undefined;
170
173
  this.playerLive = undefined;
174
+ this.playerHlsIdentifier = undefined;
171
175
  this.playerRadio = undefined;
172
176
  this.playerVideo = isVideo;
173
177
  this.playerElapsed = 0;
@@ -177,6 +181,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
177
181
  (!param.podcastId || param.processingStatus !== "READY")
178
182
  ) {
179
183
  this.playerLive = param;
184
+ this.playerHlsIdentifier = param.hlsIdentifier;
180
185
  this.playerCurrentChange = null;
181
186
  return;
182
187
  }
@@ -210,7 +215,7 @@ export const usePlayerStore = defineStore("PlayerStore", {
210
215
  playerUpdateSeekTime(seekTime: number) {
211
216
  this.playerSeekTime = seekTime;
212
217
  },
213
- playerMetadata(metadata: MediaRadio, history: Array<MediaRadio>) {
218
+ playerMetadata(metadata: MediaRadio|undefined, history: Array<MediaRadio>) {
214
219
  if (!this.playerRadio) {
215
220
  return;
216
221
  }
@@ -8,6 +8,7 @@ export interface Conference {
8
8
  deletionAttempts?: number;
9
9
  directCode?: string;
10
10
  externalRtmpUrl?: ExternalRtmpUrl;
11
+ hlsIdentifier?: string;
11
12
  hostname?: string;
12
13
  jingleDuration?: number;
13
14
  jingleFilePath?: string;
@@ -57,6 +58,7 @@ export function getEmptyConference(): Conference {
57
58
  export interface ConferencePublicInfo {
58
59
  status: string;
59
60
  videoProfile: string;
61
+ hlsIdentifier: string;
60
62
  }
61
63
 
62
64
  export interface ExternalRtmpUrl {
@@ -4,7 +4,7 @@ import { Podcast } from "./podcast";
4
4
  export interface Radio {
5
5
  canalId: number;
6
6
  url: string;
7
- metadata: MediaRadio;
7
+ metadata?: MediaRadio;
8
8
  history: Array<MediaRadio>;
9
9
  nextAdvertising: NextAdvertising;
10
10
  isInit: boolean;
@@ -30,7 +30,7 @@ export interface NextAdvertising {
30
30
 
31
31
  export interface MetadataRadio {
32
32
  channelId: number;
33
- currently: MediaRadio;
33
+ currently: MediaRadio|null;
34
34
  previously: Array<MediaRadio>;
35
35
  nextAdvertising: NextAdvertising;
36
36
  }
@@ -27,6 +27,9 @@
27
27
  --octopus-background-transparent: oklch(from var(--octopus-background) l c h / 40%);
28
28
  --octopus-tertiary-really-transparent: oklch(from var(--octopus-tertiary) l c h / 30%);
29
29
 
30
+ //Gradient
31
+ --octopus-gradient : linear-gradient(90deg,var(--octopus-primary) 0%, var(--octopus-tertiary) 100%);
32
+
30
33
  // Size
31
34
  --octopus-image-size: 12.5rem;
32
35
  --octopus-podcast-size: 13.5rem;
@@ -114,6 +114,11 @@ main, #app{
114
114
  background: var(--octopus-complementary-color) !important;
115
115
  }
116
116
 
117
+ .bg-gradient{
118
+ background: var(--octopus-primary);
119
+ background:var(--octopus-gradient);
120
+ }
121
+
117
122
  .text-blue-octopus{
118
123
  color: var(--octopus-tertiary) !important
119
124
  }
@@ -170,6 +175,13 @@ main, #app{
170
175
  }
171
176
  }
172
177
 
178
+ .show-small-screen{
179
+ display: none !important;
180
+ @media (width <= 500px) {
181
+ display: flex !important;
182
+ }
183
+ }
184
+
173
185
  .show-phone{
174
186
  display: none;
175
187
 
@@ -1,15 +0,0 @@
1
- import { MediaRadio } from "@/stores/class/general/player";
2
-
3
- export default {
4
- displayTitle(metadata: MediaRadio): string {
5
- let title = "";
6
- if (metadata.title) {
7
- title += metadata.title;
8
- }
9
- if (metadata.artist) {
10
- title += " - " + metadata.artist;
11
- }
12
- return title;
13
- }
14
- };
15
-