Skip to content
Snippets Groups Projects
PodcastController.php 13.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • /**
     * @copyright  2020 Podlibre
     * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
     * @link       https://castopod.org/
     */
    
    use App\Models\ActorModel;
    
    use CodeIgniter\Exceptions\PageNotFoundException;
    
    use CodeIgniter\HTTP\RedirectResponse;
    
    class PodcastController extends BaseController
    
        public function _remap(string $method, string ...$params): mixed
    
            if ($params === []) {
    
                ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) !== null
    
                $this->podcast = $podcast;
    
        public function list(): string
    
            if (! has_permission('podcasts-list')) {
    
                    'podcasts' => (new PodcastModel())->getUserPodcasts((int) user_id()),
    
                $data = [
                    'podcasts' => (new PodcastModel())->findAll(),
                ];
    
            return view('podcast/list', $data);
    
        public function view(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/view', $data);
    
        public function viewAnalytics(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/analytics/index', $data);
    
        public function viewAnalyticsWebpages(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/analytics/webpages', $data);
    
        public function viewAnalyticsLocations(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/analytics/locations', $data);
    
        public function viewAnalyticsUniqueListeners(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/analytics/unique_listeners', $data);
    
        public function viewAnalyticsListeningTime(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/analytics/listening_time', $data);
    
        public function viewAnalyticsTimePeriods(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/analytics/time_periods', $data);
    
        public function viewAnalyticsPlayers(): string
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
            return view('podcast/analytics/players', $data);
    
        public function create(): string
    
            $languageOptions = (new LanguageModel())->getLanguageOptions();
            $categoryOptions = (new CategoryModel())->getCategoryOptions();
    
                'languageOptions' => $languageOptions,
                'categoryOptions' => $categoryOptions,
    
                'browserLang' => get_browser_language($this->request->getServer('HTTP_ACCEPT_LANGUAGE')),
    
            return view('podcast/create', $data);
    
        public function attemptCreate(): RedirectResponse
    
                'cover' =>
                    'uploaded[cover]|is_image[cover]|ext_in[cover,jpg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
                'banner' => 'is_image[banner]|ext_in[banner,jpg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]',
    
                return redirect()
                    ->back()
                    ->withInput()
                    ->with('errors', $this->validator->getErrors());
            }
    
    
            if (
                ($partnerId = $this->request->getPost('partner_id')) === '' ||
                ($partnerLinkUrl = $this->request->getPost('partner_link_url')) === '' ||
                ($partnerImageUrl = $this->request->getPost('partner_image_url')) === '') {
                $partnerId = null;
                $partnerLinkUrl = null;
                $partnerImageUrl = null;
            }
    
    
                'title' => $this->request->getPost('title'),
    
                'handle' => $this->request->getPost('handle'),
    
                'cover' => $this->request->getFile('cover'),
                'banner' => $this->request->getFile('banner'),
    
                'description_markdown' => $this->request->getPost('description'),
                'language_code' => $this->request->getPost('language'),
    
                'category_id' => $this->request->getPost('category'),
    
                'parental_advisory' =>
                    $this->request->getPost('parental_advisory') !== 'undefined'
                        ? $this->request->getPost('parental_advisory')
                        : null,
    
                'owner_name' => $this->request->getPost('owner_name'),
                'owner_email' => $this->request->getPost('owner_email'),
    
                'publisher' => $this->request->getPost('publisher'),
    
                'type' => $this->request->getPost('type'),
                'copyright' => $this->request->getPost('copyright'),
    
                'location' => $this->request->getPost('location_name') === '' ? null : new Location($this->request->getPost(
                    'location_name'
                )),
    
                'payment_pointer' => $this->request->getPost(
                    'payment_pointer'
                ) === '' ? null : $this->request->getPost('payment_pointer'),
    
                'custom_rss_string' => $this->request->getPost('custom_rss'),
    
                'partner_id' => $partnerId,
                'partner_link_url' => $partnerLinkUrl,
                'partner_image_url' => $partnerImageUrl,
    
                'is_blocked' => $this->request->getPost('block') === 'yes',
    
                'is_completed' => $this->request->getPost('complete') === 'yes',
                'is_locked' => $this->request->getPost('lock') === 'yes',
    
                'created_by' => user_id(),
                'updated_by' => user_id(),
    
            if (! ($newPodcastId = $podcastModel->insert($newPodcast, true))) {
    
                    ->with('errors', $podcastModel->errors());
    
            $podcastAdminGroup = $authorize->group('podcast_admin');
    
            $podcastModel->addPodcastContributor(user_id(), $newPodcastId, (int) $podcastAdminGroup->id);
    
            // set Podcast categories
            (new CategoryModel())->setPodcastCategories(
    
                $this->request->getPost('other_categories') ?? [],
    
            // set interact as the newly created podcast actor
            $createdPodcast = (new PodcastModel())->getPodcastById($newPodcastId);
            set_interact_as_actor($createdPodcast->actor_id);
    
    
            return redirect()->route('podcast-view', [$newPodcastId])->with(
                'message',
                lang('Podcast.messages.createSuccess')
            );
    
        public function edit(): string
    
            $languageOptions = (new LanguageModel())->getLanguageOptions();
            $categoryOptions = (new CategoryModel())->getCategoryOptions();
    
            $data = [
                'podcast' => $this->podcast,
    
                'languageOptions' => $languageOptions,
                'categoryOptions' => $categoryOptions,
    
            replace_breadcrumb_params([
                0 => $this->podcast->title,
            ]);
    
        public function attemptEdit(): RedirectResponse
    
                'cover' =>
                    'is_image[cover]|ext_in[cover,jpg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]',
                'banner' => 'is_image[banner]|ext_in[banner,jpg,png]|min_dims[banner,1500,500]|is_image_ratio[banner,3,1]',
    
                return redirect()
                    ->back()
                    ->withInput()
                    ->with('errors', $this->validator->getErrors());
            }
    
    
            if (
                ($partnerId = $this->request->getPost('partner_id')) === '' ||
                ($partnerLinkUrl = $this->request->getPost('partner_link_url')) === '' ||
                ($partnerImageUrl = $this->request->getPost('partner_image_url')) === '') {
                $partnerId = null;
                $partnerLinkUrl = null;
                $partnerImageUrl = null;
            }
    
    
            $this->podcast->title = $this->request->getPost('title');
    
            $this->podcast->description_markdown = $this->request->getPost('description');
    
            $this->podcast->setCover($this->request->getFile('cover'));
            $this->podcast->setBanner($this->request->getFile('banner'));
    
            $this->podcast->language_code = $this->request->getPost('language');
    
            $this->podcast->category_id = $this->request->getPost('category');
    
            $this->podcast->parental_advisory =
                $this->request->getPost('parental_advisory') !== 'undefined'
                    ? $this->request->getPost('parental_advisory')
                    : null;
            $this->podcast->publisher = $this->request->getPost('publisher');
    
            $this->podcast->owner_name = $this->request->getPost('owner_name');
            $this->podcast->owner_email = $this->request->getPost('owner_email');
            $this->podcast->type = $this->request->getPost('type');
            $this->podcast->copyright = $this->request->getPost('copyright');
    
            $this->podcast->location = $this->request->getPost('location_name') === '' ? null : new Location(
                $this->request->getPost('location_name')
            );
    
            $this->podcast->payment_pointer = $this->request->getPost(
                'payment_pointer'
            ) === '' ? null : $this->request->getPost('payment_pointer');
    
            $this->podcast->custom_rss_string = $this->request->getPost('custom_rss');
    
            $this->podcast->partner_id = $partnerId;
            $this->podcast->partner_link_url = $partnerLinkUrl;
            $this->podcast->partner_image_url = $partnerImageUrl;
    
            $this->podcast->is_blocked = $this->request->getPost('block') === 'yes';
    
            $this->podcast->is_completed =
    
                $this->request->getPost('complete') === 'yes';
    
            $this->podcast->is_locked = $this->request->getPost('lock') === 'yes';
    
            $this->podcast->updated_by = (int) user_id();
    
            $podcastModel = new PodcastModel();
    
            if (! $podcastModel->update($this->podcast->id, $this->podcast)) {
    
                    ->with('errors', $podcastModel->errors());
    
            // set Podcast categories
            (new CategoryModel())->setPodcastCategories(
                $this->podcast->id,
    
                $this->request->getPost('other_categories') ?? [],
    
            return redirect()->route('podcast-edit', [$this->podcast->id])->with(
                'message',
                lang('Podcast.messages.editSuccess')
            );
    
        public function deleteBanner(): RedirectResponse
        {
            if ($this->podcast->banner === null) {
                return redirect()->back();
            }
    
    
            $db = db_connect();
    
            $db->transStart();
    
    
            $mediaModel = new MediaModel();
    
            if (! $mediaModel->deleteMedia($this->podcast->banner)) {
    
                    ->with('errors', $mediaModel->errors());
    
            (new PodcastModel())->clearCache([
                'id' => $this->podcast->id,
            ]);
    
            // remove banner url from actor
            $actor = (new ActorModel())->getActorById($this->podcast->actor_id);
    
            if ($actor !== null) {
                $actor->cover_image_url = null;
                $actor->cover_image_mimetype = null;
    
                (new ActorModel())->update($actor->id, $actor);
            }
    
            $db->transComplete();
    
    
        public function latestEpisodes(int $limit, int $podcastId): string
    
                ->orderBy('created_at', 'desc')
                ->findAll($limit);
    
    
            return view('podcast/latest_episodes', [
    
                'podcast' => (new PodcastModel())->getPodcastById($podcastId),
    
        public function delete(): RedirectResponse
    
            (new PodcastModel())->delete($this->podcast->id);
    
            return redirect()->route('podcast-list');