public function doGet(Option $q, LoggedIn $me, Option $compilations) { $filter = $q->reject(""); $query = (new SelectQuery(TSongs::_NAME))->where(TSongs::USER_ID, $me->getId())->select(TSongs::A_ARTIST)->select(TSongs::T_ALBUM)->selectAlias("MIN(" . TSongs::C_BIG_ID . ")", TSongs::C_BIG_ID)->selectAlias("MIN(" . TSongs::C_MID_ID . ")", TSongs::C_MID_ID)->selectAlias("MIN(" . TSongs::C_SMALL_ID . ")", TSongs::C_SMALL_ID); if ($compilations->nonEmpty()) { $query->where(TSongs::IS_COMP, $compilations->get()); } Context::contextify($query); if ($filter->nonEmpty()) { $query->where(TSongs::FTS_ALBUM . " @@ plainto_tsquery(?)", [$filter->get()]); } $query->addGroupBy(TSongs::A_ARTIST); $query->addGroupBy(TSongs::T_ALBUM); $query->orderBy(TSongs::T_ALBUM); ob_start("ob_gzhandler"); $query->renderAllAsJson(function ($row) { $artist_encoded = escape_url($row["album_artist"]); $album_encoded = escape_url($row["track_album"]); $row["artist_url"] = "artist/{$artist_encoded}"; $row["album_url"] = "artist/{$artist_encoded}/{$album_encoded}"; return $row; }); }