public function getOAuth() { $code = $this->poniverse->getClient()->getAccessToken(Config::get('poniverse.urls')['token'], 'authorization_code', ['code' => Input::query('code'), 'redirect_uri' => action('AuthController@getOAuth')]); if ($code['code'] != 200) { if ($code['code'] == 400 && $code['result']['error_description'] == 'The authorization code has expired' && !isset($this->request['login_attempt'])) { return Redirect::to($this->poniverse->getAuthenticationUrl('login_attempt')); } return Redirect::to('/')->with('message', 'Unfortunately we are having problems attempting to log you in at the moment. Please try again at a later time.'); } $this->poniverse->setAccessToken($code['result']['access_token']); $poniverseUser = $this->poniverse->getUser(); $token = DB::table('oauth2_tokens')->where('external_user_id', '=', $poniverseUser['id'])->where('service', '=', 'poniverse')->first(); $setData = ['access_token' => $code['result']['access_token'], 'expires' => date('Y-m-d H:i:s', strtotime("+" . $code['result']['expires_in'] . " Seconds", time())), 'type' => $code['result']['token_type']]; if (isset($code['result']['refresh_token']) && !empty($code['result']['refresh_token'])) { $setData['refresh_token'] = $code['result']['refresh_token']; } if ($token) { //User already exists, update access token and refresh token if provided. DB::table('oauth2_tokens')->where('id', '=', $token->id)->update($setData); return $this->loginRedirect(User::find($token->user_id)); } // Check by login name to see if they already have an account $user = User::findOrCreate($poniverseUser['username'], $poniverseUser['display_name'], $poniverseUser['email']); if ($user->wasRecentlyCreated) { return $this->loginRedirect($user); } // We need to insert a new token row :O $setData['user_id'] = $user->id; $setData['external_user_id'] = $poniverseUser['id']; $setData['service'] = 'poniverse'; DB::table('oauth2_tokens')->insert($setData); return $this->loginRedirect($user); }
public function getShortlink($id) { $user = User::find($id); if (!$user || $user->disabled_at !== NULL) { App::abort('404'); } return Redirect::action('ArtistsController@getProfile', [$user->slug]); }
/** * Execute the console command. * * @return mixed */ public function handle() { foreach (User::with(['tracks' => function ($query) { $query->published()->listed(); }])->get() as $user) { $user->track_count = $user->tracks->count(); $user->save(); $this->info('Updated user #' . $user->id . '!'); } }
/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $requiredScope * @return mixed * @throws \OAuth2\Exception */ public function handle(Request $request, Closure $next, $requiredScope) { // Ensure this is a valid OAuth client. $accessToken = $this->determineAccessToken($request, false); // check that access token is valid at Poniverse.net $accessTokenInfo = $this->poniverse->getAccessTokenInfo($accessToken); if (!$accessTokenInfo->getIsActive()) { throw new AccessDeniedHttpException('This access token is expired or invalid!'); } if (!in_array($requiredScope, $accessTokenInfo->getScopes())) { throw new AccessDeniedHttpException("This access token lacks the '{$requiredScope}' scope!"); } // Log in as the given user, creating the account if necessary. $this->poniverse->setAccessToken($accessToken); $this->session->put('api_client_id', $accessTokenInfo->getClientId()); $poniverseUser = $this->poniverse->getUser(); $user = User::findOrCreate($poniverseUser['username'], $poniverseUser['display_name'], $poniverseUser['email']); $this->auth->onceUsingId($user); return $next($request); }
/** * Execute the console command. * * @return mixed */ public function handle() { // Get list of affected users $usernames = DB::table('users')->select(['username', DB::raw('COUNT(*) as count')])->whereNull('disabled_at')->whereNotNull('username')->groupBy(DB::raw('LOWER(username)'))->having('count', '>=', 2)->lists('username'); foreach ($usernames as $username) { // Find the relevant accounts // ========================== /** @var Collection $accounts */ $accounts = User::where('username', $username)->orderBy('created_at', 'ASC')->get(); $firstAccount = $accounts[0]; $accounts->forget(0); $accountIds = $accounts->pluck('id'); // Reassign content // ================ // This is done with the less-efficient-than-raw-SQL Eloquent // methods to generate appropriate revision logs. $this->info('Merging duplicates for: ' . $firstAccount->username); DB::transaction(function () use($accounts, $accountIds, $firstAccount) { foreach (Album::whereIn('user_id', $accountIds)->get() as $album) { $album->user_id = $firstAccount->id; $album->save(); } foreach (Comment::whereIn('user_id', $accountIds)->get() as $comment) { $comment->user_id = $firstAccount->id; $comment->save(); } foreach (Favourite::whereIn('user_id', $accountIds)->get() as $favourite) { $favourite->user_id = $firstAccount->id; $favourite->save(); } foreach (Follower::whereIn('artist_id', $accountIds)->get() as $follow) { $follow->artist_id = $firstAccount->id; $follow->save(); } foreach (Image::whereIn('uploaded_by', $accountIds)->get() as $image) { $image->uploaded_by = $firstAccount->id; $image->save(); } foreach (Image::whereIn('uploaded_by', $accountIds)->get() as $image) { $image->uploaded_by = $firstAccount->id; $image->save(); } DB::table('oauth2_tokens')->whereIn('user_id', $accountIds)->update(['user_id' => $firstAccount->id]); foreach (PinnedPlaylist::whereIn('user_id', $accountIds)->get() as $playlist) { $playlist->user_id = $firstAccount->id; $playlist->save(); } foreach (Playlist::whereIn('user_id', $accountIds)->get() as $playlist) { $playlist->user_id = $firstAccount->id; $playlist->save(); } foreach (ResourceLogItem::whereIn('user_id', $accountIds)->get() as $item) { $item->user_id = $firstAccount->id; $item->save(); } foreach (ResourceUser::whereIn('user_id', $accountIds)->get() as $item) { $item->user_id = $firstAccount->id; $item->save(); } foreach (Track::whereIn('user_id', $accountIds)->get() as $track) { $track->user_id = $firstAccount->id; $track->save(); } foreach ($accounts as $account) { $account->disabled_at = Carbon::now(); $account->save(); } }); } }
/** * @throws \Exception * @return CommandResponse */ public function execute() { $rules = ['content' => 'required', 'track_id' => 'exists:tracks,id', 'albums_id' => 'exists:albums,id', 'playlist_id' => 'exists:playlists,id', 'profile_id' => 'exists:users,id']; $validator = Validator::make($this->_input, $rules); if ($validator->fails()) { return CommandResponse::fail($validator); } $comment = new Comment(); $comment->user_id = Auth::user()->id; $comment->content = $this->_input['content']; if ($this->_type == 'track') { $column = 'track_id'; } else { if ($this->_type == 'user') { $column = 'profile_id'; } else { if ($this->_type == 'album') { $column = 'album_id'; } else { if ($this->_type == 'playlist') { $column = 'playlist_id'; } else { App::abort(500); } } } } $comment->{$column} = $this->_id; $comment->save(); // Recount the track's comments, if this is a track comment if ($this->_type === 'track') { $entity = Track::find($this->_id); } elseif ($this->_type === 'album') { $entity = Album::find($this->_id); } elseif ($this->_type === 'playlist') { $entity = Playlist::find($this->_id); } elseif ($this->_type === 'user') { $entity = User::find($this->_id); } else { App::abort(400, 'This comment is being added to an invalid entity!'); } $entity->comment_count = Comment::where($column, $this->_id)->count(); $entity->save(); return CommandResponse::succeed(Comment::mapPublic($comment)); }
public function delete(User $user, Genre $genre) { return $user->hasRole('admin'); }
/** * @throws \Exception * @return CommandResponse */ public function execute() { $isVocal = isset($this->_input['is_vocal']) && $this->_input['is_vocal'] == 'true' ? true : false; $rules = ['title' => 'required|min:3|max:80', 'released_at' => 'before:' . date('Y-m-d', time() + 86400 * 2) . (isset($this->_input['released_at']) && $this->_input['released_at'] != "" ? '|date' : ''), 'license_id' => 'required|exists:licenses,id', 'genre_id' => 'required|exists:genres,id', 'cover' => 'image|mimes:png,jpeg|min_width:350|min_height:350', 'track_type_id' => 'required|exists:track_types,id|not_in:' . TrackType::UNCLASSIFIED_TRACK, 'songs' => 'required_when:track_type,2|exists:songs,id', 'cover_id' => 'exists:images,id', 'album_id' => 'exists:albums,id']; if ($isVocal) { $rules['lyrics'] = 'required'; } if (isset($this->_input['track_type_id']) && $this->_input['track_type_id'] == 2) { $rules['show_song_ids'] = 'required|exists:show_songs,id'; } $validator = \Validator::make($this->_input, $rules); if ($validator->fails()) { return CommandResponse::fail($validator); } $track = $this->_track; $track->title = $this->_input['title']; $track->released_at = isset($this->_input['released_at']) && $this->_input['released_at'] != "" ? strtotime($this->_input['released_at']) : null; $track->description = isset($this->_input['description']) ? $this->_input['description'] : ''; $track->lyrics = isset($this->_input['lyrics']) ? $this->_input['lyrics'] : ''; $track->license_id = $this->_input['license_id']; $track->genre_id = $this->_input['genre_id']; $track->track_type_id = $this->_input['track_type_id']; $track->is_explicit = $this->_input['is_explicit'] == 'true'; $track->is_downloadable = $this->_input['is_downloadable'] == 'true'; $track->is_listed = $this->_input['is_listed'] == 'true'; $track->is_vocal = $isVocal; if (isset($this->_input['album_id']) && strlen(trim($this->_input['album_id']))) { if ($track->album_id != null && $track->album_id != $this->_input['album_id']) { $this->removeTrackFromAlbum($track); } if ($track->album_id != $this->_input['album_id']) { $album = Album::find($this->_input['album_id']); $track->track_number = $album->tracks()->count() + 1; $track->album_id = $this->_input['album_id']; Album::whereId($album->id)->update(['track_count' => DB::raw('(SELECT COUNT(id) FROM tracks WHERE album_id = ' . $album->id . ')')]); } } else { if ($track->album_id != null) { $this->removeTrackFromAlbum($track); } $track->track_number = null; $track->album_id = null; } if ($track->track_type_id == TrackType::OFFICIAL_TRACK_REMIX) { $track->showSongs()->sync(explode(',', $this->_input['show_song_ids'])); } else { $track->showSongs()->sync([]); } if ($track->published_at == null) { $track->published_at = new \DateTime(); DB::table('tracks')->whereUserId($track->user_id)->update(['is_latest' => false]); $track->is_latest = true; } if (isset($this->_input['cover_id'])) { $track->cover_id = $this->_input['cover_id']; } else { if (isset($this->_input['cover'])) { $cover = $this->_input['cover']; $track->cover_id = Image::upload($cover, Auth::user())->id; } else { if ($this->_input['remove_cover'] == 'true') { $track->cover_id = null; } } } $track->updateTags(); $track->save(); User::whereId($this->_track->user_id)->update(['track_count' => DB::raw('(SELECT COUNT(id) FROM tracks WHERE deleted_at IS NULL AND published_at IS NOT NULL AND user_id = ' . $this->_track->user_id . ')')]); return CommandResponse::succeed(['real_cover_url' => $track->getCoverUrl(Image::NORMAL)]); }
public function getIndex() { $page = 1; if (Input::has('page')) { $page = Input::get('page'); } $query = User::orderBy('display_name', 'asc')->where('track_count', '>', 0); $count = $query->count(); $perPage = 40; $query->skip(($page - 1) * $perPage)->take($perPage); $users = []; foreach ($query->get() as $user) { $users[] = ['id' => $user->id, 'name' => $user->display_name, 'slug' => $user->slug, 'url' => $user->url, 'is_archived' => $user->is_archived, 'avatars' => ['small' => $user->getAvatarUrl(Image::SMALL), 'normal' => $user->getAvatarUrl(Image::NORMAL)], 'created_at' => $user->created_at]; } return Response::json(["artists" => $users, "current_page" => $page, "total_pages" => ceil($count / $perPage)], 200); }
public function delete(User $user, Track $track) { return $user->id === $track->user_id || $user->hasRole('admin'); }
/** * Execute the console command. * * @return void */ public function handle() { pcntl_signal(SIGINT, [$this, 'handleInterrupt']); $mlpmaPath = Config::get('ponyfm.files_directory') . '/mlpma'; $tmpPath = Config::get('ponyfm.files_directory') . '/tmp'; if (!File::exists($tmpPath)) { File::makeDirectory($tmpPath); } $UNKNOWN_GENRE = Genre::firstOrCreate(['name' => 'Unknown', 'slug' => 'unknown']); $this->comment('Enumerating MLP Music Archive source files...'); $files = File::allFiles($mlpmaPath); $this->info(sizeof($files) . ' files found!'); $this->comment('Enumerating artists...'); $artists = File::directories($mlpmaPath); $this->info(sizeof($artists) . ' artists found!'); $this->comment('Importing tracks...'); $totalFiles = sizeof($files); $fileToStartAt = (int) $this->option('startAt') - 1; $this->comment("Skipping {$fileToStartAt} files..." . PHP_EOL); $files = array_slice($files, $fileToStartAt); $this->currentFile = $fileToStartAt; foreach ($files as $file) { $this->currentFile++; pcntl_signal_dispatch(); if ($this->isInterrupted) { break; } $this->comment('[' . $this->currentFile . '/' . $totalFiles . '] Importing track [' . $file->getFilename() . ']...'); if (in_array($file->getExtension(), $this->ignoredExtensions)) { $this->comment('This is not an audio file! Skipping...' . PHP_EOL); continue; } // Has this track already been imported? $importedTrack = DB::table('mlpma_tracks')->where('filename', '=', $file->getFilename())->first(); if ($importedTrack) { $this->comment('This track has already been imported! Skipping...' . PHP_EOL); continue; } //========================================================================================================== // Extract the original tags. //========================================================================================================== $getId3 = new getID3(); // all tags read by getID3, including the cover art $allTags = $getId3->analyze($file->getPathname()); // tags specific to a file format (ID3 or Atom), pre-normalization but with cover art removed $rawTags = []; // normalized tags used by Pony.fm $parsedTags = []; if (Str::lower($file->getExtension()) === 'mp3') { list($parsedTags, $rawTags) = $this->getId3Tags($allTags); } elseif (Str::lower($file->getExtension()) === 'm4a') { list($parsedTags, $rawTags) = $this->getAtomTags($allTags); } elseif (Str::lower($file->getExtension()) === 'ogg') { list($parsedTags, $rawTags) = $this->getVorbisTags($allTags); } elseif (Str::lower($file->getExtension()) === 'flac') { list($parsedTags, $rawTags) = $this->getVorbisTags($allTags); } elseif (Str::lower($file->getExtension()) === 'wav') { list($parsedTags, $rawTags) = $this->getAtomTags($allTags); } //========================================================================================================== // Determine the release date. //========================================================================================================== $modifiedDate = Carbon::createFromTimeStampUTC(File::lastModified($file->getPathname())); $taggedYear = $parsedTags['year']; $this->info('Modification year: ' . $modifiedDate->year); $this->info('Tagged year: ' . $taggedYear); if ($taggedYear !== null && $modifiedDate->year === $taggedYear) { $releasedAt = $modifiedDate; } elseif ($taggedYear !== null && Str::length((string) $taggedYear) !== 4) { $this->error('This track\'s tagged year makes no sense! Using the track\'s last modified date...'); $releasedAt = $modifiedDate; } elseif ($taggedYear !== null && $modifiedDate->year !== $taggedYear) { $this->error('Release years don\'t match! Using the tagged year...'); $releasedAt = Carbon::create($taggedYear); } else { // $taggedYear is null $this->error('This track isn\'t tagged with its release year! Using the track\'s last modified date...'); $releasedAt = $modifiedDate; } // This is later used by the classification/publishing script to determine the publication date. $parsedTags['released_at'] = $releasedAt->toDateTimeString(); //========================================================================================================== // Does this track have vocals? //========================================================================================================== $isVocal = $parsedTags['lyrics'] !== null; //========================================================================================================== // Fill in the title tag if it's missing. //========================================================================================================== if (!$parsedTags['title']) { $parsedTags['title'] = $file->getBasename('.' . $file->getExtension()); } //========================================================================================================== // Determine the genre. //========================================================================================================== $genreName = $parsedTags['genre']; $genreSlug = Str::slug($genreName); $this->info('Genre: ' . $genreName); if ($genreName && $genreSlug !== '') { $genre = Genre::where('name', '=', $genreName)->first(); if ($genre) { $genreId = $genre->id; } else { $genre = new Genre(); $genre->name = $genreName; $genre->slug = $genreSlug; $genre->save(); $genreId = $genre->id; $this->comment('Created a new genre!'); } } else { $genreId = $UNKNOWN_GENRE->id; // "Unknown" genre ID } //========================================================================================================== // Determine which artist account this file belongs to using the containing directory. //========================================================================================================== $this->info('Path to file: ' . $file->getRelativePath()); $path_components = explode(DIRECTORY_SEPARATOR, $file->getRelativePath()); $artist_name = $path_components[0]; $album_name = array_key_exists(1, $path_components) ? $path_components[1] : null; $this->info('Artist: ' . $artist_name); $this->info('Album: ' . $album_name); $artist = User::where('display_name', '=', $artist_name)->first(); if (!$artist) { $artist = new User(); $artist->display_name = $artist_name; $artist->email = null; $artist->is_archived = true; $artist->slug = Str::slug($artist_name); $slugExists = User::where('slug', '=', $artist->slug)->first(); if ($slugExists) { $this->error('Horsefeathers! The slug ' . $artist->slug . ' is already taken!'); $artist->slug = $artist->slug . '-' . Str::random(4); } $artist->save(); } //========================================================================================================== // Extract the cover art, if any exists. //========================================================================================================== $this->comment('Extracting cover art!'); $coverId = null; if (array_key_exists('comments', $allTags) && array_key_exists('picture', $allTags['comments'])) { $image = $allTags['comments']['picture'][0]; if ($image['image_mime'] === 'image/png') { $extension = 'png'; } elseif ($image['image_mime'] === 'image/jpeg') { $extension = 'jpg'; } elseif ($image['image_mime'] === 'image/gif') { $extension = 'gif'; } else { $this->error('Unknown cover art format!'); } // write temporary image file $imageFilename = $file->getFilename() . ".cover.{$extension}"; $imageFilePath = "{$tmpPath}/" . $imageFilename; File::put($imageFilePath, $image['data']); $imageFile = new UploadedFile($imageFilePath, $imageFilename, $image['image_mime']); $cover = Image::upload($imageFile, $artist); $coverId = $cover->id; } else { $this->comment('No cover art found!'); } //========================================================================================================== // Is this part of an album? //========================================================================================================== $albumId = null; $albumName = $parsedTags['album']; if ($albumName !== null) { $album = Album::where('user_id', '=', $artist->id)->where('title', '=', $albumName)->first(); if (!$album) { $album = new Album(); $album->title = $albumName; $album->user_id = $artist->id; $album->cover_id = $coverId; $album->save(); } $albumId = $album->id; } //========================================================================================================== // Save this track. //========================================================================================================== // "Upload" the track to Pony.fm $this->comment('Transcoding the track!'); Auth::loginUsingId($artist->id); $trackFile = new UploadedFile($file->getPathname(), $file->getFilename(), $allTags['mime_type']); Input::instance()->files->add(['track' => $trackFile]); $upload = new UploadTrackCommand(true, true); $result = $upload->execute(); if ($result->didFail()) { $this->error(json_encode($result->getMessages(), JSON_PRETTY_PRINT)); } else { // Save metadata. $track = Track::find($result->getResponse()['id']); $track->title = $parsedTags['title']; $track->cover_id = $coverId; $track->album_id = $albumId; $track->genre_id = $genreId; $track->track_number = $parsedTags['track_number']; $track->released_at = $releasedAt; $track->description = $parsedTags['comments']; $track->is_downloadable = true; $track->lyrics = $parsedTags['lyrics']; $track->is_vocal = $isVocal; $track->license_id = 2; $track->save(); // If we made it to here, the track is intact! Log the import. DB::table('mlpma_tracks')->insert(['track_id' => $result->getResponse()['id'], 'path' => $file->getRelativePath(), 'filename' => $file->getFilename(), 'extension' => $file->getExtension(), 'imported_at' => Carbon::now(), 'parsed_tags' => json_encode($parsedTags), 'raw_tags' => json_encode($rawTags)]); } echo PHP_EOL . PHP_EOL; } }
/** * @param string $username * @param string $displayName * @param string $email * @return User */ public static function findOrCreate(string $username, string $displayName, string $email) { $user = static::where('username', $username)->where('is_archived', false)->first(); if (null !== $user) { return $user; } else { $user = new User(); $user->username = $username; $user->display_name = $displayName; $user->email = $email; $user->uses_gravatar = true; $user->save(); return $user; } }