import React, { useState, useEffect, useContext } from 'react'; import PropTypes from 'prop-types'; import UrlParse from 'url-parse'; import { ApiUrlContext, SiteContext } from '../../utils/contexts/'; import { formatInnerLink, getRequest } from '../../utils/helpers/'; import { BrowserCache } from '../../utils/classes/'; import { orderedSupportedVideoFormats, videoAvailableCodecsAndResolutions, extractDefaultVideoResolution } from '../media-viewer/VideoViewer/functions'; import { VideoPlayer } from './VideoPlayer'; export function VideoPlayerByPageLink(props) { const apiUrl = useContext(ApiUrlContext); const site = useContext(SiteContext); const [errorType, setErrorType] = useState(null); const [errorMessage, setErrorMessage] = useState(null); const [videoPoster, setVideoPoster] = useState(null); const [videoSources, setVideoSources] = useState([]); const [videoResolutions, setVideoResolutions] = useState({}); const [subtitlesInfo, setSubtitlesInfo] = useState([]); const [previewSprite, setPreviewSprite] = useState({}); // Keep cache data "fresh" for one day. const browserCache = new BrowserCache(site.id, 86400); const playerStates = { videoQuality: browserCache.get('video-quality'), }; playerStates.videoQuality = null !== playerStates.videoQuality ? playerStates.videoQuality : 'Auto'; let apiRequestUrl = null; let data = null; let videoId = null; let urlParams = (function () { let ret = new UrlParse(props.pageLink).query; if (!ret) { ret = []; } else { ret = ret.substring(1); ret.split('&'); ret = ret.length ? ret.split('=') : []; } return ret; })(); if (urlParams.length) { let i = 0; while (i < urlParams.length) { if ('m' === urlParams[i]) { // NOTE: "m" => media id/token. videoId = urlParams[i + 1]; } i += 2; } } if (null !== videoId) { apiRequestUrl = apiUrl.media + '/' + videoId; } function onApiResponse(response) { if (void 0 === response || !!!response || void 0 === response.data || !!!response.data) { return; } data = response.data; let srcUrl, k; const videoSources = []; let videoPoster = null; let videoInfo = videoAvailableCodecsAndResolutions(data.encodings_info, data.hls_info); let errorType = null; let errorMessage = null; if ('string' === typeof data.poster_url) { videoPoster = formatInnerLink(data.poster_url, site.url); } else if ('string' === typeof data.thumbnail_url) { videoPoster = formatInnerLink(data.thumbnail_url, site.url); } const resolutionsKeys = Object.keys(videoInfo); if (!resolutionsKeys.length) { videoInfo = null; } else { const supportedFormats = orderedSupportedVideoFormats(); let defaultResolution = playerStates.videoQuality; if (null === defaultResolution || ('Auto' === defaultResolution && void 0 === videoInfo['Auto'])) { defaultResolution = 720; // Default resolution. } let defaultVideoResolution = extractDefaultVideoResolution(defaultResolution, videoInfo); if ('Auto' === defaultResolution && void 0 !== videoInfo['Auto']) { videoSources.push({ src: videoInfo['Auto'].url[0] }); } k = 0; while (k < videoInfo[defaultVideoResolution].format.length) { if ('hls' === videoInfo[defaultVideoResolution].format[k]) { videoSources.push({ src: videoInfo[defaultVideoResolution].url[k] }); break; } k += 1; } for (k in data.encodings_info[defaultVideoResolution]) { if (data.encodings_info[defaultVideoResolution].hasOwnProperty(k)) { if (supportedFormats.support[k]) { srcUrl = data.encodings_info[defaultVideoResolution][k].url; if (!!srcUrl) { // NOTE: In some cases, url value is 'null'. srcUrl = formatInnerLink(srcUrl, site.url); videoSources.push({ src: srcUrl, encodings_status: data.encodings_info[defaultVideoResolution][k].status, }); } } } } } if (1 === videoSources.length && 'running' === videoSources[0].encodings_status) { errorType = 'encodingRunning'; errorMessage = 'Media encoding is currently running. Try again in few minutes.'; } if (null !== errorType) { switch (errorType) { case 'encodingRunning': case 'encodingPending': case 'encodingFailed': break; default: console.warn('VIDEO DEBUG:', "Video files don't exist"); } } setErrorType(errorType); setErrorMessage(errorMessage); setVideoPoster(videoPoster); setVideoSources(videoSources); setVideoResolutions(videoInfo); setSubtitlesInfo(data.subtitles_info); setPreviewSprite( !!data.sprites_url ? { url: formatInnerLink(data.sprites_url, site.url), frame: { width: 160, height: 90, seconds: 10 } } : null ); const featuredItemDescrContent = document.querySelector('.feat-first-item .item .item-description > div'); if (featuredItemDescrContent) { // featuredItemDescrContent.innerHTML = data.summary + '

' + data.description; featuredItemDescrContent.innerHTML = data.summary; } } function onApiResponseFail(response) { if (void 0 === response || void 0 === response.type) { return; } switch (response.type) { case 'network': case 'private': case 'unavailable': setErrorType(response.type); setErrorMessage( void 0 !== response.message ? response.message : "Αn error occurred while loading the media's data" ); break; } } useEffect(() => { if (null !== apiRequestUrl) { getRequest(apiRequestUrl, false, onApiResponse, onApiResponseFail); } }, []); return videoSources.length ? (
) : null; } VideoPlayerByPageLink.propTypes = { pageLink: PropTypes.string.isRequired, };