{ * [ArtistType] => { * id, name, aliasid * } * } * ArtistType is an int. It can be: * 1 => Main artist * 2 => Guest artist * 4 => Composer * 5 => Conductor * 6 => DJ */ public static function get_artists($GroupIDs) { $Results = array(); $DBs = array(); foreach ($GroupIDs as $GroupID) { if (!is_number($GroupID)) { continue; } $Artists = G::$Cache->get_value('groups_artists_'.$GroupID); if (is_array($Artists)) { $Results[$GroupID] = $Artists; } else { $DBs[] = $GroupID; } } if (count($DBs) > 0) { $IDs = implode(',', $DBs); if (empty($IDs)) { $IDs = "null"; } $QueryID = G::$DB->get_query_id(); G::$DB->query(" SELECT ta.GroupID, ta.ArtistID, ag.Name FROM torrents_artists AS ta JOIN artists_group AS ag ON ta.ArtistID = ag.ArtistID WHERE ta.GroupID IN ($IDs) ORDER BY ta.GroupID ASC, ag.Name ASC;"); while (list($GroupID, $ArtistID, $ArtistName) = G::$DB->next_record(MYSQLI_BOTH, false)) { $Results[$GroupID][] = array('id' => $ArtistID, 'name' => $ArtistName); $New[$GroupID][] = array('id' => $ArtistID, 'name' => $ArtistName); } G::$DB->set_query_id($QueryID); foreach ($DBs as $GroupID) { if (isset($New[$GroupID])) { G::$Cache->cache_value('groups_artists_'.$GroupID, $New[$GroupID]); } else { G::$Cache->cache_value('groups_artists_'.$GroupID, array()); } } $Missing = array_diff($GroupIDs, array_keys($Results)); if (!empty($Missing)) { $Results += array_fill_keys($Missing, array()); } } return $Results; } /** * Convenience function for get_artists, when you just need one group. * * @param int $GroupID * @return array - see get_artists */ public static function get_artist($GroupID) { $Results = Artists::get_artists(array($GroupID)); return $Results[$GroupID]; } /** * Format an array of artists for display. * TODO: Revisit the logic of this, see if we can helper-function the copypasta. * * @param array Artists an array of the form output by get_artists * @param boolean $MakeLink if true, the artists will be links, if false, they will be text. * @param boolean $IncludeHyphen if true, appends " - " to the end. * @param $Escape if true, output will be escaped. Think carefully before setting it false. */ public static function display_artists($Artists, $MakeLink = true, $IncludeHyphen = true, $Escape = true) { if (!empty($Artists)) { $ampersand = ($Escape) ? ' & ' : ' & '; $link = ''; switch(count($Artists)) { case 0: break; case 3: $link .= Artists::display_artist($Artists[2], $MakeLink, $Escape). ", "; case 2: $link .= Artists::display_artist($Artists[1], $MakeLink, $Escape). ", "; case 1: $link .= Artists::display_artist($Artists[0], $MakeLink, $Escape).($IncludeHyphen?' – ':''); break; default: $link = "Various".($IncludeHyphen?' – ':''); } return $link; } else { return ''; } } /** * Formats a single artist name. * * @param array $Artist an array of the form ('id'=>ID, 'name'=>Name) * @param boolean $MakeLink If true, links to the artist page. * @param boolean $Escape If false and $MakeLink is false, returns the unescaped, unadorned artist name. * @return string Formatted artist name. */ public static function display_artist($Artist, $MakeLink = true, $Escape = true) { if ($MakeLink && !$Escape) { error('Invalid parameters to Artists::display_artist()'); } elseif ($MakeLink) { return ''.display_str($Artist['name']).''; } elseif ($Escape) { return display_str($Artist['name']); } else { return $Artist['name']; } } /** * Deletes an artist and their requests, wiki, and tags. * Does NOT delete their torrents. * * @param int $ArtistID */ public static function delete_artist($ArtistID) { $QueryID = G::$DB->get_query_id(); G::$DB->query(" SELECT Name FROM artists_group WHERE ArtistID = ".$ArtistID); list($Name) = G::$DB->next_record(MYSQLI_NUM, false); // Delete requests G::$DB->query(" SELECT RequestID FROM requests_artists WHERE ArtistID = $ArtistID AND ArtistID != 0"); $Requests = G::$DB->to_array(); foreach ($Requests AS $Request) { list($RequestID) = $Request; G::$DB->query('DELETE FROM requests WHERE ID='.$RequestID); G::$DB->query('DELETE FROM requests_votes WHERE RequestID='.$RequestID); G::$DB->query('DELETE FROM requests_tags WHERE RequestID='.$RequestID); G::$DB->query('DELETE FROM requests_artists WHERE RequestID='.$RequestID); } // Delete artist G::$DB->query('DELETE FROM artists_group WHERE ArtistID='.$ArtistID); G::$Cache->decrement('stats_artist_count'); // Delete wiki revisions G::$DB->query('DELETE FROM wiki_artists WHERE PageID='.$ArtistID); // Delete tags G::$DB->query('DELETE FROM artists_tags WHERE ArtistID='.$ArtistID); // Delete artist comments, subscriptions and quote notifications Comments::delete_page('artist', $ArtistID); G::$Cache->delete_value('artist_'.$ArtistID); G::$Cache->delete_value('artist_groups_'.$ArtistID); // Record in log if (!empty(G::$LoggedUser['Username'])) { $Username = G::$LoggedUser['Username']; } else { $Username = 'System'; } Misc::write_log("Artist $ArtistID ($Name) was deleted by $Username"); G::$DB->set_query_id($QueryID); } /** * Remove LRM (left-right-marker) and trims, because people copypaste carelessly. * If we don't do this, we get seemingly duplicate artist names. * TODO: make stricter, e.g. on all whitespace characters or Unicode normalisation * * @param string $ArtistName */ public static function normalise_artist_name($ArtistName) { // \u200e is ‎ $ArtistName = trim($ArtistName); $ArtistName = preg_replace('/^(\xE2\x80\x8E)+/', '', $ArtistName); $ArtistName = preg_replace('/(\xE2\x80\x8E)+$/', '', $ArtistName); return trim(preg_replace('/ +/', ' ', $ArtistName)); } } ?>