You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
306 lines
9.0 KiB
306 lines
9.0 KiB
<?php
|
|
namespace nzedb;
|
|
|
|
use app\models\Groups as Group;
|
|
|
|
/**
|
|
* Attempts to find a PRE name for a release using a request ID from our local pre database,
|
|
* or internet request id database using a Standalone -- more intensive methods
|
|
*
|
|
* Class RequestIDLocal
|
|
*/
|
|
class RequestIDLocal extends RequestID
|
|
{
|
|
/**
|
|
* @param array $options Class instances / Echo to cli?
|
|
*/
|
|
public function __construct(array $options = [])
|
|
{
|
|
parent::__construct($options);
|
|
}
|
|
|
|
/**
|
|
* Fetch releases with requestID's from MySQL.
|
|
*/
|
|
protected function _getReleases()
|
|
{
|
|
$query = (
|
|
'SELECT r.id, r.name, r.categories_id, r.reqidstatus, g.name AS groupname, g.id as gid
|
|
FROM releases r
|
|
LEFT JOIN groups g ON r.groups_id = g.id
|
|
WHERE r.nzbstatus = 1
|
|
AND r.predb_id = 0
|
|
AND r.isrequestid = 1'
|
|
);
|
|
|
|
$query .= ($this->_charGUID === '' ? '' : ' AND r.leftguid = ' . $this->pdo->escapeString($this->_charGUID));
|
|
$query .= ($this->_groupID === '' ? '' : ' AND r.groups_id = ' . $this->_groupID);
|
|
$query .= ($this->_maxTime === 0 ? '' : sprintf(' AND r.adddate > NOW() - INTERVAL %d HOUR', $this->_maxTime));
|
|
|
|
switch ($this->_limit) {
|
|
case 'full':
|
|
$query .= sprintf(
|
|
" AND r.reqidstatus in (%d, %d, %d)",
|
|
self::REQID_UPROC,
|
|
self::REQID_NOLL,
|
|
self::REQID_NONE
|
|
);
|
|
break;
|
|
case is_numeric($this->_limit):
|
|
$query .= sprintf(
|
|
" AND r.reqidstatus in (%d, %d, %d) ORDER BY r.postdate DESC LIMIT %d",
|
|
self::REQID_UPROC,
|
|
self::REQID_NOLL,
|
|
self::REQID_NONE,
|
|
$this->_limit
|
|
);
|
|
break;
|
|
case 'all':
|
|
default:
|
|
break;
|
|
}
|
|
$this->_releases = $this->pdo->queryDirect($query);
|
|
}
|
|
|
|
/**
|
|
* Process releases for requestID's.
|
|
*
|
|
* @return int How many did we rename?
|
|
*/
|
|
protected function _processReleases()
|
|
{
|
|
$renamed = $checked = 0;
|
|
if ($this->_releases instanceof \Traversable) {
|
|
foreach ($this->_releases as $this->_release) {
|
|
$this->_requestID = $this->_siftReqId();
|
|
|
|
// Do a local lookup using multiple possible methods
|
|
$this->_newTitle = $this->_getNewTitle();
|
|
|
|
if ($this->_newTitle !== false && isset($this->_newTitle['title'])) {
|
|
$this->_updateRelease();
|
|
$renamed++;
|
|
} else {
|
|
$this->_requestIdNotFound($this->_release['id'], ($this->_release['reqidstatus'] == self::REQID_UPROC ? self::REQID_NOLL : self::REQID_NONE));
|
|
}
|
|
|
|
if ($this->echoOutput && $this->_show === 0) {
|
|
$this->consoleTools->overWritePrimary(
|
|
"Checked Releases: [" . number_format($checked) . "] " .
|
|
$this->consoleTools->percentString(++$checked, $this->_totalReleases)
|
|
);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return $renamed;
|
|
}
|
|
|
|
/**
|
|
* Get a new title / pre ID for a release.
|
|
*
|
|
* @return array|bool
|
|
*/
|
|
protected function _getNewTitle()
|
|
{
|
|
if ($this->_requestID === -2) {
|
|
return $this->_multiLookup();
|
|
}
|
|
|
|
$check = $this->pdo->queryDirect(
|
|
sprintf(
|
|
'SELECT id, title FROM predb WHERE requestid = %d AND groups_id = %d',
|
|
$this->_requestID,
|
|
$this->_release['gid']
|
|
)
|
|
);
|
|
|
|
if ($check instanceof \Traversable) {
|
|
if ($check->rowCount() == 1) {
|
|
foreach ($check as $row) {
|
|
if (preg_match('/s\d+/i', $row['title']) && !preg_match('/s\d+e\d+/i', $row['title'])) {
|
|
return false;
|
|
}
|
|
return ['title' => $row['title'], 'id' => $row['id']];
|
|
}
|
|
} else {
|
|
//Prevents multiple releases with the same request id/group from being renamed to the same Pre.
|
|
return $this->_multiLookup();
|
|
}
|
|
} else {
|
|
$result = $this->_singleAltLookup();
|
|
if (is_array($result) && is_numeric($result['id']) && $result['title'] !== '') {
|
|
return $result;
|
|
} else {
|
|
return $this->_multiLookup();
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Sub function that attempts to match RequestID Releases
|
|
* by preg_matching the title from the usenet name
|
|
*
|
|
* @return array|bool
|
|
*/
|
|
protected function _multiLookup()
|
|
{
|
|
$regex1 =
|
|
'/^\[\s*\d+\s*\][ -]+(\[(ISO|FULL|PART|MP3|0DAY|android)\][ -]+)?\[(alt-?bin| ?#?a[a-z0-9. -]+)((@?ef{1,2})?net)? ?\]' .
|
|
'[ -]+(\[(ISO|FULL|PART|MP3|0DAY|android)\][ -]+)?(\[\s*\d+\s*\][ -]+)?(\[\d+\/\d+\][ -]+)?(\"|\[)\s*' .
|
|
'(?P<title>.+?)(\.+(vol\d+\+\d+\.)?(-cd\d\.)?(avi|jpg|nzb|m3u|mkv|par2|part\d+|nfo|sample|sfv|rar|r?\d{1,3}|\d+|zip)*)?\s*(\"|\])' .
|
|
'[ -]*(\[\d+\/\d+\][ -]*)?((\"\s*(?P<filename1>.+?)([-.]sample)?([-.]cd(\d|[ab]))?(\.+(vol\d+\+\d+\.)?([-.]d\d\.)?([-.]part\d+)?' .
|
|
'(avi|jpg|nzb|m3u|mkv|par2|nfo|sample|sfv|rar|r?\d{1,3}|\d+|zip)*)?\s*\")| - (?P<filename2>.+?) (yEnc|\(\d+\/\d+\)))?.*/i'
|
|
;
|
|
|
|
$regex2 =
|
|
'/^\[\s*\d+\s*\].*' .
|
|
'\"\s*(?P<title>.+?)(\.+(vol\d+\+\d+\.)?(-cd\d\.)?' .
|
|
'(avi|jpg|nzb|m3u|mkv|par2|part\d+|nfo|sample|sfv|rar|r?\d{1,3}|\d+|zip)*)\s*\".*/i'
|
|
;
|
|
|
|
$matches = [];
|
|
switch (true) {
|
|
case preg_match($regex1, $this->_release['name'], $matches):
|
|
case preg_match($regex2, $this->_release['name'], $matches):
|
|
$check = $this->pdo->queryOneRow(
|
|
sprintf(
|
|
"SELECT id, title FROM predb WHERE title = %s OR filename = %s %s",
|
|
$this->pdo->escapeString($matches['title']),
|
|
$this->pdo->escapeString($matches['title']),
|
|
(
|
|
isset($matches['filename1']) && $matches['filename1'] !== ''
|
|
? 'OR filename = ' . $this->pdo->escapeString($matches['filename1'])
|
|
:
|
|
(
|
|
isset($matches['filename2']) && $matches['filename2'] !== ''
|
|
? 'OR filename = ' . $this->pdo->escapeString($matches['filename2'])
|
|
: ''
|
|
)
|
|
)
|
|
)
|
|
);
|
|
if ($check !== false) {
|
|
return ['title' => $check['title'], 'id' => $check['id']];
|
|
}
|
|
continue;
|
|
default:
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private $groupIDCache = [];
|
|
|
|
/**
|
|
* Attempts to remap the release groups_id by extracting the new group name from the release usenet name.
|
|
*
|
|
* @return array|bool
|
|
*/
|
|
protected function _singleAltLookup()
|
|
{
|
|
switch (true) {
|
|
case $this->_release['name'] == 'alt.binaries.etc':
|
|
$groupName = 'alt.binaries.teevee';
|
|
break;
|
|
case strpos($this->_release['name'], 'teevee') !== false:
|
|
$groupName = 'alt.binaries.teevee';
|
|
break;
|
|
case strpos($this->_release['name'], 'moovee') !== false:
|
|
$groupName = 'alt.binaries.moovee';
|
|
break;
|
|
case strpos($this->_release['name'], 'erotica') !== false:
|
|
$groupName = 'alt.binaries.erotica';
|
|
break;
|
|
case strpos($this->_release['name'], 'foreign') !== false:
|
|
$groupName = 'alt.binaries.mom';
|
|
break;
|
|
case strpos($this->_release['name'], 'inner-sanctum') !== false:
|
|
$groupName = 'alt.binaries.inner-sanctum';
|
|
break;
|
|
case strpos($this->_release['name'], 'sounds.flac') !== false:
|
|
$groupName = 'alt.binaries.sounds.flac';
|
|
break;
|
|
case strpos($this->_release['name'], 'scnzb') !== false:
|
|
$groupName = 'alt.binaries.boneless';
|
|
break;
|
|
case strpos($this->_release['name'], 'hdtv.x264') !== false:
|
|
$groupName = 'alt.binaries.hdtv.x264';
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
if (isset($this->groupIDCache[$groupName])) {
|
|
$groupID = $this->groupIDCache[$groupName];
|
|
} else {
|
|
$groupID = Group::getIDByName($groupName);
|
|
}
|
|
$check = $this->pdo->queryOneRow(
|
|
sprintf("
|
|
SELECT id, title FROM predb WHERE requestid = %d AND groups_id = %d",
|
|
$this->_requestID,
|
|
($groupID === '' ? 0 : $groupID)
|
|
)
|
|
);
|
|
if ($check !== false) {
|
|
return ['title' => $check['title'], 'id' => $check['id']];
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Updates release information when a proper Request ID match is found.
|
|
*/
|
|
protected function _updateRelease()
|
|
{
|
|
$determinedCat = $this->category->determineCategory($this->_release['gid'], $this->_newTitle['title']);
|
|
if ($determinedCat == $this->_release['categories_id']) {
|
|
$newTitle = $this->pdo->escapeString($this->_newTitle['title']);
|
|
$this->pdo->queryExec(
|
|
sprintf('
|
|
UPDATE releases
|
|
SET predb_id = %d, reqidstatus = %d, isrenamed = 1, iscategorized = 1, searchname = %s
|
|
WHERE id = %d',
|
|
$this->_newTitle['id'],
|
|
self::REQID_FOUND,
|
|
$newTitle,
|
|
$this->_release['id']
|
|
)
|
|
);
|
|
$this->sphinx->updateRelease($this->_release['id'], $this->pdo);
|
|
} else {
|
|
$newTitle = $this->pdo->escapeString($this->_newTitle['title']);
|
|
$this->pdo->queryExec(
|
|
sprintf('
|
|
UPDATE releases SET
|
|
videos_id = 0, tv_episodes_id = 0, imdbid = NULL, musicinfo_id = NULL, consoleinfo_id = NULL,
|
|
bookinfo_id = NULL, anidbid = NULL, predb_id = %d, reqidstatus = %d, isrenamed = 1,
|
|
iscategorized = 1, searchname = %s, categories_id = %d
|
|
WHERE id = %d',
|
|
$this->_newTitle['id'],
|
|
self::REQID_FOUND,
|
|
$newTitle,
|
|
$determinedCat,
|
|
$this->_release['id']
|
|
)
|
|
);
|
|
$this->sphinx->updateRelease($this->_release['id'], $this->pdo);
|
|
}
|
|
|
|
if ($this->_release['name'] !== $this->_newTitle['title'] && $this->_show == 1) {
|
|
NameFixer::echoChangedReleaseName(
|
|
[
|
|
'new_name' => $this->_newTitle['title'],
|
|
'old_name' => $this->_release['name'],
|
|
'new_category' => $this->category->getNameByID($determinedCat),
|
|
'old_category' => $this->category->getNameByID($this->_release['categories_id']),
|
|
'group' => $this->_release['groupname'],
|
|
'release_id' => $this->_release['id'],
|
|
'method' => 'RequestIDLocal'
|
|
]
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|