Passed
Push — master ( ab30be...0d1280 )
by Caen
03:32 queued 14s
created

MediaFile::getMediaAssetFiles()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Hyde\Support\Filesystem;
6
7
use Hyde\Facades\Filesystem;
8
use Hyde\Hyde;
9
use Hyde\Facades\Config;
10
use Hyde\Framework\Exceptions\FileNotFoundException;
11
use Illuminate\Support\Str;
12
13
use function extension_loaded;
14
use function file_exists;
15
use function array_merge;
16
use function array_keys;
17
use function filesize;
18
use function pathinfo;
19
use function collect;
20
use function is_file;
21
22
/**
23
 * File abstraction for a project media file.
24
 */
25
class MediaFile extends ProjectFile
26
{
27
    /** @var array<string> The default extensions for media types */
28
    final public const EXTENSIONS = ['png', 'svg', 'jpg', 'jpeg', 'gif', 'ico', 'css', 'js'];
29
30
    /** @return array<string, \Hyde\Support\Filesystem\MediaFile> The array keys are the filenames relative to the _media/ directory */
31
    public static function all(): array
32
    {
33
        return static::discoverMediaAssetFiles();
34
    }
35
36
    /** @return array<string> Array of filenames relative to the _media/ directory */
37
    public static function files(): array
38
    {
39
        return array_keys(static::all());
40
    }
41
42
    public function getIdentifier(): string
43
    {
44
        return Str::after($this->getPath(), Hyde::getMediaDirectory().'/');
0 ignored issues
show
Bug introduced by
The method getMediaDirectory() does not exist on Hyde\Hyde. Since you implemented __callStatic, consider adding a @method annotation. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

44
        return Str::after($this->getPath(), Hyde::/** @scrutinizer ignore-call */ getMediaDirectory().'/');
Loading history...
45
    }
46
47
    public function toArray(): array
48
    {
49
        return array_merge(parent::toArray(), [
50
            'length' => $this->getContentLength(),
51
            'mimeType' => $this->getMimeType(),
52
        ]);
53
    }
54
55
    public function getContentLength(): int
56
    {
57
        if (! is_file($this->getAbsolutePath())) {
58
            throw new FileNotFoundException($this->path);
59
        }
60
61
        return filesize($this->getAbsolutePath());
62
    }
63
64
    public function getMimeType(): string
65
    {
66
        $extension = pathinfo($this->getAbsolutePath(), PATHINFO_EXTENSION);
67
68
        // See if we can find a mime type for the extension instead of
69
        // having to rely on a PHP extension and filesystem lookups.
70
        $lookup = [
71
            'txt' => 'text/plain',
72
            'md' => 'text/markdown',
73
            'html' => 'text/html',
74
            'css' => 'text/css',
75
            'svg' => 'image/svg+xml',
76
            'png' => 'image/png',
77
            'jpg' => 'image/jpeg',
78
            'jpeg' => 'image/jpeg',
79
            'gif' => 'image/gif',
80
            'json' => 'application/json',
81
            'js' => 'application/javascript',
82
            'xml' => 'application/xml',
83
        ];
84
85
        if (isset($lookup[$extension])) {
86
            return $lookup[$extension];
87
        }
88
89
        if (extension_loaded('fileinfo') && file_exists($this->getAbsolutePath())) {
90
            return mime_content_type($this->getAbsolutePath());
91
        }
92
93
        return 'text/plain';
94
    }
95
96
    protected static function discoverMediaAssetFiles(): array
97
    {
98
        return collect(static::getMediaAssetFiles())->mapWithKeys(function (string $path): array {
0 ignored issues
show
Bug introduced by
static::getMediaAssetFiles() of type array is incompatible with the type Illuminate\Contracts\Support\Arrayable expected by parameter $value of collect(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

98
        return collect(/** @scrutinizer ignore-type */ static::getMediaAssetFiles())->mapWithKeys(function (string $path): array {
Loading history...
99
            $file = static::make($path);
100
101
            return [$file->getIdentifier() => $file];
102
        })->all();
103
    }
104
105
    /** @return array<string> */
106
    protected static function getMediaAssetFiles(): array
107
    {
108
        return Filesystem::findFiles(Hyde::getMediaDirectory(), static::getMediaFileExtensions(), true)->all();
109
    }
110
111
    /** @return array<string>|string */
112
    protected static function getMediaFileExtensions(): array|string
113
    {
114
        /** @var array<string>|string $config */
115
        $config = Config::get('hyde.media_extensions', self::EXTENSIONS);
116
117
        return $config;
118
    }
119
}
120