mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-30 09:48:55 +00:00
330 lines
9.5 KiB
PHP
Executable File
330 lines
9.5 KiB
PHP
Executable File
<?php
|
|
require_once(dirname(__FILE__)."/../bin/config.php");
|
|
require_once(WWW_DIR."/lib/framework/cache.php");
|
|
require_once(WWW_DIR."/lib/framework/db.php");
|
|
require_once(WWW_DIR. "lib/category.php");
|
|
require_once(WWW_DIR."/lib/releases.php");
|
|
require_once(WWW_DIR."/lib/releaseimage.php");
|
|
require_once(WWW_DIR."/lib/nzb.php");
|
|
require_once(WWW_DIR."/lib/rarinfo/par2info.php");
|
|
require_once(WWW_DIR."/lib/nfo.php");
|
|
require_once(WWW_DIR."/lib/site.php");
|
|
require_once(WWW_DIR."/lib/util.php");
|
|
require_once(WWW_DIR."/lib/groups.php");
|
|
require_once(WWW_DIR."/lib/nntp.php");
|
|
require_once("consoletools.php");
|
|
require_once("ColorCLI.php");
|
|
|
|
|
|
|
|
//*addedd from nZEDb for testing
|
|
|
|
class Functions
|
|
|
|
{
|
|
/**
|
|
* @var object Instance of PDO class.
|
|
*/
|
|
private static $pdo = null;
|
|
// database function
|
|
public function queryArray($query)
|
|
|
|
{
|
|
$db = new DB();
|
|
if ($query == '') return false;
|
|
|
|
$result = $db->queryDirect($query);
|
|
$rows = array();
|
|
foreach ($result as $row)
|
|
{
|
|
$rows[] = $row;
|
|
}
|
|
|
|
return (!isset($rows)) ? false : $rows;
|
|
}
|
|
|
|
// Used for deleting, updating (and inserting without needing the last insert id).
|
|
public function queryExec($query)
|
|
{
|
|
if ($query == '')
|
|
return false;
|
|
|
|
try {
|
|
$run = self::$pdo->prepare($query);
|
|
$run->execute();
|
|
return $run;
|
|
} catch (PDOException $e) {
|
|
// Deadlock or lock wait timeout, try 10 times.
|
|
$i = 1;
|
|
while (($e->errorInfo[1] == 1213 || $e->errorInfo[0] == 40001 || $e->errorInfo[1] == 1205 || $e->getMessage()=='SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction') && $i <= 10)
|
|
{
|
|
echo $this->c->error("A Deadlock or lock wait timeout has occurred, sleeping.\n");
|
|
$this->consoletools->showsleep($i * $i);
|
|
$run = self::$pdo->prepare($query);
|
|
$run->execute();
|
|
return $run;
|
|
$i++;
|
|
}
|
|
if ($e->errorInfo[1] == 1213 || $e->errorInfo[0] == 40001 || $e->errorInfo[1] == 1205)
|
|
{
|
|
//echo "Error: Deadlock or lock wait timeout.";
|
|
return false;
|
|
}
|
|
else if ($e->errorInfo[1]==1062 || $e->errorInfo[0]==23000)
|
|
{
|
|
//echo "\nError: Update would create duplicate row, skipping\n";
|
|
return false;
|
|
}
|
|
else if ($e->errorInfo[1]==1406 || $e->errorInfo[0]==22001)
|
|
{
|
|
//echo "\nError: Too large to fit column length\n";
|
|
return false;
|
|
}
|
|
else
|
|
echo $this->c->error($e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function Prepare($query, $options = array())
|
|
{
|
|
try {
|
|
$PDOstatement = self::$pdo->prepare($query, $options);
|
|
} catch (PDOException $e) {
|
|
//echo $this->c->error($e->getMessage());
|
|
$PDOstatement = false;
|
|
}
|
|
return $PDOstatement;
|
|
}
|
|
// gets name of category from category.php
|
|
public function getNameByID($ID)
|
|
{
|
|
$db = new DB();
|
|
$arr1 = $db->queryOneRow(sprintf("SELECT title from category where ID = %d", substr($ID, 0, 1)."000"));
|
|
$parent = array_shift($arr1);
|
|
$arr2 = $db->queryOneRow(sprintf("SELECT title from category where ID = %d", $ID));
|
|
$cat = array_shift($arr2);
|
|
return $parent." ".$cat;
|
|
}
|
|
//deletes from releases
|
|
public function fastDelete($id, $guid, $site)
|
|
{
|
|
$db = new DB();
|
|
$nzb = new NZB();
|
|
$ri = new ReleaseImage();
|
|
|
|
|
|
//
|
|
// delete from disk.
|
|
//
|
|
$nzbpath = $nzb->getNZBPath($guid, $site->nzbpath, false);
|
|
|
|
if (file_exists($nzbpath))
|
|
unlink($nzbpath);
|
|
|
|
$db->exec(sprintf("delete releases, releasenfo, releasecomment, usercart, releasefiles, releaseaudio, releasesubs, releasevideo, releaseextrafull
|
|
from releases
|
|
LEFT OUTER JOIN releasenfo on releasenfo.releaseID = releases.ID
|
|
LEFT OUTER JOIN releasecomment on releasecomment.releaseID = releases.ID
|
|
LEFT OUTER JOIN usercart on usercart.releaseID = releases.ID
|
|
LEFT OUTER JOIN releasefiles on releasefiles.releaseID = releases.ID
|
|
LEFT OUTER JOIN releaseaudio on releaseaudio.releaseID = releases.ID
|
|
LEFT OUTER JOIN releasesubs on releasesubs.releaseID = releases.ID
|
|
LEFT OUTER JOIN releasevideo on releasevideo.releaseID = releases.ID
|
|
LEFT OUTER JOIN releaseextrafull on releaseextrafull.releaseID = releases.ID
|
|
where releases.ID = %d", $id));
|
|
|
|
$ri->delete($guid); // This deletes a file so not in the query
|
|
}
|
|
//reads name of group
|
|
public function getByNameByID($id)
|
|
{
|
|
$db = new DB();
|
|
$res = $db->queryOneRow(sprintf("select name from groups where ID = %d ", $id));
|
|
return $res["name"];
|
|
}
|
|
//Add release nfo, imported from nZEDb
|
|
public function addReleaseNfo($relid)
|
|
{
|
|
$db = new DB();
|
|
return $db->queryInsert(sprintf("INSERT IGNORE INTO releasenfo (releaseID) VALUE (%d)", $relid));
|
|
}
|
|
|
|
// Confirm that the .nfo file is not something else.
|
|
public function isNFO($possibleNFO)
|
|
{
|
|
$ok = false;
|
|
if ($possibleNFO !== false)
|
|
{
|
|
if (!preg_match('/(<?xml|;\s*Generated\sby.+SF\w|^\s*PAR|\.[a-z0-9]{2,7}\s[a-z0-9]{8}|^\s*RAR|\A.{0,10}(JFIF|matroska|ftyp|ID3))/i', $possibleNFO))
|
|
{
|
|
if (strlen($possibleNFO) < 45 * 1024)
|
|
{
|
|
// exif_imagetype needs a minimum size or else it doesn't work.
|
|
if (strlen($possibleNFO) > 15)
|
|
{
|
|
// Check if it's a picture - EXIF.
|
|
if (@exif_imagetype($possibleNFO) == false)
|
|
{
|
|
// Check if it's a picture - JFIF.
|
|
if ($this->check_JFIF($possibleNFO) == false)
|
|
{
|
|
// Check if it's a par2.
|
|
$par2info = new Par2Info();
|
|
$par2info->setData($possibleNFO);
|
|
if ($par2info->error)
|
|
{
|
|
$ok = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $ok;
|
|
}
|
|
|
|
// Check if the possible NFO is a JFIF.
|
|
function check_JFIF($filename)
|
|
{
|
|
$fp = @fopen($filename, 'r');
|
|
if ($fp)
|
|
{
|
|
// JFIF often (but not always) starts at offset 6.
|
|
if (fseek($fp, 6) == 0)
|
|
{
|
|
// JFIF header is 16 bytes.
|
|
if (($bytes = fread($fp, 16)) !== false)
|
|
{
|
|
// Make sure it is JFIF header.
|
|
if (substr($bytes, 0, 4) == "JFIF")
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Attempt to get a better name from a par2 file and categorize the release.
|
|
//
|
|
public function parsePAR2($messageID, $relID, $groupID, $nntp)
|
|
{
|
|
$db = new DB();
|
|
$category = new Category();
|
|
$functions = new Functions();
|
|
$c = new ColorCLI;
|
|
|
|
if (!isset($nntp))
|
|
exit($c->error("Not connected to usenet(functions->parsePAR2).\n"));
|
|
|
|
if ($messageID == '')
|
|
return false;
|
|
$t = 'UNIX_TIMESTAMP(postdate)';
|
|
$quer = $db->queryOneRow('SELECT groupID, categoryID, relnamestatus, searchname, '.$t.' as postdate, ID as releaseID FROM releases WHERE ID = '.$relID);
|
|
if ((!in_array($quer['relnamestatus'], array(0, 1, 6, 20, 21)) || $quer['relnamestatus'] === 7 || $quer['categoryID']) != Category::CAT_MISC_OTHER)
|
|
return false;
|
|
$nntp = new Nntp();
|
|
$nntp->doConnect();
|
|
$groups = new Groups();
|
|
$functions = new Functions();
|
|
$par2 = $nntp->getMessage($functions->getByNameByID($groupID), $messageID);
|
|
if (PEAR::isError($par2))
|
|
{
|
|
$nntp->doQuit();
|
|
$nntp->doConnect();
|
|
$par2 = $nntp->getMessage($functions->getByNameByID($groupID), $messageID);
|
|
if (PEAR::isError($par2))
|
|
{
|
|
$nntp->doQuit();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
$par2info = new Par2Info();
|
|
$par2info->setData($par2);
|
|
if ($par2info->error)
|
|
return false;
|
|
|
|
$files = $par2info->getFileList();
|
|
if ($files !== false && count($files) > 0)
|
|
{
|
|
$db = new DB();
|
|
$namefixer = new Namefixer;
|
|
$rf = new ReleaseFiles();
|
|
$relfiles = 0;
|
|
$foundname = false;
|
|
foreach ($files as $fileID => $file)
|
|
{
|
|
if (!array_key_exists('name', $file))
|
|
return false;// Add to releasefiles.
|
|
if (($relfiles < 11 && $db->queryOneRow(sprintf("SELECT ID FROM releasefiles WHERE releaseID = %d AND name = %s", $relID, $db->escapeString($file["name"])))) === false)
|
|
{
|
|
if ($rf->add($relID, $file["name"], $file["size"], $quer["postdate"], 0))
|
|
$relfiles++;
|
|
}
|
|
$quer["textstring"] = $file["name"];
|
|
$namefixer->checkName($quer, 1, "PAR2, ", 1);
|
|
$stat = $db->queryOneRow("SELECT relnamestatus AS a FROM releases WHERE ID = {$relID}");
|
|
if ($stat["a"] === 7)
|
|
{
|
|
$foundname = true;
|
|
break;
|
|
}
|
|
}
|
|
if ($relfiles > 0)
|
|
{
|
|
|
|
$cnt = $db->queryOneRow('SELECT COUNT(releaseID) AS count FROM releasefiles WHERE releaseID = '.$relID);
|
|
$count = $relfiles;
|
|
if ($cnt !== false && $cnt["count"] > 0)
|
|
$count = $relfiles + $cnt["count"];
|
|
$db->exec(sprintf("UPDATE releases SET rarinnerfilecount = %d where ID = %d", $count, $relID));
|
|
}
|
|
if ($foundname === true)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Check if the NZB is there, returns path, else false.
|
|
function NZBPath($releaseGuid, $sitenzbpath = "")
|
|
{
|
|
$nzb = new NZB();
|
|
$nzbfile = $nzb->getNZBPath($releaseGuid, $sitenzbpath, false);
|
|
return !file_exists($nzbfile) ? false : $nzbfile;
|
|
}
|
|
|
|
//Categorize releases
|
|
public function categorizeRelease($type, $where="", $echooutput=false)
|
|
{
|
|
$db = new DB();
|
|
$cat = new Category();
|
|
$consoletools = new consoleTools();
|
|
$relcount = 0;
|
|
$resrel = $db->prepare("SELECT ID, ".$type.", groupID FROM releases ".$where);
|
|
$resrel->execute();
|
|
$total = $resrel->rowCount();
|
|
if ($total > 0)
|
|
{
|
|
foreach ($resrel as $rowrel)
|
|
{
|
|
$catId = $cat->determineCategory($rowrel[$type], $rowrel['groupID']);
|
|
$db->queryDirect(sprintf("UPDATE releases SET categoryID = %d, relnamestatus = 1 WHERE ID = %d", $catId, $rowrel['ID']));
|
|
$relcount ++;
|
|
if ($echooutput)
|
|
$consoletools->overWrite("Categorizing:".$consoletools->percentString($relcount,$total));
|
|
}
|
|
}
|
|
if ($echooutput !== false && $relcount > 0)
|
|
echo "\n";
|
|
return $relcount;
|
|
}
|
|
//end of testing
|
|
|
|
}
|
|
|
|
?>
|