UNPKG

rx-player

Version:
174 lines (173 loc) 7.82 kB
/** * Copyright 2015 CANAL+ Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import log from "../../log"; import arrayFindIndex from "../../utils/array_find_index"; import { MANIFEST_UPDATE_TYPE } from "./types"; /** * Update oldPeriod attributes with the one from newPeriod (e.g. when updating * the Manifest). * @param {Object} oldPeriod * @param {Object} newPeriod * @param {number} updateType * @returns {Object} */ export default function updatePeriodInPlace(oldPeriod, newPeriod, updateType) { const res = { updatedAdaptations: [], removedAdaptations: [], addedAdaptations: [], updatedThumbnailTracks: [], removedThumbnailTracks: [], addedThumbnailTracks: [], }; oldPeriod.start = newPeriod.start; oldPeriod.end = newPeriod.end; oldPeriod.duration = newPeriod.duration; oldPeriod.streamEvents = newPeriod.streamEvents; const oldThumbnailTracks = oldPeriod.thumbnailTracks; const newThumbnailTracks = newPeriod.thumbnailTracks; for (let j = 0; j < oldThumbnailTracks.length; j++) { const oldThumbnailTrack = oldThumbnailTracks[j]; const newThumbnailTrackIdx = arrayFindIndex(newThumbnailTracks, (a) => a.id === oldThumbnailTrack.id); if (newThumbnailTrackIdx === -1) { log.warn('Manifest: ThumbnailTrack "' + oldThumbnailTracks[j].id + '" not found when merging.'); const [removed] = oldThumbnailTracks.splice(j, 1); j--; res.removedThumbnailTracks.push({ id: removed.id, }); } else { const [newThumbnailTrack] = newThumbnailTracks.splice(newThumbnailTrackIdx, 1); oldThumbnailTrack.mimeType = newThumbnailTrack.mimeType; oldThumbnailTrack.height = newThumbnailTrack.height; oldThumbnailTrack.width = newThumbnailTrack.width; oldThumbnailTrack.horizontalTiles = newThumbnailTrack.horizontalTiles; oldThumbnailTrack.verticalTiles = newThumbnailTrack.verticalTiles; oldThumbnailTrack.start = newThumbnailTrack.start; oldThumbnailTrack.end = newThumbnailTrack.end; oldThumbnailTrack.tileDuration = newThumbnailTrack.tileDuration; oldThumbnailTrack.cdnMetadata = newThumbnailTrack.cdnMetadata; if (updateType === MANIFEST_UPDATE_TYPE.Full) { oldThumbnailTrack.index._replace(newThumbnailTrack.index); } else { oldThumbnailTrack.index._update(newThumbnailTrack.index); } res.updatedThumbnailTracks.push({ id: oldThumbnailTrack.id, mimeType: oldThumbnailTrack.mimeType, height: oldThumbnailTrack.height, width: oldThumbnailTrack.width, horizontalTiles: oldThumbnailTrack.horizontalTiles, verticalTiles: oldThumbnailTrack.verticalTiles, start: oldThumbnailTrack.start, end: oldThumbnailTrack.end, tileDuration: oldThumbnailTrack.tileDuration, }); } } if (newThumbnailTracks.length > 0) { log.warn(`Manifest: ${newThumbnailTracks.length} new Thumbnail tracks ` + "found when merging."); res.addedThumbnailTracks.push(...newThumbnailTracks.map((t) => ({ id: t.id, mimeType: t.mimeType, height: t.height, width: t.width, horizontalTiles: t.horizontalTiles, verticalTiles: t.verticalTiles, start: t.start, end: t.end, tileDuration: t.tileDuration, }))); oldPeriod.thumbnailTracks.push(...newThumbnailTracks); } const oldAdaptations = oldPeriod.getAdaptations(); const newAdaptations = newPeriod.getAdaptations(); for (let j = 0; j < oldAdaptations.length; j++) { const oldAdaptation = oldAdaptations[j]; const newAdaptationIdx = arrayFindIndex(newAdaptations, (a) => a.id === oldAdaptation.id); if (newAdaptationIdx === -1) { log.warn('Manifest: Adaptation "' + oldAdaptations[j].id + '" not found when merging.'); const [removed] = oldAdaptations.splice(j, 1); j--; res.removedAdaptations.push({ id: removed.id, trackType: removed.type, }); } else { const [newAdaptation] = newAdaptations.splice(newAdaptationIdx, 1); const updatedRepresentations = []; const addedRepresentations = []; const removedRepresentations = []; res.updatedAdaptations.push({ adaptation: oldAdaptation.id, trackType: oldAdaptation.type, updatedRepresentations, addedRepresentations, removedRepresentations, }); const oldRepresentations = oldAdaptation.representations; const newRepresentations = newAdaptation.representations.slice(); for (let k = 0; k < oldRepresentations.length; k++) { const oldRepresentation = oldRepresentations[k]; const newRepresentationIdx = arrayFindIndex(newRepresentations, (representation) => representation.id === oldRepresentation.id); if (newRepresentationIdx === -1) { log.warn(`Manifest: Representation "${oldRepresentations[k].id}" ` + "not found when merging."); const [removed] = oldRepresentations.splice(k, 1); k--; removedRepresentations.push(removed.id); } else { const [newRepresentation] = newRepresentations.splice(newRepresentationIdx, 1); updatedRepresentations.push(oldRepresentation.getMetadataSnapshot()); oldRepresentation.cdnMetadata = newRepresentation.cdnMetadata; if (updateType === MANIFEST_UPDATE_TYPE.Full) { oldRepresentation.index._replace(newRepresentation.index); } else { oldRepresentation.index._update(newRepresentation.index); } } } if (newRepresentations.length > 0) { log.warn(`Manifest: ${newRepresentations.length} new Representations ` + "found when merging."); oldAdaptation.representations.push(...newRepresentations); addedRepresentations.push(...newRepresentations.map((r) => r.getMetadataSnapshot())); } } } if (newAdaptations.length > 0) { log.warn(`Manifest: ${newAdaptations.length} new Adaptations ` + "found when merging."); for (const adap of newAdaptations) { const prevAdaps = oldPeriod.adaptations[adap.type]; if (prevAdaps === undefined) { oldPeriod.adaptations[adap.type] = [adap]; } else { prevAdaps.push(adap); } res.addedAdaptations.push(adap.getMetadataSnapshot()); } } return res; }