0]); } $properties = [ 'downloads' => (int) ($row['downloads'] ?? 0), 'isimage' => (bool) ($row['isimage'] ?? false), 'legacy_attachmentid' => (int) ($row['attachmentid'] ?? 0), 'legacy_filepath' => $row['filepath'] ?? null, 'legacy_thumb' => $row['thumb_filepath'] ?? null, 'legacy_articleid' => (int) ($row['articleid'] ?? 0), 'pending_sync' => true, ]; $source = $this->locateSource($row['filepath'] ?? null, $attachmentsDir); if ($source && $syncNow) { $media = $post->addMedia($source) ->preservingOriginal() ->withCustomProperties($properties) ->usingFileName(basename($row['filename']) ?: basename($source)) ->toMediaCollection('attachments', MediaDisk::name()); $media->setCustomProperty('pending_sync', false); $media->save(); return $media; } return $this->createPendingRecord($post->id, $row, $properties); } private function locateSource(?string $filepath, ?string $attachmentsDir): ?string { if (! $attachmentsDir || ! $filepath) { return null; } $candidate = rtrim($attachmentsDir, '/').'/'.ltrim($filepath, '/'); return is_file($candidate) ? $candidate : null; } private function createPendingRecord(int $postId, array $row, array $properties): Media { $disk = MediaDisk::name(); $media = new Media; $media->model_type = Post::class; $media->model_id = $postId; $media->uuid = (string) Str::uuid(); $media->collection_name = 'attachments'; $media->name = pathinfo($row['filename'] ?? 'attachment', PATHINFO_FILENAME) ?: 'attachment'; $media->file_name = $row['filename'] ?: basename($row['filepath'] ?? 'attachment.bin'); $media->mime_type = $row['filetype'] ?: null; $media->size = (int) ($row['filesize'] ?? 0); $media->disk = $disk; $media->conversions_disk = $disk; $media->manipulations = []; $media->custom_properties = $properties; $media->generated_conversions = []; $media->responsive_images = []; $media->save(); return $media; } }