mirror of
https://github.com/ceratic/MediaCollectorLibary.git
synced 2026-05-13 23:56:46 +02:00
Remove obsolete test scripts and add new API controllers for dashboard and game management
- Deleted test scripts: test_jellyfin_execution.php, test_stash.php, test_xbvr.php, test_xbvr_sync.php, vite.config.js - Added DashboardController for fetching dashboard statistics and recent activity - Added GameController for managing games, including fetching all games, game details, and games by category - Introduced various check scripts to validate database structures and data integrity for adult videos, games, gender data, posters, and TV show actors
This commit is contained in:
@@ -15,6 +15,139 @@ class Actor extends Model
|
||||
'metadata' => 'array'
|
||||
];
|
||||
|
||||
/**
|
||||
* Get all actors with filtering and pagination
|
||||
*/
|
||||
public function findAll(array $filters = [], int $limit = null, int $offset = 0): array
|
||||
{
|
||||
$sql = "
|
||||
SELECT a.*,
|
||||
COUNT(DISTINCT am.movie_id) as movie_count,
|
||||
COUNT(DISTINCT te.tv_show_id) as tv_show_count,
|
||||
COUNT(DISTINCT aav.adult_video_id) as adult_video_count
|
||||
FROM actors a
|
||||
LEFT JOIN actor_movie am ON a.id = am.actor_id
|
||||
LEFT JOIN actor_tv_episode ate ON a.id = ate.actor_id
|
||||
LEFT JOIN tv_episodes te ON ate.tv_episode_id = te.id
|
||||
LEFT JOIN actor_adult_video aav ON a.id = aav.actor_id
|
||||
";
|
||||
$params = [];
|
||||
$whereClauses = [];
|
||||
|
||||
// Search filter
|
||||
if (!empty($filters['search'])) {
|
||||
$whereClauses[] = "a.name LIKE :search";
|
||||
$params['search'] = "%{$filters['search']}%";
|
||||
}
|
||||
|
||||
// Gender filter
|
||||
if (!empty($filters['gender'])) {
|
||||
$whereClauses[] = "JSON_UNQUOTE(JSON_EXTRACT(a.metadata, '$.gender')) = :gender";
|
||||
$params['gender'] = strtoupper($filters['gender']);
|
||||
}
|
||||
|
||||
// Adult filter
|
||||
if (isset($filters['adult'])) {
|
||||
if ($filters['adult']) {
|
||||
$whereClauses[] = "aav.adult_video_id IS NOT NULL";
|
||||
} else {
|
||||
$whereClauses[] = "aav.adult_video_id IS NULL";
|
||||
}
|
||||
}
|
||||
|
||||
// Combine WHERE clauses
|
||||
if (!empty($whereClauses)) {
|
||||
$sql .= " WHERE " . implode(' AND ', $whereClauses);
|
||||
}
|
||||
|
||||
$sql .= " GROUP BY a.id";
|
||||
|
||||
// Add sorting
|
||||
$sortBy = $filters['sort'] ?? 'name';
|
||||
$sortOrder = $filters['order'] ?? 'asc';
|
||||
|
||||
switch ($sortBy) {
|
||||
case 'name':
|
||||
$sql .= " ORDER BY a.name {$sortOrder}";
|
||||
break;
|
||||
case 'age':
|
||||
$sql .= " ORDER BY JSON_EXTRACT(a.metadata, '$.age') {$sortOrder}";
|
||||
break;
|
||||
case 'media_count':
|
||||
$sql .= " ORDER BY (COUNT(DISTINCT am.movie_id) + COUNT(DISTINCT te.tv_show_id) + COUNT(DISTINCT aav.adult_video_id)) {$sortOrder}";
|
||||
break;
|
||||
case 'movie_count':
|
||||
$sql .= " ORDER BY COUNT(DISTINCT am.movie_id) {$sortOrder}";
|
||||
break;
|
||||
case 'tv_show_count':
|
||||
$sql .= " ORDER BY COUNT(DISTINCT te.tv_show_id) {$sortOrder}";
|
||||
break;
|
||||
case 'adult_count':
|
||||
$sql .= " ORDER BY COUNT(DISTINCT aav.adult_video_id) {$sortOrder}";
|
||||
break;
|
||||
default:
|
||||
$sql .= " ORDER BY a.name ASC";
|
||||
}
|
||||
|
||||
if ($limit) {
|
||||
$sql .= " LIMIT :limit OFFSET :offset";
|
||||
$params['limit'] = $limit;
|
||||
$params['offset'] = $offset;
|
||||
}
|
||||
|
||||
$stmt = $this->pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count actors with filters
|
||||
*/
|
||||
public function count(array $filters = []): int
|
||||
{
|
||||
$sql = "
|
||||
SELECT COUNT(DISTINCT a.id) as total
|
||||
FROM actors a
|
||||
LEFT JOIN actor_movie am ON a.id = am.actor_id
|
||||
LEFT JOIN actor_tv_episode ate ON a.id = ate.actor_id
|
||||
LEFT JOIN tv_episodes te ON ate.tv_episode_id = te.id
|
||||
LEFT JOIN actor_adult_video aav ON a.id = aav.actor_id
|
||||
";
|
||||
$params = [];
|
||||
$whereClauses = [];
|
||||
|
||||
// Search filter
|
||||
if (!empty($filters['search'])) {
|
||||
$whereClauses[] = "a.name LIKE :search";
|
||||
$params['search'] = "%{$filters['search']}%";
|
||||
}
|
||||
|
||||
// Gender filter
|
||||
if (!empty($filters['gender'])) {
|
||||
$whereClauses[] = "JSON_UNQUOTE(JSON_EXTRACT(a.metadata, '$.gender')) = :gender";
|
||||
$params['gender'] = strtoupper($filters['gender']);
|
||||
}
|
||||
|
||||
// Adult filter
|
||||
if (isset($filters['adult'])) {
|
||||
if ($filters['adult']) {
|
||||
$whereClauses[] = "aav.adult_video_id IS NOT NULL";
|
||||
} else {
|
||||
$whereClauses[] = "aav.adult_video_id IS NULL";
|
||||
}
|
||||
}
|
||||
|
||||
// Combine WHERE clauses
|
||||
if (!empty($whereClauses)) {
|
||||
$sql .= " WHERE " . implode(' AND ', $whereClauses);
|
||||
}
|
||||
|
||||
$stmt = $this->pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$result = $stmt->fetch(\PDO::FETCH_ASSOC);
|
||||
return (int)$result['total'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all movies this actor is associated with
|
||||
*/
|
||||
@@ -29,24 +162,83 @@ class Actor extends Model
|
||||
ORDER BY m.release_date DESC, m.title ASC
|
||||
");
|
||||
$stmt->execute(['actor_id' => $this->id]);
|
||||
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$movies = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
|
||||
// Process poster URLs for each movie
|
||||
foreach ($movies as &$movie) {
|
||||
// Use poster_url field directly if available
|
||||
if (!empty($movie['poster_url'])) {
|
||||
// Keep the existing poster_url as-is since it's already in the correct format
|
||||
}
|
||||
|
||||
// Also process metadata for additional fields
|
||||
if (!empty($movie['metadata'])) {
|
||||
$metadata = json_decode($movie['metadata'], true);
|
||||
|
||||
// Extract poster aspect ratio from metadata if available
|
||||
if (!empty($metadata['poster_aspect_ratio'])) {
|
||||
$movie['poster_aspect_ratio'] = $metadata['poster_aspect_ratio'];
|
||||
}
|
||||
|
||||
// If no poster_url in main field, try to get it from metadata
|
||||
if (empty($movie['poster_url'])) {
|
||||
if (!empty($metadata['local_cover_path'])) {
|
||||
$movie['poster_url'] = $metadata['local_cover_path'];
|
||||
} elseif (!empty($metadata['cover_url'])) {
|
||||
$movie['poster_url'] = $metadata['cover_url'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $movies;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all TV shows this actor is associated with
|
||||
* Get all TV shows this actor is associated with (via episodes)
|
||||
*/
|
||||
public function tvShows()
|
||||
{
|
||||
$stmt = $this->pdo->prepare("
|
||||
SELECT ts.*, s.display_name as source_name
|
||||
SELECT DISTINCT ts.*, s.display_name as source_name
|
||||
FROM tv_shows ts
|
||||
JOIN sources s ON ts.source_id = s.id
|
||||
JOIN actor_tv_show ats ON ts.id = ats.tv_show_id
|
||||
WHERE ats.actor_id = :actor_id
|
||||
JOIN tv_episodes te ON ts.id = te.tv_show_id
|
||||
JOIN actor_tv_episode ate ON te.id = ate.tv_episode_id
|
||||
WHERE ate.actor_id = :actor_id
|
||||
ORDER BY ts.first_air_date DESC, ts.title ASC
|
||||
");
|
||||
$stmt->execute(['actor_id' => $this->id]);
|
||||
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$tvShows = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
|
||||
// Process poster URLs for each TV show
|
||||
foreach ($tvShows as &$tvShow) {
|
||||
// Use poster_url field directly if available
|
||||
if (!empty($tvShow['poster_url'])) {
|
||||
// Keep the existing poster_url as-is since it's already in the correct format
|
||||
}
|
||||
|
||||
// Also process metadata for additional fields
|
||||
if (!empty($tvShow['metadata'])) {
|
||||
$metadata = json_decode($tvShow['metadata'], true);
|
||||
|
||||
// Extract poster aspect ratio from metadata if available
|
||||
if (!empty($metadata['poster_aspect_ratio'])) {
|
||||
$tvShow['poster_aspect_ratio'] = $metadata['poster_aspect_ratio'];
|
||||
}
|
||||
|
||||
// If no poster_url in main field, try to get it from metadata
|
||||
if (empty($tvShow['poster_url'])) {
|
||||
if (!empty($metadata['local_cover_path'])) {
|
||||
$tvShow['poster_url'] = $metadata['local_cover_path'];
|
||||
} elseif (!empty($metadata['cover_url'])) {
|
||||
$tvShow['poster_url'] = $metadata['cover_url'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $tvShows;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -63,7 +255,41 @@ class Actor extends Model
|
||||
ORDER BY av.release_date DESC, av.title ASC
|
||||
");
|
||||
$stmt->execute(['actor_id' => $this->id]);
|
||||
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
$adultVideos = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
||||
|
||||
// Process poster URLs for each adult video
|
||||
foreach ($adultVideos as &$adultVideo) {
|
||||
// Use poster_url field directly if available
|
||||
if (!empty($adultVideo['poster_url'])) {
|
||||
// Keep the existing poster_url as-is since it's already in the correct format
|
||||
}
|
||||
|
||||
// Also process metadata for additional fields
|
||||
if (!empty($adultVideo['metadata'])) {
|
||||
$metadata = json_decode($adultVideo['metadata'], true);
|
||||
|
||||
// Extract poster aspect ratio from metadata if available
|
||||
if (!empty($metadata['poster_aspect_ratio'])) {
|
||||
$adultVideo['poster_aspect_ratio'] = $metadata['poster_aspect_ratio'];
|
||||
}
|
||||
|
||||
// If no poster_url in main field, try to get it from metadata
|
||||
if (empty($adultVideo['poster_url'])) {
|
||||
if (!empty($metadata['local_cover_path'])) {
|
||||
$adultVideo['poster_url'] = $metadata['local_cover_path'];
|
||||
} elseif (!empty($metadata['cover_url'])) {
|
||||
$adultVideo['poster_url'] = $metadata['cover_url'];
|
||||
}
|
||||
}
|
||||
|
||||
// Add screenshot URL if available
|
||||
if (!empty($metadata['screenshot_url'])) {
|
||||
$adultVideo['screenshot_url'] = $metadata['screenshot_url'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $adultVideos;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -74,12 +300,13 @@ class Actor extends Model
|
||||
$stmt = $this->pdo->prepare("
|
||||
SELECT
|
||||
COUNT(DISTINCT am.movie_id) as movie_count,
|
||||
COUNT(DISTINCT ats.tv_show_id) as tv_show_count,
|
||||
COUNT(DISTINCT te.tv_show_id) as tv_show_count,
|
||||
COUNT(DISTINCT aav.adult_video_id) as adult_video_count,
|
||||
COUNT(DISTINCT am.movie_id) + COUNT(DISTINCT ats.tv_show_id) + COUNT(DISTINCT aav.adult_video_id) as total_media_count
|
||||
COUNT(DISTINCT am.movie_id) + COUNT(DISTINCT te.tv_show_id) + COUNT(DISTINCT aav.adult_video_id) as total_media_count
|
||||
FROM actors a
|
||||
LEFT JOIN actor_movie am ON a.id = am.actor_id
|
||||
LEFT JOIN actor_tv_show ats ON a.id = ats.actor_id
|
||||
LEFT JOIN actor_tv_episode ate ON a.id = ate.actor_id
|
||||
LEFT JOIN tv_episodes te ON ate.tv_episode_id = te.id
|
||||
LEFT JOIN actor_adult_video aav ON a.id = aav.actor_id
|
||||
WHERE a.id = :actor_id
|
||||
");
|
||||
@@ -196,8 +423,8 @@ class Actor extends Model
|
||||
// Build ORDER BY clause
|
||||
$orderBy = match ($sort) {
|
||||
'name_desc' => 'name DESC',
|
||||
'media_desc' => '(SELECT COUNT(*) FROM actor_movie WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_tv_show WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = actors.id) DESC',
|
||||
'media_asc' => '(SELECT COUNT(*) FROM actor_movie WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_tv_show WHERE actor_id = actors.id) + (SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = actors.id) ASC',
|
||||
'media_desc' => '(SELECT COUNT(*) FROM actor_movie WHERE actor_id = actors.id) + (SELECT COUNT(DISTINCT te.tv_show_id) FROM actor_tv_episode ate JOIN tv_episodes te ON ate.tv_episode_id = te.id WHERE ate.actor_id = actors.id) + (SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = actors.id) DESC',
|
||||
'media_asc' => '(SELECT COUNT(*) FROM actor_movie WHERE actor_id = actors.id) + (SELECT COUNT(DISTINCT te.tv_show_id) FROM actor_tv_episode ate JOIN tv_episodes te ON ate.tv_episode_id = te.id WHERE ate.actor_id = actors.id) + (SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = actors.id) ASC',
|
||||
default => 'name ASC'
|
||||
};
|
||||
|
||||
@@ -206,7 +433,7 @@ class Actor extends Model
|
||||
SELECT
|
||||
a.*,
|
||||
(SELECT COUNT(*) FROM actor_movie WHERE actor_id = a.id) as movie_count,
|
||||
(SELECT COUNT(*) FROM actor_tv_show WHERE actor_id = a.id) as tv_show_count,
|
||||
(SELECT COUNT(DISTINCT te.tv_show_id) FROM actor_tv_episode ate JOIN tv_episodes te ON ate.tv_episode_id = te.id WHERE ate.actor_id = a.id) as tv_show_count,
|
||||
(SELECT COUNT(*) FROM actor_adult_video WHERE actor_id = a.id) as adult_video_count
|
||||
FROM actors a
|
||||
{$whereClause}
|
||||
@@ -279,10 +506,11 @@ class Actor extends Model
|
||||
private function getActorTvShows(int $actorId): array
|
||||
{
|
||||
$stmt = $this->pdo->prepare("
|
||||
SELECT ts.id, ts.title
|
||||
SELECT DISTINCT ts.id, ts.title
|
||||
FROM tv_shows ts
|
||||
JOIN actor_tv_show ats ON ts.id = ats.tv_show_id
|
||||
WHERE ats.actor_id = ?
|
||||
JOIN tv_episodes te ON ts.id = te.tv_show_id
|
||||
JOIN actor_tv_episode ate ON te.id = ate.tv_episode_id
|
||||
WHERE ate.actor_id = ?
|
||||
ORDER BY ts.title
|
||||
");
|
||||
$stmt->execute([$actorId]);
|
||||
|
||||
Reference in New Issue
Block a user