feat(*.php, *.psql): deduplicate API code + performance improvements
This commit is contained in:
parent
cf3dac8a46
commit
4bad005e58
31 changed files with 502 additions and 666 deletions
|
@ -8,9 +8,6 @@ use GuzzleHttp\Client;
|
|||
|
||||
class ArtistImportHandler extends ApiHandler
|
||||
{
|
||||
protected string $postgrestUrl;
|
||||
protected string $postgrestApiKey;
|
||||
|
||||
private string $artistImportToken;
|
||||
private string $placeholderImageId = "4cef75db-831f-4f5d-9333-79eaa5bb55ee";
|
||||
private string $navidromeApiUrl;
|
||||
|
@ -20,13 +17,7 @@ class ArtistImportHandler extends ApiHandler
|
|||
{
|
||||
parent::__construct();
|
||||
$this->ensureCliAccess();
|
||||
$this->loadEnvironment();
|
||||
}
|
||||
|
||||
private function loadEnvironment(): void
|
||||
{
|
||||
$this->postgrestUrl = getenv("POSTGREST_URL");
|
||||
$this->postgrestApiKey = getenv("POSTGREST_API_KEY");
|
||||
$this->artistImportToken = getenv("ARTIST_IMPORT_TOKEN");
|
||||
$this->navidromeApiUrl = getenv("NAVIDROME_API_URL");
|
||||
$this->navidromeAuthToken = getenv("NAVIDROME_API_TOKEN");
|
||||
|
@ -41,11 +32,13 @@ class ArtistImportHandler extends ApiHandler
|
|||
$providedToken = $input["token"] ?? null;
|
||||
$artistId = $input["artistId"] ?? null;
|
||||
|
||||
if (!$providedToken || $providedToken !== $this->artistImportToken) {
|
||||
if ($providedToken !== $this->artistImportToken) {
|
||||
$this->sendJsonResponse("error", "Unauthorized access", 401);
|
||||
}
|
||||
|
||||
if (!$artistId) $this->sendJsonResponse("error", "Artist ID is required", 400);
|
||||
if (!$artistId) {
|
||||
$this->sendJsonResponse("error", "Artist ID is required", 400);
|
||||
}
|
||||
|
||||
try {
|
||||
$artistData = $this->fetchNavidromeArtist($artistId);
|
||||
|
@ -54,7 +47,7 @@ class ArtistImportHandler extends ApiHandler
|
|||
if ($artistExists) $this->processAlbums($artistId, $artistData->name);
|
||||
|
||||
$this->sendJsonResponse("message", "Artist and albums synced successfully", 200);
|
||||
} catch (Exception $e) {
|
||||
} catch (\Exception $e) {
|
||||
$this->sendJsonResponse("error", "Error: " . $e->getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +60,7 @@ class ArtistImportHandler extends ApiHandler
|
|||
exit();
|
||||
}
|
||||
|
||||
private function fetchNavidromeArtist(string $artistId)
|
||||
private function fetchNavidromeArtist(string $artistId): object
|
||||
{
|
||||
$client = new Client();
|
||||
$response = $client->get("{$this->navidromeApiUrl}/api/artist/{$artistId}", [
|
||||
|
@ -77,7 +70,7 @@ class ArtistImportHandler extends ApiHandler
|
|||
]
|
||||
]);
|
||||
|
||||
return json_decode($response->getBody(), false);
|
||||
return json_decode($response->getBody());
|
||||
}
|
||||
|
||||
private function fetchNavidromeAlbums(string $artistId): array
|
||||
|
@ -103,16 +96,14 @@ class ArtistImportHandler extends ApiHandler
|
|||
private function processArtist(object $artistData): bool
|
||||
{
|
||||
$artistName = $artistData->name ?? "";
|
||||
|
||||
if (!$artistName) throw new Exception("Artist name is missing from Navidrome data.");
|
||||
if (!$artistName) throw new \Exception("Artist name is missing.");
|
||||
|
||||
$existingArtist = $this->getArtistByName($artistName);
|
||||
|
||||
if ($existingArtist) return true;
|
||||
|
||||
$artistKey = sanitizeMediaString($artistName);
|
||||
$slug = "/music/artists/{$artistKey}";
|
||||
$description = strip_tags($artistData->biography) ?? "";
|
||||
$description = strip_tags($artistData->biography ?? "");
|
||||
$genre = $this->resolveGenreId($artistData->genres[0]->name ?? "");
|
||||
$starred = $artistData->starred ?? false;
|
||||
|
||||
|
@ -127,35 +118,34 @@ class ArtistImportHandler extends ApiHandler
|
|||
"genres" => $genre,
|
||||
];
|
||||
|
||||
$this->saveArtist($artistPayload);
|
||||
|
||||
$this->makeRequest("POST", "artists", ["json" => $artistPayload]);
|
||||
return true;
|
||||
}
|
||||
|
||||
private function processAlbums(string $artistId, string $artistName): void
|
||||
{
|
||||
$artist = $this->getArtistByName($artistName);
|
||||
|
||||
if (!$artist) throw new Exception("Artist not found in the database.");
|
||||
if (!$artist) throw new \Exception("Artist not found after insert.");
|
||||
|
||||
$existingAlbums = $this->getExistingAlbums($artist["id"]);
|
||||
$existingAlbumKeys = array_column($existingAlbums, "key");
|
||||
|
||||
$navidromeAlbums = $this->fetchNavidromeAlbums($artistId);
|
||||
|
||||
foreach ($navidromeAlbums as $album) {
|
||||
$albumName = $album["name"];
|
||||
$albumName = $album["name"] ?? "";
|
||||
$releaseYearRaw = $album["date"] ?? null;
|
||||
$releaseYear = null;
|
||||
|
||||
if ($releaseYearRaw) {
|
||||
if (preg_match('/^\d{4}/', $releaseYearRaw, $matches)) $releaseYear = (int)$matches[0];
|
||||
if ($releaseYearRaw && preg_match('/^\d{4}/', $releaseYearRaw, $matches)) {
|
||||
$releaseYear = (int)$matches[0];
|
||||
}
|
||||
|
||||
$artistKey = sanitizeMediaString($artistName);
|
||||
$albumKey = $artistKey . "-" . sanitizeMediaString($albumName);
|
||||
$albumKey = "{$artistKey}-" . sanitizeMediaString($albumName);
|
||||
|
||||
if (in_array($albumKey, $existingAlbumKeys)) {
|
||||
error_log("Skipping existing album: " . $albumName);
|
||||
error_log("Skipping existing album: {$albumName}");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -170,8 +160,8 @@ class ArtistImportHandler extends ApiHandler
|
|||
"tentative" => true,
|
||||
];
|
||||
|
||||
$this->saveAlbum($albumPayload);
|
||||
} catch (Exception $e) {
|
||||
$this->makeRequest("POST", "albums", ["json" => $albumPayload]);
|
||||
} catch (\Exception $e) {
|
||||
error_log("Error adding album '{$albumName}': " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
@ -179,34 +169,19 @@ class ArtistImportHandler extends ApiHandler
|
|||
|
||||
private function getArtistByName(string $nameString): ?array
|
||||
{
|
||||
$query = "name_string=eq." . urlencode($nameString);
|
||||
$response = $this->fetchFromPostgREST("artists", $query, "GET");
|
||||
|
||||
$response = $this->fetchFromApi("artists", "name_string=eq." . urlencode($nameString));
|
||||
return $response[0] ?? null;
|
||||
}
|
||||
|
||||
private function saveArtist(array $artistPayload): void
|
||||
{
|
||||
$this->fetchFromPostgREST("artists", "", "POST", $artistPayload);
|
||||
}
|
||||
|
||||
private function saveAlbum(array $albumPayload): void
|
||||
{
|
||||
$this->fetchFromPostgREST("albums", "", "POST", $albumPayload);
|
||||
}
|
||||
|
||||
private function resolveGenreId(string $genreName): ?string
|
||||
{
|
||||
$genres = $this->fetchFromPostgREST("genres", "name=eq." . urlencode(strtolower($genreName)), "GET");
|
||||
|
||||
if (!empty($genres)) return $genres[0]["id"];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private function getExistingAlbums(string $artistId): array
|
||||
{
|
||||
return $this->fetchFromPostgREST("albums", "artist=eq." . urlencode($artistId), "GET");
|
||||
return $this->fetchFromApi("albums", "artist=eq." . urlencode($artistId));
|
||||
}
|
||||
|
||||
private function resolveGenreId(string $genreName): ?string
|
||||
{
|
||||
$genres = $this->fetchFromApi("genres", "name=eq." . urlencode(strtolower($genreName)));
|
||||
return $genres[0]["id"] ?? null;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue