{"version":3,"file":"classicApi-BTNeGEhM.mjs","names":[],"sources":["../src/stores/ParamSdkStore.ts","../src/stores/ApiStore.ts","../src/api/apiConnection.ts","../src/stores/SaveFetchStore.ts","../src/stores/NotificationStore.ts","../src/api/apiUtils.ts","../src/api/emissionApi.ts","../src/api/transcriptionApi.ts","../src/api/groupsApi.ts","../src/stores/CacheStore.ts","../src/api/organisationApi.ts","../src/helper/arrayHelper.ts","../src/api/playlistApi.ts","../src/api/participantApi.ts","../src/i18n.ts","../src/api/podcastApi.ts","../src/api/radioApi.ts","../src/api/aggregatorsApi.ts","../src/api/mediathequeApi.ts","../src/stores/class/rubrique/rubriquage.ts","../src/api/rubriquesApi.ts","../src/helper/slugify.ts","../src/components/composable/useSubOrganisations.ts","../src/stores/AuthStore.ts","../src/stores/FilterStore.ts","../src/helper/fetchHelper.ts","../src/api/classicApi.ts"],"sourcesContent":["import { PodcastSort } from \"../api/podcastApi\";\n\nconst state: ParamStore = {\n  generalParameters: {\n    forceOrganisationId: undefined,//\"ecbd98d9-79bd-4312-ad5e-fc7c1c4a191c\",\n    forceRubriqueId: undefined,\n    podcastmaker: false,\n    buttonPlus: true,\n    isLiveTab: true,\n    isCaptchaTest: true,\n    podcastItem: 13.5,\n  },\n  podcastPage: {\n    ShareButtons: true,\n    mainRubrique: 0,\n    downloadButton: false,\n    descriptionOrSummary: 'description'\n  },\n  emissionsPage: {\n    itemPlayer: false,\n    rubriquage: undefined,\n    mainRubrique: undefined,\n    buttonMore: false,\n    progressBar: false,\n  },\n  emissionPage: {},\n  player: {\n    isVideoPage:false,\n  },\n  searchPage: {\n    sortCriteria: undefined,\n  },\n  smartLink: {\n    showOnlyFirstParagraphInDescription: false\n  },\n  presentationItems: {\n    tags: 'none'\n  }\n};\n\nexport interface ParamStore {\n  generalParameters: {\n    /** Automatically filter results by this organisation */\n    forceOrganisationId?: string;\n    /** Automatically filter results by these rubriques */\n    forceRubriqueId?: number|number[];\n    /** Automatically exclude these rubriquage from results */\n    forceNoRubriquageId?: number|number[];\n    /** Enable for podcastmakers */\n    podcastmaker?: boolean;\n    /** Show time with the dates on podcasts */\n    showTimeWithDates?: boolean;\n    buttonPlus?: boolean;\n    /** Show the \"Radio & Live\" tab in the navigation; driven by additionalConfiguration from the backend */\n    isLiveTab?: boolean;\n    isCaptchaTest?: boolean;\n    podcastItem?: number;\n  };\n  podcastPage: {\n    ShareButtons?: boolean;\n    mainRubrique?: number;\n    downloadButton?:boolean;\n    /** If true, hide tags on podcast page */\n    hideTags?: boolean;\n    /** The maximum number of tags that can be displayed */\n    maxTags?: number;\n    /** If true, do not display subtitles on podcast pages */\n    hideSubtitle?: boolean;\n    /** Select whether to display description, summary, or both */\n    descriptionOrSummary?: 'description'|'summary'|'both';\n  };\n  emissionPage: {\n    ShareButtons?: boolean;\n    /** If true, hide tags on emission page */\n    hideTags?: boolean;\n    /** The maximum number of tags that can be displayed */\n    maxTags?: number;\n    /** If true, do not display subtitles on podcast pages */\n    hideSubtitle?: boolean;\n  };\n  emissionsPage: {\n    itemPlayer?: boolean;\n    rubriquage?: number;\n    mainRubrique?: number;\n    buttonMore?: boolean;\n    progressBar?: boolean;\n  };\n  player: {\n    isVideoPage?:boolean;\n    /**\n     * Indicates that the play is at the top of the page.\n     * This adapts player settings for properly display.\n     * Currently *does not* position the player.\n     */\n    topPlacement?: boolean;\n    /** Start with the large version by default */\n    startLarge?: boolean;\n    /** Show a warning regarding AI generation of transcripts */\n    showAITranscriptWarning?: boolean;\n    /** If true, the player will not close when finishing playing */\n    stayOpenOnFinish?: boolean;\n  };\n  searchPage: {\n    /** The default sort criteria for search results */\n    sortCriteria?: PodcastSort;\n  };\n\n  /** Settings for presentation items */\n  presentationItems: {\n    /** Type of tags to display on presentation items */\n    tags: 'none'|'iab'|'rubrique';\n    /**\n     * For rubrique type, the ID of the rubriquage the rubriques must belong to\n     * to be displayed. If not set, will display all rubriques.\n     */\n    tagsRubriquageId?: number;\n    /** Limit number of tags */\n    tagsLimit?: number;\n    /** Additional infos displayed in presentation item */\n    additionalInfo?: Array<'productor'|'date'|'restrictive-rubrique'>;\n    /**\n     * ID of the restrictive rubriquage ID, used only when additionalInfo\n     * contains 'restricted-rubrique'\n     */\n    restrictiveRubriquageId?: number;\n  };\n\n  /** Smartlink configuration */\n  smartLink: {\n    /** Truncate the description to the first paragraph */\n    showOnlyFirstParagraphInDescription?: boolean;\n  }\n}\n\nfunction definedProps<T>(obj: Partial<T>|undefined): Partial<T> {\n  if (obj === undefined) {\n    return {};\n  } else {\n    return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n  }\n}\n\nconst initialize = function initialize(initObject: Partial<ParamStore>): void {\n  state.generalParameters = Object.assign(\n    state.generalParameters,\n    definedProps(initObject.generalParameters),\n  );\n  state.podcastPage = Object.assign(\n    state.podcastPage,\n    definedProps(initObject.podcastPage),\n  );\n  state.emissionsPage = Object.assign(\n    state.emissionsPage,\n    definedProps(initObject.emissionsPage),\n  );\n  state.emissionPage = Object.assign(\n    state.emissionPage,\n    definedProps(initObject.emissionPage),\n  );\n  state.player = Object.assign(state.player, definedProps(initObject.player));\n  state.searchPage = Object.assign(\n    state.searchPage,\n    definedProps(initObject.searchPage),\n  );\n  state.smartLink = Object.assign(\n    state.smartLink,\n    definedProps(initObject.smartLink)\n  );\n  state.presentationItems = Object.assign(\n    state.presentationItems,\n    definedProps(initObject.presentationItems)\n  );\n};\n\nexport default { initialize, state };\nexport { initialize, state };\n","import { defineStore } from \"pinia\";\ninterface ApiState {\n  apiUrl: string;\n  billingUrl: string;\n  chapteringUrl: string;\n  commentUrl: string;\n  frontendUrl: string;\n  hlsUrl: string;\n  imageUrl: string;\n  importerUrl: string;\n  keycloakUrl: string;\n  keycloakOpenAiUrl: string;\n  mediaUrl: string;\n  miniplayerUrl: string;\n  openAiUrl: string;\n  processorUrl: string;\n  radioUrl: string;\n  recoUrl: string;\n  rtmpUrl: string;\n  speechToTextUrl: string;\n  textToSpeechUrl: string;\n  studioUrl: string;\n  videoMakerUrl: string;\n  storageUrl: string;\n  statRadioUrl: string;\n}\nexport const useApiStore = defineStore(\"ApiStore\", {\n  state: (): ApiState => ({\n    apiUrl: \"\",\n    billingUrl: \"\",\n    chapteringUrl: \"\",\n    commentUrl: \"\",\n    frontendUrl: \"\",\n    hlsUrl: \"\",\n    imageUrl: \"\",\n    importerUrl: \"\",\n    keycloakUrl: \"\",\n    keycloakOpenAiUrl: \"\",\n    mediaUrl: \"\",\n    miniplayerUrl: \"\",\n    openAiUrl: \"\",\n    processorUrl: \"\",\n    radioUrl: \"\",\n    recoUrl: \"\",\n    rtmpUrl: \"\",\n    speechToTextUrl: \"\",\n    textToSpeechUrl: \"\",\n    studioUrl: \"\",\n    videoMakerUrl: \"\",\n    storageUrl: \"\",\n    statRadioUrl: \"\",\n  }),\n  actions: {\n    initApis(initParam: ApiState) {\n      this.apiUrl = initParam.apiUrl;\n      this.billingUrl = initParam.billingUrl;\n      this.chapteringUrl = initParam.chapteringUrl;\n      this.commentUrl = initParam.commentUrl;\n      this.frontendUrl = initParam.frontendUrl;\n      this.hlsUrl = initParam.hlsUrl;\n      this.imageUrl = initParam.imageUrl;\n      this.importerUrl = initParam.importerUrl;\n      this.keycloakUrl = initParam.keycloakUrl;\n      this.keycloakOpenAiUrl = initParam.keycloakOpenAiUrl;\n      this.mediaUrl = initParam.mediaUrl;\n      this.miniplayerUrl = initParam.miniplayerUrl;\n      this.openAiUrl = initParam.openAiUrl;\n      this.processorUrl = initParam.processorUrl;\n      this.radioUrl = initParam.radioUrl;\n      this.recoUrl = initParam.recoUrl;\n      this.rtmpUrl = initParam.rtmpUrl;\n      this.speechToTextUrl = initParam.speechToTextUrl;\n      this.textToSpeechUrl = initParam.textToSpeechUrl;\n      this.studioUrl = initParam.studioUrl;\n      this.videoMakerUrl = initParam.videoMakerUrl;\n      this.storageUrl = initParam.storageUrl;\n      this.statRadioUrl = initParam.statRadioUrl;\n    },\n  },\n});\n","import { useApiStore } from \"../stores/ApiStore\";\n\nenum ModuleApi {\n  DEFAULT = 0,\n  MEDIA = 1,\n  COMMENT = 2,\n  KEYCLOAK = 3,\n  FRONTOFFICE = 4,\n  PLAYER = 6,\n  STORAGE = 8,\n  STUDIO = 9,\n  PROCESSOR = 10,\n  SPEECHTOTEXT = 11,\n  VIDEOMAKER = 12,\n  RECOMMENDATION = 13,\n  RADIO = 14,\n  IMPORTER = 15,\n  TEXTTOSPEECH = 16,\n  BILLING = 17,\n  OPENAI = 18,\n  CHAPTERING = 19,\n  KEYCLOAKOPENAI = 20,\n}\nfunction getApiUrl(moduleName: ModuleApi) {\n  const api = useApiStore();\n  switch (moduleName) {\n    case 1:\n      return api.mediaUrl;\n    case 2:\n      return api.commentUrl;\n    case 3:\n      return api.keycloakUrl;\n    case 4:\n      return \"\";\n    case 6:\n      return api.miniplayerUrl;\n    case 8:\n      return api.storageUrl;\n    case 9:\n      return api.studioUrl;\n    case 10:\n      return api.processorUrl;\n    case 11:\n      return api.speechToTextUrl;\n    case 12:\n      return api.videoMakerUrl;\n    case 13:\n      return api.recoUrl;\n    case 14:\n      return api.radioUrl;\n    case 15:\n      return api.importerUrl;\n    case 16:\n      return api.textToSpeechUrl;\n    case 17:\n      return api.billingUrl;\n    case 18:\n      return api.openAiUrl;\n    case 19:\n      return api.chapteringUrl;\n    case 20:\n      return api.keycloakOpenAiUrl;\n    default:\n      return api.apiUrl;\n  }\n}\nexport {\n  ModuleApi,\n  getApiUrl\n}","import { defineStore } from \"pinia\";\nimport classicApi from \"../api/classicApi\";\nimport { useAuthStore } from \"./AuthStore\";\nimport { Organisation, OrganisationAttributes } from \"./class/general/organisation\";\nimport { Rubriquage } from \"./class/rubrique/rubriquage\";\n\ntype SaveObject = { [key: string]: string | number | boolean | undefined };\n\ninterface SaveFetchState {\n  orgaPublicAttributes: { [key: string]: SaveObject };\n  orgaLiveEnabled: { [key: string]: boolean };\n  orgaData: { [key: string]: Organisation };\n  orgaRubriques: { [key: string]: Array<Rubriquage> };\n}\nexport const useSaveFetchStore = defineStore(\"SaveFetchStore\", {\n  state: (): SaveFetchState => ({\n    orgaPublicAttributes: {},\n    orgaLiveEnabled: {},\n    orgaData: {},\n    orgaRubriques:{},\n  }),\n  actions: {\n    async getOrgaAttributes(orgaId: string): Promise<OrganisationAttributes> {\n      if (this.orgaPublicAttributes[orgaId]) {\n        return this.orgaPublicAttributes[orgaId];\n      }\n      const authStore = useAuthStore();\n      if (\n        orgaId === authStore.authOrganisation.id &&\n        authStore.authOrganisation.attributes &&\n        Object.keys(authStore.authOrganisation.attributes).length > 1\n      ) {\n        this.orgaPublicAttributes[orgaId] =\n          authStore.authOrganisation.attributes;\n      } else {\n        this.orgaPublicAttributes[orgaId] = await classicApi.fetchData<{\n          [key: string]: string;\n        }>({\n          api: 0,\n          path:  \"organisation/attributes/\" + orgaId,\n        });\n      }\n      return this.orgaPublicAttributes[orgaId];\n    },\n    forceUpdateAttributes(orgaId: string, attributes: SaveObject) {\n      this.orgaPublicAttributes[orgaId] = attributes;\n    },\n    async getOrgaLiveEnabled(orgaId: string): Promise<boolean> {\n      if (!orgaId.length) {\n        return false;\n      }\n      if (this.orgaLiveEnabled[orgaId]) {\n        return this.orgaLiveEnabled[orgaId];\n      }\n      this.orgaLiveEnabled[orgaId] = await classicApi.fetchData<boolean>({\n        api: 0,\n        path:  \"organisation/liveEnabled/\" + orgaId,\n      });\n      return this.orgaLiveEnabled[orgaId];\n    },\n    async getOrgaData(orgaId: string): Promise<Organisation> {\n      if (this.orgaData[orgaId]) {\n        return this.orgaData[orgaId];\n      }\n      const authStore = useAuthStore();\n      if (orgaId === authStore.authOrganisation.id) {\n        this.orgaData[orgaId] = authStore.authOrganisation;\n      } else {\n        this.orgaData[orgaId] = await classicApi.fetchData<Organisation>({\n          api: 0,\n          path:  \"organisation/\" + orgaId,\n        });\n      }\n      return this.orgaData[orgaId];\n    },\n    forceUpdateData(orgaId: string, data: Organisation) {\n      this.orgaData[orgaId] = data;\n    },\n    async getOrgaRubriques(orgaId: string): Promise<Array<Rubriquage>> {\n      if (this.orgaRubriques[orgaId]) {\n        return this.orgaRubriques[orgaId];\n      }\n      this.orgaRubriques[orgaId] = await classicApi.fetchData<Array<Rubriquage>>({\n        api: 0,\n        path:  \"rubriquage/find/\" + orgaId,\n      });\n      return this.orgaRubriques[orgaId];\n    },\n    forceUpdateRubriques(orgaId: string) {\n      delete this.orgaRubriques[orgaId];\n    },\n  },\n});\n","import { defineStore } from \"pinia\";\nimport { computed, ref } from \"vue\";\n\ntype NotificationType = 'success'|'info'|'warning'|'error';\n\n/**\n * Type for notifications\n */\ninterface Notification {\n    /** Optional title of the notification */\n    title?: string;\n    /** Message displayed by the notification */\n    message: string;\n    /** Type of notification, may affect display */\n    type: NotificationType;\n    /** When set to false, disallow manual closing of modal notification (default: true) */\n    closeable?: boolean;\n    /** Callback called when the notification is closed */\n    closeCallback?: () => void;\n}\n\nexport const useNotificationStore = defineStore('notifications', () => {\n    const notificationQueue = ref<Array<Notification>>([]);\n\n    /**\n     * Add a notification to the queue\n     * @param notification The notification to add\n     */\n    function addNotification(notification: Notification): void {\n        notificationQueue.value.push(notification);\n    }\n\n    /** Remove the current notification from the queue */\n    function clearNotification(): void {\n        const notif = currentNotification.value;\n        if (notif !== null) {\n            const idx = notificationQueue.value.indexOf(notif);\n            notificationQueue.value.splice(idx, 1);\n\n            if (notif.closeCallback) {\n                notif.closeCallback();\n            }\n        }\n    }\n\n    /** The currently active notification */\n    const currentNotification = computed((): Notification|undefined => {\n        if (notificationQueue.value.length > 0) {\n            return notificationQueue.value[0];\n        }\n        return undefined;\n    });\n\n\n    return {\n        addNotification,\n        currentNotification,\n        clearNotification\n    }\n});\n","/**\n * Utility function to easily convert a list of IDs to a map of id => element\n * @param ID The type of ID for the element\n * @param T The type of element to retrieve\n * @param ids The list of ids\n * @param getter A function that given an ID, returns a promise of the matching element\n * @param key The key for the ID\n * @return A promise containing a map of ID => element\n */\nexport async function mapFromGetAll<ID extends string|number, T extends object >(ids: Array<ID>, getter: (id: ID) => Promise<T>, key: keyof T): Promise<Record<string, T>> {\n    const results: Record<string, T> = {};\n    const promises: Array<Promise<T>> = [];\n\n    // Retrieve data for each id\n    ids.forEach((id: ID) => {\n        const promise = getter(id).then(elt => results['' + elt[key]] = elt);\n        promises.push(promise);\n    });\n\n    // Wait for all promises to finish\n    await Promise.all(promises);\n\n    return results;\n}\n\n","import classicApi from \"./classicApi\";\nimport { ModuleApi } from \"./apiConnection\";\nimport { mapFromGetAll } from \"./apiUtils\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport { ListClassicReturn } from \"@/stores/class/general/listReturn\";\n\n/**\n * Retrieve an emission by ID\n * @param emissionId The ID of the emission\n * @return An emission\n */\nasync function get(emissionId: number): Promise<Emission> {\n    return classicApi.fetchData<Emission>({\n        api: ModuleApi.DEFAULT,\n        path: 'emission/' + emissionId\n    });\n}\n\n/**\n * Retrieve all emissions specified by their IDs\n * @param emissionIds A list of emission IDs. For better result, they\n                          should be unique.\n * @return The matching emissions\n */\nasync function getAllById(emissionIds: Array<number>): Promise<Record<string, Emission>> {\n    return mapFromGetAll(emissionIds, get, 'emissionId');\n}\n\n\n/**\n * Search for emissions\n * @param query A filter on the name of the emission\n * @param options Optional options to filter the results\n */\nasync function search(query?: string, options?: {\n    /** The index of the first element to retrieve */\n    first?: number;\n    /** The number of elements to retrieve */\n    size?: number;\n    specialTreatment?: boolean;\n    distributedBy?: string;\n    /** Filter by organisation */\n    organisationId?: string|string[];\n}): Promise<ListClassicReturn<Emission>> {\n    return classicApi.fetchData<ListClassicReturn<Emission>>({\n        api: ModuleApi.DEFAULT,\n        path: \"emission/search\",\n        parameters: {\n            query,\n            first: options?.first ?? 0,\n            size: options?.size ?? 10,\n            distributedBy: options?.distributedBy,\n            organisationId: options?.organisationId\n        },\n        specialTreatement: options?.specialTreatment ?? true\n    });\n}\n\n/**\n * Remove seasons data from emission\n * @param emissionId The ID of the emission for which to remove the data\n */\nasync function resetSeasons(emissionId: number): Promise<void> {\n    return classicApi.putData({\n        api: ModuleApi.DEFAULT,\n        path: 'emission/seasons/reset/' + emissionId\n    });\n}\nexport const emissionApi = {\n    get,\n    getAllById,\n    search,\n    resetSeasons\n};\n","import { ModifyPodcastConfig } from \"../stores/class/transcript/transcriptParams\";\nimport { ModuleApi } from \"./apiConnection\";\nimport classicApi from \"./classicApi\";\n\n/** State of the translation */\nexport enum TranslationState {\n    /** Translation in progress */\n    TRANSLATING = 'TRANSLATING',\n    /** Translation is finished */\n    FINISHED = 'FINISHED',\n    /** Translation has failed */\n    FAILED = 'FAILED',\n    /** AI limit has exceeded during translation */\n    AI_LIMIT_EXCEEDED = 'AI_LIMIT_EXCEEDED'\n}\n\n/** Data for one translation */\nexport interface TranslationData {\n    /** Language of translation */\n    language: string;\n    /** State of the translation */\n    state: TranslationState;\n}\n\n/** Translation data for one podcast. Contains data of all generated translations. */\nexport interface PodcastTranslationData {\n    /** ID of the podcast */\n    podcastId: number;\n    /** Native language of the podcast */\n    nativeLanguage: string;\n    /** Translation data */\n    translations: Array<TranslationData>;\n}\n\ninterface TranslationProgress {\n    started: boolean;\n    percent: number;\n}\n\n/**\n * Returns the translations defined on the podcast\n * @param podcastId ID of the podcast\n * @returns Promise containing the translation data for the podcast\n */\nasync function getTranslations(podcastId: number): Promise<PodcastTranslationData> {\n    return classicApi.fetchData<PodcastTranslationData>({\n        api: ModuleApi.SPEECHTOTEXT,\n        path: `transcription/${podcastId}/languages`\n    });\n}\n\n/**\n * Returns the translation in a given language for the podcast\n * @param podcastId ID of the podcast\n * @param language The target language\n * @param mayCreate *(optional)* If set to true, request creation if not available\n * @returns The transcription\n */\nasync function getTranslation(podcastId: number, language: string, mayCreate?: boolean): Promise<string> {\n    let path = `transcription/${podcastId}/languages/${language}/srt`;\n    if (mayCreate !== undefined) {\n        path = `${path}?mayCreateIfNotExists=${mayCreate}`;\n    }\n\n    let found = false;\n    let timeout = 1000;\n    const timeoutStep = 100;\n    while (!found) {\n        const result = await classicApi.fetchData<string|TranslationProgress>({\n            api: ModuleApi.SPEECHTOTEXT,\n            path\n        });\n\n        // Stop when we get the proper result\n        if (typeof result === 'string') {\n            found = true;\n            return result;\n        }\n\n        // Wait some time before retrying\n        await new Promise((resolve) => setTimeout(resolve, timeout));\n        timeout += timeoutStep;\n\n        if (timeout >= 60 * 1000) {\n            break;\n        }\n    }\n\n    throw new Error('Timeout lors de la récupération de la transcription');\n}\n\n/**\n * Get raw transcription for the given podcast\n * @param podcastId ID of the podcast\n * @returns The raw transcript\n */\nasync function getRawTranscription(podcastId: number): Promise<string> {\n    return classicApi.fetchData({\n        api: ModuleApi.SPEECHTOTEXT,\n        path: `transcription/text/${podcastId}`,\n    });\n}\n\n/**\n * Generate the transcription on the given podcast\n * @param podcastId ID of the podcast on which to do the transcription\n * @param langauge Target language. Should be the native language of the podcast\n * @param params Transcription parameters\n */\nasync function generateTranscription(podcastId: number, language: string, params: ModifyPodcastConfig): Promise<void> {\n    await classicApi.postData({\n        api: ModuleApi.SPEECHTOTEXT,\n        path: `convert/${language}/${podcastId}`,\n        dataToSend: params\n    });\n}\n\n/**\n * Regenerate the transcription on the given podcast\n * Currently does the same as `generateTranscription`, but should be used when\n * relevant in case of future evolutions.\n * @param podcastId ID of the podcast on which to do the transcription\n * @param langauge Target language. Should be the native language of the podcast\n * @param params Transcription parameters\n */\nasync function regenerateTranscription(podcastId: number, language: string, params: ModifyPodcastConfig): Promise<void> {\n    await classicApi.putData({\n        api: ModuleApi.SPEECHTOTEXT,\n        path: `regenerate/${language}/${podcastId}`,\n        dataToSend: params\n    });\n}\n\n/**\n * Change the visibility of the podcast\n * @param podcastId ID of the podcast for which to change the visibility\n * @param visibility New visibility state\n */\nasync function changeTranscriptionVisibility(podcastId: number, visibility: boolean): Promise<void> {\n    await classicApi.putData({\n        api: 11,\n        path: \"visibility/\" + podcastId,\n        parameters: {\n            visibility\n        }\n    });\n}\n\n/**\n * Update the transcription of a podcast\n * @param podcastId ID of the podcast\n * @param transcript The new transcript\n */\nasync function updateTranscription(podcastId: number, transcript: string): Promise<void> {\n    await classicApi.postData({\n        api: ModuleApi.SPEECHTOTEXT,\n        path: \"update/\" + podcastId,\n        dataToSend: {\n            file: new File([transcript], \"file\")\n        },\n        contentType: \"formData\"\n    });\n}\n\n/**\n * Update the translation of a podcast\n * @param podcastId ID of the podcast\n * @param transcript The new translation\n */\nasync function updateTranslation(podcastId: number, language: string, translation: string): Promise<void> {\n    await classicApi.putData({\n        api: ModuleApi.SPEECHTOTEXT,\n        path: `transcription/${podcastId}/languages/${language}/srt`,\n        dataToSend: translation,\n        raw: true\n    });\n}\n\nexport const transcriptionApi = {\n    changeTranscriptionVisibility,\n    getTranslations,\n    getTranslation,\n    getRawTranscription,\n    generateTranscription,\n    regenerateTranscription,\n    updateTranscription,\n    updateTranslation\n};\n","import classicApi from \"./classicApi\";\nimport { ModuleApi } from \"./apiConnection\";\nimport { ListClassicReturn } from \"../stores/class/general/listReturn\";\nimport { Emission } from \"@/stores/class/general/emission\";\nimport { mapFromGetAll } from \"./apiUtils\";\n\nconst BASE_PATH = 'emission/groups/';\n\n/** Group of emissions */\nexport interface EmissionGroup {\n    /** Name of the group */\n    name: string;\n    /** Id of the group */\n    groupId: number;\n    /** Simple description */\n    description?: string;\n    /** The id of the organisation this group belongs to */\n    organisationId: string;\n    /** The list of ids of emissions in this group */\n    emissionIds: Array<number>|null;\n    /** If set, defines this group as a \"marque\" group. */\n    acpmMarque: string|null;\n}\n\ninterface Pagination {\n    /** Pagination */\n    first: number;\n    /** Number of elements */\n    size: number;\n}\n\ninterface SearchParams {\n    /** Filter by acpm */\n    acpmMarque: string;\n    /** Filter by name */\n    search: string;\n    /** Filter by organisations */\n    organisationIds: Array<string>;\n}\n\n/**\n * Add an emission to a list of groups\n * @param emission The emission to add to the groups\n * @param groups The list of groups to add the emission to\n */\nasync function addToGroups(emission: Emission|number, groups: Array<EmissionGroup>|Array<number>): Promise<void> {\n    if (groups.length === 0) {\n        return;\n    }\n\n    let emissionId: number;\n    if (typeof emission === 'object') {\n        emissionId = emission.emissionId;\n    } else {\n        emissionId = emission;\n    }\n    let groupIds: Array<number>;\n    if (typeof groups[0] === 'object') {\n        groupIds = (groups as Array<EmissionGroup>).map(g => g.groupId);\n    } else {\n        groupIds = groups as Array<number>;\n    }\n\n    return classicApi.putData({\n        api: ModuleApi.DEFAULT,\n        path: BASE_PATH + 'add/' + emissionId,\n        dataToSend: groupIds\n    });\n}\n\n/**\n * Create a new group\n */\nasync function create(group: Omit<EmissionGroup, 'groupId'|'emissionIds'>): Promise<EmissionGroup> {\n    return classicApi.postData<EmissionGroup>({\n        api: ModuleApi.DEFAULT,\n        path: BASE_PATH,\n        dataToSend: group\n    });\n}\n\n/**\n * Delete a group\n */\nasync function remove(groupId: number): Promise<void> {\n    return classicApi.deleteData({\n        api: ModuleApi.DEFAULT,\n        path: BASE_PATH + groupId\n    });\n}\n\n/**\n * Retrieve a group by its ID\n * @param groupId The ID of the group to retrieve\n * @return The group\n */\nasync function get(groupId: number): Promise<EmissionGroup> {\n    return classicApi.fetchData<EmissionGroup>({\n        api: ModuleApi.DEFAULT,\n        path: BASE_PATH + groupId\n    });\n}\n\n/**\n * Retrieve all groups specified by their IDs\n * @param groupIds A list of group IDs. For better result, they\n                          should be unique.\n * @return The matching groups\n */\nasync function getAllById(groupIds: Array<number>): Promise<Record<string, EmissionGroup>> {\n    return mapFromGetAll(groupIds, get, 'groupId');\n}\n\n/**\n * Remove an emission from a list of groups\n * @param emission The emission to remove from the groups\n * @param groups The list of groups to remove the emission from\n */\nasync function removeFromGroups(emission: Emission|number, groups: Array<EmissionGroup>|Array<number>): Promise<void> {\n    if (groups.length === 0) {\n        return;\n    }\n\n    let emissionId: number;\n    if (typeof emission === 'object') {\n        emissionId = emission.emissionId;\n    } else {\n        emissionId = emission;\n    }\n    let groupIds: Array<number>;\n    if (typeof groups[0] === 'object') {\n        groupIds = (groups as Array<EmissionGroup>).map(g => g.groupId);\n    } else {\n        groupIds = groups as Array<number>;\n    }\n\n    return classicApi.putData({\n        api: ModuleApi.DEFAULT,\n        path: BASE_PATH + 'remove/' + emissionId,\n        dataToSend: groupIds\n    });\n}\n\n/**\n * Update a group\n */\nasync function update(group: Omit<EmissionGroup, 'emissionIds'>): Promise<EmissionGroup> {\n    return classicApi.putData({\n        api: ModuleApi.DEFAULT,\n        path: BASE_PATH,\n        dataToSend: group\n    });\n}\n\n/**\n * Count number of groups\n */\nasync function count(parameters: Partial<SearchParams>): Promise<number> {\n    const result = await search({\n        ...parameters,\n        size: 0\n    });\n\n    return result.count;\n}\n\n/**\n * Search groups\n */\nasync function search(parameters: Partial<SearchParams & Pagination>): Promise<ListClassicReturn<EmissionGroup>> {\n    return classicApi.fetchData<ListClassicReturn<EmissionGroup>>({\n        api: ModuleApi.DEFAULT,\n        path: BASE_PATH + 'search',\n        parameters\n    });\n}\n\n/**\n * Search for all groups, without pagination\n */\nasync function searchNoPagination(parameters: Partial<SearchParams>): Promise<Array<EmissionGroup>> {\n    const result: Array<EmissionGroup> = [];\n\n    let index = 0;\n    while (true) {\n        const response = await search({\n            ...parameters,\n            first: index,\n            size: 1\n        });\n\n        result.push(...response.result);\n        index += response.result.length;\n\n        if (index >= response.count || response.result.length === 0) {\n            break;\n        }\n    }\n\n    return result;\n}\n\nexport const groupsApi = {\n    addToGroups,\n    count,\n    create,\n    remove,\n    get,\n    getAllById,\n    removeFromGroups,\n    update,\n    search,\n    searchNoPagination\n};\n","import dayjs, { Dayjs } from \"dayjs\";\nimport { defineStore } from \"pinia\";\n\n/**\n * Type for cache storage\n */\ninterface CachedData<T> {\n    /** The in-flight or resolved data, shared by concurrent callers */\n    data: Promise<T>;\n    /** Expiration date of the cached data */\n    expiration: Dayjs;\n}\n\nexport const useCacheStore = defineStore('cache', () => {\n\n    const cachedData: Record<string, CachedData<unknown>> = {};\n\n    async function getData<T>(key: string, callback: () => Promise<T>): Promise<T> {\n        let cache = cachedData[key] as CachedData<T>|undefined;\n        if (isDataEmptyOrExpired(cache)) {\n            // Store the promise immediately so concurrent callers share this fetch\n            const data = callback();\n            const expiration = dayjs().add(30, 'minutes');\n            cache = { data, expiration };\n            cachedData[key] = cache;\n            // Don't keep a failed fetch cached: let the next call retry\n            data.catch(() => invalidate(key));\n        }\n\n        return cache.data;\n    }\n\n    function invalidate(key: string): void {\n        delete cachedData[key];\n    }\n\n    function isDataEmptyOrExpired(data: CachedData<unknown>|undefined): boolean {\n        if (!data) {\n            return true;\n        } else {\n            return dayjs().isAfter(data.expiration);\n        }\n    }\n\n    return {\n        getData,\n        invalidate\n    };\n});\n","import classicApi from \"./classicApi\";\nimport { ModuleApi } from \"./apiConnection\";\nimport { Organisation, OrganisationAttributes } from \"../stores/class/general/organisation\";\nimport { mapFromGetAll } from \"./apiUtils\";\nimport { VideoConfig } from \"@/stores/class/config/videoConfig\";\nimport { useCacheStore } from \"@/stores/CacheStore\";\n\n/**\n * Retrieve an organisation by ID\n * @param organisationId The ID of the organisation\n * @return An organisation\n */\nasync function get(organisationId: string): Promise<Organisation> {\n    return classicApi.fetchData<Organisation>({\n        api: ModuleApi.DEFAULT,\n        path: 'organisation/' + organisationId\n    });\n}\n\n/**\n * Retrieve all organisations specified by their IDs\n * @param organisationIds A list of organisation IDs. For better result, they\n                          should be unique.\n * @return The matching organisations\n */\nasync function getAllById(organisationIds: Array<string>): Promise<Record<string, Organisation>> {\n    return mapFromGetAll(organisationIds, get, 'id');\n}\n\n/**\n * Retrieve the attributes of a given organisation\n * @param organisationId The ID of the organisation\n * @returns The attributes of the organisation\n */\nasync function getAttributes(organisationId: string): Promise<OrganisationAttributes> {\n    return classicApi.fetchData<OrganisationAttributes>({\n        api: ModuleApi.DEFAULT,\n        path: 'organisation/attributes/' + organisationId\n    });\n}\n\n/**\n * Retrieve the video configuration of a given organisation\n * @param organisationId The ID of the organisation\n * @returns The video configuration of the organisation\n */\nasync function getVideoConfig(organisationId: string): Promise<VideoConfig> {\n    const cacheStore = useCacheStore();\n    return cacheStore.getData(`org-video-config-${organisationId}`, () => {\n        return classicApi.fetchData<VideoConfig>({\n            api: ModuleApi.DEFAULT,\n            path:\"video/config/\" + encodeURI(organisationId)\n        });\n    });\n}\n\nexport const organisationApi = {\n    get,\n    getAllById,\n    getAttributes,\n    getVideoConfig\n};\n","export function unique<T>(value: T, index: number, array: Array<T>): boolean {\n    return array.indexOf(value) === index;\n}\n","import classicApi from \"./classicApi\";\nimport { ModuleApi } from \"./apiConnection\";\nimport { Podcast, SimplifiedPodcast } from \"../stores/class/general/podcast\";\nimport { Playlist, PlaylistAmbianceType } from \"../stores/class/general/playlist\";\nimport { organisationApi } from \"./organisationApi\";\nimport { emissionApi } from \"./emissionApi\";\nimport { unique } from '../helper/arrayHelper';\nimport { ListClassicReturn } from \"@/stores/class/general/listReturn\";\nimport { Paginable } from \"./types\";\nimport { FetchParam } from \"@/stores/class/general/fetchParam\";\n\n/**\n * Retrieve playlist data\n * @param playlistId The ID of the playlist\n * @return The playlist\n */\nasync function get(playlistId: number): Promise<Playlist> {\n    return classicApi.fetchData<Playlist>({\n        api: ModuleApi.DEFAULT,\n        path: 'playlist/' + playlistId\n    });\n}\n\n/**\n * Retrieve the podcasts defined in the playlist\n * @param playlistId The ID of the playlist\n * @return A list of simplified podcasts\n */\nasync function getContent(playlistId: number): Promise<Array<SimplifiedPodcast>> {\n    return classicApi.fetchData<Array<SimplifiedPodcast>>({\n        api: ModuleApi.DEFAULT,\n        path: 'v2/playlist/' + playlistId + '/content'\n    });\n}\n\n/**\n * Retrieve the podcasts defined in the playlist, with all their data\n * This query is longer, because it also needs to retrieve organisations &\n * emissions.\n * @param playlistId The ID of the playlist\n * @return A list of podcasts\n */\nasync function getContentFull(playlistId: number): Promise<Array<Podcast>> {\n    const simplified = await this.getContent(playlistId);\n    const full: Array<Podcast> = [];\n\n    const organisationIds = simplified.map((p: SimplifiedPodcast) => p.organisationId)\n        .filter(unique);\n    const emissionIds = simplified.map((p: SimplifiedPodcast) => p.emissionId)\n        .filter(unique);\n\n    const organisations = await organisationApi.getAllById(organisationIds);\n    const emissions = await emissionApi.getAllById(emissionIds);\n\n    simplified.forEach((s: SimplifiedPodcast) => {\n        const organisation = organisations[s.organisationId];\n        const emission = emissions[s.emissionId];\n\n        full.push({\n            ...s,\n            organisation,\n            emission\n        });\n    })\n\n    return full;\n}\n\n/**\n * Sort order for playlists\n */\nenum PlaylistSort {\n    SCORE = \"SCORE\",\n    NAME = \"NAME\"\n}\n\n/**\n * Search criterias for playlists\n */\ninterface PlaylistSearchOptions extends Paginable<PlaylistSort> {\n    /** Filter on organisations */\n    organisationId?: string[];\n    /** Fitler on name */\n    query?: string;\n    /** Filter on type */\n    type?: PlaylistAmbianceType;\n}\n\n/**\n * Search for playlists based on criterias\n */\nasync function search(options?: PlaylistSearchOptions): Promise<ListClassicReturn<Playlist>> {\n    return await classicApi.fetchData<ListClassicReturn<Playlist>>({\n        api: ModuleApi.DEFAULT,\n        path: 'playlist/search',\n        specialTreatement: true,\n        parameters: options as FetchParam\n    });\n}\n\n/**\n * API to manage playlists\n */\nexport const playlistApi = {\n    get,\n    getContent,\n    getContentFull,\n    search\n}\n","import { Participant } from \"@/stores/class/general/participant\";\nimport classicApi from \"./classicApi\";\nimport { ModuleApi } from \"./apiConnection\";\nimport { mapFromGetAll } from \"./apiUtils\";\n\n/**\n * Retrieve a participant by ID\n * @param participantId The ID of the participant\n * @return A participant\n */\nasync function get(participantId: number): Promise<Participant> {\n    return classicApi.fetchData<Participant>({\n        api: ModuleApi.DEFAULT,\n        path: 'participant/' + participantId\n    });\n}\n\n/**\n * Retrieve all participants specified by their IDs\n * @param participantIds A list of participant IDs. For better result, they\n                         should be unique.\n * @return The matching participants\n */\nasync function getAllById(participantIds: Array<number>): Promise<Record<string, Participant>> {\n    return mapFromGetAll(participantIds, get, 'participantId');\n}\n\nexport const participantApi = {\n    get,\n    getAllById\n}\n","import { nextTick } from \"vue\";\nimport { createI18n, I18n } from \"vue-i18n\";\n\nexport function setupI18n(options: { [key:string]: string|boolean }, isAuthenticated: boolean, isEducation: boolean) {\n  const i18n = createI18n(options);\n  loadLocaleMessages(i18n.global, options.locale,  isAuthenticated, isEducation);\n  return i18n;\n}\n\nlet i18nInstance: I18n | null = null;\n\n/**\n * Register the app's i18n instance so it can be reached from code that\n * doesn't run inside a component setup, where useI18n() is unavailable.\n */\nexport function registerI18n(instance: I18n): void {\n  i18nInstance = instance;\n}\n\nexport function getI18n(): I18n {\n  if (!i18nInstance) {\n    throw new Error('i18n instance accessed before registerI18n() was called');\n  }\n  return i18nInstance;\n}\n\nexport function setI18nLanguage(i18n: any, locale: string) {\n  i18n.locale.value= locale;\n  const html = document.querySelector(\"html\");\n  if (html) {\n    html.setAttribute(\"lang\", locale);\n  }\n}\n\nexport async function loadLocaleMessages(\n  i18n: any,\n  locale: string,\n  isAuthenticated: boolean,\n  isEducation: boolean,\n) {\n  if (\n    !i18n.messages[locale] ||\n    0 === Object.keys(i18n.messages[locale]).length\n  ) {\n    let messages = await import(`./locale/${locale}.ts`);\n    messages = messages.default;\n    if (isEducation && (\"fr\" === locale || \"en\" === locale)) {\n      const messagesEdu = await import(`./locale/education${locale}.ts`);\n      messages = { ...messages, ...messagesEdu.default };\n    }\n    i18n.setLocaleMessage(locale, messages);\n  }\n  setI18nLanguage(i18n, locale);\n  return nextTick();\n}\n","import { Podcast, PodcastProcessingStatus, PodcastType, SimplifiedPodcast } from '../stores/class/general/podcast';\nimport { ListClassicReturn } from '../stores/class/general/listReturn';\nimport classicApi from './classicApi';\nimport { ModuleApi } from './apiConnection';\nimport { unique } from '../helper/arrayHelper';\nimport { organisationApi } from './organisationApi';\nimport { emissionApi } from './emissionApi';\nimport { FetchParam } from '@/stores/class/general/fetchParam';\nimport { Paginable } from './types';\nimport { participantApi } from './participantApi';\nimport { useNotificationStore } from '@/stores/NotificationStore';\nimport { AxiosError } from 'axios';\nimport { getI18n } from '@/i18n';\n\nexport enum PodcastSort {\n    DATE = 'DATE',\n    DATE_ASC = 'DATE_ASC',\n    NAME = 'NAME',\n    LAST_PODCAST_DESC = 'LAST_PODCAST_DESC',\n    POPULARITY = 'POPULARITY',\n    SCORE = 'SCORE',\n    UPDATE_ASC = 'UPDATE_ASC',\n    UPDATE_DESC = 'UPDATE_DESC',\n    /** Smart sort using seasons settings */\n    SEASONAL = 'SEASONAL'\n}\n\nexport enum PodcastMonetisation {\n    YES = \"YES\",\n    NO = \"NO\",\n    UNDEFINED = \"UNDEFINED\"\n}\n\n/**\n * The options available to search for podcasts.\n * \n * ** /!\\ This list is not exhaustive **\n */\nexport interface PodcastSearchOptions extends Paginable<PodcastSort> {\n    /** Filter by emission ID */\n    emissionId?: number|number[];\n    /** Filter by emission groups */\n    groupId?: number[];\n    /** Filter by organisation ID */\n    organisationId?: string[];\n    /** Filter by title containing */\n    query?: string;\n    /** Filter by IAB category */\n    iabId?: number;\n    /** Filter by participant */\n    participantId?: number;\n    /** Fitler by monetisation */\n    monetisable?: PodcastMonetisation;\n    /** Filter by pub date before */\n    pubDateBefore?: string;\n    /** Filter by pub date after */\n    pubDateAfter?: string;\n    /** Filter by rubriquage exclusion ? */\n    noRubriquageId?: Array<number>;\n    /** Filter by rubrique */\n    rubriqueId?: Array<number>;\n    /** Filter by rubriquage */\n    rubriquageId?: Array<number>;\n    /** Also show hidden podcasts */\n    includeHidden?: boolean;\n    /** Filter by validity */\n    validity?: boolean;\n    /** Filter by status */\n    processingStatus?: Array<PodcastProcessingStatus>;\n    /** Filter by podcast having a video */\n    withVideo?: boolean;\n    /** Filter by tags */\n    tags?: Array<string>;\n    /** Filter by beneficiaries/rights holder reference */\n    beneficiaries?: Array<string>;\n    /** Filter by seasons */\n    season?: Array<number>;\n    /** Filter by season episode number */\n    seasonEpisode?: Array<number>;\n    /** Filter by episode type */\n    episodeType?: PodcastType;\n}\n\nasync function downloadRegister(podcastId: number, parameters?: Record<string,unknown>): Promise<{ location: string; downloadId: number }> {\n    try {\n        return await classicApi.fetchData<{\n            location: string;\n            downloadId: number;\n        }>({\n            api: ModuleApi.DEFAULT,\n            path:\"podcast/download/register/\" + podcastId + \".mp3\",\n            parameters,\n            headers: {'X-Extra-UA':'Saooti Player'}\n        });\n    } catch(e) {\n        if (e instanceof AxiosError && e.status === 403) {\n            const error = e.response.data;\n            // #14620 - match \"Country FR is not whitelisted\" or \"Country FR is blacklisted\"\n            if (error.includes('is blacklisted') || error.includes('is not whitelisted')) {\n                const { addNotification } = useNotificationStore();\n                const t = getI18n().global.t as (key: string) => string;\n                addNotification({\n                    type: 'error',\n                    title: t('Generic - Content unavailable - Country blocked - Title'),\n                    message: t('Generic - Content unavailable - Country blocked - Message')\n                });\n            }\n        }\n        return Promise.reject(e);\n    }\n}\n\n/**\n * Get a podcast by its ID\n */\nfunction get(podcastId: number): Promise<Podcast> {\n    return classicApi.fetchData<Podcast>({\n        api: ModuleApi.DEFAULT,\n        path: 'podcast/' + podcastId\n    });\n}\n\n\n/**\n * Convert easy to use PodcastSearchOptions to the actual FetchParams used by\n * the endpoint.\n */\nfunction processSearchParameters(search: PodcastSearchOptions): FetchParam {\n    const parameters: FetchParam = {};\n\n    Object.keys(search).forEach(key => {\n        const value = search[key];\n\n        if (value === undefined || value === null) {\n            return;\n        }\n\n        if (key === 'beneficiaries') {\n            parameters.beneficiary = value;\n        } else if (key === 'processingStatus') {\n            parameters.includeStatus = value;\n        } else if (key === 'tags') {\n            parameters.includeTag = value;\n        } else if (key === 'pubDateBefore') {\n            parameters.before = value;\n        } else if (key === 'pubDateAfter') {\n            parameters.after = value;\n        } else if (key === 'pageSize') {\n            parameters.size = value;\n        } else {\n            parameters[key] = value;\n        }\n    });\n\n    return parameters;\n}\n\n/**\n * Search for podcasts. Retrieved podcasts are 'incomplete', some of their\n * properties are only IDs.\n * Use `searchFull` to get full podcasts, but more queries will be made\n * @param options The search criterias\n * @param adaptParameters If true, some adjustments will be made to the parameters\n * @return A list of simplified podcasts\n */\nasync function search(options: PodcastSearchOptions, adaptParameters?: boolean): Promise<ListClassicReturn<SimplifiedPodcast>> {\n    return classicApi.fetchData<ListClassicReturn<SimplifiedPodcast>>({\n        api: ModuleApi.DEFAULT,\n        path: 'v2/podcast/search',\n        parameters: processSearchParameters(options),\n        specialTreatement: adaptParameters\n    });\n}\n\n/**\n * Count podcasts matching the filters\n * @param options The search criterias\n * @param adaptParameters If true, some adjustments will be made to the parameters\n * @return A list of simplified podcasts\n */\nasync function count(options: PodcastSearchOptions, adaptParameters?: boolean): Promise<number> {\n    const result = await search({\n        ...options,\n        size: 0\n    }, adaptParameters);\n\n    return result.count;\n}\n\n/**\n * Retrieve the podcasts matching the search criterias, with all their data.\n * This query is longer, because it also needs to retrieve organisations &\n * emissions.\n * @param options The search criterias\n * @param adaptParameters If true, some adjustments will be made to the parameters\n * @return A list of podcasts\n */\nasync function searchFull(options:PodcastSearchOptions, adaptParameters?: boolean): Promise<ListClassicReturn<Podcast>> {\n    const podcasts = await search(options, adaptParameters);\n    const full: ListClassicReturn<Podcast> = {\n        count: podcasts.count,\n        sort:podcasts.sort,\n        result: []\n    };\n    \n    const organisationIds = podcasts.result.map((p: SimplifiedPodcast) => p.organisationId)\n        .filter(unique);\n    const emissionIds = podcasts.result.map((p: SimplifiedPodcast) => p.emissionId)\n        .filter(unique);\n    const participantIds = podcasts.result.map((p: SimplifiedPodcast) => p.animatorId ?? [])\n        .flat()\n        .filter(unique);\n\n    const organisationsPromise = organisationApi.getAllById(organisationIds);\n    const emissionsPromise = emissionApi.getAllById(emissionIds);\n    const participantsPromise = participantApi.getAllById(participantIds);\n\n    const [organisations, emissions, participants] = await Promise.all([\n        organisationsPromise,\n        emissionsPromise,\n        participantsPromise\n    ])\n\n    podcasts.result.forEach((s: SimplifiedPodcast) => {\n        const organisation = organisations[s.organisationId];\n        const emission = emissions[s.emissionId];\n        const animators = s.animatorId?.map(id => participants[id]);\n\n        full.result.push({\n            ...s,\n            organisation,\n            emission,\n            animators\n        });\n    });\n\n    return full;\n}\n\nexport const podcastApi = {\n    count,\n    downloadRegister,\n    get,\n    search,\n    searchFull\n}\n","import { Ambiance, Canal } from \"../stores/class/radio/canal\";\nimport classicApi from \"./classicApi\";\nimport { ModuleApi } from \"./apiConnection\";\n\n/**\n * Retrieve a radio canal by its id\n * @param radioId Id of the radio to retrieve\n * @returns The canal data\n */\nasync function get(radioId: number): Promise<Canal> {\n    return classicApi.fetchData<Canal>({\n        api: ModuleApi.RADIO,\n        path: `canal/${radioId}`\n    });\n}\n\n/**\n * Retrieve all radio canal by organisation\n * @param organisationId Id of the organisation\n * @returns The list of canal data\n */\nasync function getAll(organisationId: string): Promise<Array<Canal>> {\n    return await classicApi.fetchData<Array<Canal>>({\n        api: ModuleApi.RADIO,\n        path: \"canal/orga/\" + organisationId + \"/\"\n    });\n}\n\n/**\n * Set the default ambiance for the given canal\n * @param canalId ID of the canal to change\n * @param ambiance New ambiance settings\n * @returns The modified ambiance\n */\nasync function setDefaultAmbiance(canalId: number, ambiance: Ambiance): Promise<Ambiance> {\n    return await classicApi.putData<Ambiance>({\n        api: ModuleApi.RADIO,\n        path: `ambiance/canal/${canalId}/default`,\n        dataToSend: ambiance\n    });\n    \n}\n\nexport const radioApi = {\n    get,\n    getAll,\n    setDefaultAmbiance\n};\n","import { ModuleApi } from \"./apiConnection\";\nimport classicApi from \"./classicApi\";\n\nexport interface Aggregator {\n    /** ID of the aggregator */\n    aggregatorId: number;\n    /** Name of the aggregator */\n    name: string;\n    /** User who created this aggregator */\n    createdBy: string;\n    /** Link to image for aggregator */\n    image?: string;\n    /** IP criteria */\n    ip?: string;\n    /** IP range criteria */\n    ipRange?: string;\n    /** Regex for referer criteria */\n    refererRegexp?: string;\n    /** Slug criteria */\n    slug?: string;\n    /** Regex for user agent criteria */\n    uaRegexp?: string;\n}\n\nexport type PredefinedAggregator = Pick<Aggregator, 'name' | 'image'>;\n\n/**\n * Return the list of predefined aggregators\n */\nasync function getPredefined(): Promise<Array<PredefinedAggregator>> {\n    return classicApi.fetchData<Array<PredefinedAggregator>>({\n        api: ModuleApi.DEFAULT,\n        path: 'rss/aggregator/distributions'\n    });\n}\n\n/**\n * Return the list of all user-defined aggregators\n * @param organisationId If defined, the aggregators will be filtered for this\n *                       organisation\n */\nasync function getAll(organisationId?: string): Promise<Array<Aggregator>> {\n    return classicApi.fetchData<Array<Aggregator>>({\n        api: ModuleApi.DEFAULT,\n        path: 'rss/aggregator/list',\n        parameters: organisationId ? { organisationId } : undefined\n    });\n}\n\n/**\n * Return the list of all user-defined aggregators, without filter data.\n * This doesn't require to be authenticated.\n * @param organisationId If defined, the aggregators will be filtered for this\n *                       organisation\n */\nasync function getAllNoAuth(organisationId?: string): Promise<Array<PredefinedAggregator>> {\n    return classicApi.fetchData<Array<Aggregator>>({\n        api: ModuleApi.DEFAULT,\n        path: 'rss/aggregator/noauth/list',\n        parameters: organisationId ? { organisationId } : undefined\n    });\n}\n\nexport const aggregatorsApi = {\n    getPredefined,\n    getAll,\n    getAllNoAuth\n};\n","import { PlaylistMedia } from \"../stores/class/radio/playlistMedia\";\nimport { Mix } from \"../stores/class/radio/mix\";\nimport { ModuleApi } from \"./apiConnection\";\nimport classicApi from \"./classicApi\";\nimport { Cartouchier } from \"@/stores/class/cartouchier/cartouchier\";\n\n/**\n * Retrieve all cartouchier from the given organisation\n * @param organisationId The ID of the organisation\n * @param options Filtering options\n * @returns List of cartouchier belonging to the organisation\n */\nasync function getAllCartouchiers(organisationId: string, options?: { ownerId?: string }): Promise<Array<Cartouchier>> {\n    return classicApi.fetchData<Array<Cartouchier>>({\n        api: ModuleApi.MEDIA,\n        path: `cartouchier/list/${organisationId}`,\n        parameters: options\n    });\n}\n\n/**\n * Retrieve all mix from the given organisation\n * @param organisationId The ID of the organisation\n * @returns List of mix belonging to the organisation\n */\nasync function getAllMix(organisationId: string): Promise<Array<Mix>> {\n    return classicApi.fetchData<Array<Mix>>({\n        api: ModuleApi.MEDIA,\n        path: `mix/${organisationId}`\n    });\n}\n\n/**\n * Delete mix with the given id\n * @param mixId The ID of the mix to delete\n */\nasync function deleteMix(mixId: number): Promise<void> {\n    await classicApi.deleteData({\n        api: ModuleApi.MEDIA,\n        path: `mix/${mixId}`\n    });\n}\n\n/**\n * Retrieve all playlist from the given organisation\n * @param organisationId The ID of the organisation\n * @param options Filtering options\n * @returns List of playlist belonging to the organisation\n */\nasync function getAllPlaylists(organisationId: string, options?: { ownerId?: string }): Promise<Array<PlaylistMedia>> {\n    return classicApi.fetchData<Array<PlaylistMedia>>({\n        api: ModuleApi.MEDIA,\n        path: `playlist/${organisationId}`,\n        parameters: options\n    });\n}\n\n/**\n * Delete playlist with the given id\n * @param playlistId The ID of the playlist to delete\n */\nasync function deletePlaylist(playlistId: number): Promise<void> {\n    await classicApi.deleteData({\n        api: ModuleApi.MEDIA,\n        path: `playlist/${playlistId}`\n    });\n}\n\nexport const mediathequeApi = {\n    getAllCartouchiers,\n    getAllMix,\n    deleteMix,\n    getAllPlaylists,\n    deletePlaylist\n}\n","import { Rubrique } from \"./rubrique\";\n\nexport const RUBRIQUAGE_HOMEORDER_RESET = -2;\n\nexport enum RubriquageMode {\n  OPTIONAL = 'OPTIONAL',\n  MANDATORY = 'MANDATORY',\n  RESTRICTIVE = 'RESTRICTIVE'\n}\n\nexport interface Rubriquage {\n  organisationId?: string;\n  rubriquageId?: number;\n  rubriques: Array<Rubrique>;\n  title: string;\n  homePageOrder?: number | null;\n  organisationPrivacy?: string;\n  mode: RubriquageMode;\n}\n","import { Rubrique } from \"@/stores/class/rubrique/rubrique\";\nimport { Rubriquage, RubriquageMode } from \"@/stores/class/rubrique/rubriquage\";\nimport { useCacheStore } from \"@/stores/CacheStore\";\nimport classicApi, { type APIOptions } from \"./classicApi\";\nimport { ModuleApi } from \"./apiConnection\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Rubriquage\n////////////////////////////////////////////////////////////////////////////////\n/**\n * Find rubriquages according to criterias\n * @param organisationIds List of organisation IDs for which to retrieve the\n *                        rubriquage\n * @param searchOptions Additional search options\n */\nasync function searchRubriquages(organisationIds: Array<string>, searchOptions?: {\n    rubriquageId?: number;\n    organisationId?: string|Array<string>;\n    query?: string;\n}, options?: APIOptions): Promise<Array<Rubriquage>> {\n    return classicApi.fetchData<Array<Rubriquage>>({\n        api: ModuleApi.DEFAULT,\n        path: 'rubriquage/find',\n        parameters: {\n            organisationId: organisationIds,\n            ...searchOptions\n        },\n        specialTreatement: options?.adaptParameters\n    });\n}\n\n/**\n * Find rubriquages according to criterias\n * @param organisationId ID of the organisation for which to retrieve the\n                         rubriquage\n * @returns The found rubriquage\n */\nasync function findRestrictiveRubriquage(organisationId: string): Promise<Rubriquage|undefined> {\n    const all = await searchRubriquages([organisationId]);\n    return all.find(r => r.mode === RubriquageMode.RESTRICTIVE);\n}\n\n/**\n * Create a new rubriquage\n * @param data The new rubriquage data\n * @returns The created rubriquage\n */\nasync function createRubriquage(data: Omit<Rubriquage, 'rubriquageId'>): Promise<Rubriquage> {\n    return classicApi.postData<Rubriquage>({\n        api: ModuleApi.DEFAULT,\n        path: \"rubriquage/\",\n        dataToSend: data\n    });\n}\n\n/**\n * Fetch rubriquage data by ID\n * @param rubriquageId ID of the rubriquage to fetch\n * @returns The rubriquage\n */\nasync function getRubriquage(rubriquageId: number): Promise<Rubriquage> {\n    return classicApi.fetchData<Rubriquage>({\n        api: ModuleApi.DEFAULT,\n        path: `rubriquage/${rubriquageId}`\n    });\n}\n\n/**\n * Update the values of the rubriquage\n * @param data The new rubriquage data\n * @returns The updated rubriquage\n */\nasync function updateRubriquage(data: Rubriquage): Promise<Rubriquage> {\n    return classicApi.putData<Rubriquage>({\n        api: ModuleApi.DEFAULT,\n        path: \"rubriquage/\",\n        dataToSend: data\n    });\n}\n\n/**\n * Delete a rubriquage\n * @param data Either the rubriquage to delete, or its ID\n * @returns An empty promise\n */\nasync function deleteRubriquage(data: Rubriquage|number): Promise<void> {\n    const rubriquageId = typeof data === 'object' ?\n        data.rubriquageId :\n        data;\n        \n    await classicApi.deleteData<void>({\n        api: ModuleApi.DEFAULT,\n        path: \"rubriquage/\" + rubriquageId\n    });\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Rubriques\n////////////////////////////////////////////////////////////////////////////////\nasync function searchRubriques(searchOptions?: {\n    rubriquageId?: number;\n    organisationId?: string|Array<string>;\n    query?: string;\n}): Promise<Array<Rubrique>> {\n    return classicApi.fetchData<Array<Rubrique>>({\n        api: ModuleApi.DEFAULT,\n        path: 'rubrique/search',\n        parameters: searchOptions\n    });\n}\n\n/**\n * Fetch rubrique data by ID\n * @see getCachedRubrique\n * @param rubriqueId ID of the rubrique to fetch\n * @returns The rubrique\n */\nasync function getRubrique(rubriqueId: number): Promise<Rubrique> {\n    return classicApi.fetchData<Rubrique>({\n        api: ModuleApi.DEFAULT,\n        path: `rubrique/${rubriqueId}`\n    });\n}\n\n/**\n * Fetch rubrique data by ID\n * If the rubrique is available in the cache, return it from the cache\n * @param rubriqueId ID of the rubrique to fetch\n * @returns The rubrique\n */\nasync function getCachedRubrique(rubriqueId: number): Promise<Rubrique> {\n    const cacheStore = useCacheStore();\n    return cacheStore.getData(`rubrique-${rubriqueId}`, () => getRubrique(rubriqueId));\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Scope\n////////////////////////////////////////////////////////////////////////////////\n/**\n * List the rubrique IDS associated to the given user\n * @param userId The ID of the user for which to retrieve this data\n * @returns The list of IDs of rubriques\n */\nasync function listUserScope(userId: string): Promise<Array<number>> {\n    return classicApi.fetchData<Array<number>>({\n        api: ModuleApi.DEFAULT,\n        path: `rubrique/user/list/rubriques/${userId}`\n    });\n}\n\n/**\n * List the user IDS associated to the given rubrique\n * @param rubriqueId The ID of the rubrique for which to retrieve this data\n * @returns The list of IDs of users\n */\nasync function listUsersScopedByRubrique(rubriqueId: string): Promise<Array<string>> {\n    return classicApi.fetchData<Array<string>>({\n        api: ModuleApi.DEFAULT,\n        path: `rubrique/user/list/users/${rubriqueId}`\n    });\n}\n\n/**\n * Update the associated rubriques to the user\n * @param userId The ID of the user for which to change the rights scope\n * @param previousScope Previous rubrique IDs\n * @param rubriqueIds New rubrique IDs to set\n * @returns A promise\n */\nasync function setUserScope(userId: string, previousScope: Array<number>, rubriqueIds: Array<number>): Promise<void> {\n\n    const associatedIds: Array<number> = [];\n    const dissociatedIds: Array<number> = [];\n    const promises: Array<Promise<void>> = [];\n\n    // Create a set containing all ids, will iterare over all of them to check\n    // whether to add or remove them\n    const allIds = new Set<number>();\n    previousScope.forEach(allIds.add, allIds);\n    rubriqueIds.forEach(allIds.add, allIds);\n\n\n    // Find out which IDs need to be added/remove\n    allIds.forEach(id => {\n        const inOld = previousScope.includes(id);\n        const inNew = rubriqueIds.includes(id);\n\n        if (inOld && !inNew) {\n            dissociatedIds.push(id);\n        } else if (!inOld && inNew) {\n            associatedIds.push(id);\n        }\n    })\n\n    // API call for adding rubriques\n    if (associatedIds.length > 0) {\n        promises.push(classicApi.postData({\n            api: ModuleApi.DEFAULT,\n            path: 'rubrique/user/associate',\n            dataToSend: {\n                rubriqueIds: associatedIds,\n                userIds: [userId]\n            }\n        }));\n    }\n\n    // API call for removing rubriques\n    if (dissociatedIds.length > 0) {\n        promises.push(classicApi.postData({\n            api: ModuleApi.DEFAULT,\n            path: 'rubrique/user/dissociate',\n            dataToSend: {\n                rubriqueIds: dissociatedIds,\n                userIds: [userId]\n            }\n        }));\n    }\n\n    return Promise.all(promises).then();\n}\n\nexport const rubriquesApi = {\n    createRubriquage,\n    findRestrictiveRubriquage,\n    getRubriquage,\n    getRubrique,\n    getCachedRubrique,\n    searchRubriquages,\n    searchRubriques,\n    updateRubriquage,\n    deleteRubriquage,\n    listUserScope,\n    listUsersScopedByRubrique,\n    setUserScope\n};\n","export function slugify(name: string): string {\n    return name\n        .normalize('NFD')\n        .replace(/[\\u0300-\\u036f]/g, '')\n        .toLowerCase()\n        .replace(/[^a-z0-9]+/g, '-')\n        .replace(/^-+|-+$/g, '');\n}\n","import { rubriquesApi } from '@/api';\nimport { slugify } from '@/helper/slugify';\nimport { Annotations } from '@/stores/class/general';\nimport { Rubriquage } from '@/stores/class/rubrique/rubriquage';\nimport ParamSdkStore from '@/stores/ParamSdkStore';\nimport { effectScope, Ref, ref, watch } from 'vue';\n\nconst subOrganisations = ref<Array<SubOrganisation>>([]);\nconst selectedSubOrganisation = ref<SubOrganisation|null>(null);\n\n// Promise for retrieving suborganisations\nlet loadingPromise: Promise<Rubriquage|undefined>|null = null;\n\n// Whether the watch on organisationId has already been registered\nlet watchInitialized = false;\n\nexport interface SubOrganisation {\n    id: number;\n    name: string;\n    annotations: Annotations;\n    podcastCount: number;\n}\n\nfunction slugifySubOrganisation(subOrga: SubOrganisation): string {\n    return slugify(subOrga.name);\n}\n\n/**\n * Composable to manage suborganisation.\n * Allows for selecting (= focusing), unselecting, listing, etc\n * @param organisationId ID of the current organisation\n * @param slugFunc Function to slugify the suborganisation ids\n */\nexport const useSubOrganisations = (organisationId: Ref<string>, slugFunc = slugifySubOrganisation) => {\n\n    // Register the watch on organisationId only once, detached from any\n    // component's lifecycle, so it isn't stopped when the first caller unmounts\n    if (!watchInitialized) {\n        watchInitialized = true;\n\n        // Load suborganisations if necessary\n        if (subOrganisations.value.length === 0 && !loadingPromise) {\n            updateList();\n        }\n\n        effectScope(true).run(() => {\n            watch(organisationId, updateList);\n        });\n    }\n\n    async function updateList() {\n        unselectSubOrganisation();\n        loadingPromise = rubriquesApi.findRestrictiveRubriquage(organisationId.value);\n        const rubriquage = await loadingPromise;\n        loadingPromise = null;\n        if (rubriquage) {\n            subOrganisations.value = rubriquage.rubriques.map(r => ({\n                id: r.rubriqueId,\n                name: r.name,\n                podcastCount: r.podcastCount ?? 0,\n                annotations: r.annotations ?? {}\n            }));\n        } else {\n            subOrganisations.value = [];\n        }\n    }\n\n    async function getSubOrganisation(id: string|number): Promise<SubOrganisation> {\n        if (loadingPromise) {\n            await loadingPromise;\n        }\n\n        let findFunc;\n        if (typeof id === 'string') {\n            findFunc = (c: SubOrganisation) => slugFunc(c) === id;\n        } else {\n            findFunc = (c: SubOrganisation) => c.id === id;\n        }\n\n        const subOrga = subOrganisations.value.find(findFunc);\n        if (subOrga) {\n            return Promise.resolve(subOrga);\n        } else {\n            return Promise.reject(`Sub organisation ${id} not found`);\n        }\n    }\n\n    function selectSubOrganisation(subOrganisation: SubOrganisation): void {\n        if (selectedSubOrganisation.value) {\n            unselectSubOrganisation();\n        }\n\n        selectedSubOrganisation.value = subOrganisation;\n        // Force filtering on rubrique ID of the college\n        ParamSdkStore.state.generalParameters.forceRubriqueId = [\n            ParamSdkStore.state.generalParameters.forceRubriqueId ?? [],\n            subOrganisation.id\n        ].flat();\n    }\n\n    function unselectSubOrganisation(): void {\n        // Nothing to do if no org is selected\n        if (!selectedSubOrganisation.value) {\n            return;\n        }\n\n        // Restore the site's base rubrique filter instead of clearing it outright\n        const data = ParamSdkStore.state.generalParameters.forceRubriqueId;\n        if (Array.isArray(data)) {\n            const idx = data.findIndex(id => id === selectedSubOrganisation.value.id);\n            if (idx >= 0) {\n                data.splice(idx, 1);\n            }\n            ParamSdkStore.state.generalParameters.forceRubriqueId = data;\n        } else {\n            ParamSdkStore.state.generalParameters.forceRubriqueId = undefined;\n        }\n        selectedSubOrganisation.value = null;\n    }\n\n    return {\n        /** Currently selected/focused suborganisation */\n        selectSubOrganisation,\n        /** Change the currently selected/focused suborganisation */\n        selectedSubOrganisation,\n        /** Remove the focus on the suborganisation */\n        unselectSubOrganisation,\n        /** List of available suborganisations */\n        subOrganisations,\n        /**\n         * Get a suborganisation by its ID or sluggified name\n         * @param id Either the numeric ID or the sluggified name of the orga\n         * @returns A promise of the matching sub organisation\n         */\n        getSubOrganisation\n    };\n};\n","import { Organisation } from \"./class/general/organisation\";\nimport { Profile } from \"@/stores/class/user/profile\";\nimport { useSaveFetchStore } from \"./SaveFetchStore\";\nimport { defineStore } from \"pinia\";\nimport { KeycloakInfo } from \"@/stores/class/user/person\";\nimport { VideoConfig } from \"@/stores/class/config/videoConfig\";\nimport classicApi from \"../api/classicApi\";\nimport { useNotificationStore } from \"./NotificationStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { organisationApi, rubriquesApi } from \"@/api\";\nimport { useSubOrganisations } from \"@/components/composable/useSubOrganisations\";\nimport { toRef } from \"vue\";\n\ninterface AuthParam {\n  accessToken?: string;\n  refreshToken?: string;\n  expiration?: Date|string;\n  clientId?: string;\n}\n\ninterface AuthState {\n  authReload: number;\n  authName: string;\n  authOrgaId: string|undefined;\n  authOrgaName?: string;\n  authRole: Array<string>;\n  authParam:AuthParam;\n  authProfile?: Profile;\n  authOrganisation: Organisation;\n  authVideoConfig: VideoConfig;\n}\n\nexport const useAuthStore = defineStore(\"AuthStore\", {\n  state: (): AuthState => ({\n    authReload: 0,\n    authName: \"\",\n    authRole: [],\n    authOrgaId: undefined,\n    authParam: {\n      accessToken: undefined,\n      refreshToken: undefined,\n      expiration: undefined,\n    },\n    authProfile: undefined,\n    authOrganisation: {\n      id: \"\",\n      name: \"\",\n      imageUrl: \"\",\n      description: undefined,\n      monetisable: undefined,\n      location: undefined,\n      comments: undefined,\n      attributes: {\n        RSS_CONTACT: undefined,\n      }\n    },\n    authVideoConfig: { active: false },\n  }),\n  getters: {\n    /** Indicates that the user is authenticated */\n    isAuthenticated(): boolean {\n      return this.authParam.accessToken !== undefined;\n    },\n    isRoleAdmin(): boolean {\n      return this.authRole.includes(\"ADMIN\");\n    },\n    isRoleAnimator(): boolean {\n      return this.authRole.includes(\"ANIMATION\");\n    },\n    isRoleUsers(): boolean {\n      return this.authRole.includes(\"USERS\");\n    },\n    isRoleOrganisation(): boolean {\n      return this.authRole.includes(\"ORGANISATION\");\n    },\n    isRoleProduction(): boolean {\n      return this.authRole.includes(\"PRODUCTION\");\n    },\n    isRolePublication(): boolean {\n      return this.authRole.includes(\"PODCAST_VALIDATION\");\n    },\n    isRoleContribution(): boolean {\n      return this.authRole.includes(\"PODCAST_CRUD\");\n    },\n    isRolePlaylists(): boolean {\n      return this.authRole.includes(\"PLAYLISTS\");\n    },\n    isRoleComments(): boolean {\n      return this.authRole.includes(\"COMMENTS_MODERATION\");\n    },\n    isRoleEditor(): boolean {\n      return this.authRole.includes(\"EDITION\");\n    },\n    isRoleAnalytics(): boolean {\n      return this.authRole.includes(\"ANALYTICS\");\n    },\n    isRoleAdvertising(): boolean {\n      return this.authRole.includes(\"ADVERTISING\");\n    },\n    isRoleLive(): boolean {\n      return this.authRole.includes(\"LIVE\");\n    },\n    isRoleRadio(): boolean {\n      return this.authRole.includes(\"RADIO\");\n    },\n    isRoleBillingAdmin(): boolean {\n      return this.authRole.includes(\"BILLING_ADMIN\");\n    },\n    isRoleBillingViewer(): boolean {\n      return this.authRole.includes(\"BILLING_VIEWER\");\n    },\n    isOneOfRoleProduction(): boolean {\n      return (\n        this.authRole.includes(\"PRODUCTION\") ||\n        this.authRole.includes(\"RESTRICTED_PRODUCTION\")\n      );\n    },\n    isRoleRestrictedProduction(): boolean {\n      return this.authRole.includes(\"RESTRICTED_PRODUCTION\");\n    },\n    isGarRole(): string | undefined {\n      return this.authProfile?.attributes?.[\"GAR\"] as\n        | string\n        | undefined; /*CHEF_ETABLISSEMENT, ENSEIGNANT, ELEVE, undefined */\n    },\n    isVideoOrga(): boolean {\n      return this.authVideoConfig.active;\n    },\n    userScope(): Array<number> {\n      // This should not happen, but in case our user has no profile, invalidate\n      // the scope.\n      if (!this.authProfile) {\n        return [-1];\n      }\n\n      // Admins are not affected by scope\n      if(\n        this.authRole.includes('ADMIN') ||\n        this.authRole.includes('ORGANISATION')\n      ) {\n        return [];\n      } else {\n        return this.authProfile.scope;\n      }\n    }\n  },\n  actions: {\n    authUpdate(authentication: {name?:string, organisationId?:string,organisationName?:string, role?:Array<string>}) {\n      this.authName = authentication.name ?? this.authName;\n      this.authOrgaId = authentication.organisationId ?? this.authOrgaId;\n      this.authOrgaName = authentication.organisationName ?? this.authOrgaName;\n      this.authRole = authentication.role ?? this.authRole;\n    },\n    authUpdateParam(oAuthParam: AuthParam) {\n      this.authParam = oAuthParam;\n    },\n    authUpdateProfile(profile: Profile) {\n      this.authProfile = profile;\n      this.authName = profile.firstname + \" \" + profile.lastname;\n    },\n    authUpdateOrganisation(organisation: Organisation) {\n      this.authOrganisation = organisation;\n      const saveFetchStore = useSaveFetchStore();\n      saveFetchStore.forceUpdateAttributes(\n        organisation.id,\n        organisation.attributes??{}\n      );\n      saveFetchStore.forceUpdateData(organisation.id, organisation);\n    },\n    async fetchProfileAsynchrone() {\n      try {\n        const organisationData  = await classicApi.fetchData<{\n          [key: string]: string;\n        }>({\n          api: 0,\n          path:\"organisation/attributes/\" + encodeURI(this.authOrganisation.id)\n        });\n        this.authVideoConfig = await organisationApi.getVideoConfig(this.authOrganisation.id);\n\n        const organisation: Organisation = {\n          ...this.authOrganisation,\n          ...{ attributes: organisationData },\n        };\n        if (organisation.attributes?.SEPA) {\n          const orgaSepa = Object.getOwnPropertyDescriptor(\n            organisation.attributes,\n            \"SEPA\",\n          );\n          if (orgaSepa) {\n            Object.defineProperty(organisation.attributes, \"iban\", orgaSepa);\n          }\n          delete organisation.attributes[\"SEPA\"];\n        }\n        this.authUpdateOrganisation(organisation);\n      } catch {\n        if (this.authReload > 5) {\n          return;\n        }\n        this.authReload += 1;\n        await new Promise((resolve) => setTimeout(resolve, 500 * this.authReload));\n        await this.fetchProfileAsynchrone();\n      }\n    },\n    async fetchProfile() {\n      try {\n        const profileDataPromise = classicApi.fetchData<KeycloakInfo>({\n          api: 20,\n          path:\"userinfo\",\n        });\n\n        const availablesOrganisationsPromise = classicApi.fetchData<Array<Organisation>>({\n          api: 0,\n          path:\"user/me/organisations\",\n        });\n\n        const [profileData, availablesOrganisations] = await Promise.all([\n          profileDataPromise,\n          availablesOrganisationsPromise\n        ]);\n\n        // Retrieve user's rights scope\n        const scope: Array<number> = [];\n        // TODO remove when scope feature is available on prod\n        try {\n          const s = await rubriquesApi.listUserScope(profileData.sub);\n          scope.push(...s);\n        } catch (e) {\n          console.error(e);\n          // Disable scope\n          scope.push(-1);\n        }\n\n        const array = (availablesOrganisations ?? []).toSorted(function (a: Organisation, b: Organisation) {\n          if (a.name.toLowerCase() < b.name.toLowerCase()) {\n            return -1;\n          }\n          if (a.name.toLowerCase() > b.name.toLowerCase()) {\n            return 1;\n          }\n          return 0;\n        });\n\n        const profile = {\n          firstname: profileData.given_name,\n          lastname: profileData.family_name,\n          email: profileData.email,\n          userId: profileData.sub,\n          attributes: {\n            CGUValid: profileData.CGUValid,\n            GAR: profileData.GAR,\n            description: profileData.description,\n            imageUrl: profileData.imageUrl,\n            active_organisation: profileData.active_organisation,\n          },\n          organisations: array,\n          scope\n        };\n\n        this.authUpdateProfile(profile);\n        if (!profileData.active_organisation) {\n          return;\n        }\n        const activeOrganisation = await classicApi.fetchData<Organisation>({\n          api: 0,\n          path:\"organisation/\" + profileData.active_organisation,\n        });\n        this.authUpdate({\n          organisationId: activeOrganisation.id,\n          organisationName: activeOrganisation.name,\n        });\n        this.authUpdateOrganisation(activeOrganisation);\n        this.fetchProfileAsynchrone();\n\n        if (scope.length > 0) {\n          const { selectSubOrganisation, getSubOrganisation } = useSubOrganisations(toRef(activeOrganisation, 'id'));\n          const org = await getSubOrganisation(scope[0]);\n          selectSubOrganisation(org);\n        }\n      } catch(error) {\n        console.error(error);\n        if (this.authReload > 5) {\n          const { addNotification } = useNotificationStore();\n          const { t } = useI18n();\n          addNotification({\n            type: 'error',\n            title: t('Auth error - Couldn\\'t retrieve user info - Title'),\n            message: t('Auth error - Couldn\\'t retrieve user info - Message')\n          });\n          return;\n        }\n        this.authReload += 1;\n\n        // Wait before retrying\n        await new Promise((resolve) => setTimeout(resolve, 500 * this.authReload));\n        await this.fetchProfile();\n      }\n    },\n  },\n});\n\n/** Type for the AuthStore */\nexport type AuthStore = ReturnType<typeof useAuthStore>;\n","import { computed, ref } from 'vue';\n\nimport { Category } from '@/stores/class/general/category';\nimport { Rubriquage } from '@/stores/class/rubrique/rubriquage';\nimport { RubriquageFilter } from '@/stores/class/rubrique/rubriquageFilter';\nimport { Rubrique } from '@/stores/class/rubrique/rubrique';\nimport { defineStore } from 'pinia';\nimport { useAuthStore } from './AuthStore';\nimport { useRoute } from 'vue-router';\n\nimport { state as sdkParams } from './ParamSdkStore';\n\n/**\n * Store managing data regarding the filters to apply to know which\n * podcasts to show.\n */\nexport const useFilterStore = defineStore(\"FilterStore\", () => {\n  const _filterOrgaId = ref<string|null>(null);\n  const filterImgUrl = ref<string>();\n  const filterName = ref<string>();\n  const filterRubriquage = ref<Array<Rubriquage>>([]);\n  const filterRubrique = ref<Array<RubriquageFilter>>([]);\n  const filterRubriqueDisplay = ref<Array<Rubrique>>([]);\n  const filterLive = ref<boolean>(false);\n  const filterIab = ref<Category>();\n\n  const route = useRoute();\n  const authStore = useAuthStore();\n\n  /**\n   * ID of the current organisation.\n   */\n  const filterOrgaId = computed((): string|undefined => {\n    // When explicitly asking to view all content, disable filter\n    if (route?.query.viewall === \"true\") {\n      return undefined;\n\n    // When productor set in route, use it\n    } else if (route?.query.productor) {\n      return route.query.productor as string;\n\n    // If we don´t have an ID stored, use data from auth store\n    } else if(_filterOrgaId.value === null) {\n      return authStore.authOrgaId;\n\n    // Otherwise use stored ID\n    } else {\n      return _filterOrgaId.value ?? undefined;\n    }\n  });\n\n  /** Update stored organisation ID only if not already set */\n  function updateOrgaIfNecessary(orgaId: string|undefined): void {\n    if (orgaId && filterOrgaId.value === undefined && sdkParams.generalParameters.podcastmaker !== true) {\n      _filterOrgaId.value = orgaId;\n    }\n  }\n\n  /**\n   * The ID of the current organisation, regardless of other options.\n   * Use this if you want to know the organisation of the user even in\n   * unfocused mode (ie viewall = true)\n   */\n  const realOrgaId = computed(() => {\n    return _filterOrgaId.value ?? undefined;\n  });\n\n  function filterUpdateOrga(filter: {\n    orgaId?: string;\n    imgUrl?: string;\n    name?: string;\n    rubriquageArray?: Array<Rubriquage>;\n    isLive?: boolean;\n  }) {\n    if (filter.imgUrl || !filter.orgaId) {\n      filterImgUrl.value = filter.imgUrl;\n    }\n    if (filter.name || !filter.orgaId) {\n      filterName.value = filter.name;\n    }\n    if (filter.rubriquageArray) {\n      filterRubriquage.value = filter.rubriquageArray;\n    }\n    filterLive.value = filter.isLive ?? false;\n    filterIab.value = undefined;\n    _filterOrgaId.value = filter.orgaId ?? null;\n  }\n\n  function filterUpdateIab(iab?: Category) {\n    filterIab.value = iab;\n  }\n\n  function filterUpdateRubrique(rubriqueFilter: Array<RubriquageFilter>) {\n    filterRubrique.value = rubriqueFilter;\n  }\n\n  function filterUpdateRubriqueDisplay(rubriques: Array<Rubrique>) {\n    filterRubriqueDisplay.value = rubriques.filter(rubrique=> rubrique);\n  }\n\n  return {\n    filterOrgaId,\n    realOrgaId,\n\n    updateOrgaIfNecessary,\n    \n    filterUpdateOrga,\n    filterUpdateIab,\n    filterUpdateRubrique,\n    filterUpdateRubriqueDisplay,\n\n    filterImgUrl,\n    filterName,\n    filterRubriquage,\n    filterRubrique,\n    filterRubriqueDisplay,\n    filterLive,\n    filterIab\n  };\n});\n\n/** Type for the FilterStore */\nexport type FilterStore = ReturnType<typeof useFilterStore>;\n","import dayjs from \"dayjs\";\nimport classicApi from \"../api/classicApi\";\nimport { useAuthStore } from \"../stores/AuthStore\";\nimport { useApiStore } from \"../stores/ApiStore\";\nimport { useFilterStore } from \"../stores/FilterStore\";\nimport { FetchParam } from \"@/stores/class/general/fetchParam\";\nimport { Media } from \"@/stores/class/general/media\";\nimport { KeycloakRenewToken } from \"@/stores/class/user/person\";\n\nexport default {\n  async createAuthenticatedFetchHeader(\n    forceRefresh = false,\n  ): Promise<{ [key:string]: string }> {\n    const authStore = useAuthStore();\n    if(\"\"===authStore.authName){\n      return {};\n    }\n    const currentTime = dayjs();\n    const expirationDate = dayjs(authStore.authParam.expiration);\n\n    if (currentTime.isAfter(expirationDate) || forceRefresh) {\n      const bearerToken = await this.updateAccessToken();\n      return { Authorization: \"Bearer \" + bearerToken };\n    } else {\n      const bearerToken = authStore.authParam.accessToken;\n      return { Authorization: \"Bearer \" + bearerToken };\n    }\n  },\n  async updateAccessToken(): Promise<string> {\n    const authStore = useAuthStore();\n    const data = await this.refreshToken();\n    if (!data) {\n      return \"\";\n    }\n    authStore.authParam.expiration = data.expiration;\n    authStore.authParam.accessToken = data.accessToken;\n    authStore.authParam.refreshToken = data.refreshToken;\n    return data.accessToken;\n  },\n  async refreshTokenLoop(): Promise<void> {\n    const authStore = useAuthStore();\n    const currentTime = dayjs();\n    const expirationDate = dayjs(authStore.authParam.expiration);\n    if (currentTime.isAfter(expirationDate)) {\n      await this.updateAccessToken();\n    }\n    const millisecondDifference = dayjs(authStore.authParam.expiration).diff(\n      dayjs(),\n      \"millisecond\",\n    );\n    setTimeout(\n      () => {\n        this.refreshTokenLoop();\n      },\n      Math.max(millisecondDifference - 5000, 0),\n    );\n  },\n  async refreshToken(): Promise<\n    | {\n        accessToken: string;\n        refreshToken: string;\n        expiration: Date;\n      }\n    | undefined\n  > {\n    const authStore = useAuthStore();\n    const response = await classicApi.postData<KeycloakRenewToken>({\n      api: 20,\n      path:\"token\",\n      contentType:\"urlencoded\",\n      dataToSend:{\n        client_id: authStore.authParam.clientId,\n        grant_type: \"refresh_token\",\n        refresh_token: authStore.authParam.refreshToken,\n      },\n      isNotAuth: true,\n      catchFunction:() => {\n        const filterStore = useFilterStore();\n        filterStore.filterOrgaId = undefined;\n        filterStore.filterImgUrl = undefined;\n        window.location.href = \"/logout\";\n      },\n    });\n    if (response) {\n      return {\n        accessToken: response.access_token,\n        refreshToken: response.refresh_token,\n        expiration: dayjs().add(response.expires_in, \"seconds\").toDate(),\n      };\n    }\n  },\n  getMediaContent(media: Media | undefined): string {\n    if (!media) {\n      return \"\";\n    }\n    const apiStore = useApiStore();\n    const authStore = useAuthStore();\n    let timing = \"#t=\" + (media.cueIn ?? 0);\n    if (media.cueOut) {\n      timing += \",\" + media.cueOut;\n    }\n    return (\n      apiStore.mediaUrl +\n      \"media/content/\" +\n      media?.mediaId +\n      \"?access_token=\" +\n      authStore.authParam.accessToken +\n      timing\n    );\n  },\n  getUriSearchParams(parameters: FetchParam): URLSearchParams {\n    const _return = new URLSearchParams();\n    for (const [key, value] of Object.entries(parameters)) {\n      // remove empty array for stats #12323\n      if (\n        undefined !== value &&\n        null !== value &&\n        \"\" !== value &&\n        (!Array.isArray(value) || (Array.isArray(value) && value.length))\n      ) {\n        _return.append(key, value.toString());\n      }\n    }\n    return _return;\n  },\n  transformObjectValueToString<T>(object: T): { [key: string]: string } {\n    const objectString: { [key: string]: string } = {};\n    for (const key in object) {\n      const value = object[key];\n      if (null !== value && \"object\" === typeof value) {\n        objectString[key] = JSON.stringify(value);\n      } else if (value) {\n        objectString[key] = (value as any).toString();\n      }\n    }\n    return objectString;\n  },\n};\n","import {getApiUrl, ModuleApi} from \"./apiConnection\";\nimport fetchHelper from \"../helper/fetchHelper\";\nimport axios, { AxiosError } from 'axios';\nimport { FetchParam } from \"@/stores/class/general/fetchParam\";\nimport { state } from \"../stores/ParamSdkStore\";\n\ninterface RequestParameters{\n  api: ModuleApi,\n  path: string,\n  isNotAuth?:boolean,\n  parameters?:FetchParam,\n  headers?:{[key: string]: string},\n  forceRefresh?: boolean,\n  specialTreatement?: boolean,\n  dataToSend?: unknown,\n  contentType?: string,\n  noContentType?:boolean,\n  catchFunction?: () => void,\n  responseType?:{[key: string]: string},\n}\n\nexport interface APIOptions {\n    adaptParameters?: boolean;\n}\n\nexport default {\n  async fetchData<Type>(params:RequestParameters): Promise<Type> {\n    let paramsString = \"\";\n    if(params.parameters){\n      if(params.specialTreatement){\n        params.parameters = this.adjustParameters(params);\n      }\n      const parameters = fetchHelper.getUriSearchParams(params.parameters).toString();\n      paramsString = parameters.length ? '?' + parameters : '';\n    }\n    let authHeaders = {};\n    if(!params.isNotAuth){\n      authHeaders = await fetchHelper.createAuthenticatedFetchHeader(params.forceRefresh);\n    }\n    const url = getApiUrl(params.api) + params.path +paramsString;\n    const response = await axios.get(url, {...{headers:  {...params.headers, ...authHeaders}}, ...params.responseType});\n    return response.data;\n  },\n\n  async postData<Type>(params: RequestParameters): Promise<Type> {\n    let paramsString = \"\";\n    if(params.parameters){\n      const parameters = fetchHelper.getUriSearchParams(params.parameters).toString();\n      paramsString = parameters.length ? '?' + parameters : '';\n    }\n    const url = getApiUrl(params.api) + params.path + paramsString;\n    let authHeaders = {};\n    if(!params.isNotAuth){\n      authHeaders = await fetchHelper.createAuthenticatedFetchHeader(params.forceRefresh);\n    }\n    let typeHeader = {};\n    let dataToSend: any;\n    if('formData'===params.contentType){\n      typeHeader = { \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n      dataToSend = new FormData();\n      for (const key in params.dataToSend) {\n        const value = params.dataToSend[key];\n        if (undefined !== value) {\n          dataToSend.append(key, value);\n        }\n      }\n    }else if ('text'===params.contentType){\n      typeHeader = { \"Content-Type\": \"text/plain\" };\n      dataToSend = (params.dataToSend as string);\n    }else if('urlencoded' === params.contentType){\n      typeHeader = { \"Content-Type\": \"  application/x-www-form-urlencoded\" };\n      dataToSend = params.dataToSend;\n    }else if(null!=params.dataToSend || undefined!=params.dataToSend){\n      typeHeader = { \"Content-Type\": 'application/json; charset=utf-8' };\n      dataToSend =JSON.stringify(params.dataToSend);\n    }\n    if(params.noContentType){\n      typeHeader = {};\n    }\n    const response = await axios.post(url,dataToSend,{headers:{...params.headers, ...typeHeader, ...authHeaders} }).catch((error) => {\n      if(params.catchFunction){\n        params.catchFunction();\n      }else{\n        const axiosError= error as AxiosError;\n        return Promise.reject(axiosError);\n      }\n    });\n    return response?.data;\n  },\n\n  async putData<Type>(params: RequestParameters & { raw?: boolean }): Promise<Type> {\n    let paramsString = \"\";\n    if(params.parameters){\n      const parameters = fetchHelper.getUriSearchParams(params.parameters).toString();\n      paramsString = parameters.length ? '?' + parameters : '';\n    }\n    const url = getApiUrl(params.api) + params.path + paramsString;\n    let authHeaders = {};\n    if(!params.isNotAuth){\n      authHeaders = await fetchHelper.createAuthenticatedFetchHeader(params.forceRefresh);\n    }\n    let typeHeader = {};\n    let dataToSend: any;\n    if('formData'===params.contentType){\n      typeHeader = { \"Content-Type\": \"multipart/form-data; charset=utf-8\" };\n      dataToSend = new FormData();\n      for (const key in params.dataToSend) {\n        const value = params.dataToSend[key];\n        if (undefined !== value) {\n          dataToSend.append(key, value);\n        }\n      }\n    } else if (params.raw === true && params.dataToSend) {\n      typeHeader = { \"Content-Type\": 'text/plain; charset=utf-8' };\n      dataToSend = params.dataToSend;\n    }else if(null!=params.dataToSend || undefined!=params.dataToSend){\n      typeHeader = { \"Content-Type\": 'application/json; charset=utf-8' };\n      dataToSend = params.dataToSend;//JSON.stringify(params.dataToSend);\n    }\n\n    if(params.noContentType){\n      typeHeader = {};\n    }\n\n    const response = await axios.put(url,dataToSend,{headers:{...params.headers, ...typeHeader, ...authHeaders} });\n    return response.data;\n  },\n\n  async deleteData<Type>(params: RequestParameters):Promise<Type> {\n    let paramsString = \"\";\n    if(params.parameters){\n      const parameters = fetchHelper.getUriSearchParams(params.parameters).toString();\n      paramsString = parameters.length ? '?' + parameters : '';\n    }\n    const url = getApiUrl(params.api) + params.path + paramsString;\n    let authHeaders = {};\n    if(!params.isNotAuth){\n      authHeaders = await fetchHelper.createAuthenticatedFetchHeader(params.forceRefresh);\n    }\n    let dataToSend: any;\n    if('formData'===params.contentType){\n      dataToSend = new FormData();\n      for (const key in params.dataToSend) {\n        const value = params.dataToSend[key];\n        if (undefined !== value) {\n          dataToSend.append(key, value);\n        }\n      }\n    }else{\n      dataToSend = params.dataToSend;\n    }\n    const response = await axios.delete(url, {headers:{...params.headers, ...authHeaders},  data: dataToSend });\n    return response.data;\n  },\n\n  adjustParameters(params: RequestParameters){\n    const parametersUpdated = params.parameters ?? {};\n    if (params.path.includes('podcast/search')){\n      if(!params.parameters?.includeHidden || params.isNotAuth){\n        parametersUpdated.validity = true;\n      }else{\n        parametersUpdated.includeStatus = ['READY', 'PLANNED', 'PROCESSING', 'ERROR'];\n        if (!parametersUpdated.notLive) {\n          parametersUpdated.includeStatus.push('READY_TO_RECORD');\n        }\n      }\n    }\n\n    if(state.generalParameters.forceOrganisationId){\n      if(!parametersUpdated.organisationId || !(parametersUpdated.organisationId as Array<string>)?.length){\n        parametersUpdated.organisationId = state.generalParameters.forceOrganisationId;\n      }else if(Array.isArray(parametersUpdated.organisationId)&& 1===(parametersUpdated.organisationId as Array<string>).length && \"\"===parametersUpdated.organisationId[0]){\n        parametersUpdated.organisationId = undefined;\n      }\n    }\n\n    // Force filter on rubrique\n    if(undefined!==state.generalParameters.forceRubriqueId){\n      if(!parametersUpdated.rubriqueId){\n        parametersUpdated.rubriqueId = [];\n      }\n      parametersUpdated.rubriqueId = (parametersUpdated.rubriqueId as Array<number>).concat([state.generalParameters.forceRubriqueId].flat());\n    }\n\n    // Force filter on rubriquage\n    if(undefined!==state.generalParameters.forceNoRubriquageId){\n      if(!parametersUpdated.noRubriquageId){\n        parametersUpdated.noRubriquageId = [];\n      }\n      (parametersUpdated.noRubriquageId as number[]).push(...([state.generalParameters.forceNoRubriquageId].flat()));\n    }\n\n    return parametersUpdated;\n  },\n}\n"],"mappings":"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"}