Revert "Allow searching media inside playlists ("chaining" media search queries)."
This reverts commit b98d1600cc
.
This commit is contained in:
parent
7c9c986b5b
commit
5396aa9a06
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue