96 lines
2.9 KiB
PHP
96 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\StoreRecordingRequest;
|
|
use App\Models\Recording;
|
|
use App\Services\Mp3MetadataService;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\View\View;
|
|
|
|
class RecordingController extends Controller
|
|
{
|
|
/**
|
|
* Display a listing of recordings.
|
|
*/
|
|
public function index(Request $request): View
|
|
{
|
|
$query = Recording::query()->latest();
|
|
|
|
if ($search = $request->string('q')->trim()->toString()) {
|
|
$query->where(function ($builder) use ($search) {
|
|
$builder->where('title', 'like', "%{$search}%")
|
|
->orWhere('artist', 'like', "%{$search}%")
|
|
->orWhere('album', 'like', "%{$search}%")
|
|
->orWhere('original_filename', 'like', "%{$search}%")
|
|
->orWhere('transcript', 'like', "%{$search}%");
|
|
});
|
|
}
|
|
|
|
$recordings = $query->paginate(20)->withQueryString();
|
|
|
|
return view('recordings.index', compact('recordings', 'search'));
|
|
}
|
|
|
|
/**
|
|
* Show the upload form.
|
|
*/
|
|
public function create(): View
|
|
{
|
|
return view('recordings.create');
|
|
}
|
|
|
|
/**
|
|
* Store a newly uploaded recording.
|
|
*/
|
|
public function store(StoreRecordingRequest $request, Mp3MetadataService $metadata): RedirectResponse
|
|
{
|
|
$file = $request->file('audio');
|
|
$path = $file->store('recordings', 'local');
|
|
$absolutePath = Storage::disk('local')->path($path);
|
|
$tags = $metadata->extract($absolutePath);
|
|
|
|
$title = $request->string('title')->trim()->toString()
|
|
?: ($tags['title'] ?? pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME));
|
|
|
|
$recording = Recording::create([
|
|
'title' => $title,
|
|
'original_filename' => $file->getClientOriginalName(),
|
|
'file_path' => $path,
|
|
'duration_seconds' => $tags['duration_seconds'],
|
|
'recorded_at' => $tags['recorded_at'],
|
|
'artist' => $tags['artist'],
|
|
'album' => $tags['album'],
|
|
'file_size_bytes' => $file->getSize() ?: 0,
|
|
'transcription_status' => 'pending',
|
|
]);
|
|
|
|
return redirect()
|
|
->route('recordings.show', $recording)
|
|
->with('success', 'Recording uploaded successfully.');
|
|
}
|
|
|
|
/**
|
|
* Display the specified recording.
|
|
*/
|
|
public function show(Recording $recording): View
|
|
{
|
|
return view('recordings.show', compact('recording'));
|
|
}
|
|
|
|
/**
|
|
* Remove the specified recording.
|
|
*/
|
|
public function destroy(Recording $recording): RedirectResponse
|
|
{
|
|
$recording->deleteFile();
|
|
$recording->delete();
|
|
|
|
return redirect()
|
|
->route('recordings.index')
|
|
->with('success', 'Recording deleted.');
|
|
}
|
|
}
|