. */ namespace Poniverse\Ponyfm\Http\Controllers; use Illuminate\Http\Request; use Poniverse\Ponyfm\Models\ResourceLogItem; use Poniverse\Ponyfm\Models\Track; use Poniverse\Ponyfm\Models\TrackFile; use Auth; use Config; use App; use Redirect; use Response; use View; class TracksController extends Controller { public function getIndex() { return View::make('tracks.index'); } public function getEmbed($id) { $track = Track ::whereId($id) ->published() ->userDetails() ->with( 'user', 'user.avatar', 'genre' )->first(); if (!$track || !$track->canView(Auth::user())) { App::abort(404); } $userData = [ 'stats' => [ 'views' => 0, 'plays' => 0, 'downloads' => 0 ], 'is_favourited' => false ]; if ($track->users->count()) { $userRow = $track->users[0]; $userData = [ 'stats' => [ 'views' => $userRow->view_count, 'plays' => $userRow->play_count, 'downloads' => $userRow->download_count, ], 'is_favourited' => $userRow->is_favourited ]; } return View::make('tracks.embed', ['track' => $track, 'user' => $userData]); } public function getOembed(Request $request) { if (!$request->has('url')) { App::abort(404); } $parsedUrl = parse_url($request->input('url')); $id = preg_match('(\d+)', $parsedUrl['path']); $track = Track ::whereId($id) ->published() ->userDetails() ->first(); if (!$track || !$track->canView(Auth::user())) { App::abort(404); } $output = [ 'version' => '1.0', 'type' => 'rich', 'provider_name' => 'Pony.fm', 'provider_url' => 'https://pony.fm', 'width' => 480, 'height' => 130, 'title' => $track->title, 'author_name' => $track->user->display_name, 'author_url' => $track->user->url, 'html' => '' ]; return Response::json($output); } public function getTrack($id, $slug) { $track = Track::find($id); if (!$track || !$track->canView(Auth::user())) { App::abort(404); } if ($track->slug != $slug) { return Redirect::action('TracksController@getTrack', [$id, $track->slug]); } return View::make('tracks.show', ['track' => $track]); } public function getEdit($id, $slug) { return $this->getTrack($id, $slug); } public function getShortlink($id) { $track = Track::find($id); if (!$track || !$track->canView(Auth::user())) { App::abort(404); } return Redirect::action('TracksController@getTrack', [$id, $track->slug]); } public function getStream($id, $extension) { $track = Track::find($id); if (!$track || !$track->canView(Auth::user())) { App::abort(404); } $trackFile = TrackFile::findOrFailByExtension($track->id, $extension); $response = Response::make('', 200); $filename = $trackFile->getFile(); if (!file_exists($filename)) { App::abort(418); } ResourceLogItem::logItem('track', $id, ResourceLogItem::PLAY, $trackFile->getFormat()['index']); if (Config::get('app.sendfile')) { $response->header('X-Sendfile', $filename); } else { $response->header('X-Accel-Redirect', $filename); } $time = gmdate(filemtime($filename)); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $time == $_SERVER['HTTP_IF_MODIFIED_SINCE']) { header('HTTP/1.0 304 Not Modified'); exit(); } $response->header('Last-Modified', $time); $response->header('Content-Type', $trackFile->getFormat()['mime_type']); return $response; } public function getDownload($id, $extension) { $track = Track::find($id); if (!$track || !$track->canView(Auth::user())) { App::abort(404); } $trackFile = TrackFile::findOrFailByExtension($track->id, $extension); ResourceLogItem::logItem('track', $id, ResourceLogItem::DOWNLOAD, $trackFile->getFormat()['index']); $response = Response::make('', 200); $filename = $trackFile->getFile(); if (Config::get('app.sendfile')) { $response->header('X-Sendfile', $filename); $response->header( 'Content-Disposition', 'attachment; filename="'.$trackFile->getDownloadFilename().'"' ); } else { $response->header('X-Accel-Redirect', $filename); $response->header( 'Content-Disposition', 'attachment; filename="'.$trackFile->getDownloadFilename().'"' ); } $time = gmdate(filemtime($filename)); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $time == $_SERVER['HTTP_IF_MODIFIED_SINCE']) { header('HTTP/1.0 304 Not Modified'); exit(); } $response->header('Last-Modified', $time); $response->header('Content-Type', $trackFile->getFormat()['mime_type']); return $response; } }