Files
lubo_comment_query/app/Http/Controllers/ProgramQueryController.php
T
2026-07-29 10:40:52 +08:00

59 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Programs;
use App\Util\VideoOcrUtil;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
class ProgramQueryController extends BaseController
{
public function index(Request $request) {
$keyword = $request->get("keyword", "");
$query = Programs::query()->with(["appends", "video_pivots.video"])->where("status", "=", 1)->orderByDesc("created_at");
if ($keyword) {
$keyword_split = explode(" ", $keyword);
foreach ($keyword_split as $_keyword) {
$_keyword = trim($_keyword);
if (mb_strlen($_keyword) > 0) {
$query->where(function (Builder $_query) use ($_keyword) {
$_query
->where("name", "like", "%{$_keyword}%")
->orWhere("difficulty", "like", "%{$_keyword}%")
->orWhere("desc", "like", "%{$_keyword}%")
->orWhereHas("appends", function (Builder $__query) use ($_keyword) {
$__query->where("from", "like", "%{$_keyword}%");
$__query->orWhere(function (Builder $sub_query) use ($_keyword) {
$sub_query
->where("is_original", "=", 0)
->where("name", "like", "%{$_keyword}%");
});
})
;
});
}
}
}
$programs = $query->paginate(10)->withQueryString();
return view("program.index", [
"keyword" => $keyword,
"programs"=>$programs,
]);
}
public function videos(Request $request, Programs $program) {
$videos = $program->video_pivots;
foreach ($videos as $video_pivot) {
// 节目开始/结束位置的 OCR 快照(无 OCR 数据的分P为 null,视图不展示)
$video_pivot->start_ocr = VideoOcrUtil::find_frame_at($video_pivot->video_bvid, $video_pivot->start_part, $video_pivot->start_time);
$video_pivot->stop_ocr = VideoOcrUtil::find_frame_at($video_pivot->video_bvid, $video_pivot->stop_part ?? 1, $video_pivot->stop_time);
}
return view("program.video.index", [
"program" => $program,
"videos" => $videos,
]);
}
}