Revert "Allow searching media inside playlists ("chaining" media search queries)."

This reverts commit b98d1600cc.
This commit is contained in:
Buster Neece 2023-02-02 13:07:14 -06:00
parent 7c9c986b5b
commit 5396aa9a06
No known key found for this signature in database
GPG Key ID: F1D2E64A0005E80E
1 changed files with 39 additions and 45 deletions

View File

@ -130,34 +130,29 @@ final class ListAction
$mediaQueryBuilder->andWhere( $mediaQueryBuilder->andWhere(
'sm.id NOT IN (SELECT spm2.media_id FROM App\Entity\StationPlaylistMedia spm2)' 'sm.id NOT IN (SELECT spm2.media_id FROM App\Entity\StationPlaylistMedia spm2)'
); );
} else { } elseif (str_starts_with($searchPhrase, 'playlist:')) {
if (str_contains($searchPhrase, 'playlist:')) { [, $playlistName] = explode(':', $searchPhrase, 2);
preg_match('/playlist:(\w*)/', $searchPhrase, $matches, PREG_UNMATCHED_AS_NULL);
if ($matches[1]) { $playlist = $this->em->getRepository(Entity\StationPlaylist::class)
$playlist = $this->em->getRepository(Entity\StationPlaylist::class) ->findOneBy(
->findOneBy( [
[ 'station' => $station,
'station' => $station, 'name' => $playlistName,
'name' => $matches[1], ]
] );
);
if ($playlist instanceof Entity\StationPlaylist) { if (!$playlist instanceof Entity\StationPlaylist) {
$mediaQueryBuilder->andWhere( return $response->withStatus(400)
'sm.id IN (SELECT spm2.media_id FROM App\Entity\StationPlaylistMedia spm2 ' ->withJson(new Entity\Api\Error(400, 'Playlist not found.'));
. 'WHERE spm2.playlist = :playlist)'
)->setParameter('playlist', $playlist);
}
$searchPhrase = trim(str_replace($matches[0] ?? '', '', $searchPhrase));
}
} }
if (!in_array($searchPhrase, ['*', '%'], true)) { $mediaQueryBuilder->andWhere(
$mediaQueryBuilder->andWhere('(sm.title LIKE :query OR sm.artist LIKE :query)') 'sm.id IN (SELECT spm2.media_id FROM App\Entity\StationPlaylistMedia spm2 '
->setParameter('query', '%' . $searchPhrase . '%'); . 'WHERE spm2.playlist = :playlist)'
} )->setParameter('playlist', $playlist);
} elseif (!in_array($searchPhrase, ['*', '%'], true)) {
$mediaQueryBuilder->andWhere('(sm.title LIKE :query OR sm.artist LIKE :query)')
->setParameter('query', '%' . $searchPhrase . '%');
} }
$mediaQuery = $mediaQueryBuilder->getQuery(); $mediaQuery = $mediaQueryBuilder->getQuery();
@ -251,7 +246,7 @@ final class ListAction
$unprocessableMedia[$unprocessableRow['path']] = $unprocessableRow['error']; $unprocessableMedia[$unprocessableRow['path']] = $unprocessableRow['error'];
} }
if ($isSearch) { if (!empty($searchPhrase)) {
if ('special:unprocessable' === $searchPhrase) { if ('special:unprocessable' === $searchPhrase) {
$files = array_keys($unprocessableMedia); $files = array_keys($unprocessableMedia);
} else { } else {
@ -289,7 +284,7 @@ final class ListAction
$row->size = ($row->is_dir) ? 0 : $fs->fileSize($row->path); $row->size = ($row->is_dir) ? 0 : $fs->fileSize($row->path);
$shortname = ($isSearch) $shortname = (!empty($searchPhrase))
? $row->path ? $row->path
: basename($row->path); : basename($row->path);
@ -330,27 +325,21 @@ final class ListAction
} }
// Apply sorting // Apply sorting
if ('special:duplicates' === $searchPhrase) { [$sort, $sortOrder] = $this->getSortFromRequest($request);
usort(
$result,
static fn(Entity\Api\FileList $a, Entity\Api\FileList $b) => $a->media->id <=> $b->media->id
);
} else {
[$sort, $sortOrder] = $this->getSortFromRequest($request);
$propertyAccessor = self::getPropertyAccessor(); $propertyAccessor = self::getPropertyAccessor();
usort( usort(
$result, $result,
static fn(Entity\Api\FileList $a, Entity\Api\FileList $b) => self::sortRows( static fn(Entity\Api\FileList $a, Entity\Api\FileList $b) => self::sortRows(
$a, $a,
$b, $b,
$propertyAccessor, $propertyAccessor,
$sort, $searchPhrase,
$sortOrder $sort,
) $sortOrder
); )
} );
$paginator = Paginator::fromArray($result, $request); $paginator = Paginator::fromArray($result, $request);
@ -368,9 +357,14 @@ final class ListAction
Entity\Api\FileList $a, Entity\Api\FileList $a,
Entity\Api\FileList $b, Entity\Api\FileList $b,
PropertyAccessorInterface $propertyAccessor, PropertyAccessorInterface $propertyAccessor,
?string $searchPhrase = null,
?string $sort = null, ?string $sort = null,
string $sortOrder = Criteria::ASC string $sortOrder = Criteria::ASC
): int { ): int {
if ('special:duplicates' === $searchPhrase) {
return $a->media->id <=> $b->media->id;
}
$isDirComp = $b->is_dir <=> $a->is_dir; $isDirComp = $b->is_dir <=> $a->is_dir;
if (0 !== $isDirComp) { if (0 !== $isDirComp) {
return $isDirComp; return $isDirComp;