@saooti/octopus-sdk 41.6.1 → 41.7.0

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.
@@ -120,3 +120,7 @@ symbol_info_budget:
120
120
  # Note: the backend is fixed at startup. If a project with a different backend
121
121
  # is activated post-init, an error will be returned.
122
122
  language_backend:
123
+
124
+ # list of regex patterns which, when matched, mark a memory entry as read‑only.
125
+ # Extends the list from the global configuration, merging the two lists.
126
+ read_only_memory_patterns: []
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 41.7.0 (En cours)
4
+
5
+ **Features**
6
+
7
+ - **14298** - Les épisodes à valider sont visibles par défaut quand
8
+ l'utilisateur a les droits nécessaires
9
+ - **14299** - Ajout de la plateforme 'Radio France'
10
+ - **14301** - Ajout option `smartLink.showOnlyFirstParagraphInDescription` pour
11
+ tronquer la description à un paragraphe dans le SmartLink
12
+
13
+ **Fix**
14
+
15
+ - **14235** - Correction affichage images avec caractères spéciaux dans leur nom
16
+ - Correctifs visuels smartlink :
17
+ - Force le style du titre pour éviter overrides involontaires
18
+ - Amélioration de l'affichage si le contenu est long
19
+ - Ajout du paramètre de recherche `validity`/`vl` dans les props de route
20
+
3
21
  ## 41.6.1 (04/03/2026)
4
22
 
5
23
  **Fix**
