{"version":3,"file":"VideoPage-DW__bu7l.mjs","names":[],"sources":["../src/components/pages/VideoPage.vue","../src/components/pages/VideoPage.vue"],"sourcesContent":["<template>\n  <section class=\"page-box\">\n    <template v-if=\"loaded && !error\">\n      <router-link\n        :to=\"{\n          name: 'podcast',\n          params: { podcastId: podcastId },\n        }\"\n        class=\"mt-3 mb-3 w-fit-content d-flex align-items-center\"\n        :title=\"t('Episode name page', { name: podcast?.title })\"\n      >\n        <ChevronLeftIcon />{{ t(\"Episode page\") }}\n      </router-link>\n      <div\n        v-if=\"videoId || isLiveReadyToRecord\"\n        class=\"d-flex video-page-container\"\n      >\n        <div class=\"w-70-responsive\">\n          <template v-if=\"isLiveReadyToRecord\">\n            <PlayerVideoHls\n              v-if=\"recordingLive\"\n              :hls-url=\"hlsVideoUrl\"\n              :is-secured=\"isSecured\"\n              :responsive=\"true\"\n            />\n            <div\n              v-if=\"isCounter || overrideText\"\n              class=\"d-flex flex-column align-items-center flex-grow-1 blue-bg p-3\"\n            >\n              <CountdownOctopus\n                :time-remaining=\"timeRemaining\"\n                :override-text=\"overrideText\"\n              />\n            </div>\n          </template>\n          <PlayerVideoDigiteka\n            v-else\n            :video-id=\"videoId\"\n            :podcast-id=\"podcastId\"\n            responsive\n          />\n        </div>\n        <div class=\"w-30-responsive info-video-container\">\n          <div class=\"d-flex flex-column flex-grow-1 w-100\">\n            <ClassicNav\n              v-if=\"tabs.length\"\n              v-model:active-tab=\"activeTab\"\n              :tab-number=\"tabs.length\"\n              :transparent=\"true\"\n            >\n              <template v-for=\"(tab, index) in tabs\" #[index]>\n                {{ tab }}\n              </template>\n              <template #tab0>\n                <VideoModuleBox\n                  :podcast=\"podcast\"\n                  :date=\"date\"\n                  :duration=\"duration\"\n                />\n              </template>\n              <template #tab1>\n                <section>\n                  <CommentSection\n                    :podcast=\"podcast\"\n                    class=\"module-box-transparent\"\n                  />\n                </section>\n              </template>\n            </ClassicNav>\n            <VideoModuleBox\n              v-else\n              class=\"p-2 video-module-box\"\n              :podcast=\"podcast\"\n              :date=\"date\"\n              :duration=\"duration\"\n              :duration-iso=\"durationIso\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <div\n      v-if=\"!error && !videoId && !isLiveReadyToRecord\"\n      class=\"text-center text-danger h3\"\n    >\n      {{ t(\"The episode does not have an associated video\") }}\n    </div>\n    <ClassicLoading\n      :loading-text=\"!loaded ? t('Loading content ...') : undefined\"\n      :error-text=\"\n        error\n          ? t(`This episode is not available for (re)listening`)\n          : undefined\n      \"\n    />\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport ChevronLeftIcon from \"vue-material-design-icons/ChevronLeft.vue\";\nimport ClassicLoading from \"../form/ClassicLoading.vue\";\nimport classicApi from \"../../api/classicApi\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport ClassicNav from \"../misc/ClassicNav.vue\";\nimport {useSeoTitleUrl} from \"../composable/route/useSeoTitleUrl\";\nimport {usePodcastView} from \"../composable/podcasts/usePodcastView\";\nimport { computed, defineAsyncComponent, onBeforeUnmount, Ref, ref, watch } from \"vue\";\nimport { AxiosError } from \"axios\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nimport { useCommentStore } from \"../../stores/CommentStore\";\nimport { useApiStore } from \"../../stores/ApiStore\";\nimport { CommentsConfig } from \"@/stores/class/config/commentsConfig\";\nimport {\n  Conference,\n  ConferencePublicInfo,\n} from \"@/stores/class/conference/conference\";\nimport { usePlayerStore } from \"../../stores/PlayerStore\";\nimport { useGeneralStore } from \"../../stores/GeneralStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useRoute } from \"vue-router\";\nimport { useErrorHandler } from \"../composable/useErrorHandler\";\nconst PlayerVideoDigiteka = defineAsyncComponent(\n  () => import(\"../misc/player/video/PlayerVideoDigiteka.vue\"),\n);\nconst PlayerVideoHls = defineAsyncComponent(\n  () => import(\"../misc/player/video/PlayerVideoHls.vue\"),\n);\nconst CommentSection = defineAsyncComponent(\n  () => import(\"../display/comments/CommentSection.vue\"),\n);\nconst VideoModuleBox = defineAsyncComponent(\n  () => import(\"../display/podcasts/VideoModuleBox.vue\"),\n);\nconst CountdownOctopus = defineAsyncComponent(\n  () => import(\"../display/live/CountdownOctopus.vue\"),\n);\n\n//Props \nconst props = defineProps({\n  podcastId:{ default: 0, type: Number },\n})\n\n//Data \nconst loaded = ref(false);\nconst podcast: Ref<Podcast | undefined> = ref(undefined);\nconst error = ref(false);\nconst activeTab = ref(0);\nconst configPodcast: Ref<CommentsConfig | undefined> = ref(undefined);\nconst podcastConference: Ref<Conference | undefined> = ref(undefined);\nconst intervalStatusConference: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined);\n\n//Composables\nconst { \n  isLiveReadyToRecord,\n  isCounter,\n  timeRemaining,\n  date,\n  duration,\n  durationIso,\n  editRight\n} = usePodcastView(podcast, podcastConference);\nconst {handle403} = useErrorHandler();\nconst { updatePathParams } = useSeoTitleUrl();\nconst authStore = useAuthStore();\nconst apiStore = useApiStore();\nconst generalStore = useGeneralStore();\nconst playerStore = usePlayerStore();\nconst filterStore = useFilterStore();\nconst commentStore = useCommentStore();\nconst {t} = useI18n();\nconst route = useRoute();\n\n//Computed\nconst videoId = computed(() => podcast.value?.video?.videoId);\nconst canPostComment = computed(() => {\n  return commentStore.getCanPostComment(\n    configPodcast.value,\n    podcast.value,\n    undefined !== authStore.authOrgaId,\n  );\n});\nconst tabs = computed(() => {\n  if (canPostComment.value) {\n    return [t(\"Information\"), t(\"Comments\")];\n  }\n  return [];\n});\nconst recordingLive = computed(() => {\n  return (\n        undefined !== podcastConference.value &&\n        -1 !== podcastConference.value.conferenceId &&\n        (\"RECORDING\" === podcastConference.value.status ||\n          \"PENDING\" === podcastConference.value.status)\n      );\n});\nconst hlsVideoUrl = computed(() => {\n  if (!recordingLive.value || !podcastConference.value) {\n    return \"\";\n  }\n  return `${apiStore.hlsUrl}live/video_${podcastConference.value.hlsIdentifier}/index.m3u8`;\n});\nconst isSecured = computed(() => {\n  return \"SECURED\" === podcast.value?.organisation?.privacy;\n});\nconst overrideText = computed(() => {\n  if (\"PUBLISHING\" !== podcastConference.value?.status) {\n    return;\n  }\n  return t(\"In the process of being published\");\n});\n\n//Watch\nwatch(()=>props.podcastId, async () => {\n  await getPodcastDetails();\n  if (!podcast.value) {\n    return;\n  }\n  commentStore.initCommentUser();\n  configPodcast.value = await commentStore.getCommentsConfig(podcast.value);\n}, {immediate: true});\n\n\nonBeforeUnmount(() => {\n  clearInterval(intervalStatusConference.value as unknown as number);\n})\n\n//Methods\nasync function getPodcastDetails(): Promise<void> {\n  loaded.value = false;\n  error.value = false;\n  try {\n    podcast.value = await classicApi.fetchData<Podcast>({\n      api: 0,\n      path: \"podcast/\" + props.podcastId,\n    });\n    document.title = podcast.value.title + \" - \"+generalStore.metaTitle;\n    const orga = podcast.value.organisation;\n    const privateAccess =\n      \"PUBLIC\" !== orga.privacy &&\n      filterStore.filterOrgaId !== orga.id &&\n      route.query.productor !== orga.id;\n    const notValid =\n      (!podcast.value.availability.visibility ||\n        ![\"READY_TO_RECORD\", \"READY\", \"PROCESSING\"].includes(\n          podcast.value.processingStatus ?? \"\",\n        ) ||\n        !podcast.value.valid) &&\n      !editRight.value;\n    if (privateAccess || notValid) {\n      error.value = true;\n    } else {\n      updatePathParams(podcast.value.title);\n      if (\n        podcast.value.conferenceId &&\n        \"READY\" !== podcast.value.processingStatus\n      ) {\n        await fetchConferenceStatus();\n        intervalStatusConference.value = setInterval(() => { fetchConferenceStatus(); }, 3000);\n        playerStore.playerPlay(\n          {\n            ...podcast.value,\n            ...{ \n              conferenceId: podcast.value.conferenceId,\n              hlsIdentifier: podcastConference.value?.hlsIdentifier,\n            },\n          },\n          true,\n        );\n      }\n    }\n  } catch (errorCatched) {\n    handle403(errorCatched as AxiosError);\n    error.value = true;\n  }\n  loaded.value = true;\n}\n\nasync function fetchConferenceStatus() {\n  if (!podcast.value?.conferenceId) {\n    return;\n  }\n  const data = await classicApi.fetchData<ConferencePublicInfo>({\n    api: 9,\n    path: \"conference/info/\" + podcast.value.conferenceId,\n  });\n  podcastConference.value = {\n    ...data,\n    ...{\n      conferenceId: podcast.value.conferenceId,\n      title: \"\",\n    },\n  };\n  if (\"DEBRIEFING\" === data.status) {\n    clearInterval(intervalStatusConference.value as unknown as number);\n  }\n}\n</script>\n<style lang=\"scss\">\n.octopus-app .video-page-container {\n  align-items: stretch;\n  flex-grow: 1;\n  background: var(--octopus-primary-really-transparent);\n  border-radius: var(--octopus-border-radius);\n  box-shadow: 0 0 10px 1px var(--octopus-primary-transparent);\n\n  .info-video-container {\n    display: flex;\n    flex-direction: column;\n\n    .octopus-tab-pane,\n    .video-module-box {\n      height: 0;\n      overflow-y: auto;\n\n      @media (width <= 960px) {\n        height: inherit;\n      }\n    }\n\n    .classic-nav-tab-container {\n      flex-direction: column;\n    }\n  }\n\n  .module-box.module-box-transparent {\n    margin: 0;\n    background: transparent;\n    border: 0;\n    padding: 0;\n  }\n\n  .w-70-responsive {\n    width: 70%;\n    aspect-ratio: 16/9;\n  }\n\n  .w-30-responsive {\n    width: 30%;\n  }\n\n  .w-70-responsive,\n  .w-30-responsive {\n    display: flex;\n    align-items: stretch;\n    flex-grow: 1;\n\n    @media (width <= 960px) {\n      width: 100%;\n      padding: 0 !important;\n    }\n  }\n\n  .really-light-secondary-bg {\n    background: white;\n  }\n}\n</style>\n","<template>\n  <section class=\"page-box\">\n    <template v-if=\"loaded && !error\">\n      <router-link\n        :to=\"{\n          name: 'podcast',\n          params: { podcastId: podcastId },\n        }\"\n        class=\"mt-3 mb-3 w-fit-content d-flex align-items-center\"\n        :title=\"t('Episode name page', { name: podcast?.title })\"\n      >\n        <ChevronLeftIcon />{{ t(\"Episode page\") }}\n      </router-link>\n      <div\n        v-if=\"videoId || isLiveReadyToRecord\"\n        class=\"d-flex video-page-container\"\n      >\n        <div class=\"w-70-responsive\">\n          <template v-if=\"isLiveReadyToRecord\">\n            <PlayerVideoHls\n              v-if=\"recordingLive\"\n              :hls-url=\"hlsVideoUrl\"\n              :is-secured=\"isSecured\"\n              :responsive=\"true\"\n            />\n            <div\n              v-if=\"isCounter || overrideText\"\n              class=\"d-flex flex-column align-items-center flex-grow-1 blue-bg p-3\"\n            >\n              <CountdownOctopus\n                :time-remaining=\"timeRemaining\"\n                :override-text=\"overrideText\"\n              />\n            </div>\n          </template>\n          <PlayerVideoDigiteka\n            v-else\n            :video-id=\"videoId\"\n            :podcast-id=\"podcastId\"\n            responsive\n          />\n        </div>\n        <div class=\"w-30-responsive info-video-container\">\n          <div class=\"d-flex flex-column flex-grow-1 w-100\">\n            <ClassicNav\n              v-if=\"tabs.length\"\n              v-model:active-tab=\"activeTab\"\n              :tab-number=\"tabs.length\"\n              :transparent=\"true\"\n            >\n              <template v-for=\"(tab, index) in tabs\" #[index]>\n                {{ tab }}\n              </template>\n              <template #tab0>\n                <VideoModuleBox\n                  :podcast=\"podcast\"\n                  :date=\"date\"\n                  :duration=\"duration\"\n                />\n              </template>\n              <template #tab1>\n                <section>\n                  <CommentSection\n                    :podcast=\"podcast\"\n                    class=\"module-box-transparent\"\n                  />\n                </section>\n              </template>\n            </ClassicNav>\n            <VideoModuleBox\n              v-else\n              class=\"p-2 video-module-box\"\n              :podcast=\"podcast\"\n              :date=\"date\"\n              :duration=\"duration\"\n              :duration-iso=\"durationIso\"\n            />\n          </div>\n        </div>\n      </div>\n    </template>\n    <div\n      v-if=\"!error && !videoId && !isLiveReadyToRecord\"\n      class=\"text-center text-danger h3\"\n    >\n      {{ t(\"The episode does not have an associated video\") }}\n    </div>\n    <ClassicLoading\n      :loading-text=\"!loaded ? t('Loading content ...') : undefined\"\n      :error-text=\"\n        error\n          ? t(`This episode is not available for (re)listening`)\n          : undefined\n      \"\n    />\n  </section>\n</template>\n\n<script setup lang=\"ts\">\nimport ChevronLeftIcon from \"vue-material-design-icons/ChevronLeft.vue\";\nimport ClassicLoading from \"../form/ClassicLoading.vue\";\nimport classicApi from \"../../api/classicApi\";\nimport { Podcast } from \"@/stores/class/general/podcast\";\nimport ClassicNav from \"../misc/ClassicNav.vue\";\nimport {useSeoTitleUrl} from \"../composable/route/useSeoTitleUrl\";\nimport {usePodcastView} from \"../composable/podcasts/usePodcastView\";\nimport { computed, defineAsyncComponent, onBeforeUnmount, Ref, ref, watch } from \"vue\";\nimport { AxiosError } from \"axios\";\nimport { useFilterStore } from \"../../stores/FilterStore\";\nimport { useAuthStore } from \"../../stores/AuthStore\";\nimport { useCommentStore } from \"../../stores/CommentStore\";\nimport { useApiStore } from \"../../stores/ApiStore\";\nimport { CommentsConfig } from \"@/stores/class/config/commentsConfig\";\nimport {\n  Conference,\n  ConferencePublicInfo,\n} from \"@/stores/class/conference/conference\";\nimport { usePlayerStore } from \"../../stores/PlayerStore\";\nimport { useGeneralStore } from \"../../stores/GeneralStore\";\nimport { useI18n } from \"vue-i18n\";\nimport { useRoute } from \"vue-router\";\nimport { useErrorHandler } from \"../composable/useErrorHandler\";\nconst PlayerVideoDigiteka = defineAsyncComponent(\n  () => import(\"../misc/player/video/PlayerVideoDigiteka.vue\"),\n);\nconst PlayerVideoHls = defineAsyncComponent(\n  () => import(\"../misc/player/video/PlayerVideoHls.vue\"),\n);\nconst CommentSection = defineAsyncComponent(\n  () => import(\"../display/comments/CommentSection.vue\"),\n);\nconst VideoModuleBox = defineAsyncComponent(\n  () => import(\"../display/podcasts/VideoModuleBox.vue\"),\n);\nconst CountdownOctopus = defineAsyncComponent(\n  () => import(\"../display/live/CountdownOctopus.vue\"),\n);\n\n//Props \nconst props = defineProps({\n  podcastId:{ default: 0, type: Number },\n})\n\n//Data \nconst loaded = ref(false);\nconst podcast: Ref<Podcast | undefined> = ref(undefined);\nconst error = ref(false);\nconst activeTab = ref(0);\nconst configPodcast: Ref<CommentsConfig | undefined> = ref(undefined);\nconst podcastConference: Ref<Conference | undefined> = ref(undefined);\nconst intervalStatusConference: Ref<ReturnType<typeof setTimeout> | undefined> = ref(undefined);\n\n//Composables\nconst { \n  isLiveReadyToRecord,\n  isCounter,\n  timeRemaining,\n  date,\n  duration,\n  durationIso,\n  editRight\n} = usePodcastView(podcast, podcastConference);\nconst {handle403} = useErrorHandler();\nconst { updatePathParams } = useSeoTitleUrl();\nconst authStore = useAuthStore();\nconst apiStore = useApiStore();\nconst generalStore = useGeneralStore();\nconst playerStore = usePlayerStore();\nconst filterStore = useFilterStore();\nconst commentStore = useCommentStore();\nconst {t} = useI18n();\nconst route = useRoute();\n\n//Computed\nconst videoId = computed(() => podcast.value?.video?.videoId);\nconst canPostComment = computed(() => {\n  return commentStore.getCanPostComment(\n    configPodcast.value,\n    podcast.value,\n    undefined !== authStore.authOrgaId,\n  );\n});\nconst tabs = computed(() => {\n  if (canPostComment.value) {\n    return [t(\"Information\"), t(\"Comments\")];\n  }\n  return [];\n});\nconst recordingLive = computed(() => {\n  return (\n        undefined !== podcastConference.value &&\n        -1 !== podcastConference.value.conferenceId &&\n        (\"RECORDING\" === podcastConference.value.status ||\n          \"PENDING\" === podcastConference.value.status)\n      );\n});\nconst hlsVideoUrl = computed(() => {\n  if (!recordingLive.value || !podcastConference.value) {\n    return \"\";\n  }\n  return `${apiStore.hlsUrl}live/video_${podcastConference.value.hlsIdentifier}/index.m3u8`;\n});\nconst isSecured = computed(() => {\n  return \"SECURED\" === podcast.value?.organisation?.privacy;\n});\nconst overrideText = computed(() => {\n  if (\"PUBLISHING\" !== podcastConference.value?.status) {\n    return;\n  }\n  return t(\"In the process of being published\");\n});\n\n//Watch\nwatch(()=>props.podcastId, async () => {\n  await getPodcastDetails();\n  if (!podcast.value) {\n    return;\n  }\n  commentStore.initCommentUser();\n  configPodcast.value = await commentStore.getCommentsConfig(podcast.value);\n}, {immediate: true});\n\n\nonBeforeUnmount(() => {\n  clearInterval(intervalStatusConference.value as unknown as number);\n})\n\n//Methods\nasync function getPodcastDetails(): Promise<void> {\n  loaded.value = false;\n  error.value = false;\n  try {\n    podcast.value = await classicApi.fetchData<Podcast>({\n      api: 0,\n      path: \"podcast/\" + props.podcastId,\n    });\n    document.title = podcast.value.title + \" - \"+generalStore.metaTitle;\n    const orga = podcast.value.organisation;\n    const privateAccess =\n      \"PUBLIC\" !== orga.privacy &&\n      filterStore.filterOrgaId !== orga.id &&\n      route.query.productor !== orga.id;\n    const notValid =\n      (!podcast.value.availability.visibility ||\n        ![\"READY_TO_RECORD\", \"READY\", \"PROCESSING\"].includes(\n          podcast.value.processingStatus ?? \"\",\n        ) ||\n        !podcast.value.valid) &&\n      !editRight.value;\n    if (privateAccess || notValid) {\n      error.value = true;\n    } else {\n      updatePathParams(podcast.value.title);\n      if (\n        podcast.value.conferenceId &&\n        \"READY\" !== podcast.value.processingStatus\n      ) {\n        await fetchConferenceStatus();\n        intervalStatusConference.value = setInterval(() => { fetchConferenceStatus(); }, 3000);\n        playerStore.playerPlay(\n          {\n            ...podcast.value,\n            ...{ \n              conferenceId: podcast.value.conferenceId,\n              hlsIdentifier: podcastConference.value?.hlsIdentifier,\n            },\n          },\n          true,\n        );\n      }\n    }\n  } catch (errorCatched) {\n    handle403(errorCatched as AxiosError);\n    error.value = true;\n  }\n  loaded.value = true;\n}\n\nasync function fetchConferenceStatus() {\n  if (!podcast.value?.conferenceId) {\n    return;\n  }\n  const data = await classicApi.fetchData<ConferencePublicInfo>({\n    api: 9,\n    path: \"conference/info/\" + podcast.value.conferenceId,\n  });\n  podcastConference.value = {\n    ...data,\n    ...{\n      conferenceId: podcast.value.conferenceId,\n      title: \"\",\n    },\n  };\n  if (\"DEBRIEFING\" === data.status) {\n    clearInterval(intervalStatusConference.value as unknown as number);\n  }\n}\n</script>\n<style lang=\"scss\">\n.octopus-app .video-page-container {\n  align-items: stretch;\n  flex-grow: 1;\n  background: var(--octopus-primary-really-transparent);\n  border-radius: var(--octopus-border-radius);\n  box-shadow: 0 0 10px 1px var(--octopus-primary-transparent);\n\n  .info-video-container {\n    display: flex;\n    flex-direction: column;\n\n    .octopus-tab-pane,\n    .video-module-box {\n      height: 0;\n      overflow-y: auto;\n\n      @media (width <= 960px) {\n        height: inherit;\n      }\n    }\n\n    .classic-nav-tab-container {\n      flex-direction: column;\n    }\n  }\n\n  .module-box.module-box-transparent {\n    margin: 0;\n    background: transparent;\n    border: 0;\n    padding: 0;\n  }\n\n  .w-70-responsive {\n    width: 70%;\n    aspect-ratio: 16/9;\n  }\n\n  .w-30-responsive {\n    width: 30%;\n  }\n\n  .w-70-responsive,\n  .w-30-responsive {\n    display: flex;\n    align-items: stretch;\n    flex-grow: 1;\n\n    @media (width <= 960px) {\n      width: 100%;\n      padding: 0 !important;\n    }\n  }\n\n  .really-light-secondary-bg {\n    background: white;\n  }\n}\n</style>\n"],"mappings":"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"}