Added image processing options to media module. Cropping Killergram avatars. Overwriting images when --force is used.
This commit is contained in:
parent
4c551cc15f
commit
e8c55512e2
44
src/media.js
44
src/media.js
|
@ -105,6 +105,8 @@ function toBaseSource(rawSource) {
|
|||
if (rawSource.comment) baseSource.comment = rawSource.comment;
|
||||
if (rawSource.group) baseSource.group = rawSource.group;
|
||||
|
||||
if (rawSource.process) baseSource.process = rawSource.process;
|
||||
|
||||
return baseSource;
|
||||
}
|
||||
|
||||
|
@ -285,6 +287,30 @@ async function storeImageFile(media, hashDir, hashSubDir, filename, filedir, fil
|
|||
|
||||
const image = sharp(media.file.path);
|
||||
const info = await image.metadata();
|
||||
const isProcessed = media.meta.subtype !== 'jpeg' || media.process;
|
||||
|
||||
if (media.process) {
|
||||
Object.entries(media.process).forEach(([operation, options]) => {
|
||||
if (image[operation]) {
|
||||
image[operation](...(Array.isArray(options) ? options : [options]));
|
||||
return;
|
||||
}
|
||||
|
||||
if (operation === 'crop') {
|
||||
image.extract(...(Array.isArray(options) ? options : [options]));
|
||||
return;
|
||||
}
|
||||
|
||||
logger.warn(`Unknown image operation on ${media.id} (${media.src}): ${operation}`);
|
||||
});
|
||||
}
|
||||
|
||||
if (isProcessed) {
|
||||
// convert to JPEG and write to permanent location
|
||||
await image
|
||||
.jpeg()
|
||||
.toFile(path.join(config.media.path, filepath));
|
||||
}
|
||||
|
||||
// generate thumbnail and lazy
|
||||
await Promise.all([
|
||||
|
@ -304,17 +330,12 @@ async function storeImageFile(media, hashDir, hashSubDir, filename, filedir, fil
|
|||
.toFile(path.join(config.media.path, lazypath)),
|
||||
]);
|
||||
|
||||
if (media.meta.subtype === 'jpeg') {
|
||||
// move temp file to permanent location
|
||||
await fsPromises.rename(media.file.path, path.join(config.media.path, filepath));
|
||||
} else {
|
||||
// convert to JPEG and write to permanent location
|
||||
await sharp(media.file.path)
|
||||
.jpeg()
|
||||
.toFile(path.join(config.media.path, filepath));
|
||||
|
||||
if (isProcessed) {
|
||||
// remove temp file
|
||||
await fsPromises.unlink(media.file.path);
|
||||
} else {
|
||||
// move temp file to permanent location
|
||||
await fsPromises.rename(media.file.path, path.join(config.media.path, filepath));
|
||||
}
|
||||
|
||||
logger.silly(`Stored thumbnail, lazy and permanent media file for ${media.id} from ${media.src} at ${filepath}`);
|
||||
|
@ -435,8 +456,6 @@ async function fetchSource(source, baseMedia) {
|
|||
hasher.write(chunk);
|
||||
});
|
||||
|
||||
console.log(source);
|
||||
|
||||
const { mimetype } = source.stream
|
||||
? await fetchStreamSource(source, tempFileTarget, hashStream)
|
||||
: await fetchHttpSource(source, tempFileTarget, hashStream);
|
||||
|
@ -572,9 +591,10 @@ async function storeMedias(baseMedias) {
|
|||
);
|
||||
|
||||
const [uniqueHashMedias, existingHashMedias] = await findHashDuplicates(fetchedMedias);
|
||||
const newMedias = argv.force ? uniqueHashMedias.concat(existingHashMedias) : uniqueHashMedias;
|
||||
|
||||
const savedMedias = await Promise.map(
|
||||
uniqueHashMedias,
|
||||
newMedias,
|
||||
async baseMedia => storeFile(baseMedia),
|
||||
);
|
||||
|
||||
|
|
|
@ -71,6 +71,18 @@ async function fetchActorReleases({ query }, url, remainingPages, actorName, acc
|
|||
async function scrapeProfile({ query, window }, actorName, url, include) {
|
||||
const profile = {};
|
||||
|
||||
profile.avatar = {
|
||||
src: `http://thumbs.killergram.com/models/${encodeURI(actorName)}/modelprofilethumb.jpg`,
|
||||
process: {
|
||||
crop: {
|
||||
top: 4,
|
||||
left: 4,
|
||||
width: 289,
|
||||
height: 125,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
if (include.releases) {
|
||||
const availablePages = query.all('.pageboxdropdown option', 'value');
|
||||
profile.releases = await fetchActorReleases(qu.init(query.q('#episodes > table'), window), url, availablePages.slice(1), actorName);
|
||||
|
|
Loading…
Reference in New Issue