Skip to content

Commit

Permalink
Legacy media support in MediaLoader (#12029)
Browse files Browse the repository at this point in the history
* `legacyMedia` block type support

* Add settings test

* Add Storybook story

* Update index.stories.tsx

* Comment fixes

- Add title to placeholder config
- Add 'kind' to playlist items

* Test fix

* Update buildSettings.test.ts
  • Loading branch information
amoore108 authored Oct 4, 2024
1 parent 556481e commit 52633ff
Show file tree
Hide file tree
Showing 9 changed files with 249 additions and 11 deletions.
3 changes: 3 additions & 0 deletions src/app/components/MediaLoader/configs/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import aresMedia from './aresMedia';
import tv from './tv';
import liveRadio from './liveRadio';
import audio from './audio';
import legacyMedia from './legacyMedia';

import {
ConfigBuilderReturnProps,
Expand All @@ -17,6 +18,7 @@ const BLOCK_TYPES = [
'tv',
'liveRadio',
'audio',
'legacyMedia',
] as const;

const blockTypeMapping: Record<
Expand All @@ -28,6 +30,7 @@ const blockTypeMapping: Record<
tv,
liveRadio,
audio,
legacyMedia,
};

export default (blocks: MediaBlock[]) => {
Expand Down
49 changes: 49 additions & 0 deletions src/app/components/MediaLoader/configs/legacyMedia.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { MediaOverrides } from '#app/models/types/media';
import filterForBlockType from '#lib/utilities/blockHandlers';
import {
LegacyMediaBlock,
ConfigBuilderProps,
ConfigBuilderReturnProps,
} from '../types';
import buildPlaceholderConfig from '../utils/buildPlaceholderConfig';

export default ({
blocks,
basePlayerConfig,
translations,
}: ConfigBuilderProps): ConfigBuilderReturnProps => {
const legacyMediaBlock: LegacyMediaBlock =
filterForBlockType(blocks, 'legacyMedia') ?? {};

const { model: mediaOverrides }: MediaOverrides =
filterForBlockType(blocks, 'mediaOverrides') || {};

const { image, format, playlist } = legacyMediaBlock?.content ?? {};

const placeholderConfig = buildPlaceholderConfig({
title: mediaOverrides?.pageTitleOverride || '',
type: format || 'video',
holdingImageURL: image?.href,
translations,
});

const mp4Items = playlist
?.filter(item => item.format === 'mp4')
?.map(item => ({ href: item.url, kind: 'programme' }));

return {
mediaType: format || 'video',
playerConfig: {
...basePlayerConfig,
playlistObject: {
title: mediaOverrides?.pageTitleOverride || '',
holdingImageURL: image?.href,
items: mp4Items,
},
ui: basePlayerConfig.ui,
statsObject: basePlayerConfig.statsObject,
},
placeholderConfig,
showAds: false,
};
};
51 changes: 51 additions & 0 deletions src/app/components/MediaLoader/fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,57 @@ export const onDemandTvBlock = {
},
};

export const legacyMediaBlock = [
{
type: 'legacyMedia',
content: {
id: '28780250',
subType: 'primary',
format: 'video',
image: {
id: '28780250',
subType: 'thumbnail',
href: 'http://a.files.bbci.co.uk/worldservice/live/assets/images/2013/12/08/131208135805_iraq_blast_640x360_bbc_nocredit.jpg',
path: '/amz/worldservice/live/assets/images/2013/12/08/131208135805_iraq_blast_640x360_bbc_nocredit.jpg',
height: 360,
width: 640,
altText: 'اثار التفجير على احدى السيارات في بغداد',
copyrightHolder: '',
},
aspectRatio: '16:9',
live: false,
href: 'http://www.bbc.co.uk/arabic/meta/dps/2013/12/emp/131208_iraq_blast_.emp.xml',
playlist: [
{
format: '3gp',
bitrate: '80000',
url: 'https://wsodprogrf.akamaized.net/arabic/3gp/2013/12/iraqblast_16x9_lo.3gp',
},
{
format: '3gp',
bitrate: '160000',
url: 'https://wsodprogrf.akamaized.net/zhongwen/simp/3gp/2013/12/iraqblast_16x9_hi.3gp',
},
{
format: 'mp4',
bitrate: '168000',
url: 'https://wsodprogrf.akamaized.net/arabic/dps/2013/12/iraqblast_16x9_lo.mp4',
},
{
format: 'mp4',
bitrate: '320000',
url: 'https://wsodprogrf.akamaized.net/arabic/dps/2013/12/iraqblast_16x9_med.mp4',
},
{
format: 'mp4',
bitrate: '904000',
url: 'https://wsodprogrf.akamaized.net/arabic/dps/2013/12/iraqblast_16x9_hi.mp4',
},
],
},
},
];

export const mediaOverridesBlock = {
model: {
language: 'hi',
Expand Down
9 changes: 9 additions & 0 deletions src/app/components/MediaLoader/index.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
aresMediaBlocks,
aresMediaPortraitBlocks,
clipMediaBlocks,
legacyMediaBlock,
} from './fixture';
import { MediaBlock } from './types';
import readme from './README.md';
Expand Down Expand Up @@ -53,6 +54,14 @@ export const Portrait = () => (
/>
);

export const LegacyMediaLoader = () => (
<Component
service="pidgin"
pageType="article"
blocks={legacyMediaBlock as MediaBlock[]}
/>
);

export const LivePageMedia = () => (
<Component
service="pidgin"
Expand Down
40 changes: 36 additions & 4 deletions src/app/components/MediaLoader/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export type PlayerConfig = {
title: string;
summary?: string;
holdingImageURL?: string;
items: PlaylistItem[];
items: PlaylistItem[] | LegacyPlayListItem[];
guidance?: string;
embedRights?: 'allowed';
liveRewind?: boolean;
Expand Down Expand Up @@ -63,6 +63,11 @@ export type PlaylistItem = {
serviceID?: string;
};

export type LegacyPlayListItem = {
href: string;
kind: string;
};

export type ConfigBuilderProps = {
id: string;
blocks: MediaBlock[];
Expand Down Expand Up @@ -208,14 +213,41 @@ export type ClipMediaBlock = {
};
};

export type LegacyMediaBlock = {
type: 'legacyMedia';
content: {
id: string;
subType: string;
format: MediaType;
image: {
id: string;
subType: string;
href: string;
path: string;
height: number;
width: number;
altText: string;
copyrightHolder: string;
};
aspectRatio: string;
live: boolean;
href: string;
playlist: {
format: string;
url: string;
}[];
};
};

export type MediaBlock =
| AresMediaBlock
| ClipMediaBlock
| CaptionBlock
| LegacyMediaBlock
| LiveRadioBlock
| OnDemandTVBlock
| OnDemandAudioBlock
| MediaOverrides
| LiveRadioBlock;
| CaptionBlock
| MediaOverrides;

export type BuildConfigProps = {
id: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import { PlaceholderConfig } from '../../types';

type BuildPlaceholderConfigParams = {
title: string;
duration: number;
holdingImageURL: string;
placeholderImageOriginCode: string;
placeholderImageLocator: string;
type: MediaType;
duration?: number;
durationISO8601?: string;
placeholderImageOriginCode?: string;
placeholderImageLocator?: string;
translations?: Translations;
guidanceMessage?: string | null;
};
Expand Down
78 changes: 77 additions & 1 deletion src/app/components/MediaLoader/utils/buildSettings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
buildAresMediaPlayerBlock,
aresMediaBlock,
aresMediaLiveStreamBlocks,
legacyMediaBlock,
} from '../fixture';
import {
BuildConfigProps,
Expand Down Expand Up @@ -311,6 +312,82 @@ describe('buildSettings', () => {
});
});

it('Should process a LegacyMediaBlock into a valid playlist item for a "MAP" page', () => {
const legacyMediaOverrides = {
model: {
pageTitleOverride: 'Legacy Media Page Title',
},
type: 'mediaOverrides',
};

const result = buildSettings({
...baseSettings,
service: 'arabic',
lang: 'ar',
producer: 'ARABIC',
counterName: 'arabic.multimedia.2013.12.131208_iraq_blast_.page',
blocks: [...legacyMediaBlock, legacyMediaOverrides] as MediaBlock[],
});

expect(result).toStrictEqual({
mediaType: 'video',
playerConfig: {
autoplay: true,
product: 'news',
statsObject: {
destination: 'WS_NEWS_LANGUAGES',
producer: 'ARABIC',
},
enableToucan: true,
appName: 'news-arabic',
appType: 'responsive',
counterName: 'arabic.multimedia.2013.12.131208_iraq_blast_.page',
playlistObject: {
title: 'Legacy Media Page Title',
holdingImageURL:
'http://a.files.bbci.co.uk/worldservice/live/assets/images/2013/12/08/131208135805_iraq_blast_640x360_bbc_nocredit.jpg',
items: [
{
href: 'https://wsodprogrf.akamaized.net/arabic/dps/2013/12/iraqblast_16x9_lo.mp4',
kind: 'programme',
},
{
href: 'https://wsodprogrf.akamaized.net/arabic/dps/2013/12/iraqblast_16x9_med.mp4',
kind: 'programme',
},
{
href: 'https://wsodprogrf.akamaized.net/arabic/dps/2013/12/iraqblast_16x9_hi.mp4',
kind: 'programme',
},
],
},
ui: {
skin: 'classic',
controls: { enabled: true },
locale: { lang: 'ar' },
subtitles: { enabled: true, defaultOn: true },
fullscreen: { enabled: true },
},
},
placeholderConfig: {
mediaInfo: {
datetime: undefined,
duration: '00:00',
durationSpoken: 'Duration 0,00',
guidanceMessage: undefined,
title: 'Legacy Media Page Title',
type: 'video',
},
placeholderSrc:
'http://a.files.bbci.co.uk/worldservice/live/assets/images/2013/12/08/131208135805_iraq_blast_640x360_bbc_nocredit.jpg',
placeholderSrcset: '',
translatedNoJSMessage:
'This video cannot play in your browser. Please enable JavaScript or try a different browser.',
} as PlaceholderConfig,
showAds: false,
} satisfies ConfigBuilderReturnProps);
});

it('Should process an AresMedia block into a valid playlist item for syndication.', () => {
const result = buildSettings({
...baseSettings,
Expand Down Expand Up @@ -583,7 +660,6 @@ describe('buildSettings', () => {
const result = buildSettings({
...baseSettings,
embedded: true,
// @ts-expect-error partial data used for testing purposes
blocks: myFixture as MediaBlock[],
});
expect(result?.playerConfig).not.toHaveProperty(
Expand Down
6 changes: 3 additions & 3 deletions src/app/models/types/media.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ export type LiveRadioBlock = {

export type MediaOverrides = {
model: {
language: string;
pageIdentifierOverride: string;
pageTitleOverride: string;
language?: string;
pageIdentifierOverride?: string;
pageTitleOverride?: string;
};
type: 'mediaOverrides';
};
18 changes: 18 additions & 0 deletions src/app/pages/MediaArticlePage/MediaArticlePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ARTICLE_PAGE, MEDIA_ASSET_PAGE } from '#app/routes/utils/pageTypes';
import { Tag } from '#app/components/LinkedData/types';
import { Article, OptimoBylineBlock } from '#app/models/types/optimo';
import { RequestContext } from '#app/contexts/RequestContext';
import { MediaOverrides } from '#app/models/types/media';
import useToggle from '../../hooks/useToggle';
import {
getArticleId,
Expand Down Expand Up @@ -173,6 +174,23 @@ const MediaArticlePage = ({ pageData }: { pageData: Article }) => {
<MediaLoader blocks={props.blocks as MediaBlock[]} />
</div>
),
legacyMedia: (props: ComponentToRenderProps) => {
const mediaOverrides: MediaOverrides = {
model: { pageTitleOverride: headline },
type: 'mediaOverrides',
};

return (
<div
css={({ spacings }: Theme) => [
`padding-top: ${spacings.TRIPLE}rem`,
isCpsMap && styles.cafMediaPlayer,
]}
>
<MediaLoader blocks={[props, mediaOverrides] as MediaBlock[]} />
</div>
);
},
text,
byline: () =>
hasByline ? (
Expand Down

0 comments on commit 52633ff

Please sign in to comment.