diff --git a/src/Fieldtypes/Assets/Assets.php b/src/Fieldtypes/Assets/Assets.php index d60546b7bda..f9ec895a4a5 100644 --- a/src/Fieldtypes/Assets/Assets.php +++ b/src/Fieldtypes/Assets/Assets.php @@ -259,11 +259,19 @@ protected function getColumns() ->defaultVisibility(false) ->sortable(true); + $duration = Column::make('duration') + ->label(__('Duration')) + ->value('duration_formatted') + ->visible(true) + ->defaultVisibility(false) + ->sortable(true); + $columns->put('basename', $basename); $columns->put('size', $size); $columns->put('last_modified', $lastModified); $columns->put('width', $width); $columns->put('height', $height); + $columns->put('duration', $duration); $columns->setPreferred("assets.{$this->container()->handle()}.columns"); diff --git a/src/Http/Controllers/CP/Assets/BrowserController.php b/src/Http/Controllers/CP/Assets/BrowserController.php index 6ec6277b0dd..92b6fc4416a 100644 --- a/src/Http/Controllers/CP/Assets/BrowserController.php +++ b/src/Http/Controllers/CP/Assets/BrowserController.php @@ -245,11 +245,19 @@ public function setColumns($container) ->defaultVisibility(false) ->sortable(true); + $duration = Column::make('duration') + ->label(__('Duration')) + ->value('duration_formatted') + ->visible(true) + ->defaultVisibility(false) + ->sortable(true); + $columns->put('basename', $basename); $columns->put('size', $size); $columns->put('last_modified', $lastModified); $columns->put('width', $width); $columns->put('height', $height); + $columns->put('duration', $duration); $columns->setPreferred("assets.{$container->handle()}.columns"); diff --git a/src/Http/Resources/CP/Assets/FolderAsset.php b/src/Http/Resources/CP/Assets/FolderAsset.php index 8b9a6355476..8aeee1fe280 100644 --- a/src/Http/Resources/CP/Assets/FolderAsset.php +++ b/src/Http/Resources/CP/Assets/FolderAsset.php @@ -38,6 +38,7 @@ public function toArray($request) 'url' => $this->absoluteUrl(), 'width' => $this->width(), 'height' => $this->height(), + 'duration_formatted' => $this->duration() ? Str::durationForHumans($this->duration()) : null, 'size_formatted' => Str::fileSizeForHumans($this->size(), 0), 'last_modified_relative' => $this->lastModified()->diffForHumans(), 'editable' => User::current()->can('edit', $this->resource), diff --git a/src/Http/Resources/CP/Assets/SearchedAssetsCollection.php b/src/Http/Resources/CP/Assets/SearchedAssetsCollection.php index c70e3ea323a..7451400862f 100644 --- a/src/Http/Resources/CP/Assets/SearchedAssetsCollection.php +++ b/src/Http/Resources/CP/Assets/SearchedAssetsCollection.php @@ -68,11 +68,19 @@ public function setColumns() ->defaultVisibility(false) ->sortable(true); + $duration = Column::make('duration') + ->label(__('Duration')) + ->value('duration_formatted') + ->visible(true) + ->defaultVisibility(false) + ->sortable(true); + $columns->put('basename', $basename); $columns->put('size', $size); $columns->put('last_modified', $lastModified); $columns->put('width', $width); $columns->put('height', $height); + $columns->put('duration', $duration); if ($key = $this->columnPreferenceKey) { $columns->setPreferred($key); diff --git a/src/Support/Str.php b/src/Support/Str.php index 0d74567c2db..02dc81afbc7 100644 --- a/src/Support/Str.php +++ b/src/Support/Str.php @@ -149,6 +149,14 @@ public static function fileSizeForHumans($bytes, $decimals = 2) return trans('statamic::messages.units.B', ['count' => $bytes]); } + public static function durationForHumans($s) + { + $mins = floor($s / 60); + $secs = $s % 60; + + return sprintf('%01d:%02d', $mins, $secs); + } + public static function timeForHumans($ms) { if ($ms < 1000) { diff --git a/tests/Support/StrTest.php b/tests/Support/StrTest.php index 13b70bf5822..ca348ab021e 100644 --- a/tests/Support/StrTest.php +++ b/tests/Support/StrTest.php @@ -147,6 +147,19 @@ public function it_gets_time_for_humans() $this->assertEquals('1.57s', Str::timeForHumans(1570)); } + #[Test] + public function it_gets_duration_for_humans() + { + $this->assertEquals('0:00', Str::durationForHumans(0)); + $this->assertEquals('0:01', Str::durationForHumans(1)); + $this->assertEquals('0:12', Str::durationForHumans(12)); + $this->assertEquals('0:59', Str::durationForHumans(59)); + $this->assertEquals('1:00', Str::durationForHumans(60)); + $this->assertEquals('2:01', Str::durationForHumans(121)); + $this->assertEquals('16:40', Str::durationForHumans(1000)); + $this->assertEquals('130:00', Str::durationForHumans(7800)); + } + #[Test] public function it_widonts() {