300) { $text = substr($text, 0, 300) . '...'; } return $text; } #[AsTwigFilter('filesize')] public function type(string|int $size) { return (new FileSize($size))->asAuto(); } #[AsTwigFilter('strip_media_path')] public function stripMediaPath(string $path) { return str_replace( $this->mediaFiles->getBasePath() . DIRECTORY_SEPARATOR, '', $path ); } #[AsTwigFilter('episode_id_from_results')] public function episodeIdFromResults($result): ?string { if (!$result instanceof GetTvShowOptionsResult) { return null; } return "S". str_pad($result->season, 2, "0", STR_PAD_LEFT) . "E". str_pad($result->episode, 2, "0", STR_PAD_LEFT); } #[AsTwigFunction('episode_id')] public function episodeId($season, $episode): ?string { return "S". str_pad($season, 2, "0", STR_PAD_LEFT) . "E". str_pad($episode, 2, "0", STR_PAD_LEFT); } #[AsTwigFunction('episode_anchor')] public function episodeAnchor($season, $episode): ?string { return "episode_" . (int) $season . "_" . (int) $episode; } #[AsTwigFunction('extract_from_episode_id')] public function extractFromEpisodeId(?string $episodeId): ?EpisodeIdDto { if (null === $episodeId) { return new EpisodeIdDto("", ""); } // Capture season $seasonMatch = []; preg_match('/[sS]\d\d(\d)?(\d)?/', $episodeId, $seasonMatch); if (empty($seasonMatch)) { $season = ""; } else { $season = str_replace(['S', 's'], '', $seasonMatch[0]); } // Capture episode $episodeMatch = []; preg_match('/[eE]\d\d(\d)?(\d)?/', $episodeId, $episodeMatch); if (empty($episodeMatch)) { $episode = ""; } else { $episode = str_replace(['E', 'e'], '', $episodeMatch[0]); } if (null === $season && null === $episode) { return new EpisodeIdDto("", ""); } return new EpisodeIdDto($season, $episode); } }