From 01ac7a883684b12e12051acb2e63257c88c41b96 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Wed, 8 Apr 2020 17:08:10 +0300 Subject: [PATCH 01/36] stream title format fixed --- src/routes/MetaDetails/StreamsList/Stream/styles.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/MetaDetails/StreamsList/Stream/styles.less b/src/routes/MetaDetails/StreamsList/Stream/styles.less index fe0e6aec6..3b2126558 100644 --- a/src/routes/MetaDetails/StreamsList/Stream/styles.less +++ b/src/routes/MetaDetails/StreamsList/Stream/styles.less @@ -63,6 +63,7 @@ flex: 1; max-height: 3.6em; margin: 0.5rem 1rem; + white-space: pre; color: @color-surface-light5-90; } From e9c451a41a78ba7a91109cd0a773e81692c699f3 Mon Sep 17 00:00:00 2001 From: nklhrstv Date: Thu, 9 Apr 2020 12:47:03 +0300 Subject: [PATCH 02/36] replace init fb sdk script with javscript code --- src/routes/Intro/Intro.js | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/routes/Intro/Intro.js b/src/routes/Intro/Intro.js index b9fd84185..3296b6a97 100644 --- a/src/routes/Intro/Intro.js +++ b/src/routes/Intro/Intro.js @@ -277,23 +277,20 @@ const Intro = ({ queryParams }) => { }; }, [routeFocused]); React.useEffect(() => { - var initScriptElement = document.createElement('script'); - var sdkScriptElement = document.createElement('script'); - initScriptElement.innerHTML = `window.fbAsyncInit = function() { - FB.init({ - appId: '1537119779906825', - autoLogAppEvents: false, - xfbml: false, - version: 'v2.5' - }); - };`; + window.fbAsyncInit = function() { + FB.init({ + appId: '1537119779906825', + autoLogAppEvents: false, + xfbml: false, + version: 'v2.5' + }); + }; + const sdkScriptElement = document.createElement('script'); sdkScriptElement.src = 'https://connect.facebook.net/en_US/sdk.js'; sdkScriptElement.async = true; sdkScriptElement.defer = true; - document.body.appendChild(initScriptElement); document.body.appendChild(sdkScriptElement); return () => { - document.body.removeChild(initScriptElement); document.body.removeChild(sdkScriptElement); }; }, []); From e1533fbf2a512ac9a4b82837b93db90ba480923f Mon Sep 17 00:00:00 2001 From: svetlagasheva Date: Mon, 27 Apr 2020 12:46:30 +0300 Subject: [PATCH 03/36] META_LINK_CATEGORY constant added --- src/common/CONSTANTS.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/CONSTANTS.js b/src/common/CONSTANTS.js index cc16a76ce..42a7e9f7f 100644 --- a/src/common/CONSTANTS.js +++ b/src/common/CONSTANTS.js @@ -6,6 +6,7 @@ const CATALOG_PREVIEW_SIZE = 10; const CATALOG_PAGE_SIZE = 100; const NONE_EXTRA_VALUE = 'None'; const SKIP_EXTRA_NAME = 'skip'; +const META_LINK_CATEGORY = 'meta'; const IMDB_LINK_CATEGORY = 'imdb'; const SHARE_LINK_CATEGORY = 'share'; const TYPE_PRIORITIES = { @@ -29,6 +30,7 @@ module.exports = { CATALOG_PAGE_SIZE, NONE_EXTRA_VALUE, SKIP_EXTRA_NAME, + META_LINK_CATEGORY, IMDB_LINK_CATEGORY, SHARE_LINK_CATEGORY, TYPE_PRIORITIES From 7fbb445b5345574b32c58ed9438c552f39ebf2e9 Mon Sep 17 00:00:00 2001 From: svetlagasheva Date: Mon, 27 Apr 2020 12:56:20 +0300 Subject: [PATCH 04/36] metaTransportUrl query param for video removed --- src/common/deepLinking.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/common/deepLinking.js b/src/common/deepLinking.js index f90bc1436..49885808c 100644 --- a/src/common/deepLinking.js +++ b/src/common/deepLinking.js @@ -60,13 +60,12 @@ const withLibItem = ({ libItem, streams = {} }) => { }; const withVideo = ({ video, metaTransportUrl, metaItem, streams = {} }) => { - const queryParams = new URLSearchParams([['metaTransportUrl', metaTransportUrl]]); const [stream, streamTransportUrl] = typeof streams[`${encodeURIComponent(metaItem.id)}/${encodeURIComponent(video.id)}`] === 'object' ? streams[`${encodeURIComponent(metaItem.id)}/${encodeURIComponent(video.id)}`] : []; return { - meta_details_streams: `#/metadetails/${encodeURIComponent(metaItem.type)}/${encodeURIComponent(metaItem.id)}/${encodeURIComponent(video.id)}?${queryParams.toString()}`, + meta_details_streams: `#/metadetails/${encodeURIComponent(metaItem.type)}/${encodeURIComponent(metaItem.id)}/${encodeURIComponent(video.id)}`, // TODO check if stream is external player: typeof stream === 'object' && typeof streamTransportUrl === 'string' ? `#/player/${encodeURIComponent(serializeStream(stream))}/${encodeURIComponent(streamTransportUrl)}/${encodeURIComponent(metaTransportUrl)}/${encodeURIComponent(metaItem.type)}/${encodeURIComponent(metaItem.id)}/${encodeURIComponent(video.id)}` From 9e701f0cc9a386361b8d4cefefad1c886c852a66 Mon Sep 17 00:00:00 2001 From: svetlagasheva Date: Mon, 27 Apr 2020 12:59:14 +0300 Subject: [PATCH 05/36] map metaExtension in meta_resources in useMetaDetails --- src/routes/MetaDetails/useMetaDetails.js | 59 +++++++++++++----------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/routes/MetaDetails/useMetaDetails.js b/src/routes/MetaDetails/useMetaDetails.js index 6f2a6722c..0bc4c679f 100644 --- a/src/routes/MetaDetails/useMetaDetails.js +++ b/src/routes/MetaDetails/useMetaDetails.js @@ -1,7 +1,7 @@ // Copyright (C) 2017-2020 Smart code 203358507 const React = require('react'); -const { deepLinking, useModelState } = require('stremio/common'); +const { CONSTANTS, deepLinking, useModelState } = require('stremio/common'); const initMetaDetailsState = () => ({ selected: null, @@ -12,10 +12,10 @@ const initMetaDetailsState = () => ({ const mapMetaDetailsStateWithCtx = (meta_details, ctx) => { const selected = meta_details.selected; const meta_resources = meta_details.meta_resources.map((meta_resource) => { - return { - request: meta_resource.request, - content: meta_resource.content.type === 'Ready' ? - { + return meta_resource.content.type === 'Ready' ? + { + request: meta_resource.request, + content: { type: 'Ready', content: { ...meta_resource.content.content, @@ -39,28 +39,35 @@ const mapMetaDetailsStateWithCtx = (meta_details, ctx) => { metaTransportUrl: meta_resource.request.base, metaItem: meta_resource.content.content }) - })) - } - } - : - meta_resource.content, - deepLinks: meta_details.selected !== null ? - deepLinking.withMetaResource({ - metaResource: meta_resource, - type: meta_details.selected.meta_resource_ref.type_name, - id: meta_details.selected.meta_resource_ref.id, - videoId: meta_details.selected.streams_resource_ref !== null ? meta_details.selected.streams_resource_ref.id : null - }) - : - null, - addon: ctx.profile.addons.reduce((result, addon) => { - if (addon.transportUrl === meta_resource.request.base) { - return addon; - } + })), + metaExtension: meta_resource.content.content.links.reduceRight((result, link) => { + if (link.category === CONSTANTS.META_LINK_CATEGORY) { + return link; + } - return result; - }, null) - }; + return result; + }, null) + } + }, + deepLinks: meta_details.selected !== null ? + deepLinking.withMetaResource({ + metaResource: meta_resource, + type: meta_details.selected.meta_resource_ref.type_name, + id: meta_details.selected.meta_resource_ref.id, + videoId: meta_details.selected.streams_resource_ref !== null ? meta_details.selected.streams_resource_ref.id : null + }) + : + null, + addon: ctx.profile.addons.reduce((result, addon) => { + if (addon.transportUrl === meta_resource.request.base) { + return addon; + } + + return result; + }, null) + } + : + meta_resource; }); const streams_resources = meta_details.streams_resources.map((stream_resource) => { return stream_resource.content.type === 'Ready' ? From 6d5ca95d63727c8366f76b6e58acf8e7cb526f95 Mon Sep 17 00:00:00 2001 From: svetlagasheva Date: Mon, 27 Apr 2020 13:26:22 +0300 Subject: [PATCH 06/36] ModalDialog with iframe used for selected addon in MetaDetails --- src/routes/MetaDetails/MetaDetails.js | 39 ++++++++++++++++++++++----- src/routes/MetaDetails/styles.less | 21 +++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/routes/MetaDetails/MetaDetails.js b/src/routes/MetaDetails/MetaDetails.js index 5c8c25789..95a4461fb 100644 --- a/src/routes/MetaDetails/MetaDetails.js +++ b/src/routes/MetaDetails/MetaDetails.js @@ -2,7 +2,7 @@ const React = require('react'); const PropTypes = require('prop-types'); -const { VerticalNavBar, HorizontalNavBar, MetaPreview, Image, useInLibrary } = require('stremio/common'); +const { VerticalNavBar, HorizontalNavBar, MetaPreview, ModalDialog, Image, useInLibrary } = require('stremio/common'); const StreamsList = require('./StreamsList'); const VideosList = require('./VideosList'); const useMetaDetails = require('./useMetaDetails'); @@ -14,14 +14,22 @@ const MetaDetails = ({ urlParams, queryParams }) => { return metaDetails.selected !== null ? metaDetails.selected.meta_resources_ref : null; }, [metaDetails.selected]); const selectedAddon = queryParams.get('metaTransportUrl'); + const metaResourcesReady = metaDetails.meta_resources.filter((metaResource) => metaResource.content.type === 'Ready' && metaResource.content.content.metaExtension !== null); const selectedMetaResource = React.useMemo(() => { return metaDetails.meta_resources.reduceRight((result, metaResource) => { + if (metaResource.content.type === 'Ready') { + return metaResource; + } + + return result; + }, null); + }, [metaDetails, selectedAddon]); + const selectedMetaResourceRef = React.useMemo(() => { + return metaDetails.meta_resources.reduce((result, metaResource) => { if (typeof selectedAddon === 'string') { if (metaResource.request.base === selectedAddon) { return metaResource; } - } else if (metaResource.content.type === 'Ready') { - return metaResource; } return result; @@ -42,7 +50,7 @@ const MetaDetails = ({ urlParams, queryParams }) => { null; }, [selectedMetaResource, streamsResourceRef]); const tabs = React.useMemo(() => { - return metaDetails.meta_resources.map((metaResource) => ({ + return metaResourcesReady.map((metaResource) => ({ id: metaResource.addon.transportUrl, label: metaResource.addon.manifest.name, logo: metaResource.addon.manifest.logo, @@ -50,6 +58,10 @@ const MetaDetails = ({ urlParams, queryParams }) => { href: metaResource.deepLinks.meta_details_streams !== null ? metaResource.deepLinks.meta_details_streams : metaResource.deepLinks.meta_details_videos })); }, [metaDetails]); + const clearSelectedAddon = React.useCallback(() => { + queryParams.delete('metaTransportUrl'); + window.location.replace(`#${urlParams.path}`); + }, [queryParams]); const [inLibrary, toggleInLibrary] = useInLibrary(selectedMetaResource !== null && selectedMetaResource.content.type === 'Ready' ? selectedMetaResource.content.content : null); return (
@@ -60,11 +72,11 @@ const MetaDetails = ({ urlParams, queryParams }) => { />
{ - metaDetails.meta_resources.length > 0 ? + metaResourcesReady.length > 0 ? : null @@ -142,12 +154,27 @@ const MetaDetails = ({ urlParams, queryParams }) => { null }
+ { + typeof selectedAddon === 'string' ? + +