From 6d0b42a88bfde2ef2a6a51a97890b5184c56c525 Mon Sep 17 00:00:00 2001 From: ghost Date: Mon, 4 Sep 2023 02:48:24 +0300 Subject: [PATCH] add info hash v2 support --- composer.json | 2 +- database/yggtracker.mwb | Bin 28206 -> 29822 bytes example/environment/sphinx.conf | 4 + src/crontab/scrape.php | 10 +- src/library/database.php | 109 ++++++++------ src/public/action.php | 250 +++++++++++++++++++------------- src/public/edit.php | 154 +++++++++++++++++--- 7 files changed, 355 insertions(+), 174 deletions(-) diff --git a/composer.json b/composer.json index bd66f90..78806a4 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "type": "library", "require": { "php": "^8.1", - "yggverse/parser": ">=0.2.0", + "yggverse/parser": ">=0.3.0", "jdenticon/jdenticon": "^1.0" }, "license": "MIT", diff --git a/database/yggtracker.mwb b/database/yggtracker.mwb index 766ad8c9dd01dd7c55d96a95598bed25b79f00bb..a18577ba3ec97000db96054e6b20d3a7fe4795f2 100644 GIT binary patch literal 29822 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 literal 28206 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 AP5=M^ diff --git a/example/environment/sphinx.conf b/example/environment/sphinx.conf index 857165e..90c4d69 100644 --- a/example/environment/sphinx.conf +++ b/example/environment/sphinx.conf @@ -19,6 +19,10 @@ source magnet : yggtracker `magnet`.`metaDescription`, \ `magnet`.`description`, \ `magnet`.`dn`, \ + (SELECT GROUP_CONCAT(DISTINCT `infoHash`.`value`) \ + FROM `infoHash` \ + JOIN `magnetToInfoHash` ON (`magnetToInfoHash`.`magnetId` = `magnet`.`magnetId`) \ + WHERE `infoHash`.`infoHashId` = `magnetToInfoHash`.`infoHashId`) AS `infoHash`, \ (SELECT GROUP_CONCAT(DISTINCT `keywordTopic`.`value`) \ FROM `keywordTopic` \ JOIN `magnetToKeywordTopic` ON (`magnetToKeywordTopic`.`magnetId` = `magnet`.`magnetId`) \ diff --git a/src/crontab/scrape.php b/src/crontab/scrape.php index 14b9bda..db91f60 100644 --- a/src/crontab/scrape.php +++ b/src/crontab/scrape.php @@ -57,6 +57,12 @@ try { foreach ($db->getMagnetToAddressTrackerScrapeQueue(CRAWLER_SCRAPE_QUEUE_LIMIT) as $queue) { + $hash = []; + foreach ($db->findMagnetToInfoHashByMagnetId($queue->magnetId) as $result) + { + $hash[] = $db->getInfoHash($result->infoHashId)->value; + } + if ($addressTracker = $db->getAddressTracker($queue->addressTrackerId)) { // Build url @@ -72,9 +78,7 @@ try { $host->value, $uri->value); - $hash = str_replace('urn:btih:', false, $db->getMagnet($queue->magnetId)->xt); - - if ($scrape = $scraper->scrape([$hash], [$url], null, 1)) + if ($scrape = $scraper->scrape($hash, [$url], null, 1)) { $db->updateMagnetToAddressTrackerTimeOffline( $queue->magnetToAddressTrackerId, diff --git a/src/library/database.php b/src/library/database.php index 8196850..0d605df 100644 --- a/src/library/database.php +++ b/src/library/database.php @@ -248,6 +248,50 @@ class Database { return $this->addUri($value); } + // Info Hash + public function addInfoHash(mixed $value, int $version) : int { + + $this->_debug->query->insert->total++; + + $query = $this->_db->prepare('INSERT INTO `infoHash` SET `value` = ?, `version` = ?'); + + $query->execute([$value, $version]); + + return $this->_db->lastInsertId(); + } + + public function getInfoHash(int $infoHashId) { + + $this->_debug->query->select->total++; + + $query = $this->_db->prepare('SELECT * FROM `infoHash` WHERE `infoHashId` = ?'); + + $query->execute([$infoHashId]); + + return $query->fetch(); + } + + public function findInfoHash(string $value, int $version) { + + $this->_debug->query->select->total++; + + $query = $this->_db->prepare('SELECT * FROM `infoHash` WHERE `value` = ? AND `version` = ?'); + + $query->execute([$value, $version]); + + return $query->fetch(); + } + + public function initInfoHashId(mixed $value, int $version) : int { + + if ($result = $this->findInfoHash($value, $version)) { + + return $result->infoHashId; + } + + return $this->addInfoHash($value, $version); + } + // Address Tracker public function addAddressTracker(int $schemeId, int $hostId, mixed $portId, mixed $uriId) : int { @@ -495,7 +539,6 @@ class Database { // Magnet public function addMagnet(int $userId, - string $xt, int $xl, string $dn, string $linkSource, @@ -508,7 +551,6 @@ class Database { $this->_debug->query->insert->total++; $query = $this->_db->prepare('INSERT INTO `magnet` SET `userId` = ?, - `xt` = ?, `xl` = ?, `dn` = ?, `linkSource` = ?, @@ -521,7 +563,6 @@ class Database { $query->execute( [ $userId, - $xt, $xl, $dn, $linkSource, @@ -569,45 +610,6 @@ class Database { return $query->fetch()->result; } - public function findMagnet(int $userId, string $xt) { - - $this->_debug->query->select->total++; - - $query = $this->_db->prepare('SELECT * FROM `magnet` WHERE `userId` = ? AND `xt` = ?'); - - $query->execute([$userId, $xt]); - - return $query->fetch(); - } - - public function initMagnetId( int $userId, - string $xt, - int $xl, - string $dn, - string $linkSource, - bool $public, - bool $comments, - bool $sensitive, - bool $approved, - int $timeAdded) : int { - - if ($result = $this->findMagnet($userId, $xt)) { - - return $result->magnetId; - } - - return $this->addMagnet($userId, - $xt, - $xl, - $dn, - $linkSource, - $public, - $comments, - $sensitive, - $approved, - $timeAdded); - } - public function updateMagnetDn(int $magnetId, string $dn, int $timeUpdated) : int { $this->_debug->query->update->total++; @@ -696,6 +698,29 @@ class Database { return $query->rowCount(); } + // Magnet to Info Hash + public function addMagnetToInfoHash(int $magnetId, int $infoHashId) : int { + + $this->_debug->query->insert->total++; + + $query = $this->_db->prepare('INSERT INTO `magnetToInfoHash` SET `magnetId` = ?, `infoHashId` = ?'); + + $query->execute([$magnetId, $infoHashId]); + + return $this->_db->lastInsertId(); + } + + public function findMagnetToInfoHashByMagnetId(int $magnetId) + { + $this->_debug->query->select->total++; + + $query = $this->_db->prepare('SELECT * FROM `magnetToInfoHash` WHERE `magnetId` = ?'); + + $query->execute([$magnetId]); + + return $query->fetchAll(); + } + // Magnet to AddressTracker public function addMagnetToAddressTracker(int $magnetId, int $addressTrackerId) : int { diff --git a/src/public/action.php b/src/public/action.php index c852ac7..fb4d493 100644 --- a/src/public/action.php +++ b/src/public/action.php @@ -431,7 +431,30 @@ switch (isset($_GET['target']) ? urldecode($_GET['target']) : false) $link = []; /// Exact Topic - $link[] = sprintf('magnet:?xt=%s', $magnet->xt); + $xt = []; + + foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result) + { + if ($infoHash = $db->getInfoHash($result->infoHashId)) + { + switch ($infoHash->version) + { + case 1: + + $xt[] = sprintf('xt=urn:btih:%s', $infoHash->value); + + break; + + case 2: + + $xt[] = sprintf('xt=urn:btmh:%s', $infoHash->value); + + break; + } + } + } + + $link[] = sprintf('magnet:?%s', implode('&', $xt)); /// Display Name $link[] = sprintf('dn=%s', urlencode($magnet->dn)); @@ -591,118 +614,137 @@ switch (isset($_GET['target']) ? urldecode($_GET['target']) : false) $db->beginTransaction(); // Init magnet - if (Yggverse\Parser\Urn::parse($magnet->xt)) + if ($magnetId = $db->addMagnet( $user->userId, + $magnet->xl, + $magnet->dn, + $link, + MAGNET_DEFAULT_PUBLIC, + MAGNET_DEFAULT_COMMENTS, + MAGNET_DEFAULT_SENSITIVE, + $user->approved ? true : MAGNET_DEFAULT_APPROVED, + time())) { - if ($magnetId = $db->initMagnetId($user->userId, - strip_tags($magnet->xt), - strip_tags($magnet->xl), - strip_tags($magnet->dn), - $link, - MAGNET_DEFAULT_PUBLIC, - MAGNET_DEFAULT_COMMENTS, - MAGNET_DEFAULT_SENSITIVE, - $user->approved ? true : MAGNET_DEFAULT_APPROVED, - time())) + foreach ($magnet as $key => $value) { - foreach ($magnet as $key => $value) + switch ($key) { - switch ($key) - { - case 'tr': - foreach ($value as $tr) + case 'xt': + foreach ($value as $xt) + { + if (Yggverse\Parser\Magnet::isXTv1($xt)) { - if ($url = Yggverse\Parser\Url::parse($tr)) - { - if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name))) - { - $db->initMagnetToAddressTrackerId( - $magnetId, - $db->initAddressTrackerId( - $db->initSchemeId($url->host->scheme), - $db->initHostId($url->host->name), - $db->initPortId($url->host->port), - $db->initUriId($url->page->uri) - ) - ); - } - } - } - break; - case 'ws': - foreach ($value as $ws) - { - // @TODO - } - break; - case 'as': - foreach ($value as $as) - { - if ($url = Yggverse\Parser\Url::parse($as)) - { - if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name))) - { - $db->initMagnetToAcceptableSourceId( - $magnetId, - $db->initAcceptableSourceId( - $db->initSchemeId($url->host->scheme), - $db->initHostId($url->host->name), - $db->initPortId($url->host->port), - $db->initUriId($url->page->uri) - ) - ); - } - } - } - break; - case 'xs': - foreach ($value as $xs) - { - if ($url = Yggverse\Parser\Url::parse($xs)) - { - if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name))) - { - $db->initMagnetToExactSourceId( - $magnetId, - $db->initExactSourceId( - $db->initSchemeId($url->host->scheme), - $db->initHostId($url->host->name), - $db->initPortId($url->host->port), - $db->initUriId($url->page->uri) - ) - ); - } - } - } - break; - case 'mt': - foreach ($value as $mt) - { - // @TODO - } - break; - case 'x.pe': - foreach ($value as $xPe) - { - // @TODO - } - break; - case 'kt': - foreach ($value as $kt) - { - $db->initMagnetToKeywordTopicId( + $db->addMagnetToInfoHash( $magnetId, - $db->initKeywordTopicId(trim(mb_strtolower(strip_tags(html_entity_decode($kt))))) + $db->initInfoHashId( + Yggverse\Parser\Magnet::filterInfoHash($xt), 1 + ) ); } - break; - } + if (Yggverse\Parser\Magnet::isXTv2($xt)) + { + $db->addMagnetToInfoHash( + $magnetId, + $db->initInfoHashId( + Yggverse\Parser\Magnet::filterInfoHash($xt), 2 + ) + ); + } + } + break; + case 'tr': + foreach ($value as $tr) + { + if ($url = Yggverse\Parser\Url::parse($tr)) + { + if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name))) + { + $db->initMagnetToAddressTrackerId( + $magnetId, + $db->initAddressTrackerId( + $db->initSchemeId($url->host->scheme), + $db->initHostId($url->host->name), + $db->initPortId($url->host->port), + $db->initUriId($url->page->uri) + ) + ); + } + } + } + break; + case 'ws': + foreach ($value as $ws) + { + // @TODO + } + break; + case 'as': + foreach ($value as $as) + { + if ($url = Yggverse\Parser\Url::parse($as)) + { + if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name))) + { + $db->initMagnetToAcceptableSourceId( + $magnetId, + $db->initAcceptableSourceId( + $db->initSchemeId($url->host->scheme), + $db->initHostId($url->host->name), + $db->initPortId($url->host->port), + $db->initUriId($url->page->uri) + ) + ); + } + } + } + break; + case 'xs': + foreach ($value as $xs) + { + if ($url = Yggverse\Parser\Url::parse($xs)) + { + if (preg_match(YGGDRASIL_URL_REGEX, str_replace(['[',']'], false, $url->host->name))) + { + $db->initMagnetToExactSourceId( + $magnetId, + $db->initExactSourceId( + $db->initSchemeId($url->host->scheme), + $db->initHostId($url->host->name), + $db->initPortId($url->host->port), + $db->initUriId($url->page->uri) + ) + ); + } + } + } + break; + case 'mt': + foreach ($value as $mt) + { + // @TODO + } + break; + case 'x.pe': + foreach ($value as $xPe) + { + // @TODO + } + break; + case 'kt': + foreach ($value as $kt) + { + $db->initMagnetToKeywordTopicId( + $magnetId, + $db->initKeywordTopicId(trim(mb_strtolower(strip_tags(html_entity_decode($kt))))) + ); + } + break; } - - $db->commit(); - - // Redirect to edit page - header(sprintf('Location: %s/edit.php?magnetId=%s', trim(WEBSITE_URL, '/'), $magnetId)); } + + $db->commit(); + + // Redirect to edit page + header(sprintf('Location: %s/edit.php?magnetId=%s', trim(WEBSITE_URL, '/'), $magnetId)); } } catch (Exception $e) { diff --git a/src/public/edit.php b/src/public/edit.php index a960652..48c1824 100644 --- a/src/public/edit.php +++ b/src/public/edit.php @@ -51,15 +51,6 @@ $response = (object) 'message' => false, ] ], - 'xt' => (object) - [ - 'value' => false, - 'valid' => (object) - [ - 'success' => true, - 'message' => false, - ] - ], 'dn' => (object) [ 'value' => false, @@ -69,9 +60,18 @@ $response = (object) 'message' => false, ] ], + 'xt' => (object) + [ + 'value' => [], + 'valid' => (object) + [ + 'success' => true, + 'message' => false, + ] + ], 'kt' => (object) [ - 'value' => false, + 'value' => [], 'valid' => (object) [ 'success' => true, @@ -80,7 +80,7 @@ $response = (object) ], 'tr' => (object) [ - 'value' => false, + 'value' => [], 'valid' => (object) [ 'success' => true, @@ -89,7 +89,7 @@ $response = (object) ], 'as' => (object) [ - 'value' => false, + 'value' => [], 'valid' => (object) [ 'success' => true, @@ -98,7 +98,7 @@ $response = (object) ], 'xs' => (object) [ - 'value' => false, + 'value' => [], 'valid' => (object) [ 'success' => true, @@ -267,6 +267,76 @@ else { $db->updateMagnetDn($magnet->magnetId, trim(strip_tags(html_entity_decode($_POST['dn']))), time()); } + // Exact Topic + if (isset($_POST['xt'])) + { + foreach ((array) $_POST['xt'] as $version => $value) + { + switch ($version) + { + case 1: + + if (!empty($value)) + { + $exist = false; + + foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result) + { + if ($infoHash = $db->getInfoHash($result->infoHashId)) + { + if ($infoHash->version == 1) + { + $exist = true; + } + } + } + + if (!$exist) + { + $db->addMagnetToInfoHash( + $magnet->magnetId, + $db->initInfoHashId( + Yggverse\Parser\Magnet::filterInfoHash($value), 1 + ) + ); + } + } + + break; + + case 2: + + if (!empty($value)) + { + $exist = false; + + foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result) + { + if ($infoHash = $db->getInfoHash($result->infoHashId)) + { + if ($infoHash->version == 2) + { + $exist = true; + } + } + } + + if (!$exist) + { + $db->addMagnetToInfoHash( + $magnet->magnetId, + $db->initInfoHashId( + Yggverse\Parser\Magnet::filterInfoHash($value), 2 + ) + ); + } + } + + break; + } + } + } + // Keyword Topic $db->deleteMagnetToKeywordTopicByMagnetId($magnet->magnetId); @@ -437,12 +507,18 @@ else { $response->form->sensitive->value = (bool) $magnet->sensitive; $response->form->approved->value = (bool) $magnet->approved; - // Exact Topic - $response->form->xt->value = $magnet->xt; - // Display Name $response->form->dn->value = $magnet->dn; + // Exact Topic + foreach ($db->findMagnetToInfoHashByMagnetId($magnet->magnetId) as $result) + { + if ($infoHash = $db->getInfoHash($result->infoHashId)) + { + $response->form->xt->value[$infoHash->version] = $infoHash->value; + } + } + // Keyword Topic $kt = []; foreach ($db->findKeywordTopicByMagnetId($magnet->magnetId) as $result) @@ -596,15 +672,45 @@ else {
-