Skip to content

[Bug]: CBR/CBZ cover extraction skips valid covers when image is PNG or uppercase extension #127

@devnoname120

Description

@devnoname120

Hi, thanks for this package.

I found CBR/CBZ cover extraction edge cases in kiwilan/php-ebook v3.0.09.

Environment

  • PHP 8.1.34
  • kiwilan/php-ebook 3.0.09
  • macOS arm64

What works

  • CBR/CBZ with first image named cover.jpg => getCover() is returned.

What doesn’t work

  • CBR/CBZ with first image named cover.png => getCover() is null.
  • CBR/CBZ with first image named COVER.JPG (uppercase extension) => getCover() is null.

Repro

<?php
require 'vendor/autoload.php';

use Kiwilan\Ebook\Ebook;

// tiny 1x1 PNG and JPEG payloads
$png = base64_decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO7+L8wAAAAASUVORK5CYII=');
$jpg = base64_decode('/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABALDg8QEBAPEA8QFRAQFhUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRX/2wBDARESEhUVFRYVFRYVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRX/wAARCAAQABADASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAb/xAAfEAACAQQDAQAAAAAAAAAAAAABAgMABAURBhIhMUH/xAAVAQEBAAAAAAAAAAAAAAAAAAADBP/EABkRAAMAAwAAAAAAAAAAAAAAAAABAhEhQf/aAAwDAQACEQMRAD8AkQw3U1fTn2Y7QplkURxA6mMZ6Zr0NhkW0NQj8w5m0a1kqJYg5mVjA6n8K2jLJtq8+7WqNwMZ8j7wT3oX7mJf/Z');

file_put_contents('cover.png', $png);
file_put_contents('COVER.JPG', $jpg);

// create archives (example shell)
// zip -q sample-png.cbz cover.png
// rar a -idq sample-png.cbr cover.png
// zip -q sample-upper.cbz COVER.JPG
// rar a -idq sample-upper.cbr COVER.JPG

foreach (['sample-png.cbz','sample-png.cbr','sample-upper.cbz','sample-upper.cbr'] as $file) {
    $ebook = Ebook::read(__DIR__ . '/' . $file);
    echo $file . ' cover=' . ($ebook?->getCover() ? 'yes' : 'no') . PHP_EOL;
}

Expected

getCover() should detect covers from common image types and case variants in comic archives, including:

  • .png
  • uppercase extensions like .JPG, .JPEG, .WEBP, .PNG

Actual

Only lowercase .jpg / .jpeg / .webp are effectively picked for CBR/CBZ cover detection, so valid archives can return no cover.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions