{"version":3,"file":"YoutubeStore-DZYnWaNV.js","sources":["../../Vue/node_modules/get-youtube-id/index.js","../../Vue/src/config/YoutubeState.ts","../../Vue/src/stores/YoutubeStore.ts"],"sourcesContent":["\n(function (root, factory) {\n if (typeof exports === 'object') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define(factory);\n } else {\n root.getYouTubeID = factory();\n }\n}(this, function (exports) {\n\n return function (url, opts) {\n if (opts == undefined) {\n opts = {fuzzy: true};\n }\n\n if (/youtu\\.?be/.test(url)) {\n\n // Look first for known patterns\n var i;\n var patterns = [\n /youtu\\.be\\/([^#\\&\\?]{11})/, // youtu.be/\n /\\?v=([^#\\&\\?]{11})/, // ?v=\n /\\&v=([^#\\&\\?]{11})/, // &v=\n /embed\\/([^#\\&\\?]{11})/, // embed/\n /\\/v\\/([^#\\&\\?]{11})/ // /v/\n ];\n\n // If any pattern matches, return the ID\n for (i = 0; i < patterns.length; ++i) {\n if (patterns[i].test(url)) {\n return patterns[i].exec(url)[1];\n }\n }\n\n if (opts.fuzzy) {\n // If that fails, break it apart by certain characters and look \n // for the 11 character key\n var tokens = url.split(/[\\/\\&\\?=#\\.\\s]/g);\n for (i = 0; i < tokens.length; ++i) {\n if (/^[^#\\&\\?]{11}$/.test(tokens[i])) {\n return tokens[i];\n }\n }\n }\n }\n\n return null;\n };\n\n}));\n","export enum YouTubeState {\r\n Unstarted = -1,\r\n Ended,\r\n Playing,\r\n Paused,\r\n Buffering,\r\n Unknown,\r\n VideoCued,\r\n Error,\r\n};","import { YouTubeState } from \"@/config/YoutubeState\";\r\nimport { MediaPlayerStatus } from \"@/models/frontend-only/MediaPlayerStatus\";\r\nimport getYoutubeID from \"get-youtube-id\";\r\n\r\nexport const useYoutubeStore = defineStore(\"youtube\", () => {\r\n let player: YT.Player | null = null;\r\n const state = ref(YouTubeState.Unstarted);\r\n const duration = ref(0);\r\n const currentTime = ref(0);\r\n const isFullScreen = ref(false);\r\n let pollReference: number | null = null;\r\n let youtubePlayerReady: Promise | null = null;\r\n\r\n const videoUrl = ref(\"\");\r\n\r\n const status = computed(() => {\r\n switch (state.value) {\r\n case YouTubeState.Unknown:\r\n case YouTubeState.Error:\r\n return MediaPlayerStatus.Error;\r\n case YouTubeState.Buffering:\r\n case YouTubeState.VideoCued:\r\n return MediaPlayerStatus.Loading;\r\n case YouTubeState.Playing:\r\n return MediaPlayerStatus.Playing;\r\n case YouTubeState.Paused:\r\n case YouTubeState.Ended:\r\n return MediaPlayerStatus.Paused;\r\n case YouTubeState.Unstarted:\r\n default:\r\n return MediaPlayerStatus.Unloaded;\r\n }\r\n });\r\n\r\n function init() {\r\n if (youtubePlayerReady) {\r\n return youtubePlayerReady;\r\n }\r\n\r\n youtubePlayerReady = new Promise((res) => {\r\n (window as any).onYouTubeIframeAPIReady = () => {\r\n pollForStatus();\r\n res();\r\n };\r\n loadScript(\"https://www.youtube.com/player_api\", \"youtube-api\");\r\n });\r\n pollForStatus();\r\n return youtubePlayerReady;\r\n }\r\n\r\n function pause() {\r\n if (player?.pauseVideo) {\r\n player?.pauseVideo();\r\n }\r\n }\r\n\r\n function play() {\r\n player?.playVideo();\r\n }\r\n\r\n function toggle() {\r\n if (state.value === YouTubeState.Playing) {\r\n if (player?.pauseVideo) {\r\n player?.pauseVideo();\r\n }\r\n } else {\r\n player?.playVideo();\r\n }\r\n }\r\n\r\n const iframeElement: HTMLIFrameElement | null = null;\r\n\r\n // function requestFullScreen() {\r\n // isFullScreen.value = true;\r\n // if (!player) {\r\n // return;\r\n // }\r\n // iframeElement = player.getIframe();\r\n // document.querySelector(\"#big-youtube-wrapper\")?.appendChild(iframeElement);\r\n // iframeElement.classList.add(\"youtube-fullscreen\");\r\n // setNewPlayerTime(player.getCurrentTime());\r\n // }\r\n\r\n // function reduceFullScreen() {\r\n // isFullScreen.value = false;\r\n // if (!player) {\r\n // return;\r\n // }\r\n // iframeElement = player.getIframe();\r\n // document.querySelector(\"#big-youtube-wrapper\")?.removeChild(iframeElement);\r\n // iframeElement.classList.remove(\"youtube-fullscreen\");\r\n // document.querySelector(\".youtube-player\")?.appendChild(iframeElement);\r\n // setNewPlayerTime(player.getCurrentTime());\r\n // }\r\n\r\n // function setNewPlayerTime(time: number) {\r\n // setTimeout(() => {\r\n // if (player) {\r\n // seekTo(time);\r\n // }\r\n // }, 1000);\r\n // }\r\n\r\n function seekTo(second: number) {\r\n player?.seekTo(second, true);\r\n }\r\n\r\n // there appears to be no way to update currentTime/duration based on some event call from the youtube object\r\n // https://stackoverflow.com/questions/35787114/youtube-player-iframe-api-hooking-event-for-currenttime\r\n function pollForStatus() {\r\n pollReference = window.setInterval(() => {\r\n if (!player) {\r\n duration.value = 0;\r\n currentTime.value = 0;\r\n return;\r\n }\r\n // if (state.value !== YouTubeState.Playing) {\r\n // return;\r\n // }\r\n duration.value = (player?.getDuration && player.getDuration()) || 0;\r\n currentTime.value =\r\n (player?.getCurrentTime && player.getCurrentTime()) || 0;\r\n }, 500);\r\n }\r\n\r\n function isYouTubeURLValid(url: string) {\r\n const videoId = getVideoIdFromURL(url);\r\n return videoId !== null;\r\n }\r\n\r\n function getVideoIdFromURL(url: string) {\r\n const pattern =\r\n /^(?:https?:\\/\\/)?(?:www\\.)?(?:youtube\\.com\\/(?:embed\\/|v\\/|e\\/|watch\\?v=|v=|embed\\/|youtu\\.be\\/|\\/v\\/|\\/e\\/|\\/watch\\?v=))?(.{11})/i;\r\n const match = url.match(pattern);\r\n return match ? match[1] : null;\r\n }\r\n\r\n async function isVideoAvailable(url: string) {\r\n const videoId = getYoutubeID(url);\r\n const response = await fetch(\r\n `https://www.googleapis.com/youtube/v3/videos?id=${videoId}&key=AIzaSyCvoYzJBVNlBMZfZ-9O5syJrAdddOMYNyE&part=status`,\r\n );\r\n\r\n const videoStatus = (await response.json())?.items?.[0]?.status?.embeddable;\r\n if (videoStatus === undefined) {\r\n console.error(\"Video in link is not available\");\r\n }\r\n\r\n if (!videoStatus) {\r\n console.error(\"Video in link is not available\");\r\n }\r\n return true;\r\n }\r\n\r\n function onInit(_player: YT.Player) {\r\n player = _player;\r\n videoUrl.value = (_player?.getVideoUrl && _player.getVideoUrl()) || \"\";\r\n pollForStatus();\r\n }\r\n\r\n function onDestroy() {\r\n player = null;\r\n state.value = YouTubeState.Unstarted;\r\n if (pollReference) {\r\n clearInterval(pollReference);\r\n pollReference = null;\r\n }\r\n }\r\n\r\n function ytEventOnReady(e: YT.PlayerEvent) {\r\n state.value = (e as any).data || YouTubeState.Buffering;\r\n }\r\n function ytEventOnError(e: YT.PlayerEvent) {\r\n throw e;\r\n }\r\n function ytEventOnStateChange(e: YT.PlayerEvent) {\r\n state.value = (e as any).data;\r\n if (state.value === YouTubeState.Ended) {\r\n emitter.emit(\"youtubeVideoEnded\");\r\n //store.playNextSong();\r\n pollForStatus();\r\n }\r\n }\r\n\r\n return {\r\n pause,\r\n play,\r\n toggle,\r\n seekTo,\r\n onInit,\r\n onDestroy,\r\n isFullScreen,\r\n currentTime,\r\n duration,\r\n status,\r\n init,\r\n ytEventOnStateChange,\r\n ytEventOnReady,\r\n ytEventOnError,\r\n videoUrl,\r\n isYouTubeURLValid,\r\n isVideoAvailable,\r\n };\r\n});\r\n"],"names":["root","factory","module","this","exports","url","opts","i","patterns","tokens","YouTubeState","YouTubeState2","useYoutubeStore","defineStore","player","state","ref","duration","currentTime","isFullScreen","pollReference","youtubePlayerReady","videoUrl","status","computed","MediaPlayerStatus","init","res","pollForStatus","loadScript","pause","play","toggle","seekTo","second","isYouTubeURLValid","getVideoIdFromURL","pattern","match","isVideoAvailable","videoId","getYoutubeID","videoStatus","_d","_c","_b","_a","onInit","_player","onDestroy","ytEventOnReady","e","ytEventOnError","ytEventOnStateChange","emitter"],"mappings":"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","x_google_ignoreList":[0]}