From a0dfbc671a8197157b264bec8cb1bc596ab21178 Mon Sep 17 00:00:00 2001 From: MarkLark86 Date: Mon, 23 Oct 2023 14:25:51 +1100 Subject: [PATCH] [NHUB-315] (2.4.2): Support Audio & Video for Featuremedia (#615) * Support video seeking * Update utils * Update usage of featuremedia & other media fields * Update video & audio src attributes in body_html * Make audio use available width * Update ItemIcons to generate list of icon types automatically * remove commented line * fix flake8 issues --- assets/components/cards/render/CardFooter.jsx | 4 +- assets/components/cards/render/CardMeta.jsx | 5 +- .../cards/render/LargePictureTextCard.jsx | 1 - .../cards/render/LargeTextOnlyCard.jsx | 2 - .../cards/render/PictureTextCard.jsx | 1 - .../components/cards/render/TextOnlyCard.jsx | 7 +-- .../cards/render/TopNewsOneByOneCard.jsx | 2 - .../cards/render/TopNewsTwoByTwoCard.jsx | 8 +-- assets/styles/index.scss | 3 + assets/ui/components/ArticleBodyHtml.jsx | 14 +++-- assets/ui/components/ArticleMedia.jsx | 2 +- assets/wire/components/ItemDetails.jsx | 31 ++++++---- assets/wire/components/PreviewMeta.jsx | 8 +-- assets/wire/components/WireListItem.jsx | 31 +++------- assets/wire/components/WireListItemIcons.jsx | 15 ++--- assets/wire/components/WirePreview.jsx | 33 ++++++----- assets/wire/utils.js | 57 +++++++++++++++++++ newsroom/upload.py | 4 +- 18 files changed, 135 insertions(+), 93 deletions(-) diff --git a/assets/components/cards/render/CardFooter.jsx b/assets/components/cards/render/CardFooter.jsx index 7351c1045..5b20281da 100644 --- a/assets/components/cards/render/CardFooter.jsx +++ b/assets/components/cards/render/CardFooter.jsx @@ -2,11 +2,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import CardMeta from './CardMeta'; -function CardFooter({item, picture, listConfig}) { +function CardFooter({item, listConfig}) { return (
); @@ -14,7 +13,6 @@ function CardFooter({item, picture, listConfig}) { CardFooter.propTypes = { item: PropTypes.object.isRequired, - picture: PropTypes.object, listConfig: PropTypes.object, }; diff --git a/assets/components/cards/render/CardMeta.jsx b/assets/components/cards/render/CardMeta.jsx index 237c2b209..7485efc38 100644 --- a/assets/components/cards/render/CardMeta.jsx +++ b/assets/components/cards/render/CardMeta.jsx @@ -4,9 +4,9 @@ import {gettext, shortDate, fullDate, isDisplayed} from 'utils'; import {characterCount, wordCount} from 'utils'; import WireListItemIcons from 'wire/components/WireListItemIcons'; -function CardMeta({item, picture, displayDivider, slugline, listConfig}) { +function CardMeta({item, displayDivider, slugline, listConfig}) { return (
- +
{slugline && {slugline}} @@ -26,7 +26,6 @@ function CardMeta({item, picture, displayDivider, slugline, listConfig}) { CardMeta.propTypes = { item: PropTypes.object.isRequired, - picture: PropTypes.object, displayDivider: PropTypes.bool, slugline: PropTypes.string, listConfig: PropTypes.object, diff --git a/assets/components/cards/render/LargePictureTextCard.jsx b/assets/components/cards/render/LargePictureTextCard.jsx index 027c25bc6..8fbde2918 100644 --- a/assets/components/cards/render/LargePictureTextCard.jsx +++ b/assets/components/cards/render/LargePictureTextCard.jsx @@ -20,7 +20,6 @@ const getPictureTextPanel = (item, picture, openItem, cardId, listConfig) => {
diff --git a/assets/components/cards/render/LargeTextOnlyCard.jsx b/assets/components/cards/render/LargeTextOnlyCard.jsx index b7fe4546e..487be0dee 100644 --- a/assets/components/cards/render/LargeTextOnlyCard.jsx +++ b/assets/components/cards/render/LargeTextOnlyCard.jsx @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import CardFooter from './CardFooter'; import CardBody from './CardBody'; import CardRow from './CardRow'; -import {getPicture} from 'wire/utils'; const getTextOnlyPanel = (item, openItem, cardId, listConfig) => (
@@ -11,7 +10,6 @@ const getTextOnlyPanel = (item, openItem, cardId, listConfig) => (
diff --git a/assets/components/cards/render/PictureTextCard.jsx b/assets/components/cards/render/PictureTextCard.jsx index f15329844..5e02653c3 100644 --- a/assets/components/cards/render/PictureTextCard.jsx +++ b/assets/components/cards/render/PictureTextCard.jsx @@ -20,7 +20,6 @@ const getPictureTextPanel = (item, picture, openItem, withPictures, cardId, list
diff --git a/assets/components/cards/render/TextOnlyCard.jsx b/assets/components/cards/render/TextOnlyCard.jsx index 52cf873d5..2604cca6b 100644 --- a/assets/components/cards/render/TextOnlyCard.jsx +++ b/assets/components/cards/render/TextOnlyCard.jsx @@ -2,10 +2,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import CardRow from './CardRow'; import CardFooter from './CardFooter'; -import {getPicture, shortText} from 'wire/utils'; +import {shortText} from 'wire/utils'; import {Embargo} from '../../../wire/components/fields/Embargo'; -const getTextOnlyPanel = (item, openItem, picture, cardId, listConfig) => ( +const getTextOnlyPanel = (item, openItem, cardId, listConfig) => (
openItem(item, cardId)}>
@@ -17,7 +17,6 @@ const getTextOnlyPanel = (item, openItem, picture, cardId, listConfig) => (
@@ -28,7 +27,7 @@ const getTextOnlyPanel = (item, openItem, picture, cardId, listConfig) => ( function TextOnlyCard ({items, title, product, openItem, isActive, cardId, listConfig}) { return ( - {items.map((item) => getTextOnlyPanel(item, openItem, getPicture(item), cardId, listConfig))} + {items.map((item) => getTextOnlyPanel(item, openItem, cardId, listConfig))} ); } diff --git a/assets/components/cards/render/TopNewsOneByOneCard.jsx b/assets/components/cards/render/TopNewsOneByOneCard.jsx index 330cc1f04..9629197a8 100644 --- a/assets/components/cards/render/TopNewsOneByOneCard.jsx +++ b/assets/components/cards/render/TopNewsOneByOneCard.jsx @@ -6,7 +6,6 @@ import CardMeta from './CardMeta'; import {Embargo} from '../../../wire/components/fields/Embargo'; const getTopNewsPanel = (item, picture, openItem, cardId, listConfig) => { - const rendition = getThumbnailRendition(picture, true); const imageUrl = rendition && rendition.href; const caption = rendition && getCaption(picture); @@ -19,7 +18,6 @@ const getTopNewsPanel = (item, picture, openItem, cardId, listConfig) => { diff --git a/assets/components/cards/render/TopNewsTwoByTwoCard.jsx b/assets/components/cards/render/TopNewsTwoByTwoCard.jsx index ac8307bb7..feea2b71c 100644 --- a/assets/components/cards/render/TopNewsTwoByTwoCard.jsx +++ b/assets/components/cards/render/TopNewsTwoByTwoCard.jsx @@ -9,7 +9,6 @@ import CardBody from './CardBody'; import {Embargo} from '../../../wire/components/fields/Embargo'; const getTopNewsLeftPanel = (item, picture, openItem, cardId, listConfig) => { - const rendition = getThumbnailRendition(picture, true); const imageUrl = rendition && rendition.href; const caption = rendition && getCaption(picture); @@ -24,7 +23,6 @@ const getTopNewsLeftPanel = (item, picture, openItem, cardId, listConfig) => { @@ -38,7 +36,6 @@ const getTopNewsLeftPanel = (item, picture, openItem, cardId, listConfig) => { }; const getTopNewsRightPanel = (item, picture, openItem, cardId, listConfig) => { - const rendition = getThumbnailRendition(picture); const imageUrl = rendition && rendition.href; const caption = rendition && getCaption(picture); @@ -47,10 +44,7 @@ const getTopNewsRightPanel = (item, picture, openItem, cardId, listConfig) => {
openItem(item, cardId)}> {caption} - +
); }; diff --git a/assets/styles/index.scss b/assets/styles/index.scss index 5a9c655a3..c252efbff 100644 --- a/assets/styles/index.scss +++ b/assets/styles/index.scss @@ -2945,6 +2945,9 @@ a.wire-articles__versions { width: 100%; height: auto; } + audio { + width: 100%; + }; .btn { align-self: flex-end; } diff --git a/assets/ui/components/ArticleBodyHtml.jsx b/assets/ui/components/ArticleBodyHtml.jsx index 274eaf048..6432d77a8 100644 --- a/assets/ui/components/ArticleBodyHtml.jsx +++ b/assets/ui/components/ArticleBodyHtml.jsx @@ -162,19 +162,23 @@ class ArticleBodyHtml extends React.PureComponent { container.innerHTML = html; container - .querySelectorAll('img') - .forEach((imageTag) => { + .querySelectorAll('img, video, audio') + .forEach((mediaTag) => { // Using the tag's `src` attribute, find the Original Rendition's ID const originalMediaId = imageEmbedOriginalIds.find((mediaId) => ( - !imageTag.src.startsWith('/assets/') && - imageTag.src.includes(mediaId)) + !mediaTag.src.startsWith('/assets/') && + mediaTag.src.includes(mediaId)) ); + if (mediaTag instanceof HTMLVideoElement) { + mediaTag.preload = 'metadata'; + } + if (originalMediaId) { // We now have the Original Rendition's ID // Use that to update the `src` attribute to use Newshub's Web API imageSourcesUpdated = true; - imageTag.src = `/assets/${originalMediaId}`; + mediaTag.src = `/assets/${originalMediaId}`; } }); diff --git a/assets/ui/components/ArticleMedia.jsx b/assets/ui/components/ArticleMedia.jsx index fa4954665..a01f9d39f 100644 --- a/assets/ui/components/ArticleMedia.jsx +++ b/assets/ui/components/ArticleMedia.jsx @@ -12,7 +12,7 @@ export default function ArticleMedia({isKilled, media, download}) {
{media.headline || media.description_text} {media.type === 'video' && ( -