diff --git a/src/Controller/TorrentController.php b/src/Controller/TorrentController.php index 913180f..f720fdd 100644 --- a/src/Controller/TorrentController.php +++ b/src/Controller/TorrentController.php @@ -44,35 +44,21 @@ class TorrentController extends AbstractController throw $this->createNotFoundException(); } - // Init file - try - { - $file = \Rhilip\Bencode\TorrentFile::load( - $torrentService->getStoragePathById( - $torrent->getId() - ) - ); - } - - catch (ParseException $e) - { - throw $this->createNotFoundException(); - } - - /* - if (!$torrent = $torrentService->getTorrentLocales($request->get('torrentId'))) + // Read file + if (!$file = $torrentService->readTorrentFileById($torrent->getId())) { throw $this->createNotFoundException(); } - */ + // Render template return $this->render('default/torrent/info.html.twig', [ 'torrent' => [ - 'id' => $torrent->getId(), - 'added' => 0, // @TODO - 'locales' => $torrentService->findLastTorrentLocales($torrent->getId()), - 'pages' => [] + 'id' => $torrent->getId(), + 'added' => $torrent->getAdded(), + 'locales' => $torrentService->findLastTorrentLocales($torrent->getId()), + 'sensitive' => $torrentService->findLastTorrentSensitive($torrent->getId()), + 'pages' => [] ], 'file' => [ @@ -93,7 +79,8 @@ class TorrentController extends AbstractController 'v1' => $file->getInfoHashV1(false), 'v2' => $file->getInfoHashV2(false) ], - 'magnet' => $file->getMagnetLink() + // @TODO use download action to filter announcement URL + // 'magnet' => $file->getMagnetLink() ], 'trackers' => explode('|', $this->getParameter('app.trackers')), ]); @@ -369,7 +356,8 @@ class TorrentController extends AbstractController $form['torrent']['error'][] = $translator->trans('Torrent file out of size limit'); } - if (empty($torrentService->getTorrentInfoNameByFilepath($file->getPathName()))) + //// Validate torrent format + if (!$torrentService->readTorrentFileByFilepath($file->getPathName())) { $form['torrent']['error'][] = $translator->trans('Could not parse torrent file'); } diff --git a/src/Service/TorrentService.php b/src/Service/TorrentService.php index 6f1a94c..1f68a3a 100644 --- a/src/Service/TorrentService.php +++ b/src/Service/TorrentService.php @@ -29,39 +29,76 @@ class TorrentService $this->entityManagerInterface = $entityManagerInterface; } - public function getStoragePathById(int $id): string + // Tools + public function readTorrentFileByFilepath( + string $filepath + ): \Rhilip\Bencode\TorrentFile { - return sprintf( - '%s/var/torrents/%s.torrent', - $this->kernelInterface->getProjectDir(), - implode('/', str_split($id)) + return \Rhilip\Bencode\TorrentFile::load( + $filepath + ); + } + + public function readTorrentFileById( + int $id + ): \Rhilip\Bencode\TorrentFile + { + return $this->readTorrentFileByFilepath( + $this->getStorageFilepathById($id) ); } - /* - public function getTorrentKeywordsByFilepath(string $filepath): string + public function generateTorrentKeywordsByTorrentFilepath( + string $filepath, + int $minLength = 3 + ): string { - $data = $this->decodeTorrentByFilepath($filepath); + $keywords = []; - if (!empty($data['info']['name'])) + foreach ($this->readTorrentFileByFilepath($filepath)->getFileList() as $file) { - return mb_strtolower( + $words = explode( + ' ', preg_replace( '/[\s]+/', ' ', preg_replace( '/[\W]+/', ' ', - $data['info']['name'] + $file['path'] ) ) ); + + foreach ($words as $key => $value) + { + if (mb_strlen($value) < $minLength) + { + unset($words[$key]); + } + } + + $keywords = array_merge($keywords, $words); } - return ''; + return mb_strtolower( + implode( + ',', + array_unique($keywords) + ) + ); + } + + public function getStorageFilepathById(int $id): string + { + return sprintf( + '%s/var/torrents/%s.torrent', + $this->kernelInterface->getProjectDir(), + implode('/', str_split($id)) + ); } - */ + // Getters public function getTorrent(int $id): ?Torrent { return $this->entityManagerInterface @@ -69,6 +106,7 @@ class TorrentService ->findOneByIdField($id); } + /// Locales public function getTorrentLocales(int $id): ?TorrentLocales { return $this->entityManagerInterface @@ -90,6 +128,29 @@ class TorrentService ->findTorrentLocales($torrentId); } + /// Sensitive + public function getTorrentSensitive(int $id): ?TorrentSensitive + { + return $this->entityManagerInterface + ->getRepository(TorrentSensitive::class) + ->getTorrentLocales($id); + } + + public function findLastTorrentSensitive(int $torrentId): ?TorrentSensitive + { + return $this->entityManagerInterface + ->getRepository(TorrentSensitive::class) + ->findLastTorrentSensitive($torrentId); + } + + public function findTorrentSensitive(int $torrentId): array + { + return $this->entityManagerInterface + ->getRepository(TorrentSensitive::class) + ->findTorrentSensitive($torrentId); + } + + // Setters public function add( string $filepath, int $userId, @@ -100,14 +161,18 @@ class TorrentService ): ?Torrent { $torrent = $this->addTorrent( - $this->getTorrentInfoNameByFilepath($filepath), - $this->getTorrentKeywordsByFilepath($filepath) + $userId, + $added, + $this->generateTorrentKeywordsByTorrentFilepath( + $filepath + ), + $approved ); $filesystem = new Filesystem(); $filesystem->copy( $filepath, - $this->getStoragePathById( + $this->getStorageFilepathById( $torrent->getId() ) ); @@ -135,14 +200,18 @@ class TorrentService } public function addTorrent( - string $filepath, - string $keywords + int $userId, + int $added, + string $keywords, + bool $approved ): ?Torrent { $torrent = new Torrent(); - $torrent->setFilename($filepath); + $torrent->setUserId($userId); + $torrent->setAdded($added); $torrent->setKeywords($keywords); + $torrent->setApproved($approved); $this->entityManagerInterface->persist($torrent); $this->entityManagerInterface->flush();