koel/app/Http/Controllers/API/ObjectStorage/S3/SongController.php

78 lines
2.4 KiB
PHP
Raw Normal View History

2016-06-13 09:04:42 +00:00
<?php
namespace App\Http\Controllers\API\ObjectStorage\S3;
use App\Events\LibraryChanged;
use App\Http\Requests\API\ObjectStorage\S3\PutSongRequest;
use App\Http\Requests\API\ObjectStorage\S3\RemoveSongRequest;
use App\Models\Album;
use App\Models\Artist;
use App\Models\Song;
2018-08-29 06:15:11 +00:00
use App\Repositories\SongRepository;
use App\Services\HelperService;
2018-08-19 09:05:33 +00:00
use App\Services\MediaMetadataService;
2020-09-13 22:04:07 +00:00
use Illuminate\Http\Response;
2016-06-13 09:04:42 +00:00
class SongController extends Controller
{
2021-06-05 10:47:56 +00:00
private MediaMetadataService $mediaMetadataService;
private SongRepository $songRepository;
private HelperService $helperService;
2018-08-19 09:05:33 +00:00
2018-08-29 06:15:11 +00:00
public function __construct(
MediaMetadataService $mediaMetadataService,
HelperService $helperService,
SongRepository $songRepository
) {
2018-08-19 09:05:33 +00:00
$this->mediaMetadataService = $mediaMetadataService;
2018-08-29 06:15:11 +00:00
$this->songRepository = $songRepository;
$this->helperService = $helperService;
2018-08-19 09:05:33 +00:00
}
2016-06-13 09:04:42 +00:00
public function put(PutSongRequest $request)
{
2021-06-05 10:47:56 +00:00
$path = "s3://$request->bucket/$request->key";
2016-06-13 09:04:42 +00:00
$tags = $request->tags;
$artist = Artist::getOrCreate(array_get($tags, 'artist'));
2016-06-13 09:04:42 +00:00
$compilation = (bool) trim(array_get($tags, 'albumartist'));
$album = Album::getOrCreate($artist, array_get($tags, 'album'), $compilation);
2020-12-22 20:11:22 +00:00
$cover = array_get($tags, 'cover');
2016-06-13 09:04:42 +00:00
2020-12-22 20:11:22 +00:00
if ($cover) {
$this->mediaMetadataService->writeAlbumCover(
$album,
base64_decode($cover['data'], true),
$cover['extension']
);
2016-06-13 09:04:42 +00:00
}
2018-08-29 06:15:11 +00:00
$song = Song::updateOrCreate(['id' => $this->helperService->getFileHash($path)], [
2016-06-13 09:04:42 +00:00
'path' => $path,
'album_id' => $album->id,
'artist_id' => $artist->id,
2016-06-13 09:04:42 +00:00
'title' => trim(array_get($tags, 'title', '')),
'length' => array_get($tags, 'duration', 0) ?: 0,
2016-08-03 10:42:11 +00:00
'track' => (int) array_get($tags, 'track'),
'lyrics' => array_get($tags, 'lyrics', '') ?: '',
2016-06-13 09:04:42 +00:00
'mtime' => time(),
]);
2018-08-19 15:26:34 +00:00
event(new LibraryChanged());
2016-06-13 09:04:42 +00:00
return response()->json($song);
}
public function remove(RemoveSongRequest $request)
{
2021-06-05 10:47:56 +00:00
$song = $this->songRepository->getOneByPath("s3://$request->bucket/$request->key");
2020-09-13 22:04:07 +00:00
abort_unless((bool) $song, Response::HTTP_NOT_FOUND);
2018-08-29 06:15:11 +00:00
2016-06-13 09:04:42 +00:00
$song->delete();
event(new LibraryChanged());
2020-09-13 22:04:07 +00:00
return response()->json(null, Response::HTTP_NO_CONTENT);
2016-06-13 09:04:42 +00:00
}
}