podcastartgenerator/site/app/Jobs/StashAndOptimizeLegacyArtworkJob.php

126 lines
5.1 KiB
PHP
Raw Permalink Normal View History

<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Models\User;
use App\Models\Artist;
use App\Models\Artwork;
use App\Models\Episode;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Intervention\Image\Facades\Image;
use Carbon\Carbon;
use ImageOptimizer;
class StashAndOptimizeLegacyArtworkJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $artist;
protected $artwork;
public $tries = 2;
/**
* Create a new job instance.
*/
public function __construct($artist, $artwork)
{
$this->artist = $artist;
$this->artwork = $artwork;
}
/**
* Execute the job.
*/
public function handle(): void
{
$date = Carbon::parse($this->artwork->created_at);
$basename = $date->format('Y')
. '/' . $date->format('m')
. '/' . Str::slug($this->artist->name)
. '-' . Str::slug($this->artwork->title)
. '_' . $this->artwork->id . '.jpg';
$filename = 'artworks/' . $basename;
$thumbnailName = 'thumbnails/' . $basename;
if (Storage::disk('static')->exists($filename)) {
Log::channel('artwork_import')->error($filename . ' already exists. Filesize: ' . Storage::disk('static')->size($filename));
$this->createArtwork($basename);
return;
}
$img = Image::make('/legacypublic' . $this->artwork->path . '/' . $this->artwork->filename)
->resize(3000, null, function ($constraint) {
$constraint->aspectRatio();
})
->encode('jpg', 100);
$thumbImg = Image::make('/legacypublic' . $this->artwork->path . '/' . $this->artwork->filename)
->resize(512, null, function ($constraint) {
$constraint->aspectRatio();
})
->encode('jpg', 100);
$imgLocation = Storage::disk('static')->put($filename, $img);
$thumbLocation = Storage::disk('static')->put($thumbnailName, $thumbImg);
$size_before = Storage::disk('static')->size($filename);
$thumb_size_before = Storage::disk('static')->size($thumbnailName);
ImageOptimizer::optimize(Storage::disk('static')->path($filename));
ImageOptimizer::optimize(Storage::disk('static')->path($thumbnailName));
$size_after = Storage::disk('static')->size($filename);
$thumb_size_after = Storage::disk('static')->size($thumbnailName);
$diff = $size_before - $size_after;
$thumbDiff = $thumb_size_before - $thumb_size_after;
Log::channel('artwork_import')->info('Filesize Before: ' . $size_before);
Log::channel('artwork_import')->info('Filesize After: ' . $size_after);
$perc_smaller = ($diff / $size_before) * 100;
$thumb_perc_smaller = ($thumbDiff / $thumb_size_before) * 100;
Log::channel('artwork_import')->info(number_format($perc_smaller, 2) . '% smaller.');
Log::channel('artwork_import')->info(number_format($thumb_perc_smaller, 2) . '% smaller thumbnail - ' . $thumb_size_after);
Log::channel('artwork_import')->info('Saved and resized ' . $filename);
$this->createArtwork($basename);
}
private function createArtwork($basename) {
$artwork = Artwork::where('legacy_id', $this->artwork->id)->first();
if (!$this->artwork->episode_id) {
$episode = Episode::where('episode_date', '>=', Carbon::parse($this->artwork->created_at)->startOfDay())
->orderBy('episode_date', 'asc')
->first();
} else {
$episode = Episode::where('legacy_id', $this->artwork->episode_id)->first();
}
if (!$artwork) {
$artwork = Artwork::where('filename', $basename)->first();
if ($artwork) {
$artwork->legacy_id = $this->artwork->id;
$artwork->episode_id = $episode->id ?? null;
$artwork->save();
return;
}
}
if (!$artwork) {
Log::channel('artwork_import')->info('making new artwork model for ' . $basename);
Artwork::factory()->state([
'title' => $this->artwork->title,
'artist_id' => $this->artist->id,
'description' => '',
'podcast_id' => 1,
'overlay_id' => $this->artwork->overlay_id,
'episode_id' => $episode->id ?? null,
'filename' => $basename ?? null,
'created_at' => Carbon::parse($this->artwork->created_at),
'updated_at' => Carbon::parse($this->artwork->updated_at),
'legacy_id' => $this->artwork->id,
])->create();
} else {
Log::channel('artwork_import')->info($artwork->id . ' has a model it exists with ' . $artwork->filename);
}
}
}