mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-05-02 22:44:24 +00:00
131 lines
5.1 KiB
JavaScript
131 lines
5.1 KiB
JavaScript
// Copyright (C) 2017-2020 Smart code 203358507
|
|
|
|
const React = require('react');
|
|
const { CONSTANTS, deepLinking, useModelState } = require('stremio/common');
|
|
|
|
const initMetaDetailsState = () => ({
|
|
selected: null,
|
|
meta_resources: [],
|
|
streams_resources: []
|
|
});
|
|
|
|
const mapMetaDetailsStateWithCtx = (meta_details, ctx) => {
|
|
const selected = meta_details.selected;
|
|
const meta_resources = meta_details.meta_resources.map((meta_resource) => {
|
|
return meta_resource.content.type === 'Ready' ?
|
|
{
|
|
request: meta_resource.request,
|
|
content: {
|
|
type: 'Ready',
|
|
content: {
|
|
...meta_resource.content.content,
|
|
released: new Date(
|
|
typeof meta_resource.content.content.released === 'string' ?
|
|
meta_resource.content.content.released
|
|
:
|
|
NaN
|
|
),
|
|
videos: meta_resource.content.content.videos.map((video) => ({
|
|
...video,
|
|
released: new Date(
|
|
typeof video.released === 'string' ?
|
|
video.released
|
|
:
|
|
NaN
|
|
),
|
|
upcoming: Date.parse(video.released) > Date.now(),
|
|
// TODO add watched and progress
|
|
deepLinks: deepLinking.withVideo({
|
|
video,
|
|
metaTransportUrl: meta_resource.request.base,
|
|
metaItem: meta_resource.content.content
|
|
})
|
|
})),
|
|
metaExtensions: meta_resource.content.content.links.filter((link) => link.category === CONSTANTS.META_LINK_CATEGORY)
|
|
}
|
|
},
|
|
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' ?
|
|
{
|
|
request: stream_resource.request,
|
|
content: {
|
|
type: 'Ready',
|
|
content: stream_resource.content.content.map((stream) => ({
|
|
...stream,
|
|
// TODO map progress
|
|
deepLinks: deepLinking.withStream({
|
|
stream,
|
|
streamTransportUrl: stream_resource.request.base,
|
|
// TODO metaTransportUrl should be based on state
|
|
metaTransportUrl: meta_details.meta_resources.reduceRight((result, meta_resource) => {
|
|
if (meta_resource.content.type === 'Ready') {
|
|
return meta_resource.request.base;
|
|
}
|
|
|
|
return result;
|
|
}, ''),
|
|
type: selected.meta_resource_ref.type_name,
|
|
id: selected.meta_resource_ref.id,
|
|
videoId: selected.streams_resource_ref.id,
|
|
})
|
|
}))
|
|
}
|
|
}
|
|
:
|
|
stream_resource;
|
|
});
|
|
return { selected, meta_resources, streams_resources };
|
|
};
|
|
|
|
const useMetaDetails = (urlParams) => {
|
|
const loadMetaDetailsAction = React.useMemo(() => {
|
|
if (typeof urlParams.type === 'string' && typeof urlParams.id === 'string') {
|
|
return {
|
|
action: 'Load',
|
|
args: {
|
|
model: 'MetaDetails',
|
|
args: {
|
|
meta_resource_ref: {
|
|
resource: 'meta',
|
|
type_name: urlParams.type,
|
|
id: urlParams.id,
|
|
extra: []
|
|
},
|
|
streams_resource_ref: typeof urlParams.videoId === 'string' ?
|
|
{
|
|
resource: 'stream',
|
|
type_name: urlParams.type,
|
|
id: urlParams.videoId,
|
|
extra: []
|
|
}
|
|
:
|
|
null
|
|
}
|
|
}
|
|
};
|
|
} else {
|
|
return {
|
|
action: 'Unload'
|
|
};
|
|
}
|
|
}, [urlParams]);
|
|
return useModelState({
|
|
model: 'meta_details',
|
|
action: loadMetaDetailsAction,
|
|
mapWithCtx: mapMetaDetailsStateWithCtx,
|
|
init: initMetaDetailsState
|
|
});
|
|
};
|
|
|
|
module.exports = useMetaDetails;
|