MediaFixLocalFilesystemCleanupPipeline.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Jobs\MediaPipeline;
  3. use App\Media;
  4. use Illuminate\Bus\Queueable;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Foundation\Bus\Dispatchable;
  7. use Illuminate\Queue\InteractsWithQueue;
  8. use Illuminate\Queue\SerializesModels;
  9. use Illuminate\Support\Facades\Redis;
  10. use Illuminate\Support\Facades\Storage;
  11. class MediaFixLocalFilesystemCleanupPipeline implements ShouldQueue
  12. {
  13. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  14. public $timeout = 1800;
  15. public $tries = 5;
  16. public $maxExceptions = 1;
  17. public function handle()
  18. {
  19. if(config_cache('pixelfed.cloud_storage') == false) {
  20. // Only run if cloud storage is enabled
  21. return;
  22. }
  23. $disk = Storage::disk('local');
  24. $cloud = Storage::disk(config('filesystems.cloud'));
  25. Media::whereNotNull(['status_id', 'cdn_url', 'replicated_at'])
  26. ->chunk(20, function ($medias) use($disk, $cloud) {
  27. foreach($medias as $media) {
  28. if(!str_starts_with($media->media_path, 'public')) {
  29. continue;
  30. }
  31. if($disk->exists($media->media_path) && $cloud->exists($media->media_path)) {
  32. $disk->delete($media->media_path);
  33. }
  34. if($media->thumbnail_path) {
  35. if($disk->exists($media->thumbnail_path)) {
  36. $disk->delete($media->thumbnail_path);
  37. }
  38. }
  39. $paths = explode('/', $media->media_path);
  40. if(count($paths) === 7) {
  41. array_pop($paths);
  42. $baseDir = implode('/', $paths);
  43. if(count($disk->allFiles($baseDir)) === 0) {
  44. $disk->deleteDirectory($baseDir);
  45. array_pop($paths);
  46. $baseDir = implode('/', $paths);
  47. if(count($disk->allFiles($baseDir)) === 0) {
  48. $disk->deleteDirectory($baseDir);
  49. array_pop($paths);
  50. $baseDir = implode('/', $paths);
  51. if(count($disk->allFiles($baseDir)) === 0) {
  52. $disk->deleteDirectory($baseDir);
  53. }
  54. }
  55. }
  56. }
  57. }
  58. });
  59. }
  60. }