Skip to content
Snippets Groups Projects
Episode.php 4.71 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\PodcastModel;
    
    use League\CommonMark\CommonMarkConverter;
    
        protected \App\Entities\Podcast $podcast;
        protected string $GUID;
        protected string $link;
        protected \CodeIgniter\Files\File $image;
        protected string $image_media_path;
        protected string $image_url;
        protected \CodeIgniter\Files\File $enclosure;
        protected string $enclosure_media_path;
        protected string $enclosure_url;
        protected array $enclosure_metadata;
    
        protected string $description_html;
    
        protected $casts = [
            'slug' => 'string',
            'title' => 'string',
    
            'enclosure_uri' => 'string',
    
            'pub_date' => 'datetime',
            'description' => 'string',
    
            'image_uri' => '?string',
    
            'author_name' => '?string',
            'author_email' => '?string',
    
            'number' => 'integer',
    
            'season_number' => '?integer',
            'type' => 'string',
            'block' => 'boolean',
        ];
    
        public function setImage(?\CodeIgniter\HTTP\Files\UploadedFile $image)
        {
    
            if (!empty($image) && $image->isValid()) {
    
                // check whether the user has inputted an image and store it
                $this->attributes['image_uri'] = save_podcast_media(
                    $image,
                    $this->getPodcast()->name,
                    $this->attributes['slug']
                );
            } elseif (
                $APICdata = $this->getEnclosureMetadata()['attached_picture']
            ) {
                // if the user didn't input an image,
                // check if the uploaded audio file has an attached cover and store it
                $cover_image = new \CodeIgniter\Files\File('episode_cover');
                file_put_contents($cover_image, $APICdata);
    
                $this->attributes['image_uri'] = save_podcast_media(
                    $cover_image,
                    $this->getPodcast()->name,
                    $this->attributes['slug']
                );
            }
    
            return $this;
        }
    
    
        public function getImage(): \CodeIgniter\Files\File
    
        {
            return new \CodeIgniter\Files\File($this->getImageMediaPath());
        }
    
    
        public function getImageMediaPath(): string
    
        {
            return media_path($this->attributes['image_uri']);
        }
    
    
            if ($image_uri = $this->attributes['image_uri']) {
                return media_url($image_uri);
            }
            return $this->getPodcast()->image_url;
        }
    
        public function setEnclosure(
            \CodeIgniter\HTTP\Files\UploadedFile $enclosure = null
        ) {
    
            if (!empty($enclosure) && $enclosure->isValid()) {
    
                helper('media');
    
                $this->attributes['enclosure_uri'] = save_podcast_media(
                    $enclosure,
                    $this->getPodcast()->name,
                    $this->attributes['slug']
                );
    
                return $this;
            }
        }
    
        public function getEnclosure()
        {
            return new \CodeIgniter\Files\File($this->getEnclosureMediaPath());
    
        }
    
        public function getEnclosureMediaPath()
        {
    
            return media_path($this->attributes['enclosure_uri']);
        }
    
        public function getEnclosureUrl()
        {
            return base_url(
                route_to(
                    'analytics_hit',
                    $this->attributes['podcast_id'],
                    $this->attributes['id'],
                    $this->attributes['enclosure_uri']
                )
            );
        }
    
    
        public function getEnclosureMetadata()
        {
            helper('id3');
    
            return get_file_tags($this->getEnclosure());
        }
    
    
        public function getLink()
        {
            return base_url(
                route_to(
    
                    $this->getPodcast()->name,
                    $this->attributes['slug']
                )
            );
        }
    
    
        public function getGUID()
    
        {
            return $this->getLink();
        }
    
        public function getPodcast()
        {
    
            return (new PodcastModel())->find($this->attributes['podcast_id']);
    
    
        public function getDescriptionHtml()
        {
    
            $converter = new CommonMarkConverter([
                'html_input' => 'strip',
                'allow_unsafe_links' => false,
            ]);
    
                $descriptionFooter = $this->getPodcast()->episode_description_footer
    
                return $converter->convertToHtml($this->attributes['description']) .
    
                    $converter->convertToHtml($descriptionFooter) .
    
            return $converter->convertToHtml($this->attributes['description']);