Initial commit: Animexe Laravel platform

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 00:01:48 +03:00
co-authored by Claude Opus 4.8
commit a63515cfc6
366 changed files with 74773 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
<?php
namespace App\Services;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
class AniSkipService
{
// v2 kapalı, v1 çalışıyor
const BASE = 'https://api.aniskip.com/v1';
const CACHE_HIT = 60 * 60 * 24;
const CACHE_MISS = 60 * 15; // miss → 15 dk (kısa retry)
public function getSkipTimes(string $malId, int $episodeNumber): ?array
{
$key = "aniskip_v1_{$malId}_{$episodeNumber}";
if (Cache::has($key)) {
return Cache::get($key);
}
try {
// v1: types[]=op&types[]=ed şeklinde gönderilmeli
$url = self::BASE . "/skip-times/{$malId}/{$episodeNumber}?types[]=op&types[]=ed&episodeLength=0";
$res = Http::timeout(6)->get($url);
if (!$res->ok() || empty($res->json('results'))) {
Cache::put($key, null, self::CACHE_MISS);
return null;
}
$result = [];
foreach ($res->json('results') as $item) {
$type = $item['skip_type'] ?? null;
$interval = $item['interval'] ?? null;
if (!$type || !$interval) continue;
$result[$type] = [
'start' => round((float)($interval['start_time'] ?? $interval['startTime'] ?? 0), 2),
'end' => round((float)($interval['end_time'] ?? $interval['endTime'] ?? 0), 2),
];
}
$data = empty($result) ? null : $result;
Cache::put($key, $data, $data ? self::CACHE_HIT : self::CACHE_MISS);
return $data;
} catch (\Throwable) {
return null;
}
}
public function searchByTitle(string $title, ?string $titleEn = null, ?string $titleJp = null): ?string
{
$jikan = new JikanService();
return $jikan->searchMalId($title, $titleEn, $titleJp);
}
}