mirror of
https://github.com/ceratic/MediaCollectorLibary.git
synced 2026-05-13 23:56:46 +02:00
172 lines
6.1 KiB
PHP
172 lines
6.1 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
|
use App\Models\Movie;
|
|
use Slim\Views\Twig;
|
|
|
|
class MovieController extends Controller
|
|
{
|
|
private \PDO $pdo;
|
|
|
|
public function __construct(\PDO $pdo, Twig $view)
|
|
{
|
|
parent::__construct($view);
|
|
$this->pdo = $pdo;
|
|
}
|
|
|
|
public function index(Request $request, Response $response, $args)
|
|
{
|
|
$queryParams = $request->getQueryParams();
|
|
|
|
// Get pagination parameters
|
|
$page = max(1, (int)($queryParams['page'] ?? 1));
|
|
$perPage = max(12, min(100, (int)($queryParams['per_page'] ?? 24)));
|
|
|
|
// Get search parameters
|
|
$search = trim($queryParams['search'] ?? '');
|
|
|
|
// Get filter parameters
|
|
$genres = $queryParams['genres'] ?? [];
|
|
if (!is_array($genres)) {
|
|
$genres = [$genres];
|
|
}
|
|
$genres = array_filter($genres);
|
|
|
|
$directors = $queryParams['directors'] ?? [];
|
|
if (!is_array($directors)) {
|
|
$directors = [$directors];
|
|
}
|
|
$directors = array_filter($directors);
|
|
|
|
// Get view mode
|
|
$viewMode = $queryParams['view'] ?? 'grid'; // grid, list, covers
|
|
|
|
// Get sort parameter
|
|
$sort = $queryParams['sort'] ?? 'title_asc';
|
|
|
|
// Get movies with pagination, filters, and sorting
|
|
$movies = Movie::getAllWithPagination($this->pdo, $page, $perPage, $search, $genres, $directors, $sort);
|
|
|
|
// Get total count for pagination
|
|
$totalCount = Movie::getTotalCount($this->pdo, $search, $genres, $directors);
|
|
|
|
// Get available filter options
|
|
$availableGenres = Movie::getAvailableGenres($this->pdo);
|
|
$availableDirectors = Movie::getAvailableDirectors($this->pdo);
|
|
|
|
// Calculate pagination info
|
|
$totalPages = ceil($totalCount / $perPage);
|
|
$hasNextPage = $page < $totalPages;
|
|
$hasPrevPage = $page > 1;
|
|
|
|
return $this->view->render($response, 'movies/index.twig', [
|
|
'title' => 'Movies',
|
|
'movies' => $movies,
|
|
'pagination' => [
|
|
'current_page' => $page,
|
|
'per_page' => $perPage,
|
|
'total_pages' => $totalPages,
|
|
'total_items' => $totalCount,
|
|
'has_next' => $hasNextPage,
|
|
'has_prev' => $hasPrevPage,
|
|
'next_page' => $page + 1,
|
|
'prev_page' => $page - 1
|
|
],
|
|
'search' => $search,
|
|
'view_mode' => $viewMode,
|
|
'view_modes' => ['grid', 'list', 'covers'],
|
|
'filters' => [
|
|
'genres' => $genres,
|
|
'directors' => $directors
|
|
],
|
|
'available_filters' => [
|
|
'genres' => $availableGenres,
|
|
'directors' => $availableDirectors
|
|
],
|
|
'sort' => $sort,
|
|
'sort_options' => [
|
|
'title_asc' => 'Title (A-Z)',
|
|
'title_desc' => 'Title (Z-A)',
|
|
'year_asc' => 'Release Year (Oldest First)',
|
|
'year_desc' => 'Release Year (Newest First)',
|
|
'rating_desc' => 'Highest Rated',
|
|
'views_desc' => 'Most Viewed',
|
|
'added_desc' => 'Recently Added',
|
|
'added_asc' => 'Oldest Added',
|
|
'last_watched_desc' => 'Last Watched'
|
|
]
|
|
]);
|
|
}
|
|
|
|
public function show(Request $request, Response $response, $args)
|
|
{
|
|
$movieId = (int) $args['id'];
|
|
|
|
// Get movie details
|
|
$stmt = $this->pdo->prepare("
|
|
SELECT m.*, s.display_name as source_name
|
|
FROM movies m
|
|
JOIN sources s ON m.source_id = s.id
|
|
WHERE m.id = :id
|
|
");
|
|
$stmt->execute(['id' => $movieId]);
|
|
$movie = $stmt->fetch(\PDO::FETCH_ASSOC);
|
|
|
|
if (!$movie) {
|
|
return $response->withStatus(404);
|
|
}
|
|
|
|
// Decode metadata for display
|
|
$metadata = json_decode($movie['metadata'], true);
|
|
|
|
// Extract additional fields from metadata if available
|
|
if ($metadata) {
|
|
// Production companies
|
|
if (isset($metadata['production_companies']) && is_array($metadata['production_companies'])) {
|
|
$companies = array_column($metadata['production_companies'], 'name');
|
|
$movie['production_companies'] = implode(', ', $companies);
|
|
}
|
|
|
|
// Production countries
|
|
if (isset($metadata['production_countries']) && is_array($metadata['production_countries'])) {
|
|
$countries = array_column($metadata['production_countries'], 'name');
|
|
$movie['production_countries'] = implode(', ', $countries);
|
|
}
|
|
|
|
// Collection info
|
|
if (isset($metadata['belongs_to_collection']) && is_array($metadata['belongs_to_collection'])) {
|
|
$movie['belongs_to_collection'] = $metadata['belongs_to_collection']['name'] ?? null;
|
|
}
|
|
|
|
// Additional metadata fields
|
|
//$movie['budget'] = $metadata['budget'] ?? $movie['budget'];
|
|
//$movie['revenue'] = $metadata['revenue'] ?? $movie['revenue'];
|
|
//$movie['original_language'] = $metadata['original_language'] ?? $movie['original_language'];
|
|
//$movie['tagline'] = $metadata['tagline'] ?? $movie['tagline'];
|
|
//$movie['status'] = $metadata['status'] ?? $movie['status'];
|
|
//$movie['vote_count'] = $metadata['vote_count'] ?? $movie['vote_count'];
|
|
}
|
|
|
|
// Get actors for this movie
|
|
$stmt = $this->pdo->prepare("
|
|
SELECT a.*
|
|
FROM actors a
|
|
JOIN actor_movie am ON a.id = am.actor_id
|
|
WHERE am.movie_id = :movie_id
|
|
ORDER BY a.name ASC
|
|
");
|
|
$stmt->execute(['movie_id' => $movieId]);
|
|
$actors = $stmt->fetchAll(\PDO::FETCH_ASSOC);
|
|
|
|
return $this->view->render($response, 'movies/show.twig', [
|
|
'title' => $movie['title'],
|
|
'movie' => $movie,
|
|
'metadata' => $metadata,
|
|
'actors' => $actors
|
|
]);
|
|
}
|
|
}
|