Browse Source

implement additional torrent fields index, add indexer configuration #31

main
ghost 1 year ago
parent
commit
c7c5d7340c
  1. 27
      .env
  2. 9
      config/services.yaml
  3. 24
      src/Controller/TorrentController.php
  4. 192
      src/Service/TorrentService.php

27
.env

@ -90,3 +90,30 @@ APP_TORRENT_FILE_SIZE_MAX=1024000
APP_TORRENT_WANTED_FTP_ENABLED=1 APP_TORRENT_WANTED_FTP_ENABLED=1
APP_TORRENT_WANTED_FTP_FOLDER=/yggtracker APP_TORRENT_WANTED_FTP_FOLDER=/yggtracker
APP_TORRENT_WANTED_FTP_APPROVED_ONLY=1 APP_TORRENT_WANTED_FTP_APPROVED_ONLY=1
# Enable search index for torrent name
APP_INDEX_TORRENT_NAME=1
# Enable search index for torrent info hash v1
APP_INDEX_TORRENT_HASH_V1=1
# Enable search index for torrent info hash v2
APP_INDEX_TORRENT_HASH_V2=1
# Enable search index for torrent filenames
APP_INDEX_TORRENT_FILENAMES=1
# Enable search index for torrent source
APP_INDEX_TORRENT_SOURCE=1
# Enable search index for torrent comment
APP_INDEX_TORRENT_COMMENT=1
# Enable search index for words length greater than N chars
APP_INDEX_WORD_LENGTH_MIN=3
# Enable search index for words length not greater than N chars
APP_INDEX_WORD_LENGTH_MAX=255
# Enable search index transliteration @TODO
APP_INDEX_TRANSLITERATION=1

9
config/services.yaml

@ -21,6 +21,15 @@ parameters:
app.torrent.wanted.ftp.enabled: '%env(APP_TORRENT_WANTED_FTP_ENABLED)%' app.torrent.wanted.ftp.enabled: '%env(APP_TORRENT_WANTED_FTP_ENABLED)%'
app.torrent.wanted.ftp.folder: '%env(APP_TORRENT_WANTED_FTP_FOLDER)%' app.torrent.wanted.ftp.folder: '%env(APP_TORRENT_WANTED_FTP_FOLDER)%'
app.torrent.wanted.ftp.approved: '%env(APP_TORRENT_WANTED_FTP_APPROVED_ONLY)%' app.torrent.wanted.ftp.approved: '%env(APP_TORRENT_WANTED_FTP_APPROVED_ONLY)%'
app.index.torrent.name: '%env(APP_INDEX_TORRENT_NAME)%'
app.index.torrent.filenames: '%env(APP_INDEX_TORRENT_FILENAMES)%'
app.index.torrent.hash.v1: '%env(APP_INDEX_TORRENT_HASH_V1)%'
app.index.torrent.hash.v2: '%env(APP_INDEX_TORRENT_HASH_V2)%'
app.index.torrent.source: '%env(APP_INDEX_TORRENT_SOURCE)%'
app.index.torrent.comment: '%env(APP_INDEX_TORRENT_COMMENT)%'
app.index.word.length.min: '%env(APP_INDEX_WORD_LENGTH_MIN)%'
app.index.word.length.max: '%env(APP_INDEX_WORD_LENGTH_MAX)%'
app.index.transliteration: '%env(APP_INDEX_TRANSLITERATION)%'
services: services:
# default configuration for services in *this* file # default configuration for services in *this* file

24
src/Controller/TorrentController.php

