2019-11-11 02:20:00 +00:00
|
|
|
'use strict';
|
|
|
|
|
2020-03-29 02:00:46 +00:00
|
|
|
const Promise = require('bluebird');
|
|
|
|
const nanoid = require('nanoid/non-secure');
|
2019-11-11 02:20:00 +00:00
|
|
|
|
2020-03-29 02:00:46 +00:00
|
|
|
const logger = require('./logger')(__filename);
|
|
|
|
const argv = require('./argv');
|
|
|
|
const knex = require('./knex');
|
|
|
|
const { get } = require('./utils/qu');
|
|
|
|
|
|
|
|
function itemsByKey(items, key) {
|
|
|
|
return items.reduce((acc, item) => ({ ...acc, [item[key]]: item }), {});
|
2019-11-11 02:20:00 +00:00
|
|
|
}
|
|
|
|
|
2020-03-29 02:00:46 +00:00
|
|
|
function toBaseSource(rawSource) {
|
|
|
|
if (rawSource.src || (rawSource.extract && rawSource.url)) {
|
|
|
|
const baseSource = {};
|
|
|
|
|
|
|
|
if (rawSource.src) baseSource.src = rawSource.src;
|
|
|
|
if (rawSource.quality) baseSource.quality = rawSource.quality;
|
|
|
|
if (rawSource.type) baseSource.type = rawSource.type;
|
|
|
|
|
|
|
|
if (rawSource.url) baseSource.url = rawSource.url;
|
|
|
|
if (rawSource.extract) baseSource.extract = rawSource.extract;
|
|
|
|
|
|
|
|
return baseSource;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (typeof rawSource === 'string') {
|
|
|
|
return {
|
|
|
|
src: rawSource,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
function baseSourceToBaseMedia(baseSource) {
|
|
|
|
if (Array.isArray(baseSource)) {
|
|
|
|
if (baseSource.length > 0) {
|
|
|
|
return {
|
|
|
|
id: nanoid(),
|
|
|
|
sources: baseSource,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (baseSource) {
|
|
|
|
return {
|
|
|
|
id: nanoid(),
|
|
|
|
sources: [baseSource],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
function fallbackMediaToBaseMedia(rawMedia) {
|
|
|
|
const baseSources = rawMedia
|
|
|
|
.map(source => toBaseSource(source))
|
|
|
|
.filter(Boolean);
|
|
|
|
|
|
|
|
return baseSourceToBaseMedia(baseSources);
|
|
|
|
}
|
|
|
|
|
|
|
|
function toBaseMedias(rawMedias) {
|
|
|
|
if (!rawMedias || rawMedias.length === 0) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
return rawMedias.map((rawMedia) => {
|
|
|
|
if (!rawMedia) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Array.isArray(rawMedia)) {
|
|
|
|
// fallback sources provided
|
|
|
|
return fallbackMediaToBaseMedia(rawMedia);
|
|
|
|
}
|
|
|
|
|
|
|
|
const baseSource = toBaseSource(rawMedia);
|
|
|
|
|
|
|
|
return baseSourceToBaseMedia(baseSource);
|
|
|
|
}).filter(Boolean);
|
|
|
|
}
|
|
|
|
|
|
|
|
async function findSourceDuplicates(baseMedias) {
|
|
|
|
const sourceUrls = baseMedias
|
|
|
|
.map(baseMedia => baseMedia.sources.map(source => source.src))
|
|
|
|
.flat()
|
|
|
|
.filter(Boolean);
|
|
|
|
|
|
|
|
const extractUrls = baseMedias
|
|
|
|
.map(baseMedia => baseMedia.sources.map(source => source.url))
|
|
|
|
.flat()
|
|
|
|
.filter(Boolean);
|
2020-03-24 02:48:24 +00:00
|
|
|
|
2020-03-29 02:00:46 +00:00
|
|
|
|
|
|
|
const [existingSourceMedia, existingExtractMedia] = await Promise.all([
|
|
|
|
knex('media').whereIn('source', sourceUrls),
|
|
|
|
knex('media').whereIn('source_page', extractUrls),
|
|
|
|
]);
|
|
|
|
|
|
|
|
const existingSourceMediaByUrl = itemsByKey(existingSourceMedia, 'source');
|
|
|
|
const existingExtractMediaByUrl = itemsByKey(existingExtractMedia, 'source_page');
|
|
|
|
|
|
|
|
return {
|
|
|
|
existingSourceMediaByUrl,
|
|
|
|
existingExtractMediaByUrl,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
async function extractSource(baseSource) {
|
|
|
|
if (!baseSource.extract || !baseSource.url) {
|
|
|
|
return baseSource;
|
|
|
|
}
|
|
|
|
|
|
|
|
const res = await get(baseSource.url);
|
|
|
|
|
|
|
|
console.log(res);
|
|
|
|
return baseSource;
|
|
|
|
}
|
|
|
|
|
|
|
|
async function fetchSource(baseSource, { existingSourceMediaByUrl, existingExtractMediaByUrl }) {
|
|
|
|
// attempts
|
|
|
|
// extract
|
|
|
|
const extractedSource = await extractSource(baseSource, existingExtractMediaByUrl);
|
|
|
|
|
|
|
|
console.log(extractedSource);
|
|
|
|
}
|
|
|
|
|
|
|
|
async function fetchMedia(baseMedia, existingMedias) {
|
|
|
|
await baseMedia.sources.reduce((result, baseSource, _baseSourceIndex) => result.catch(async () => {
|
|
|
|
await fetchSource(baseSource, existingMedias);
|
|
|
|
}), Promise.reject(new Error()));
|
|
|
|
}
|
|
|
|
|
|
|
|
async function storeMedias(baseMedias) {
|
|
|
|
const { existingSourceMediaByUrl, existingExtractMediaByUrl } = await findSourceDuplicates(baseMedias);
|
|
|
|
|
|
|
|
await Promise.map(baseMedias, async baseMedia => fetchMedia(baseMedia, { existingSourceMediaByUrl, existingExtractMediaByUrl }));
|
|
|
|
|
|
|
|
console.log(existingSourceMediaByUrl, existingExtractMediaByUrl);
|
|
|
|
}
|
|
|
|
|
|
|
|
async function associateReleaseMedia(releases) {
|
|
|
|
if (!argv.media) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const baseMediasByReleaseId = releases.reduce((acc, release) => ({
|
|
|
|
...acc,
|
|
|
|
[release.id]: {
|
|
|
|
poster: argv.images && argv.poster && toBaseMedias([release.poster]),
|
|
|
|
photos: argv.images && argv.photos && toBaseMedias(release.photos),
|
|
|
|
trailer: argv.videos && argv.trailer && toBaseMedias([release.trailer]),
|
|
|
|
teaser: argv.videos && argv.teaser && toBaseMedias([release.teaser]),
|
|
|
|
},
|
|
|
|
}), {});
|
|
|
|
|
|
|
|
const baseMedias = Object.values(baseMediasByReleaseId).map(releaseMedia => Object.values(releaseMedia)).flat(2);
|
|
|
|
|
|
|
|
await storeMedias(baseMedias);
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
associateReleaseMedia,
|
2019-11-11 02:20:00 +00:00
|
|
|
};
|