mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-29 01:08:56 +00:00
285 lines
10 KiB
PHP
285 lines
10 KiB
PHP
<?php
|
|
|
|
require_once dirname(__DIR__, 5).DIRECTORY_SEPARATOR.'bootstrap.php';
|
|
|
|
use nntmux\Nfo;
|
|
use nntmux\NZB;
|
|
use nntmux\NNTP;
|
|
use nntmux\db\DB;
|
|
use nntmux\Category;
|
|
use nntmux\ColorCLI;
|
|
use nntmux\NameFixer;
|
|
use nntmux\MiscSorter;
|
|
use nntmux\NZBContents;
|
|
use App\Models\Settings;
|
|
use nntmux\processing\PostProcess;
|
|
|
|
$pdo = new DB();
|
|
|
|
if (! isset($argv[1])) {
|
|
exit(ColorCLI::error('This script is not intended to be run manually, it is called from Multiprocessing.'));
|
|
}
|
|
$namefixer = new NameFixer(['Settings' => $pdo]);
|
|
$sorter = new MiscSorter(true, $pdo);
|
|
$pieces = explode(' ', $argv[1]);
|
|
$guidChar = $pieces[1];
|
|
$maxperrun = $pieces[2];
|
|
$thread = $pieces[3];
|
|
|
|
switch (true) {
|
|
|
|
case $pieces[0] === 'standard' && $guidChar !== null && $maxperrun !== null && is_numeric($maxperrun):
|
|
|
|
// Allow for larger filename return sets
|
|
$pdo->queryExec('SET SESSION group_concat_max_len = 32768');
|
|
|
|
// Find releases to process. We only want releases that have no PreDB match, have not been renamed, exist
|
|
// in Other Categories, have already been PP Add/NFO processed, and haven't been fully fixRelName processed
|
|
$releases = $pdo->queryDirect(
|
|
sprintf("
|
|
SELECT
|
|
r.id AS releases_id, r.guid, r.groups_id, r.categories_id, r.name, r.searchname, r.proc_nfo,
|
|
r.proc_uid, r.proc_files, r.proc_par2, r.proc_srr, r.proc_hash16k, r.proc_sorter, r.ishashed, r
|
|
.dehashstatus, r.nfostatus,
|
|
r.size AS relsize, r.predb_id,
|
|
IFNULL(rf.releases_id, 0) AS fileid, IF(rf.ishashed = 1, rf.name, 0) AS filehash,
|
|
IFNULL(GROUP_CONCAT(rf.name ORDER BY rf.name ASC SEPARATOR '|'), '') AS filestring,
|
|
IFNULL(UNCOMPRESS(rn.nfo), '') AS textstring,
|
|
IFNULL(HEX(ru.uniqueid), '') AS uid,
|
|
IFNULL(ph.hash, 0) AS hash
|
|
FROM releases r
|
|
LEFT JOIN release_nfos rn ON r.id = rn.releases_id
|
|
LEFT JOIN release_files rf ON r.id = rf.releases_id
|
|
LEFT JOIN release_unique ru ON ru.releases_id = r.id
|
|
LEFT JOIN par_hashes ph ON ph.releases_id = r.id
|
|
WHERE r.leftguid = %s
|
|
AND r.nzbstatus = %d
|
|
AND r.isrenamed = %d
|
|
AND r.predb_id = 0
|
|
AND r.passwordstatus >= 0
|
|
AND r.nfostatus > %d
|
|
AND
|
|
(
|
|
(
|
|
r.nfostatus = %d
|
|
AND r.proc_nfo = %d
|
|
)
|
|
OR r.proc_files = %d
|
|
OR r.proc_uid = %d
|
|
OR r.proc_par2 = %d
|
|
OR r.proc_srr = %d
|
|
OR r.proc_hash16k = %d
|
|
OR
|
|
(
|
|
r.nfostatus = %5\$d
|
|
AND r.proc_sorter = %d
|
|
)
|
|
OR
|
|
(
|
|
r.ishashed = 1
|
|
AND r.dehashstatus BETWEEN -6 AND 0
|
|
)
|
|
)
|
|
AND r.categories_id IN (%s)
|
|
GROUP BY r.id
|
|
ORDER BY r.id+0 DESC
|
|
LIMIT %s",
|
|
$pdo->escapeString($guidChar),
|
|
NZB::NZB_ADDED,
|
|
NameFixer::IS_RENAMED_NONE,
|
|
Nfo::NFO_UNPROC,
|
|
Nfo::NFO_FOUND,
|
|
NameFixer::PROC_NFO_NONE,
|
|
NameFixer::PROC_FILES_NONE,
|
|
NameFixer::PROC_UID_NONE,
|
|
NameFixer::PROC_PAR2_NONE,
|
|
NameFixer::PROC_SRR_NONE,
|
|
NameFixer::PROC_HASH16K_NONE,
|
|
MiscSorter::PROC_SORTER_NONE,
|
|
Category::getCategoryOthersGroup(),
|
|
$maxperrun
|
|
)
|
|
);
|
|
|
|
if ($releases instanceof \Traversable) {
|
|
foreach ($releases as $release) {
|
|
$namefixer->checked++;
|
|
$namefixer->reset();
|
|
|
|
echo PHP_EOL.ColorCLI::primaryOver("[{$release['releases_id']}]");
|
|
|
|
if ((int) $release['ishashed'] === 1 && (int) $release['dehashstatus'] >= -6 && (int) $release['dehashstatus'] <= 0) {
|
|
echo ColorCLI::primaryOver('m');
|
|
if (preg_match('/[a-fA-F0-9]{32,40}/i', $release['name'], $matches)) {
|
|
$namefixer->matchPredbHash($matches[0], $release, 1, 1, true, 1);
|
|
}
|
|
if ($namefixer->matched === false && ! empty($release['filehash']) && preg_match('/[a-fA-F0-9]{32,40}/i', $release['filehash'], $matches)) {
|
|
echo ColorCLI::primaryOver('h');
|
|
$namefixer->matchPredbHash($matches[0], $release, true, 1, true, 1);
|
|
}
|
|
}
|
|
|
|
if ($namefixer->matched) {
|
|
continue;
|
|
}
|
|
$namefixer->reset();
|
|
|
|
if ((int) $release['proc_uid'] === NameFixer::PROC_UID_NONE && ! empty($release['uid'])) {
|
|
echo ColorCLI::primaryOver('U');
|
|
$namefixer->uidCheck($release, true, 'UID, ', 1, 1);
|
|
}
|
|
// Not all gate requirements in query always set column status as PP Add check is in query
|
|
$namefixer->_updateSingleColumn('proc_uid', NameFixer::PROC_UID_DONE, $release['releases_id']);
|
|
|
|
if ($namefixer->matched) {
|
|
continue;
|
|
}
|
|
$namefixer->reset();
|
|
|
|
if ((int) $release['proc_srr'] === NameFixer::PROC_SRR_NONE) {
|
|
echo ColorCLI::primaryOver('sr');
|
|
$namefixer->srrNameCheck($release, true, 'SRR, ', 1, 1);
|
|
}
|
|
// Not all gate requirements in query always set column status as PP Add check is in query
|
|
$namefixer->_updateSingleColumn('proc_srr', NameFixer::PROC_SRR_DONE, $release['releases_id']);
|
|
|
|
if ($namefixer->matched) {
|
|
continue;
|
|
}
|
|
$namefixer->reset();
|
|
|
|
if ((int) $release['proc_hash16k'] === NameFixer::PROC_HASH16K_NONE && ! empty($release['hash'])) {
|
|
echo ColorCLI::primaryOver('U');
|
|
$namefixer->hashCheck($release, true, 'PAR2 hash, ', 1, 1);
|
|
}
|
|
// Not all gate requirements in query always set column status as PP Add check is in query
|
|
$namefixer->_updateSingleColumn('proc_hash16k', NameFixer::PROC_HASH16K_DONE, $release['releases_id']);
|
|
|
|
if ($namefixer->matched) {
|
|
continue;
|
|
}
|
|
$namefixer->reset();
|
|
|
|
if ((int) $release['nfostatus'] === Nfo::NFO_FOUND && (int) $release['proc_nfo'] === NameFixer::PROC_NFO_NONE) {
|
|
if (! empty($release['textstring']) && ! preg_match('/^=newz\[NZB\]=\w+/', $release['textstring'])) {
|
|
echo ColorCLI::primaryOver('n');
|
|
$namefixer->done = $namefixer->matched = false;
|
|
$namefixer->checkName($release, true, 'NFO, ', 1, 1);
|
|
}
|
|
$namefixer->_updateSingleColumn('proc_nfo', NameFixer::PROC_NFO_DONE, $release['releases_id']);
|
|
}
|
|
|
|
if ($namefixer->matched) {
|
|
continue;
|
|
}
|
|
$namefixer->reset();
|
|
|
|
if ((int) $release['fileid'] > 0 && (int) $release['proc_files'] === NameFixer::PROC_FILES_NONE) {
|
|
echo ColorCLI::primaryOver('F');
|
|
$namefixer->done = $namefixer->matched = false;
|
|
$fileNames = explode('|', $release['filestring']);
|
|
if (is_array($fileNames)) {
|
|
$releaseFile = $release;
|
|
foreach ($fileNames as $fileName) {
|
|
if ($namefixer->matched === false) {
|
|
echo ColorCLI::primaryOver('f');
|
|
$releaseFile['textstring'] = $fileName;
|
|
$namefixer->checkName($releaseFile, true, 'Filenames, ', 1, 1);
|
|
if ($namefixer->matched === false) {
|
|
echo ColorCLI::primaryOver('xf');
|
|
$namefixer->xxxNameCheck($releaseFile, true, 'Filenames, ', 1, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Not all gate requirements in query always set column status as PP Add check is in query
|
|
$namefixer->_updateSingleColumn('proc_files', NameFixer::PROC_FILES_DONE, $release['releases_id']);
|
|
|
|
if ($namefixer->matched) {
|
|
continue;
|
|
}
|
|
$namefixer->reset();
|
|
|
|
if ((int) $release['proc_par2'] === NameFixer::PROC_PAR2_NONE) {
|
|
echo ColorCLI::primaryOver('p');
|
|
if (! isset($nzbcontents)) {
|
|
$nntp = new NNTP(['Settings' => $pdo]);
|
|
if (((int) Settings::settingValue('..alternate_nntp') === 1 ? $nntp->doConnect(true, true) : $nntp->doConnect()) !== true) {
|
|
ColorCLI::error('Unable to connect to usenet.');
|
|
}
|
|
$Nfo = new Nfo(['Settings' => $pdo, 'Echo' => true]);
|
|
$nzbcontents = new NZBContents(
|
|
[
|
|
'Echo' => true, 'NNTP' => $nntp, 'Nfo' => $Nfo, 'Settings' => $pdo,
|
|
'PostProcess' => new PostProcess(['Settings' => $pdo, 'Nfo' => $Nfo, 'NameFixer' => $namefixer]),
|
|
]
|
|
);
|
|
}
|
|
if ($namefixer->hashCheck($release, true, 'PAR2 hash, ', 1, 1) === false) {
|
|
$nzbcontents->checkPAR2($release['guid'], $release['releases_id'], $release['groups_id'], 1, 1);
|
|
}
|
|
}
|
|
|
|
// Not all gate requirements in query always set column status as PP Add check is in query
|
|
$namefixer->_updateSingleColumn('proc_par2', NameFixer::PROC_PAR2_DONE, $release['releases_id']);
|
|
|
|
if ($namefixer->matched) {
|
|
continue;
|
|
}
|
|
$namefixer->reset();
|
|
|
|
if ((int) $release['nfostatus'] === Nfo::NFO_FOUND && (int) $release['proc_sorter'] === MiscSorter::PROC_SORTER_NONE) {
|
|
echo ColorCLI::primaryOver('S');
|
|
$res = $sorter->nfosorter(null, $release['releases_id']);
|
|
// All gate requirements in query, only set column status if it ran the routine
|
|
$namefixer->_updateSingleColumn('proc_sorter', MiscSorter::PROC_SORTER_DONE, $release['releases_id']);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case $pieces[0] === 'predbft' && isset($maxperrun) && is_numeric($maxperrun) && isset($thread) && is_numeric($thread):
|
|
$pres = $pdo->queryDirect(
|
|
sprintf('
|
|
SELECT p.id AS predb_id, p.title, p.source, p.searched
|
|
FROM predb p
|
|
WHERE LENGTH(title) >= 15 AND title NOT REGEXP "[\"\<\> ]"
|
|
AND searched = 0
|
|
AND predate < (NOW() - INTERVAL 1 DAY)
|
|
ORDER BY predate+0 ASC
|
|
LIMIT %s
|
|
OFFSET %s',
|
|
$maxperrun,
|
|
$thread * $maxperrun - $maxperrun
|
|
)
|
|
);
|
|
|
|
if ($pres instanceof \Traversable) {
|
|
foreach ($pres as $pre) {
|
|
$namefixer->done = $namefixer->matched = false;
|
|
$ftmatched = $searched = 0;
|
|
$ftmatched = $namefixer->matchPredbFT($pre, true, 1, true, 1);
|
|
if ($ftmatched > 0) {
|
|
$searched = 1;
|
|
} elseif ($ftmatched < 0) {
|
|
$searched = -6;
|
|
echo '*';
|
|
} else {
|
|
$searched = $pre['searched'] - 1;
|
|
echo '.';
|
|
}
|
|
$pdo->queryExec(
|
|
sprintf('
|
|
UPDATE predb
|
|
SET searched = %d
|
|
WHERE id = %d',
|
|
$searched,
|
|
$pre['predb_id']
|
|
)
|
|
);
|
|
$namefixer->checked++;
|
|
}
|
|
}
|
|
}
|