Commit 02e4441f authored by Yassine Doghri's avatar Yassine Doghri
Browse files

feat: create optimized & resized images upon upload

- resize uploaded image to thumbnail, medium, large, feed, and id3 formats
- set image url formats where adapted in views
- set format sizes and extensions in Images config file for customization
- add validation for image uploads: `min_dims` and `is_image_squared`
- update codeigniter4 and myth-auth php packages to latest develop versions
- update npm packages to latest versions
- update public/.htaccess

closes #6
parent 40a0535f
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -10,8 +10,12 @@ WORKDIR /castopod
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpng-dev \
    libjpeg-dev \
    zlib1g-dev \
    && docker-php-ext-install intl gd
    && docker-php-ext-install intl

RUN docker-php-ext-configure gd --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd

RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli

@@ -19,4 +23,5 @@ RUN echo "file_uploads = On\n" \
         "memory_limit = 100M\n" \
         "upload_max_filesize = 100M\n" \
         "post_max_size = 120M\n" \
         "max_execution_time = 300\n" \
         > /usr/local/etc/php/conf.d/uploads.ini
+69 −0
Original line number Diff line number Diff line
@@ -30,4 +30,73 @@ class Images extends BaseConfig
        'gd' => \CodeIgniter\Images\Handlers\GDHandler::class,
        'imagick' => \CodeIgniter\Images\Handlers\ImageMagickHandler::class,
    ];

    /**
     * --------------------------------------------------------------------------
     * Uploaded images resizing sizes (in px)
     * --------------------------------------------------------------------------
     * The sizes listed below determine the resizing of images when uploaded.
     * All uploaded images are of 1:1 ratio (width and height are the same).
     */

    /**
     * @var integer
     */
    public $thumbnailSize = 150;

    /**
     * @var integer
     */
    public $mediumSize = 320;

    /**
     * @var integer
     */
    public $largeSize = 1024;

    /**
     * Size of images linked in the rss feed (should be between 1400 and 3000)
     *
     * @var integer
     */
    public $feedSize = 1400;

    /**
     * Size for ID3 tag cover art (should be between 300 and 800)
     *
     * @var integer
     */
    public $id3Size = 500;

    /**
     * --------------------------------------------------------------------------
     * Uploaded images naming extensions
     * --------------------------------------------------------------------------
     * The properties listed below set the name extensions for the resized images
     */

    /**
     * @var string
     */
    public $thumbnailExtension = '_thumbnail';

    /**
     * @var string
     */
    public $mediumExtension = '_medium';

    /**
     * @var string
     */
    public $largeExtension = '_large';

    /**
     * @var string
     */
    public $feedExtension = '_feed';

    /**
     * @var string
     */
    public $id3Extension = '_id3';
}
+1 −1
Original line number Diff line number Diff line
@@ -17,9 +17,9 @@ class Validation
    public $ruleSets = [
        \CodeIgniter\Validation\Rules::class,
        \CodeIgniter\Validation\FormatRules::class,
        \CodeIgniter\Validation\FileRules::class,
        \CodeIgniter\Validation\CreditCardRules::class,
        \App\Validation\Rules::class,
        \App\Validation\FileRules::class,
        \Myth\Auth\Authentication\Passwords\ValidationRules::class,
    ];

+2 −2
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ class Episode extends BaseController
        $rules = [
            'enclosure' => 'uploaded[enclosure]|ext_in[enclosure,mp3,m4a]',
            'image' =>
                'uploaded[image]|is_image[image]|ext_in[image,jpg,png]|permit_empty',
                'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]',
            'publication_date' => 'valid_date[Y-m-d]|permit_empty',
            'publication_time' =>
                'regex_match[/^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/]|permit_empty',
@@ -151,7 +151,7 @@ class Episode extends BaseController
            'enclosure' =>
                'uploaded[enclosure]|ext_in[enclosure,mp3,m4a]|permit_empty',
            'image' =>
                'uploaded[image]|is_image[image]|ext_in[image,jpg,png]|permit_empty',
                'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]',
            'publication_date' => 'valid_date[Y-m-d]|permit_empty',
            'publication_time' =>
                'regex_match[/^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/]|permit_empty',
+10 −9
Original line number Diff line number Diff line
@@ -79,7 +79,8 @@ class Podcast extends BaseController
    public function attemptCreate()
    {
        $rules = [
            'image' => 'uploaded[image]|is_image[image]|ext_in[image,jpg,png]',
            'image' =>
                'uploaded[image]|is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]',
        ];

        if (!$this->validate($rules)) {
@@ -162,8 +163,9 @@ class Podcast extends BaseController
        helper(['media', 'misc']);

        $rules = [
            'name' => 'required',
            'imported_feed_url' => 'required',
            'imported_feed_url' => 'required|valid_url',
            'season_number' => 'is_natural_no_zero|permit_empty',
            'max_episodes' => 'is_natural_no_zero|permit_empty',
        ];

        if (!$this->validate($rules)) {
@@ -217,8 +219,6 @@ class Podcast extends BaseController
            'complete' => empty($nsItunes->complete)
                ? false
                : $nsItunes->complete == 'yes',
            'episode_description_footer' => '',
            'custom_html_head' => '',
            'created_by' => user(),
            'updated_by' => user(),
        ]);
@@ -299,7 +299,8 @@ class Podcast extends BaseController
                    ? null
                    : download_file($nsItunes->image->attributes()),
                'explicit' => $nsItunes->explicit == 'yes',
                'number' => $this->request->getPost('force_renumber')
                'number' =>
                    $this->request->getPost('force_renumber') == 'yes'
                        ? $itemNumber
                        : $nsItunes->episode,
                'season_number' => empty(
@@ -358,7 +359,7 @@ class Podcast extends BaseController
    {
        $rules = [
            'image' =>
                'uploaded[image]|is_image[image]|ext_in[image,jpg,png]|permit_empty',
                'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]',
        ];

        if (!$this->validate($rules)) {
Loading