UNPKG

@eluvio/elv-utils-js

Version:

Utilities for the Eluvio Content Fabric

153 lines (134 loc) 4.45 kB
const fs = require('fs') const path = require('path') const isEmpty = require('@eluvio/elv-js-helpers/Boolean/isEmpty') const isNil = require('@eluvio/elv-js-helpers/Boolean/isNil') const isNumber = require('@eluvio/elv-js-helpers/Boolean/isNumber') const {ModOpt} = require('./lib/options') const Utility = require('./lib/Utility') const ArgFile = require('./lib/concerns/args/ArgFile') const ArgForced = require('./lib/concerns/args/ArgForced') const ArgIsDefault = require('./lib/concerns/args/ArgIsDefault') const ArgLabel = require('./lib/concerns/args/ArgLabel') const ArgLanguage = require('./lib/concerns/args/ArgLanguage') const ArgOfferingKey = require('./lib/concerns/args/ArgOfferingKey') const ArgStoreClear = require('./lib/concerns/args/ArgStoreClear') const ArgStreamKey = require('./lib/concerns/ArgStreamKey') const ArgTimeShift = require('./lib/concerns/ArgTimeShift') const Edit = require('./lib/concerns/Edit') const ExistObj = require('./lib/concerns/kits/ExistObj') const Metadata = require('./lib/concerns/Metadata') const Part = require('./lib/concerns/Part') const Subtitle = require('./lib/concerns/Subtitle') class OfferingAddSubtitles extends Utility { static blueprint() { return { concerns: [ ExistObj, Metadata, Subtitle, Edit, Part, ArgFile, ArgForced, ArgIsDefault, ArgLabel, ArgLanguage, ArgOfferingKey, ArgStoreClear, ArgStreamKey, ArgTimeShift ], options: [ ModOpt('file', { demand: true, X: 'subtitle' }), ModOpt('offeringKey', { X: 'to add subtitle stream to' }), ModOpt('storeClear', { X: 'to store subtitle data' }), ModOpt('streamKey', { descTemplate: 'Key for new subtitle stream', demand: true }), ModOpt('label', { demand: true, X: 'to show in player for subtitle stream' }), ModOpt('language', { demand: true, X: 'for subtitle stream' }), ModOpt('isDefault', { X: 'subtitle stream' }), ModOpt('timeShift', { X: 'from timestamps in subtitle file' }) ] } } async body() { const logger = this.logger const { forced, isDefault, label, language, offeringKey, storeClear, streamKey, timeShift } = this.args const filePath = this.args.file const fileName = path.basename(filePath) const {libraryId, objectId} = await this.concerns.ExistObj.argsProc() const offering = await this.concerns.Metadata.get({ libraryId, objectId, subtree: `/offerings/${offeringKey}` }) if (isNil(offering) || isEmpty(offering)) throw Error(`Offering '${offeringKey}' not found.`) const useClearStorage = storeClear || offering.store_clear // read captions file and apply any time shift let originalData = fs.readFileSync(filePath) const partData = isNumber(timeShift) && (timeShift !== 0) ? Subtitle.adjustTimestamps(timeShift, originalData) : originalData const {writeToken} = await this.concerns.Edit.getWriteToken({libraryId, objectId}) // upload part const partUploadResult = await this.concerns.Part.upload({ libraryId, objectId, writeToken, storeClear: useClearStorage, partData }) const partHash = partUploadResult.partHash console.log(`Subtitles uploaded as new part: ${partHash}`) const revisedOffering = Subtitle.addToOffering({ offering, partHash, forced, isDefault, label, language, streamKey }) // Write back metadata await this.concerns.Metadata.write({ libraryId, metadata: revisedOffering, objectId, subtree: `/offerings/${offeringKey}`, writeToken, }) // finalize const newHash = await this.concerns.Edit.finalize({ commitMessage: `Add subtitle stream from file '${fileName}' to offering '${offeringKey}'`, libraryId, objectId, writeToken }) logger.data('version_hash', newHash) logger.log('New version hash: ' + newHash) } header() { return `Add subtitle stream to offering '${this.args.offeringKey}' in object ${this.args.objectId}.` } } if (require.main === module) { Utility.cmdLineInvoke(OfferingAddSubtitles) } else { module.exports = OfferingAddSubtitles }