Commit c815ecd6 authored by Yassine Doghri's avatar Yassine Doghri
Browse files

feat(rss): generate rss feed from podcast entity

- refactor episode, podcast and category entities to add dynamic properties
- refactor Routes when adding feed route
- update migration files to better fit itunes' and rss' specs
- update podcast and episode forms
- add SimpleRSSElement class to Libraries
- add rss_helper
- update home controller to redirect if system has only one podcast
parent d3119173
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ class App extends BaseConfig
	| dates with the date helper, and can be retrieved through app_timezone()
	|
	*/
    public $appTimezone = 'America/Chicago';
    public $appTimezone = 'UTC';

    /*
	|--------------------------------------------------------------------------
+14 −11
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ $routes->setDefaultMethod('index');
$routes->setTranslateURIDashes(false);
$routes->set404Override();
$routes->setAutoRoute(false);
$routes->addPlaceholder('podcastSlug', '@[a-z0-9\_]{1,191}');
$routes->addPlaceholder('podcastName', '[a-z0-9\_]{1,191}');
$routes->addPlaceholder('episodeSlug', '[a-z0-9\-]{1,191}');

/**
@@ -34,24 +34,27 @@ $routes->addPlaceholder('episodeSlug', '[a-z0-9\-]{1,191}');
// We get a performance increase by specifying the default
// route since we don't have to scan directories.
$routes->get('/', 'Home::index', ['as' => 'home']);
$routes->add('new-podcast', 'Podcasts::create', ['as' => 'podcasts_create']);
$routes->add('new-podcast', 'Podcast::create', ['as' => 'podcast_create']);

$routes->group('(:podcastSlug)', function ($routes) {
    $routes->add('/', 'Podcasts::view/$1', ['as' => 'podcasts_view']);
    $routes->add('new-episode', 'Episodes::create/$1', [
        'as' => 'episodes_create',
$routes->group('@(:podcastName)', function ($routes) {
    $routes->add('/', 'Podcast::view/$1', ['as' => 'podcast_view']);
    $routes->add('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']);
    $routes->add('new-episode', 'Episode::create/$1', [
        'as' => 'episode_create',
    ]);
    $routes->add('(:episodeSlug)', 'Episodes::view/$1/$2', [
        'as' => 'episodes_view',
    $routes->add('episodes/(:episodeSlug)', 'Episode::view/$1/$2', [
        'as' => 'episode_view',
    ]);
});

// Route for podcast audio file analytics (/stats/podcast_id/episode_id/podcast_folder/filename.mp3)
$routes->add('/stats/(:num)/(:num)/(:any)', 'Analytics::hit/$1/$2/$3');
$routes->add('stats/(:num)/(:num)/(:any)', 'Analytics::hit/$1/$2/$3', [
    'as' => 'analytics_hit',
]);

// Show the Unknown UserAgents
$routes->add('/.well-known/unknown-useragents', 'UnknownUserAgents');
$routes->add('/.well-known/unknown-useragents/(:num)', 'UnknownUserAgents/$1');
$routes->add('.well-known/unknown-useragents', 'UnknownUserAgents');
$routes->add('.well-known/unknown-useragents/(:num)', 'UnknownUserAgents/$1');

/**
 * --------------------------------------------------------------------
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ class Toolbar extends BaseConfig
        \CodeIgniter\Debug\Toolbar\Collectors\Database::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Logs::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Views::class,
        // \CodeIgniter\Debug\Toolbar\Collectors\Cache::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Cache::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Files::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Routes::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Events::class,
+1 −1
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ class BaseController extends Controller
        set_user_session_referer();
    }

    protected function stats($postcast_id)
    protected static function triggerWebpageHit($postcast_id)
    {
        webpage_hit($postcast_id);
    }
+20 −26
Original line number Diff line number Diff line
@@ -10,15 +10,17 @@ namespace App\Controllers;
use App\Models\EpisodeModel;
use App\Models\PodcastModel;

class Episodes extends BaseController
helper('podcast');

class Episode extends BaseController
{
    public function create($podcast_slug)
    public function create($podcast_name)
    {
        helper(['form', 'database', 'media', 'id3']);

        $episode_model = new EpisodeModel();
        $podcast_model = new PodcastModel();
        $podcast_name = substr($podcast_slug, 1);

        $podcast = $podcast_model->where('name', $podcast_name)->first();

        if (
@@ -33,13 +35,9 @@ class Episodes extends BaseController
        ) {
            $data = [
                'podcast' => $podcast,
                'episode_types' => field_enums(
                    $episode_model->prefixTable('episodes'),
                    'type'
                ),
            ];

            echo view('episodes/create', $data);
            echo view('episode/create', $data);
        } else {
            $episode_slug = $this->request->getVar('slug');

@@ -49,7 +47,7 @@ class Episodes extends BaseController
            $image = $this->request->getFile('image');

            // By default, the episode's image path is set to the podcast's
            $image_path = $podcast->image;
            $image_path = $podcast->image_uri;

            // check whether the user has inputted an image and store it
            if ($image->isValid()) {
@@ -81,20 +79,21 @@ class Episodes extends BaseController
                'podcast_id' => $podcast->id,
                'title' => $this->request->getVar('title'),
                'slug' => $episode_slug,
                'enclosure_url' => $episode_path,
                'enclosure_uri' => $episode_path,
                'enclosure_length' => $episode_file->getSize(),
                'enclosure_type' => $episode_file_metadata['mime_type'],
                'guid' => $podcast_slug . '/' . $episode_slug,
                'pub_date' => $this->request->getVar('pub_date'),
                'description' => $this->request->getVar('description'),
                'duration' => $episode_file_metadata['playtime_seconds'],
                'image' => $image_path,
                'image_uri' => $image_path,
                'explicit' => $this->request->getVar('explicit') or false,
                'number' => $this->request->getVar('episode_number'),
                'season_number' => $this->request->getVar('season_number')
                    ? $this->request->getVar('season_number')
                    : null,
                'type' => $this->request->getVar('type'),
                'author_name' => $this->request->getVar('author_name'),
                'author_email' => $this->request->getVar('author_email'),
                'block' => $this->request->getVar('block') or false,
            ]);

@@ -103,30 +102,25 @@ class Episodes extends BaseController
            $episode_file = write_file_tags($podcast, $episode);

            return redirect()->to(
                base_url(
                    route_to(
                        'episodes_view',
                        '/@' . $podcast_name,
                        $episode_slug
                    )
                )
                base_url(route_to('episode_view', $podcast_name, $episode_slug))
            );
        }
    }

    public function view($podcast_slug, $episode_slug)
    public function view($podcast_name, $episode_slug)
    {
        $podcast_model = new PodcastModel();
        $episode_model = new EpisodeModel();

        $podcast = $podcast_model->where('name', $podcast_name)->first();
        $episode = $episode_model->where('slug', $episode_slug)->first();

        $data = [
            'podcast' => $podcast_model
                ->where('name', substr($podcast_slug, 1))
                ->first(),
            'episode' => $episode_model->where('slug', $episode_slug)->first(),
            'podcast' => $podcast,
            'episode' => $episode,
        ];
        self::stats($data['podcast']->id);
        self::triggerWebpageHit($data['podcast']->id);

        return view('episodes/view.php', $data);
        return view('episode/view.php', $data);
    }
}
Loading