package/index.ts CHANGED
@@ -183,6 +183,7 @@ export const getPodcastAddictIcon = () => import("./src/components/icons/Podcast
183
183
  export const getRadiolineIcon = () => import("./src/components/icons/RadiolineIcon.vue");
184
184
  export const getTuninIcon = () => import("./src/components/icons/TuninIcon.vue");
185
185
  export const getXIcon = () => import("./src/components/icons/XIcon.vue");
186
+ export const getRadioFranceIcon = () => import("./src/components/icons/RadioFranceIcon.vue");
186
187
 
187
188
  // Podcastmaker
188
189
  export const PodcastmakerHeader = defineAsyncComponent(() => import("./src/components/display/podcastmaker/PodcastmakerHeader.vue"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saooti/octopus-sdk",
3
- "version": "41.6.1",
3
+ "version": "41.7.0",
4
4
  "private": false,
5
5
  "description": "Javascript SDK for using octopus",
6
6
  "author": "Saooti",
@@ -10,6 +10,7 @@ import ApplePodcastIcon from "../../icons/ApplePodcastIcon.vue";
10
10
  import CastboxIcon from "../../icons/CastboxIcon.vue";
11
11
  import PodcastRepublicIcon from "../../icons/PodcastRepublicIcon.vue";
12
12
  import PodbeanIcon from "../../icons/PodbeanIcon.vue";
13
+ import RadioFranceIcon from "../../icons/RadioFranceIcon.vue";
13
14
  import YoutubeIcon from "vue-material-design-icons/Youtube.vue";
14
15
  import SpotifyIcon from "vue-material-design-icons/Spotify.vue";
15
16
  import { Annotations } from "@/stores/class/general";
@@ -29,7 +30,8 @@ export enum SharePlatformName {
29
30
  YOUTUBE = "youtube",
30
31
  CASTBOX = "castbox",
31
32
  PODBEAN = "podbean",
32
- PODCAST_REPUBLIC = "podcastrepublic"
33
+ PODCAST_REPUBLIC = "podcastrepublic",
34
+ RADIO_FRANCE = "radiofrance"
33
35
  }
34
36
 
35
37
  export interface SharePlatform {
@@ -121,6 +123,11 @@ export const useSharePlatforms = () => {
121
123
  icon: PodcastRepublicIcon,
122
124
  title: "Podcast Republic",
123
125
  color: "#5c85dd",
126
+ }, {
127
+ name: SharePlatformName.RADIO_FRANCE,
128
+ icon: RadioFranceIcon,
129
+ title: "Radio France",
130
+ color: "#a90041",
124
131
  }];
125
132
  });
126
133
 
@@ -139,7 +146,7 @@ export const useSharePlatforms = () => {
139
146
  * @param annotations The annotations of the element for which to get the
140
147
  platforms links
141
148
  */
142
- function getPlatformsWithLinks(annotations:Annotations|undefined): Array<SharePlatformUrl> {
149
+ function getPlatformsWithLinks(annotations: Annotations|undefined): Array<SharePlatformUrl> {
143
150
  const ary: Array<SharePlatformUrl> = [];
144
151
  platforms.value.forEach(p => {
145
152
  const url = getUrl(p.name, annotations);
@@ -154,9 +161,7 @@ export const useSharePlatforms = () => {
154
161
  }
155
162
 
156
163
  function getUrl(sub: string, annotations: Annotations|undefined): string | undefined {
157
- return externaliseLinks(
158
- annotations?.[sub] as string | undefined,
159
- );
164
+ return externaliseLinks(annotations?.[sub] as string | undefined);
160
165
  }
161
166
 
162
167
  function externaliseLinks(link?: string): string | undefined {
@@ -7,6 +7,10 @@ export const useImageProxy = ()=>{
7
7
  if (!url) {
8
8
  return "";
9
9
  }
10
+
11
+ // Encode URL to prevent some display issues
12
+ url = encodeURI(url);
13
+
10
14
  if (apiStore.imageUrl && url.includes("http")) {
11
15
  const size = height ? "height=" + height : "width=" + width;
12
16
  const encode = btoa(url).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
@@ -185,7 +185,7 @@ const props = withDefaults(defineProps<{
185
185
  sort: "DATE",
186
186
  monetisable: "UNDEFINED",
187
187
  searchPattern: "",
188
- validity: "true"
188
+ validity: ""
189
189
  });
190
190
 
191
191
  //Emits
@@ -104,7 +104,7 @@ const props = withDefaults(defineProps<{
104
104
  includeHidden: false,
105
105
  showCount: false,
106
106
  displaySortText: true,
107
- validity: true,
107
+ validity: '',
108
108
  justSizeChosen: false,
109
109
  withVideo: undefined,
110
110
  forceUpdateParameters: false
@@ -183,7 +183,7 @@ const classicPodcastPlay = computed(() => {
183
183
  });
184
184
 
185
185
  const displayBanner = computed(() => {
186
- return !(
186
+ return props.justButtons !== true && !(
187
187
  isLiveValidAndVisible.value &&
188
188
  !isLiveToBeRecorded.value &&
189
189
  ProcessingStatus.Planned !== props.podcast.processingStatus
@@ -0,0 +1,162 @@
1
+ <template>
2
+ <span
3
+ :aria-hidden="!title"
4
+ class="material-design-icon"
5
+ :title="title"
6
+ >
7
+ <svg
8
+ :width="size"
9
+ :height="size"
10
+ viewBox="0 0 58 58"
11
+ fill="none"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ >
14
+ <path
15
+ fill-rule="evenodd"
16
+ clip-rule="evenodd"
17
+ d="M37.0892 33.8774C37.0892 35.7523 36.5961 37.5174 35.7265 39.0643H50.1862C50.5743 37.3938 50.7809 35.6586 50.7809 33.8774C50.7809 23.6473 44.0269 14.9123 34.5121 11.4499V0.596397H21.9553V23.3202C23.0498 22.9984 24.2131 22.8248 25.419 22.8248C31.8644 22.8248 37.0892 27.7733 37.0892 33.8774Z"
18
+ fill="url(#paint0_linear_75_103)"
19
+ />
20
+ <path
21
+ fill-rule="evenodd"
22
+ clip-rule="evenodd"
23
+ d="M29.5724 44.3362C28.2958 44.7861 26.9145 45.0321 25.4717 45.0321C18.9987 45.0321 13.7507 40.0835 13.7507 33.9785C13.7507 32.2762 14.1593 30.664 14.8881 29.2236H0.500687C0.173332 30.7608 0 32.3507 0 33.9785C0 47.2455 11.404 58 25.4717 58C26.8678 58 28.2374 57.8924 29.5724 57.6889V44.3362Z"
24
+ fill="url(#paint1_linear_75_103)"
25
+ />
26
+ <path
27
+ fill-rule="evenodd"
28
+ clip-rule="evenodd"
29
+ d="M37.1502 33.909C37.1502 35.7895 36.6555 37.5598 35.7831 39.1113H50.2891C50.6784 37.4358 50.8857 35.6954 50.8857 33.909C50.8857 23.6484 44.1101 14.8873 34.5649 11.4146V0.528656H21.9678V23.3202C23.0658 22.9975 24.2329 22.8234 25.4426 22.8234C31.9087 22.8234 37.1502 27.7867 37.1502 33.909Z"
30
+ fill="url(#paint2_linear_75_103)"
31
+ />
32
+ <path
33
+ fill-rule="evenodd"
34
+ clip-rule="evenodd"
35
+ d="M29.5386 44.2967C28.2634 44.7479 26.8837 44.9945 25.4426 44.9945C18.977 44.9945 13.735 40.0316 13.735 33.9089C13.735 32.2017 14.1431 30.5848 14.8711 29.1403H0.500114C0.173133 30.682 0 32.2764 0 33.9089C0 47.2143 11.3909 58 25.4426 58C26.8371 58 28.2051 57.8921 29.5386 57.688V44.2967Z"
36
+ fill="url(#paint3_linear_75_103)"
37
+ />
38
+ <path
39
+ fill-rule="evenodd"
40
+ clip-rule="evenodd"
41
+ d="M60.6053 19.1855C60.6053 16.4375 60.6053 14.0587 60.5519 11.7338H68.0196C68.1254 12.3676 68.2313 15.0632 68.2313 16.5431C69.4495 13.4249 72.3623 11.1523 77.0225 11.0995V18.3403C71.5145 18.1814 68.2313 19.6613 68.2313 27.1663V39.1113H60.6053V19.1855Z"
42
+ fill="url(#paint4_linear_75_103)"
43
+ />
44
+ <path
45
+ fill-rule="evenodd"
46
+ clip-rule="evenodd"
47
+ d="M115.556 33.6677C120.746 33.6677 121.381 29.3333 121.381 25.4223C121.381 20.7186 120.693 17.1774 115.714 17.1774C111.743 17.1774 109.73 20.2956 109.73 25.4751C109.73 30.8136 111.796 33.6677 115.556 33.6677ZM128.637 0.528656V31.6059C128.637 34.0902 128.637 36.627 128.69 39.1113H121.434C121.275 38.2657 121.116 36.8915 121.064 36.2572C119.739 38.4242 117.356 39.7456 113.278 39.7456C106.34 39.7456 101.945 34.1963 101.945 25.6341C101.945 17.2302 106.606 11.0995 114.39 11.0995C118.362 11.0995 120.481 12.5261 121.064 13.7418V0.528656H128.637Z"
48
+ fill="url(#paint5_linear_75_103)"
49
+ />
50
+ <path
51
+ fill-rule="evenodd"
52
+ clip-rule="evenodd"
53
+ d="M131.681 39.1113H139.308V11.7338H131.681V39.1113ZM131.681 7.2937H139.308V0.528656H131.681V7.2937Z"
54
+ fill="url(#paint6_linear_75_103)"
55
+ />
56
+ <path
57
+ fill-rule="evenodd"
58
+ clip-rule="evenodd"
59
+ d="M148.596 25.4223C148.596 30.7079 150.874 33.8257 154.528 33.8257C158.288 33.8257 160.353 30.7079 160.353 25.4751C160.353 19.7669 158.235 17.0718 154.422 17.0718C150.926 17.0718 148.596 19.6613 148.596 25.4223ZM168.032 25.3695C168.032 33.6677 163.054 39.7456 154.369 39.7456C145.895 39.7456 140.917 33.6677 140.917 25.528C140.917 17.0718 146.054 11.0995 154.739 11.0995C162.789 11.0995 168.032 16.8076 168.032 25.3695Z"
60
+ fill="url(#paint7_linear_75_103)"
61
+ />
62
+ <path
63
+ fill-rule="evenodd"
64
+ clip-rule="evenodd"
65
+ d="M170.69 39.1113V17.4415H168.46V11.7338H170.69V9.35504C170.69 3.70012 173.497 0 179.429 0C180.647 0 182.235 0.105641 182.924 0.31737V6.28966C182.5 6.23684 181.917 6.18358 181.335 6.18358C179.111 6.18358 178.263 6.97678 178.263 9.93651V11.7338H182.133V17.4415H178.263V39.1113H170.69Z"
66
+ fill="url(#paint8_linear_75_103)"
67
+ />
68
+ <path
69
+ fill-rule="evenodd"
70
+ clip-rule="evenodd"
71
+ d="M183.316 19.1855C183.316 16.4375 183.316 14.0587 183.263 11.7338H190.73C190.836 12.3676 190.942 15.0632 190.942 16.5431C192.16 13.4249 195.073 11.1523 199.733 11.0995V18.3403C194.226 18.1814 190.942 19.6613 190.942 27.1663V39.1113H183.316V19.1855Z"
72
+ fill="url(#paint9_linear_75_103)"
73
+ />
74
+ <path
75
+ fill-rule="evenodd"
76
+ clip-rule="evenodd"
77
+ d="M226.106 11.7338H233.468C233.627 12.4732 233.732 14.3761 233.785 15.2217C234.686 13.5305 236.91 11.0995 241.729 11.0995C247.237 11.0995 250.785 14.8519 250.785 21.7226V39.1113H243.213V22.5682C243.213 19.45 242.207 17.2302 238.817 17.2302C235.586 17.2302 233.785 19.0274 233.785 23.8896V39.1113H226.159V18.6573C226.159 16.3314 226.159 13.7946 226.106 11.7338Z"
78
+ fill="url(#paint10_linear_75_103)"
79
+ />
80
+ <path
81
+ fill-rule="evenodd"
82
+ clip-rule="evenodd"
83
+ d="M277.529 30.2849C276.63 34.8306 273.398 39.7456 265.243 39.7456C256.717 39.7456 252.321 33.879 252.321 25.634C252.321 17.5471 257.246 11.0995 265.614 11.0995C274.829 11.0995 277.424 17.7589 277.529 20.8242H270.168C269.692 18.6044 268.421 17.0718 265.455 17.0718C261.96 17.0718 260 20.0843 260 25.3695C260 31.2361 262.118 33.879 265.402 33.879C268.05 33.879 269.427 32.3463 270.115 30.2849H277.529Z"
84
+ fill="url(#paint11_linear_75_103)"
85
+ />
86
+ <path d="M296.374 22.4102C296.321 19.2387 295.05 16.5431 291.342 16.5431C287.742 16.5431 286.258 19.0275 285.941 22.4102H296.374ZM285.782 27.0606C285.782 30.4962 287.529 33.8257 291.29 33.8257C294.467 33.8257 295.368 32.5576 296.109 30.9192H303.682C302.729 34.2492 299.711 39.7456 291.131 39.7456C282.075 39.7456 278.156 33.0334 278.156 25.8453C278.156 17.2302 282.552 11.0995 291.396 11.0995C300.77 11.0995 304 17.9173 304 24.7356C304 25.6869 304 26.2683 303.894 27.0606H285.782Z" fill="url(#paint12_linear_75_103)" />
87
+ <path
88
+ fill-rule="evenodd"
89
+ clip-rule="evenodd"
90
+ d="M92.9792 27.378C92.9792 30.9716 92.397 34.3543 87.5775 34.3543C84.8235 34.3543 83.6053 32.6632 83.6053 30.7079C83.6053 28.0651 85.3003 26.6381 89.9076 26.6381H92.9792V27.378ZM100.393 32.0294V20.5601C100.393 14.0064 96.3687 11.1523 89.0603 11.0995C81.5344 11.0995 78.3368 14.2638 77.4998 18.4379L84.5059 19.873C84.8235 17.8645 85.5649 16.5431 88.7428 16.5431C92.2907 16.5431 92.9792 18.446 92.9792 20.4012V22.0396H89.0603C81.0105 22.0396 76.0322 24.9469 76.0322 31.1833C76.0322 35.4116 78.7862 39.7456 85.4061 39.7456C90.2781 39.7456 92.1319 37.9484 93.1379 36.4161C93.1379 37.1032 93.2967 38.5827 93.5089 39.1113H100.764C100.606 38.477 100.393 34.6717 100.393 32.0294Z"
91
+ fill="url(#paint13_linear_75_103)"
92
+ />
93
+ <path
94
+ fill-rule="evenodd"
95
+ clip-rule="evenodd"
96
+ d="M215.69 27.378C215.69 30.9716 215.108 34.3543 210.288 34.3543C207.534 34.3543 206.316 32.6632 206.316 30.7079C206.316 28.0651 208.01 26.6381 212.618 26.6381H215.69V27.378ZM223.104 32.0294V20.5601C223.104 14.0064 219.079 11.1523 211.771 11.0995C204.245 11.0995 201.047 14.2638 200.21 18.4379L207.217 19.873C207.534 17.8645 208.275 16.5431 211.453 16.5431C215.001 16.5431 215.69 18.446 215.69 20.4012V22.0396H211.771C203.721 22.0396 198.743 24.9469 198.743 31.1833C198.743 35.4116 201.497 39.7456 208.117 39.7456C212.989 39.7456 214.842 37.9484 215.849 36.4161C215.849 37.1032 216.007 38.5827 216.219 39.1113H223.475C223.316 38.477 223.104 34.6717 223.104 32.0294Z"
97
+ fill="url(#paint14_linear_75_103)"
98
+ />
99
+ <defs>
100
+ <linearGradient
101
+ id="paint0_linear_75_103"
102
+ x1="37.483"
103
+ y1="3.20798"
104
+ x2="21.3118"
105
+ y2="32.4338"
106
+ gradientUnits="userSpaceOnUse"
107
+ >
108
+ <stop stop-color="#8D044F" />
109
+ <stop offset="0.278736" stop-color="#AC47B6" />
110
+ <stop offset="0.419307" stop-color="#986BAA" />
111
+ <stop offset="0.677775" stop-color="#FF6C5B" />
112
+ <stop offset="1" stop-color="#FD0323" />
113
+ </linearGradient>
114
+ <linearGradient
115
+ id="paint1_linear_75_103"
116
+ x1="8.26123"
117
+ y1="34.1806"
118
+ x2="25.2003"
119
+ y2="57.7245"
120
+ gradientUnits="userSpaceOnUse"
121
+ >
122
+ <stop stop-color="#B800C4" />
123
+ <stop offset="0.427705" stop-color="#E0008C" />
124
+ <stop offset="1" stop-color="#FF0101" />
125
+ </linearGradient>
126
+ <linearGradient
127
+ id="paint2_linear_75_103"
128
+ x1="37.5457"
129
+ y1="3.14803"
130
+ x2="21.3224"
131
+ y2="32.4618"
132
+ gradientUnits="userSpaceOnUse"
133
+ >
134
+ <stop stop-color="#8D044F" />
135
+ <stop offset="0.278736" stop-color="#AC47B6" />
136
+ <stop offset="0.419307" stop-color="#986BAA" />
137
+ <stop offset="0.677775" stop-color="#FF6C5B" />
138
+ <stop offset="1" stop-color="#FD0323" />
139
+ </linearGradient>
140
+ <linearGradient
141
+ id="paint3_linear_75_103"
142
+ x1="8.25178"
143
+ y1="34.035"
144
+ x2="25.2587"
145
+ y2="57.7687"
146
+ gradientUnits="userSpaceOnUse"
147
+ >
148
+ <stop stop-color="#B800C4" />
149
+ <stop offset="0.427705" stop-color="#E0008C" />
150
+ <stop offset="1" stop-color="#FF0101" />
151
+ </linearGradient>
152
+ </defs>
153
+ </svg>
154
+ </span>
155
+ </template>
156
+
157
+ <script setup lang="ts">
158
+ defineProps({
159
+ size: { default: 50, type: Number },
160
+ title: { default: undefined, type: String },
161
+ })
162
+ </script>
@@ -23,7 +23,14 @@
23
23
  alt=""
24
24
  >
25
25
  <span>{{ title }}</span>
26
- <slot name="afterTitle"/>
26
+ <slot name="afterTitle" />
27
+
28
+ <span
29
+ v-if="subtitle && !isOpen"
30
+ class="subtitle"
31
+ >
32
+ &nbsp;-&nbsp;{{ subtitle }}
33
+ </span>
27
34
  <ChevronDownIcon class="ms-auto" :class="{ 'arrow-transform': isOpen }" />
28
35
  </button>
29
36
  <div v-show="isOpen" class="body p-2">
@@ -44,6 +51,8 @@ const AlertIcon = defineAsyncComponent(
44
51
  //Props
45
52
  const props = defineProps({
46
53
  title: { default: "", type: String },
54
+ /** Message displayed next to the title when closed */
55
+ subtitle: { default: undefined, type: String },
47
56
  idComposer: { default: "", type: String },
48
57
  isWarning: { default: false, type: Boolean },
49
58
  imageUrl: { default: undefined, type: String },
@@ -65,9 +74,8 @@ onMounted(()=>{
65
74
  })
66
75
 
67
76
  </script>
68
- <style lang="scss">
69
-
70
77
 
78
+ <style scoped lang="scss">
71
79
  .octopus-accordion {
72
80
  > button {
73
81
  min-height: 50px;
@@ -110,5 +118,12 @@ onMounted(()=>{
110
118
  justify-content: center;
111
119
  align-items: center;
112
120
  }
121
+
122
+ .subtitle {
123
+ color: var(--octopus-gray);
124
+ font-weight: 600;
125
+ font-style: italic;
126
+ font-size: 0.75rem;
127
+ }
113
128
  }
114
129
  </style>
@@ -104,14 +104,19 @@ watch(()=>generalStore.contentToDisplay, async () => {
104
104
  return;
105
105
  }
106
106
  const widthAsked = window.innerWidth > 960 ? "1600":"1000";
107
- const proxyUrl = useProxyImageUrl(generalStore.contentToDisplay.imageUrl,widthAsked, undefined, true);
107
+ const proxyUrl = useProxyImageUrl(generalStore.contentToDisplay.imageUrl, widthAsked, undefined, true);
108
108
  try {
109
109
  const result = await axios.get(proxyUrl);
110
110
  headerBackgroundImage.value = `background-image: url('${result.data}');`;
111
111
  needToBlur.value = result.data === generalStore.contentToDisplay.imageUrl;
112
112
  } catch {
113
- headerBackgroundImage.value = generalStore.contentToDisplay.imageUrl ? `background-image: url('${generalStore.contentToDisplay.imageUrl}');` : "";
114
- needToBlur.value = true;
113
+ if (generalStore.contentToDisplay.imageUrl) {
114
+ const url = encodeURI(generalStore.contentToDisplay.imageUrl);
115
+ headerBackgroundImage.value = `background-image: url('${url}');`;
116
+ needToBlur.value = true;
117
+ } else {
118
+ headerBackgroundImage.value = '';
119
+ }
115
120
  }
116
121
  }, {deep: true, immediate: true});
117
122
 
@@ -25,7 +25,7 @@
25
25
  </button>
26
26
  </div>
27
27
  <h1>{{ title }}</h1>
28
- <div v-html="displayHelper.urlify(element.description)" />
28
+ <div v-html="description" />
29
29
 
30
30
  <!-- Play button when viewing with phone -->
31
31
  <button
@@ -104,6 +104,7 @@ import { usePlayerStore } from '../../stores/PlayerStore';
104
104
  import { podcastApi, PodcastSort } from '../../api/podcastApi';
105
105
  import { useSharePath } from '../composable/share/useSharePath';
106
106
  import displayHelper from '../../helper/displayHelper';
107
+ import { state } from '../../stores/ParamSdkStore';
107
108
 
108
109
  const { updatePathParams } = useSeoTitleUrl();
109
110
  const { useProxyImageUrl } = useImageProxy();
@@ -158,6 +159,21 @@ const title = computed((): string => {
158
159
  return '';
159
160
  });
160
161
 
162
+ /** Description of the element displayed */
163
+ const description = computed((): string => {
164
+ let description = element.value.description;
165
+ if (state.smartLink.showOnlyFirstParagraphInDescription === true) {
166
+ // Find everything up to the end of the first paragraph, including newlines
167
+ const pattern = /^(.+?(?:\n+.*?)*<\/p>)/;
168
+ const matches = description.match(pattern);
169
+ if (matches && matches.length >= 2) {
170
+ description = matches[1];
171
+ }
172
+ }
173
+
174
+ return displayHelper.urlify(description);
175
+ });
176
+
161
177
  /** The organisation associated with the element */
162
178
  const organisation = computed((): Organisation|undefined => {
163
179
  if (!element.value) {
@@ -251,7 +267,7 @@ function playLatestPodcast(): void {
251
267
  height: 100%;
252
268
  overflow: hidden;
253
269
  // Do not take place in page
254
- position: absolute;
270
+ position: fixed;
255
271
  // Make rest of page appear in front of image
256
272
  z-index: -1;
257
273
 
@@ -276,7 +292,7 @@ article {
276
292
  --background: white;
277
293
  --border-radius: 20px;
278
294
 
279
- margin: 8rem auto 0;
295
+ margin: 8rem auto 2rem;
280
296
  padding: 20px;
281
297
  width: 900px;
282
298
  border-radius: var(--border-radius);
@@ -345,6 +361,8 @@ article {
345
361
 
346
362
  h1 {
347
363
  text-align: start !important;
364
+ font-size: var(--octopus-smartlink-title-fontsize);
365
+ color: var(--octopus-smartlink-title-color);
348
366
 
349
367
  @media (width <= 960px) {
350
368
  text-align: center !important;
@@ -416,5 +416,6 @@
416
416
  "Edit": "Bearbeiten",
417
417
  "Podcast": "Folge",
418
418
  "Player - Transcription - AI Warning": "Die Transkription basiert auf KI und kann Fehler enthalten, bitte teilen Sie uns dies mit.",
419
- "All organisations": "Alle Organisationen"
419
+ "All organisations": "Alle Organisationen",
420
+ "Emission subtitle": "Untertitel der Sendung"
420
421
  }
@@ -416,5 +416,6 @@
416
416
  "Edit": "Edit",
417
417
  "Podcast": "Episode",
418
418
  "Player - Transcription - AI Warning": "The transcription is based on AI and may contain errors, please let us know.",
419
- "All organisations": "All organizations"
419
+ "All organisations": "All organizations",
420
+ "Emission subtitle": "Subtitle of the show"
420
421
  }
@@ -416,5 +416,6 @@
416
416
  "Edit": "Editar",
417
417
  "Podcast": "Episodio",
418
418
  "Player - Transcription - AI Warning": "La transcripción se basa en IA y puede contener errores, háganoslo saber.",
419
- "All organisations": "Todas las organizaciones"
419
+ "All organisations": "Todas las organizaciones",
420
+ "Emission subtitle": "Subtítulo del programa"
420
421
  }
@@ -34,6 +34,7 @@
34
34
  "Emission description": "Description de l'émission",
35
35
  "Emission image": "Image de l'émission",
36
36
  "Emission name": "Titre de l'émission",
37
+ "Emission subtitle": "Sous-titre de l'émission",
37
38
  "No elements found. Consider changing the search query.":
38
39
  "Aucun élement ne correspond à votre recherche",
39
40
  "Podcast is not visible for listeners":
@@ -417,5 +417,6 @@
417
417
  "Edit": "Modificare",
418
418
  "Podcast": "Episodio",
419
419
  "Player - Transcription - AI Warning": "La trascrizione si basa sull'intelligenza artificiale e potrebbe contenere errori, faccelo sapere.",
420
- "All organisations": "Tutte le organizzazioni"
420
+ "All organisations": "Tutte le organizzazioni",
421
+ "Emission subtitle": "Sottotitolo dello spettacolo"
421
422
  }
@@ -415,5 +415,6 @@
415
415
  "Edit": "Uredi",
416
416
  "Podcast": "Epizoda",
417
417
  "Player - Transcription - AI Warning": "Transkripcija temelji na umetni inteligenci in lahko vsebuje napake, zato nas obvestite.",
418
- "All organisations": "Vse organizacije"
418
+ "All organisations": "Vse organizacije",
419
+ "Emission subtitle": "Podnaslov oddaje"
419
420
  }
@@ -1,13 +1,11 @@
1
- import { Router, RouteRecordRaw, RouteRecordSingleView, RouteRecordSingleViewWithChildren } from "vue-router";
1
+ import { Router, RouteRecordRaw, RouteRecordSingleView, RouteRecordSingleViewWithChildren, RouteLocationNormalized } from "vue-router";
2
2
  import { useFilterStore, FilterStore } from "../stores/FilterStore";
3
3
  import { useSaveFetchStore } from "../stores/SaveFetchStore";
4
4
  import { Rubriquage } from "../stores/class/rubrique/rubriquage";
5
5
  import classicApi from "../api/classicApi";
6
6
  import { useAuthStore, AuthStore } from "../stores/AuthStore";
7
7
  import { deepEqual } from "../helper/equals";
8
- import { RouteLocationNormalized } from "vue-router";
9
- import { RouteProps } from "../components/composable/route/types";
10
- import { ROUTE_PARAMS } from "../components/composable/route/types";
8
+ import { RouteProps, ROUTE_PARAMS } from "../components/composable/route/types";
11
9
  import { type Component } from "vue";
12
10
  import { state as sdkParams } from "../stores/ParamSdkStore";
13
11
 
@@ -46,6 +44,7 @@ export function getRouteProps(route: RouteLocationNormalized): RouteProps {
46
44
  routeRubriques :route.query.r as string ?? route.query.rubriquesId as string|undefined,
47
45
  routeBeneficiaries: route.query[ROUTE_PARAMS.Beneficiaries] as string[]|undefined,
48
46
  routeOnlyVideo: route.query.v as string|undefined ?? "",
47
+ routeValidity: route.query.vl as string ?? "",
49
48
  routeEmissionGroups
50
49
  }
51
50
  }
@@ -29,6 +29,9 @@ const state: ParamStore = {
29
29
  searchPage: {
30
30
  sortCriteria: undefined,
31
31
  },
32
+ smartLink: {
33
+ showOnlyFirstParagraphInDescription: false
34
+ }
32
35
  };
33
36
 
34
37
  export interface ParamStore {
@@ -90,6 +93,12 @@ export interface ParamStore {
90
93
  /** The default sort criteria for search results */
91
94
  sortCriteria?: PodcastSort;
92
95
  };
96
+
97
+ /** Smartlink configuration */
98
+ smartLink: {
99
+ /** Truncate the description to the first paragraph */
100
+ showOnlyFirstParagraphInDescription?: boolean;
101
+ }
93
102
  }
94
103
 
95
104
  function definedProps<T>(obj: Partial<T>|undefined): Partial<T> {
@@ -46,4 +46,8 @@
46
46
  // Player
47
47
  // Color for the transcript background
48
48
  --octopus-player-transcript-bg-color: oklch(from var(--octopus-player-color) calc(l + 0.1) c h);
49
+
50
+ // Smartlink
51
+ --octopus-smartlink-title-color: var(--octopus-gray-text);
52
+ --octopus-smartlink-title-fontsize: 1.5rem;
49
53
  }