JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr{ gilour

File "LinkImageController.php"

Full Path: /home/markqprx/iniasli.pro/app-20260222054312/Http/Controllers/LinkImageController.php
File size: 2.23 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Controllers;

use App\Actions\Link\LinkeablePublicPolicy;
use App\Models\Link;
use Carbon\Carbon;
use Common\Core\BaseController;
use Common\Core\Rendering\DetectsCrawlers;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;

class LinkImageController extends BaseController
{
    use DetectsCrawlers;

    public function show(string $hash)
    {
        $link = Link::where('hash', $hash)->firstOrFail();

        if (!app(LinkeablePublicPolicy::class)->isAccessible($link)) {
            abort(403);
        }

        // Don't create image if request is coming from a crawler
        if ($this->isCrawler()) {
            return $link->image;
        }

        if (
            !$link->image ||
            // update automatically generated image once a week
            (Str::contains($link->image, '_auto_') &&
                $link->updated_at->lessThan(Carbon::now()->subWeek()))
        ) {
            $this->generateWebsiteScreenshot($link);
        }

        return redirect("storage/$link->image");
    }

    private function generateWebsiteScreenshot(Link $link)
    {
        $path = "link_images/{$link->hash}_auto_.jpg";

        // todo: fix config('common.site.ssr_enabled')

        if (false) {
            $imageData = $this->captureImageWithNode($link);
        } else {
            $apis = [
                "https://s.wordpress.com/mshots/v1/$link->long_url?w=800",
                "https://api.pagepeeker.com/v2/thumbs.php?size=l&url=$link->long_url",
                "https://api.miniature.io/?width=800&height=600&screen=1024&url=$link->long_url",
                'https://image.thum.io/get/width/600/crop/900/' .
                urldecode($link->long_url),
            ];
            $imageData = Http::get(Arr::random($apis))->body();
        }

        if (isset($imageData)) {
            Storage::disk('public')->put($path, $imageData);
            $link->fill(['image' => $path])->save();
        }
    }

    protected function captureImageWithNode(Link $link)
    {
        $serverUrl = config('common.site.ssr_url') . '/screenshot';
        return Http::post($serverUrl, [
            'url' => $link->long_url,
        ])->body();
    }
}