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 766ad8c..a18577b 100644 Binary files a/database/yggtracker.mwb and b/database/yggtracker.mwb differ 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 {
-