client = new Client([ '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'), 'password' => config('symfonycast.password'), '_csrf_token' => $token ], 'on_stats' => function (TransferStats $stats) use (&$currentUrl) { $currentUrl = $stats->getEffectiveUri(); } ]); } /** * @return Collection * @throws GuzzleException */ public function updateCourses(): Collection { $coursePage = $this->client->get('courses/filtering'); $courses = $this->htmlParser->getCourses($coursePage); return $courses->each->save(); } /** * @param Course $course * @return Collection * @throws GuzzleException */ public function updateChapters(Course $course): Collection { $singleCoursePage = $this->client->get('/screencast/' . $course->link); $chapters = $this->htmlParser->getCourseDetails($singleCoursePage, $course->id); $chapters->each->save(); $chapters->each(fn($chapter) => GetVideoFileSize::dispatch($chapter->id)); return $chapters; } public function isSubscriptionActive(): bool { return $this->htmlParser->isSubscriptionActive($this->client->get('/profile/show')); } public function getChapterInfo(Chapter $chapter): ?string { $course = $chapter->course; $chapterPage = $this->client->get('/screencast/' . $course->link . DIRECTORY_SEPARATOR . $chapter->link); return $this->htmlParser->getVideoSource($chapterPage); } public function videoSize(Chapter $chapter): Chapter { if (!$chapter->video_size && $chapter->video_link) { $response = $this->client->head($chapter->video_link); if ($response->hasHeader('Content-Length')) { $chapter->video_size = (int)$response->getHeader('Content-Length')[0]; $chapter->save(); } } return $chapter; } public function downloadFile(Chapter $chapter): void { if (is_null($chapter->video_link)) { return; } if (!is_dir($chapter->directory_path)) { mkdir(directory: $chapter->directory_path, recursive: true); } if (!$chapter->is_video_file) { $this->client->request( 'GET', $chapter->video_link, ['sink' => $chapter->video_path], ); } $chapter->video_size = filesize($chapter->video_path); $chapter->save(); } }