Added media limit sampling.
This commit is contained in:
64
src/media.js
64
src/media.js
@@ -1,13 +1,12 @@
|
||||
'use strict';
|
||||
|
||||
const config = require('config');
|
||||
// const util = require('util');
|
||||
const Promise = require('bluebird');
|
||||
const fs = require('fs').promises;
|
||||
const path = require('path');
|
||||
const nanoid = require('nanoid/non-secure');
|
||||
const mime = require('mime');
|
||||
const fileType = require('file-type');
|
||||
// const fileType = require('file-type');
|
||||
const sharp = require('sharp');
|
||||
const blake2 = require('blake2');
|
||||
|
||||
@@ -72,6 +71,60 @@ async function getThumbnail(buffer, height = config.media.thumbnailSize) {
|
||||
return null;
|
||||
}
|
||||
|
||||
function sampleMedias(medias, limit = config.media.limit, preferLast = true) {
|
||||
// limit media sets, use extrax as fallbacks
|
||||
if (medias.length <= limit) {
|
||||
return medias;
|
||||
}
|
||||
|
||||
const chunkSize = Math.floor(medias.length / limit);
|
||||
const rest = medias.length - (limit * chunkSize);
|
||||
|
||||
const chunks = Array.from(
|
||||
{ length: limit },
|
||||
(value, index) => {
|
||||
const start = (chunkSize * index) + Math.min(index, rest);
|
||||
|
||||
return medias.slice(
|
||||
start,
|
||||
start + chunkSize + (index < rest ? 1 : 0),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
// flip last chunk so the very last image (often the best cumshot) is tried first
|
||||
const lastPreferredChunks = preferLast
|
||||
? chunks.slice(0, -1).concat(chunks.slice(-1).reverse())
|
||||
: chunks;
|
||||
|
||||
const groupedMedias = lastPreferredChunks.map((chunk) => {
|
||||
// merge chunked medias into single media with grouped fallback priorities,
|
||||
// so the first sources of each media is preferred over all second sources, etc.
|
||||
const sources = chunk
|
||||
.reduce((accSources, media) => {
|
||||
media.sources.forEach((source, index) => {
|
||||
if (!accSources[index]) {
|
||||
accSources.push([source]);
|
||||
return;
|
||||
}
|
||||
|
||||
accSources[index].push(source);
|
||||
});
|
||||
|
||||
return accSources;
|
||||
}, [])
|
||||
.flat();
|
||||
|
||||
return {
|
||||
id: chunk[0].id,
|
||||
role: chunk[0].role,
|
||||
sources,
|
||||
};
|
||||
});
|
||||
|
||||
return groupedMedias;
|
||||
}
|
||||
|
||||
function itemsByKey(items, key) {
|
||||
return items.reduce((acc, item) => ({ ...acc, [item[key]]: item }), {});
|
||||
}
|
||||
@@ -143,7 +196,7 @@ function toBaseMedias(rawMedias, role) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return rawMedias.map((rawMedia) => {
|
||||
const baseMedias = rawMedias.map((rawMedia) => {
|
||||
if (!rawMedia) {
|
||||
return null;
|
||||
}
|
||||
@@ -157,6 +210,10 @@ function toBaseMedias(rawMedias, role) {
|
||||
|
||||
return baseSourceToBaseMedia(baseSource, role);
|
||||
}).filter(Boolean);
|
||||
|
||||
const sampledBaseMedias = sampleMedias(baseMedias);
|
||||
|
||||
return sampledBaseMedias;
|
||||
}
|
||||
|
||||
async function findSourceDuplicates(baseMedias) {
|
||||
@@ -465,7 +522,6 @@ async function associateReleaseMedia(releases) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: media count limits
|
||||
// TODO: catch errors
|
||||
// TODO: stage by role
|
||||
|
||||
|
||||
Reference in New Issue
Block a user