. */ namespace Poniverse\Ponyfm\Http\Controllers\Api\V1; use Poniverse\Ponyfm\Commands\UploadTrackCommand; use Poniverse\Ponyfm\Http\Controllers\ApiControllerBase; use Poniverse\Ponyfm\Image; use Poniverse\Ponyfm\Track; use Response; class TracksController extends ApiControllerBase { public function postUploadTrack() { session_write_close(); $response = $this->execute(new UploadTrackCommand()); $commandData = $response->getData(true); if (200 !== $response->getStatusCode()) { return $response; } $data = [ 'id' => $commandData['id'], 'status_url' => action('Api\V1\TracksController@getUploadStatus', ['id' => $commandData['id']]), 'message' => "This track has been accepted for processing! Poll the status_url to know when it's ready to publish.", ]; $response->setData($data); $response->setStatusCode(202); return $response; } public function getUploadStatus($trackId) { $track = Track::findOrFail($trackId); $this->authorize('edit', $track); if ($track->status === Track::STATUS_PROCESSING) { return Response::json(['message' => 'Processing...'], 202); } elseif ($track->status === Track::STATUS_COMPLETE) { return Response::json([ 'message' => 'Processing complete! The artist must publish the track by visiting its edit_url.', 'edit_url' => action('ContentController@getTracks', ['id' => $trackId]) ], 201); } else { // something went wrong return Response::json(['error' => 'Processing failed!'], 500); } } public function getTrackRadioDetails($hash) { $track = Track ::with('user', 'album', 'user.avatar', 'cover', 'comments', 'genre') ->published() ->whereHash($hash)->first(); if (!$track) { return Response::json(['message' => 'Track not found.'], 403); } $comments = []; foreach ($track->comments as $comment) { $comments[] = [ 'id' => $comment->id, 'created_at' => $comment->created_at, 'content' => $comment->content, 'user' => [ 'name' => $comment->user->display_name, 'id' => $comment->user->id, 'url' => $comment->user->url, 'avatars' => [ 'normal' => $comment->user->getAvatarUrl(Image::NORMAL), 'thumbnail' => $comment->user->getAvatarUrl(Image::THUMBNAIL), 'small' => $comment->user->getAvatarUrl(Image::SMALL), ] ] ]; } return Response::json([ 'id' => $track->id, 'title' => $track->title, 'description' => $track->description, 'lyrics' => $track->lyrics, 'user' => [ 'id' => $track->user->id, 'name' => $track->user->display_name, 'url' => $track->user->url, 'avatars' => [ 'thumbnail' => $track->user->getAvatarUrl(Image::THUMBNAIL), 'small' => $track->user->getAvatarUrl(Image::SMALL), 'normal' => $track->user->getAvatarUrl(Image::NORMAL) ] ], 'stats' => [ 'views' => $track->view_count, 'plays' => $track->play_count, 'downloads' => $track->download_count, 'comments' => $track->comment_count, 'favourites' => $track->favourite_count ], 'url' => $track->url, 'is_vocal' => !!$track->is_vocal, 'is_explicit' => !!$track->is_explicit, 'is_downloadable' => !!$track->is_downloadable, 'published_at' => $track->published_at, 'duration' => $track->duration, 'genre' => $track->genre != null ? [ 'id' => $track->genre->id, 'name' => $track->genre->name ] : null, 'type' => [ 'id' => $track->track_type->id, 'name' => $track->track_type->title ], 'covers' => [ 'thumbnail' => $track->getCoverUrl(Image::THUMBNAIL), 'small' => $track->getCoverUrl(Image::SMALL), 'normal' => $track->getCoverUrl(Image::NORMAL) ], 'comments' => $comments, // As of 2015-10-28, this should be expected to produce either // "direct_upload" or "mlpma" for all tracks. 'source' => $track->source ], 200); } }