{"version":3,"file":"PodcastRawTranscript-D3bXLNub.mjs","names":[],"sources":["../src/components/display/podcasts/PodcastRawTranscript.vue","../src/components/display/podcasts/PodcastRawTranscript.vue"],"sourcesContent":["<template>\n    <div>\n        <AccessibilityModal\n            v-if=\"isAccessibilityModal\"\n            @save=\"saveAccessibility\"\n            @close=\"isAccessibilityModal = false\"\n        />\n        <div class=\"transcription-section-buttons\">\n            <button\n                v-if=\"isOpen\"\n                class=\"btn btn-primary m-0\"\n                @click=\"isAccessibilityModal = true\"\n            >\n                <EyeOutlineIcon class=\"me-1\" /> {{ t('Transcript Accessibility') }}\n            </button>\n\n            <div\n                v-if=\"isOpen && availableLanguagesOptions.length > 0\"\n                class=\"language-selector\"\n            >\n                <span class=\"me-2\">{{ t('Transcript - Available languages') }}</span>\n                <ClassicSelect\n                    :text-init=\"currentLanguage\"\n                    :is-disabled=\"!loadingDone\"\n                    :options=\"availableLanguagesOptions\"\n                    :display-label=\"false\"\n                    @update:text-init=\"changeLanguage\"\n                />\n            </div>\n            \n            <button\n                class=\"btn btn-transcript\"\n                :class=\"{ open: isOpen }\"\n                @click=\"isOpen = !isOpen\"\n            >\n                {{ buttonText }}\n            </button>\n        </div>\n        <div v-if=\"isOpen\" class=\"transcription-body\">\n            <ClassicLoading\n                :loading-text=\"!loadingDone ? t('Loading content ...') : undefined\"\n            />\n            <div class=\"transcription-text\">\n                <template v-if=\"loadingDone && transcript?.length\">\n                    {{ transcript }}\n                </template>\n                <template v-if=\"loadingDone && !transcript?.length\">\n                    {{ t(\"Transcript does not yet exist for this episode\") }}\n                </template>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport cookiesHelper from \"../../../helper/cookiesHelper\";\nimport EyeOutlineIcon from \"vue-material-design-icons/EyeOutline.vue\";\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport { computed, defineAsyncComponent, ref, watch } from \"vue\";\nimport { useI18n } from \"vue-i18n\";\nimport { transcriptionApi, TranslationState } from \"../../../api/transcriptionApi\";\nimport { useTranslation } from \"../../composable/useTranslation\";\nimport ClassicSelect from \"../../form/ClassicSelect.vue\";\nconst AccessibilityModal = defineAsyncComponent(\n    () => import(\"../accessibility/AccessibilityModal.vue\"),\n);\n\n//Props \nconst props = defineProps<{\n    /** ID of the podcast for which to display transcription */\n    podcastId: number;\n}>();\n\n//Data \nconst isOpen = ref(false);\nconst loadingDone = ref(false);\nconst isAccessibilityModal = ref(false);\nconst transcript = ref<string|undefined>(undefined);\n/** Native language of the podcast */\nconst nativeLanguage = ref('');\n/** List of languages for which a transcription exists */\nconst availableLanguages = ref<Array<string>>([]);\n/** Currently shown language */\nconst currentLanguage = ref('');\n\n//Composables\nconst { t } = useI18n();\nconst { convertSrtToPlainText, getMostRelevantLanguage } = useTranslation();\n\n//Computed\nconst buttonText = computed(() => isOpen.value? t(\"Hide transcript\"): t(\"View transcript\"));\n\nconst availableLanguagesOptions = computed(() => {\n    return availableLanguages.value.map(lang => ({\n        title: lang,\n        value: lang\n    }));\n})\n\n//Watch\nwatch(isOpen, () => {\n    if (isOpen.value && !loadingDone.value) {\n        if (props.podcastId) {\n            fetchTranscripts();\n        }\n        getAccessibility();\n    }\n});\n\n//Methods\nfunction getAccessibility(){\n    const fontSize = cookiesHelper.getCookie(\"octopus-font-size\");\n    if (null !== fontSize) {\n        setCssProperty('--octopus-accessibility-font-size', fontSize);\n    }\n    const background = cookiesHelper.getCookie(\"octopus-background\");\n    if (null !== background) {\n        setCssProperty('--octopus-accessibility-background', background);\n    }\n    const color = cookiesHelper.getCookie(\"octopus-color\");\n    if (null !== color) {\n        setCssProperty('--octopus-accessibility-color', color);\n    }\n}\n\nfunction setCssProperty(name: string, value: string){\n    document.documentElement.style.setProperty(name,value);\n}\n\nfunction saveAccessibility(accessibility: {fontSize: number,background: string,color: string}){\n    setCssProperty('--octopus-accessibility-font-size', accessibility.fontSize+'px');\n    cookiesHelper.setCookie(\"octopus-font-size\", accessibility.fontSize+'px');\n    setCssProperty('--octopus-accessibility-background', accessibility.background);\n    cookiesHelper.setCookie(\"octopus-background\",accessibility.background);\n    setCssProperty('--octopus-accessibility-color', accessibility.color);\n    cookiesHelper.setCookie(\"octopus-color\",accessibility.color);\n    isAccessibilityModal.value = false;\n}\n\nasync function fetchTranscripts(language?: string): Promise<void> {\n    try {\n        const translation = await transcriptionApi.getTranslations(props.podcastId);\n        if (language === undefined) {\n            const { ready, available } = await getMostRelevantLanguage(translation);\n            // If available language is set, it is better than ready, so use it\n            language = available ?? ready;\n        }\n        const srt = await transcriptionApi.getTranslation(props.podcastId, language, true);\n        transcript.value = convertSrtToPlainText(srt);\n        \n        availableLanguages.value = translation.translations\n            .filter(t => t.state === TranslationState.FINISHED)\n            .map(t => t.language);\n        nativeLanguage.value = translation.nativeLanguage;\n        currentLanguage.value = language;\n        availableLanguages.value.unshift(translation.nativeLanguage);\n\n        if (!availableLanguages.value.includes(language)) {\n            availableLanguages.value.push(language);\n        }\n    } catch (error) {\n        console.error(error);\n    }\n    loadingDone.value = true;\n}\n\nasync function changeLanguage(language: string): Promise<void> {\n    loadingDone.value = false;\n    currentLanguage.value = language;\n    transcript.value = undefined;\n    try {\n        const srt = await transcriptionApi.getTranslation(props.podcastId, language);        \n        transcript.value = convertSrtToPlainText(srt);\n    } catch (error) {\n        console.error(error);\n    }\n    loadingDone.value = true;\n}\n\n/** Force reloading */\nfunction reset(): void {\n    if (isOpen.value || loadingDone.value) {\n        fetchTranscripts(currentLanguage.value);\n    }\n}\n\ndefineExpose({ reset });\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-app {\n  --octopus-accessibility-font-size: 16px;\n  --octopus-accessibility-background: var(--octopus-background);\n  --octopus-accessibility-color: var(--octopus-color-text);\n\n  .language-selector {\n    display: flex;\n    align-items: center;\n    margin-left: 1rem;\n\n    span {\n        font-weight: 600;\n    }\n  }\n\n  .transcription-section-buttons{\n    display: flex;\n    justify-content: space-between;\n    flex-wrap: wrap;\n    @media (width <= 625px) {\n      flex-direction: column;\n    }\n  }\n  .btn-transcript {\n    position: relative;\n    border-radius: var(--octopus-border-radius);\n    overflow: hidden;\n    transition: all 0.2s linear 0s;\n    \n    &.open{\n      margin-left:auto;\n      direction: rtl;\n      @media (width <= 625px) {\n        margin-top: 0.5rem;\n      }\n    }\n    &:not(.open){\n      margin-right: auto;\n    }\n\n    &:not(.open)::before,\n    &.open::after {\n      content: \"➤\";\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      position: absolute;\n      top: 0;\n      height: 100%;\n      width: 30px;\n      border-radius: 0 50% 50% 0;\n      background-color: var(--octopus-background-transparent);\n      transform: scale(0, 1);\n      transition: all 0.2s linear 0s;\n    }\n\n    &:not(.open)::before {\n      left: 0;\n      transform-origin: left center;\n    }\n\n    &.open::after {\n      right: -30px;\n      transform-origin: center left;\n    }\n    &:hover {\n      text-indent: 30px;\n    }\n\n    &:not(.open):hover::before,\n    &.open:hover::after {\n      text-indent: 0;\n    }\n\n    &:not(.open):hover::before {\n      transform: scale(1, 1);\n    }\n\n    &.open:hover::after {\n      transform: scale(-1, 1);\n    }\n  }\n\n  .transcription-body {\n    font-size: var(--octopus-accessibility-font-size);\n    position: relative;\n    padding: 1rem;\n    max-height: 250px;\n    display: flex;\n    justify-content: center;\n    white-space: pre-wrap;\n    background: var(--octopus-accessibility-background);\n    color: var(--octopus-accessibility-color);\n    border: 2px solid var(--octopus-border-default);\n    border-radius: var(--octopus-border-radius);\n\n    .transcription-text {\n      overflow: hidden auto;\n    }\n  }\n}\n</style>\n","<template>\n    <div>\n        <AccessibilityModal\n            v-if=\"isAccessibilityModal\"\n            @save=\"saveAccessibility\"\n            @close=\"isAccessibilityModal = false\"\n        />\n        <div class=\"transcription-section-buttons\">\n            <button\n                v-if=\"isOpen\"\n                class=\"btn btn-primary m-0\"\n                @click=\"isAccessibilityModal = true\"\n            >\n                <EyeOutlineIcon class=\"me-1\" /> {{ t('Transcript Accessibility') }}\n            </button>\n\n            <div\n                v-if=\"isOpen && availableLanguagesOptions.length > 0\"\n                class=\"language-selector\"\n            >\n                <span class=\"me-2\">{{ t('Transcript - Available languages') }}</span>\n                <ClassicSelect\n                    :text-init=\"currentLanguage\"\n                    :is-disabled=\"!loadingDone\"\n                    :options=\"availableLanguagesOptions\"\n                    :display-label=\"false\"\n                    @update:text-init=\"changeLanguage\"\n                />\n            </div>\n            \n            <button\n                class=\"btn btn-transcript\"\n                :class=\"{ open: isOpen }\"\n                @click=\"isOpen = !isOpen\"\n            >\n                {{ buttonText }}\n            </button>\n        </div>\n        <div v-if=\"isOpen\" class=\"transcription-body\">\n            <ClassicLoading\n                :loading-text=\"!loadingDone ? t('Loading content ...') : undefined\"\n            />\n            <div class=\"transcription-text\">\n                <template v-if=\"loadingDone && transcript?.length\">\n                    {{ transcript }}\n                </template>\n                <template v-if=\"loadingDone && !transcript?.length\">\n                    {{ t(\"Transcript does not yet exist for this episode\") }}\n                </template>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport cookiesHelper from \"../../../helper/cookiesHelper\";\nimport EyeOutlineIcon from \"vue-material-design-icons/EyeOutline.vue\";\nimport ClassicLoading from \"../../form/ClassicLoading.vue\";\nimport { computed, defineAsyncComponent, ref, watch } from \"vue\";\nimport { useI18n } from \"vue-i18n\";\nimport { transcriptionApi, TranslationState } from \"../../../api/transcriptionApi\";\nimport { useTranslation } from \"../../composable/useTranslation\";\nimport ClassicSelect from \"../../form/ClassicSelect.vue\";\nconst AccessibilityModal = defineAsyncComponent(\n    () => import(\"../accessibility/AccessibilityModal.vue\"),\n);\n\n//Props \nconst props = defineProps<{\n    /** ID of the podcast for which to display transcription */\n    podcastId: number;\n}>();\n\n//Data \nconst isOpen = ref(false);\nconst loadingDone = ref(false);\nconst isAccessibilityModal = ref(false);\nconst transcript = ref<string|undefined>(undefined);\n/** Native language of the podcast */\nconst nativeLanguage = ref('');\n/** List of languages for which a transcription exists */\nconst availableLanguages = ref<Array<string>>([]);\n/** Currently shown language */\nconst currentLanguage = ref('');\n\n//Composables\nconst { t } = useI18n();\nconst { convertSrtToPlainText, getMostRelevantLanguage } = useTranslation();\n\n//Computed\nconst buttonText = computed(() => isOpen.value? t(\"Hide transcript\"): t(\"View transcript\"));\n\nconst availableLanguagesOptions = computed(() => {\n    return availableLanguages.value.map(lang => ({\n        title: lang,\n        value: lang\n    }));\n})\n\n//Watch\nwatch(isOpen, () => {\n    if (isOpen.value && !loadingDone.value) {\n        if (props.podcastId) {\n            fetchTranscripts();\n        }\n        getAccessibility();\n    }\n});\n\n//Methods\nfunction getAccessibility(){\n    const fontSize = cookiesHelper.getCookie(\"octopus-font-size\");\n    if (null !== fontSize) {\n        setCssProperty('--octopus-accessibility-font-size', fontSize);\n    }\n    const background = cookiesHelper.getCookie(\"octopus-background\");\n    if (null !== background) {\n        setCssProperty('--octopus-accessibility-background', background);\n    }\n    const color = cookiesHelper.getCookie(\"octopus-color\");\n    if (null !== color) {\n        setCssProperty('--octopus-accessibility-color', color);\n    }\n}\n\nfunction setCssProperty(name: string, value: string){\n    document.documentElement.style.setProperty(name,value);\n}\n\nfunction saveAccessibility(accessibility: {fontSize: number,background: string,color: string}){\n    setCssProperty('--octopus-accessibility-font-size', accessibility.fontSize+'px');\n    cookiesHelper.setCookie(\"octopus-font-size\", accessibility.fontSize+'px');\n    setCssProperty('--octopus-accessibility-background', accessibility.background);\n    cookiesHelper.setCookie(\"octopus-background\",accessibility.background);\n    setCssProperty('--octopus-accessibility-color', accessibility.color);\n    cookiesHelper.setCookie(\"octopus-color\",accessibility.color);\n    isAccessibilityModal.value = false;\n}\n\nasync function fetchTranscripts(language?: string): Promise<void> {\n    try {\n        const translation = await transcriptionApi.getTranslations(props.podcastId);\n        if (language === undefined) {\n            const { ready, available } = await getMostRelevantLanguage(translation);\n            // If available language is set, it is better than ready, so use it\n            language = available ?? ready;\n        }\n        const srt = await transcriptionApi.getTranslation(props.podcastId, language, true);\n        transcript.value = convertSrtToPlainText(srt);\n        \n        availableLanguages.value = translation.translations\n            .filter(t => t.state === TranslationState.FINISHED)\n            .map(t => t.language);\n        nativeLanguage.value = translation.nativeLanguage;\n        currentLanguage.value = language;\n        availableLanguages.value.unshift(translation.nativeLanguage);\n\n        if (!availableLanguages.value.includes(language)) {\n            availableLanguages.value.push(language);\n        }\n    } catch (error) {\n        console.error(error);\n    }\n    loadingDone.value = true;\n}\n\nasync function changeLanguage(language: string): Promise<void> {\n    loadingDone.value = false;\n    currentLanguage.value = language;\n    transcript.value = undefined;\n    try {\n        const srt = await transcriptionApi.getTranslation(props.podcastId, language);        \n        transcript.value = convertSrtToPlainText(srt);\n    } catch (error) {\n        console.error(error);\n    }\n    loadingDone.value = true;\n}\n\n/** Force reloading */\nfunction reset(): void {\n    if (isOpen.value || loadingDone.value) {\n        fetchTranscripts(currentLanguage.value);\n    }\n}\n\ndefineExpose({ reset });\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-app {\n  --octopus-accessibility-font-size: 16px;\n  --octopus-accessibility-background: var(--octopus-background);\n  --octopus-accessibility-color: var(--octopus-color-text);\n\n  .language-selector {\n    display: flex;\n    align-items: center;\n    margin-left: 1rem;\n\n    span {\n        font-weight: 600;\n    }\n  }\n\n  .transcription-section-buttons{\n    display: flex;\n    justify-content: space-between;\n    flex-wrap: wrap;\n    @media (width <= 625px) {\n      flex-direction: column;\n    }\n  }\n  .btn-transcript {\n    position: relative;\n    border-radius: var(--octopus-border-radius);\n    overflow: hidden;\n    transition: all 0.2s linear 0s;\n    \n    &.open{\n      margin-left:auto;\n      direction: rtl;\n      @media (width <= 625px) {\n        margin-top: 0.5rem;\n      }\n    }\n    &:not(.open){\n      margin-right: auto;\n    }\n\n    &:not(.open)::before,\n    &.open::after {\n      content: \"➤\";\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      position: absolute;\n      top: 0;\n      height: 100%;\n      width: 30px;\n      border-radius: 0 50% 50% 0;\n      background-color: var(--octopus-background-transparent);\n      transform: scale(0, 1);\n      transition: all 0.2s linear 0s;\n    }\n\n    &:not(.open)::before {\n      left: 0;\n      transform-origin: left center;\n    }\n\n    &.open::after {\n      right: -30px;\n      transform-origin: center left;\n    }\n    &:hover {\n      text-indent: 30px;\n    }\n\n    &:not(.open):hover::before,\n    &.open:hover::after {\n      text-indent: 0;\n    }\n\n    &:not(.open):hover::before {\n      transform: scale(1, 1);\n    }\n\n    &.open:hover::after {\n      transform: scale(-1, 1);\n    }\n  }\n\n  .transcription-body {\n    font-size: var(--octopus-accessibility-font-size);\n    position: relative;\n    padding: 1rem;\n    max-height: 250px;\n    display: flex;\n    justify-content: center;\n    white-space: pre-wrap;\n    background: var(--octopus-accessibility-background);\n    color: var(--octopus-accessibility-color);\n    border: 2px solid var(--octopus-border-default);\n    border-radius: var(--octopus-border-radius);\n\n    .transcription-text {\n      overflow: hidden auto;\n    }\n  }\n}\n</style>\n"],"mappings":"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"}