@ -880,7 +880,19 @@ class TorrentController extends AbstractController
{ {
// Save data // Save data
$torrent = $torrentService->add( $torrent = $torrentService->add(
$file->getPathName(), $file->getPathName(),
(bool) $this->getParameter('app.index.torrent.name'),
(bool) $this->getParameter('app.index.torrent.filenames'),
(bool) $this->getParameter('app.index.torrent.hash.v1'),
(bool) $this->getParameter('app.index.torrent.hash.v2'),
(bool) $this->getParameter('app.index.torrent.source'),
(bool) $this->getParameter('app.index.torrent.comment'),
(bool) $this->getParameter('app.index.transliteration'),
(int) $this->getParameter('app.index.word.length.min'),
(int) $this->getParameter('app.index.word.length.max'),
$user->getId(), $user->getId(),
time(), time(),
(array) $locales, (array) $locales,
@ -2440,7 +2452,17 @@ class TorrentController extends AbstractController
): Response ): Response
{ {
// Reindex keywords // Reindex keywords
$torrentService->reindexTorrentKeywordsAll(); $torrentService->reindexTorrentKeywordsAll(
(bool) $this->getParameter('app.index.torrent.name'),
(bool) $this->getParameter('app.index.torrent.filenames'),
(bool) $this->getParameter('app.index.torrent.hash.v1'),
(bool) $this->getParameter('app.index.torrent.hash.v2'),
(bool) $this->getParameter('app.index.torrent.source'),
(bool) $this->getParameter('app.index.torrent.comment'),
(bool) $this->getParameter('app.index.transliteration'),
(int) $this->getParameter('app.index.word.length.min'),
(int) $this->getParameter('app.index.word.length.max')
);
// Render response // Render response
return new Response(); // @TODO return new Response(); // @TODO

192
src/Service/TorrentService.php

@ -62,16 +62,12 @@ class TorrentService
); );
} }
public function generateTorrentKeywordsByTorrentFilepath( public function generateTorrentKeywordsByString(
string $filepath, string $string,
int $minLength = 3 bool $transliteration,
int $wordLengthMin,
int $wordLengthMax,
): array ): array
{
$keywords = [];
if ($file = $this->readTorrentFileByFilepath($filepath))
{
foreach ($file->getFileList() as $list)
{ {
$words = explode( $words = explode(
' ', ' ',
@ -81,44 +77,152 @@ class TorrentService
preg_replace( preg_replace(
'/[\W_]+/u', '/[\W_]+/u',
' ', ' ',
$list['path'] $string
) )
) )
); );
foreach ($words as $key => $value) // Apply words filter
foreach ((array) $words as $key => $value)
{ {
if (mb_strlen($value) < $minLength) // Apply word length filter
$length = mb_strlen($value);
if ($length < $wordLengthMin || $length > $wordLengthMax)
{ {
unset($words[$key]); unset($words[$key]);
} }
else else
{ {
// Apply case insensitive search conversion
$words[$key] = mb_strtolower($value); $words[$key] = mb_strtolower($value);
if ($transliteration)
{
// @TODO
}
} }
} }
if ($hash = $file->getInfoHashV1(false)) // Build simple array
$keywords = [];
foreach ((array) $words as $word)
{ {
$keywords[] = $hash; $keywords[] = $word;
} }
if ($hash = $file->getInfoHashV2(false)) // Return unique keywords
{ return array_unique(
$keywords[] = $hash; $keywords
);
} }
public function generateTorrentKeywordsByTorrentFilepath(
string $filepath,
bool $extractName,
bool $extractFilenames,
bool $extractInfoHashV1,
bool $extractInfoHashV2,
bool $extractSource,
bool $extractComment,
bool $wordTransliteration,
int $wordLengthMin,
int $wordLengthMax
): array
{
$keywords = [];
if ($file = $this->readTorrentFileByFilepath($filepath))
{
if ($extractName)
{
if ($name = $file->getName(false)) if ($name = $file->getName(false))
{ {
$keywords[] = $name; $keywords = array_merge(
$keywords,
$this->generateTorrentKeywordsByString(
$name,
$wordTransliteration,
$wordLengthMin,
$wordLengthMax
)
);
}
}
if ($extractFilenames)
{
foreach ($file->getFileList() as $list)
{
$keywords = array_merge(
$keywords,
$this->generateTorrentKeywordsByString(
$list['path'],
$wordTransliteration,
$wordLengthMin,
$wordLengthMax
)
);
}
}
if ($extractSource)
{
if ($source = $file->getSource(false))
{
$keywords = array_merge(
$keywords,
$this->generateTorrentKeywordsByString(
$source,
$wordTransliteration,
$wordLengthMin,
$wordLengthMax
)
);
}
}
if ($extractComment)
{
if ($comment = $file->getComment(false))
{
$keywords = array_merge(
$keywords,
$this->generateTorrentKeywordsByString(
$comment,
$wordTransliteration,
$wordLengthMin,
$wordLengthMax
)
);
}
}
if ($extractInfoHashV1)
{
if ($hash = $file->getInfoHashV1(false))
{
$keywords[] = $hash;
}
} }
$keywords = array_merge($keywords, $words); if ($extractInfoHashV2)
{
if ($hash = $file->getInfoHashV2(false))
{
$keywords[] = $hash;
}
} }
} }
return array_unique($keywords); return array_unique(
$keywords
);
} }
public function getStorageFilepathByTorrentId(int $torrentId): string public function getStorageFilepathByTorrentId(int $torrentId): string
@ -187,13 +291,27 @@ class TorrentService
} }
public function add( public function add(
string $filepath, string $filepath,
bool $extractName,
bool $extractFilenames,
bool $extractInfoHashV1,
bool $extractInfoHashV2,
bool $extractSource,
bool $extractComment,
bool $wordTransliteration,
int $wordLengthMin,
int $wordLengthMax,
int $userId, int $userId,
int $added, int $added,
array $locales, array $locales,
bool $sensitive, bool $sensitive,
bool $approved, bool $approved,
bool $status bool $status
): ?Torrent ): ?Torrent
{ {
$torrent = $this->addTorrent( $torrent = $this->addTorrent(
@ -201,7 +319,16 @@ class TorrentService
$added, $added,
md5_file($filepath), md5_file($filepath),
$this->generateTorrentKeywordsByTorrentFilepath( $this->generateTorrentKeywordsByTorrentFilepath(
$filepath $filepath,
$extractName,
$extractFilenames,
$extractInfoHashV1,
$extractInfoHashV2,
$extractSource,
$extractComment,
$wordTransliteration,
$wordLengthMin,
$wordLengthMax
), ),
$locales, $locales,
$sensitive, $sensitive,
@ -489,7 +616,17 @@ class TorrentService
} }
} }
public function reindexTorrentKeywordsAll(): void public function reindexTorrentKeywordsAll(
bool $extractName,
bool $extractFilenames,
bool $extractInfoHashV1,
bool $extractInfoHashV2,
bool $extractSource,
bool $extractComment,
bool $wordTransliteration,
int $wordLengthMin,
int $wordLengthMax
): void
{ {
foreach ($this->entityManagerInterface foreach ($this->entityManagerInterface
->getRepository(Torrent::class) ->getRepository(Torrent::class)
@ -499,7 +636,16 @@ class TorrentService
$this->generateTorrentKeywordsByTorrentFilepath( $this->generateTorrentKeywordsByTorrentFilepath(
$this->getStorageFilepathByTorrentId( $this->getStorageFilepathByTorrentId(
$torrent->getId() $torrent->getId()
) ),
$extractName,
$extractFilenames,
$extractInfoHashV1,
$extractInfoHashV2,
$extractSource,
$extractComment,
$wordTransliteration,
$wordLengthMin,
$wordLengthMax
) )
); );

Loading…
Cancel
Save