diff --git a/.gitignore b/.gitignore index 38e5b25..79288c0 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ npm-debug.log yarn-error.log /.idea /.vscode +/public/videos diff --git a/app/Http/Controllers/ChapterController.php b/app/Http/Controllers/ChapterController.php index 1aee37a..c3c0aef 100644 --- a/app/Http/Controllers/ChapterController.php +++ b/app/Http/Controllers/ChapterController.php @@ -3,12 +3,11 @@ namespace App\Http\Controllers; use App\Http\SymfonyCastDl\SymfonyCastDlService; -use App\Models\Chapter; use App\Models\Course; class ChapterController extends Controller { - public function index(Course $course, int $chapter, SymfonyCastDlService $symfonyCastDlService) + public function __invoke(Course $course, int $chapter, SymfonyCastDlService $symfonyCastDlService) { $chapter = $course->chapters->firstWhere('order', $chapter); diff --git a/app/Http/Controllers/Course/Sync.php b/app/Http/Controllers/Course/Sync.php new file mode 100644 index 0000000..c43aeb1 --- /dev/null +++ b/app/Http/Controllers/Course/Sync.php @@ -0,0 +1,18 @@ +chapters->each->update(['sync_offline' => 1]); + $course->chapters->each(fn($chapter) => DownloadVideoFile::dispatch($chapter->id)); + return redirect()->back(); + } +} diff --git a/app/Http/Controllers/CourseController.php b/app/Http/Controllers/CourseController.php index fe69ec9..0ef7e73 100644 --- a/app/Http/Controllers/CourseController.php +++ b/app/Http/Controllers/CourseController.php @@ -11,16 +11,8 @@ use Illuminate\View\View; class CourseController extends Controller { - public function index(Course $course): View + public function __invoke(Course $course): View { return view('course.index', compact('course')); } - - public function sync(Course $course): \Illuminate\Http\RedirectResponse - { - $course->chapters->each->update(['sync_offline' => 1]); - $course->chapters->each(fn($chapter) => DownloadVideoFile::dispatch($chapter->id)); - return redirect()->back(); - } - } diff --git a/app/Http/Controllers/Index.php b/app/Http/Controllers/Index.php index bb9094c..db5f242 100644 --- a/app/Http/Controllers/Index.php +++ b/app/Http/Controllers/Index.php @@ -5,14 +5,19 @@ namespace App\Http\Controllers; use App\Http\SymfonyCastDl\HtmlParser; use App\Http\SymfonyCastDl\SymfonyCastDlService; use App\Models\Course; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; class Index extends Controller { public function index(string $track = null) { - $courses = Course::where('tracks', 'like', '%'.$track.'%')->with('chapters')->withCount('chapters')->get(); - + $courses = Course::where('tracks', 'like', '%' . $track . '%')->with('chapters')->withCount([ + 'chapters', + 'chapters as chapters_to_sync' => function (Builder $query) { + $query->where('sync_offline', 1); + }, + ])->get(); return view('index', compact(['courses'])); } diff --git a/app/Http/SymfonyCastDl/SymfonyCastDlService.php b/app/Http/SymfonyCastDl/SymfonyCastDlService.php index 2ca419a..eed05f3 100644 --- a/app/Http/SymfonyCastDl/SymfonyCastDlService.php +++ b/app/Http/SymfonyCastDl/SymfonyCastDlService.php @@ -18,11 +18,8 @@ class SymfonyCastDlService 'base_uri' => config('symfonycast.base_url'), 'cookies' => true ]); - $response = $this->client->get('login'); - $token = $htmlParser->getCsrfToken($response); - $this->client->post('login', [ 'form_params' => [ 'email' => config('symfonycast.login'), @@ -38,7 +35,6 @@ class SymfonyCastDlService public function getInfo(): void { $coursePage = $this->client->get('courses/filtering'); - $courses = $this->htmlParser->getCourses($coursePage); $courses->each->save(); /** @var Course $course */ @@ -68,7 +64,7 @@ class SymfonyCastDlService return; } if (!is_dir($chapter->directory_path)) { - mkdir($chapter->directory_path); + mkdir(directory: $chapter->directory_path, recursive: true); } if (!$chapter->is_video_file) { $this->client->request( diff --git a/app/Models/Chapter.php b/app/Models/Chapter.php index 031e218..6b14c4f 100644 --- a/app/Models/Chapter.php +++ b/app/Models/Chapter.php @@ -46,7 +46,9 @@ class Chapter extends Model protected function videoUrl(): Attribute { return Attribute::make( - get: fn() => url($this->course_id . '/' . $this->order . '.mp4') + get: fn() => url( + 'videos' . DIRECTORY_SEPARATOR . $this->course_id . DIRECTORY_SEPARATOR . $this->order . '.mp4' + ) ); } @@ -60,7 +62,7 @@ class Chapter extends Model protected function directoryPath(): Attribute { return Attribute::make( - get: fn() => public_path($this->course_id) + get: fn() => public_path('videos' . DIRECTORY_SEPARATOR . $this->course_id) ); } diff --git a/app/Models/Course.php b/app/Models/Course.php index 8b02408..87019cc 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -55,9 +55,7 @@ class Course extends Model public function totalSizeHuman(): Attribute { return Attribute::make( - get: function () { - return formatFileSize($this->total_size); - }, + get: fn() => formatFileSize($this->total_size), ); } } diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php index 4d5a50a..caece4d 100644 --- a/resources/views/index.blade.php +++ b/resources/views/index.blade.php @@ -26,18 +26,18 @@ {{ $course->status }} @foreach( explode(',', $course->tracks) as $track) - {{ $track }} + {{ $track }} @endforeach Sync all chapters offline - {{ $course->chapters_count }} / {{ $course->numberofchapters }} + {{ $course->chapters_to_sync }} / {{ $course->numberofchapters }} {{ $course->published_at?->diffForHumans() }} {{ $course->total_size_human }} - {{formatFileSize(folderSize(public_path($course->id)))}} + {{formatFileSize(folderSize(public_path('videos'.DIRECTORY_SEPARATOR.$course->id)))}} @endforeach diff --git a/routes/web.php b/routes/web.php index ec25a19..fca0433 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,28 +1,18 @@ name('course.')->group(function () { - Route::get('/{course}', [CourseController::class, 'index'])->name('index'); - Route::get('/{course}/sync', [CourseController::class, 'sync'])->name('sync'); - Route::get('/{course}/chapter/{chapter}', [ChapterController::class, 'index'])->name('chapter'); +Route::prefix('course')->group(function () { + Route::get('/{course}', CourseController::class)->name('course.index'); + Route::get('/{course}/sync', Sync::class)->name('course.sync'); + Route::get('/{course}/chapter/{chapter}', ChapterController::class)->name('course.chapter'); });