61 lines
1.9 KiB
PHP
61 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Clip;
|
|
|
|
class ClipController extends Controller
|
|
{
|
|
/**
|
|
* Display a listing of videos.
|
|
*
|
|
* @param \Illuminate\Http\Request $request
|
|
* @return \Illuminate\Http\JsonResponse
|
|
*/
|
|
public function getClips(Request $request)
|
|
{
|
|
// Start query with a join on videos to enable ordering by external_date
|
|
$query = Clip::query()
|
|
->join('videos', 'clips.video_id', '=', 'videos.id')
|
|
->with(['video', 'video.transcriptions', 'video.channel'])
|
|
->select('clips.*') // Ensures only Clip attributes are returned
|
|
->orderBy('videos.external_date', 'desc');
|
|
|
|
// Filter by channel_ids
|
|
if ($request->has('channel_ids')) {
|
|
$query->whereHas('video', function ($q) use ($request) {
|
|
$q->whereIn('channel_id', $request->input('channel_ids'));
|
|
});
|
|
}
|
|
|
|
// Filter by specific video_id
|
|
if ($request->has('video_id')) {
|
|
$query->whereHas('video', function ($q) use ($request) {
|
|
$q->where('id', $request->input('video_id'));
|
|
});
|
|
}
|
|
|
|
// Filter by languages (via video.channel.language)
|
|
if ($request->has('languages')) {
|
|
$languages = $request->input('languages');
|
|
$query->whereHas('video.channel', function ($q) use ($languages) {
|
|
$q->whereIn('language', $languages);
|
|
});
|
|
}
|
|
|
|
// Filter by external_date range
|
|
if ($request->has('start_date') && $request->has('end_date')) {
|
|
$query->whereBetween('videos.external_date', [
|
|
$request->input('start_date'),
|
|
$request->input('end_date'),
|
|
]);
|
|
}
|
|
|
|
// Retrieve the results (consider using paginate() for large sets)
|
|
$clips = $query->get();
|
|
|
|
return response()->json($clips);
|
|
}
|
|
}
|