/** * Delete releases using admin settings. * This deletes releases, regardless of group. * * @void * @access public */ public function deleteReleases() { $startTime = time(); $category = new \Category(['Settings' => $this->pdo]); $genres = new \Genres(['Settings' => $this->pdo]); $passwordDeleted = $duplicateDeleted = $retentionDeleted = $completionDeleted = $disabledCategoryDeleted = 0; $disabledGenreDeleted = $miscRetentionDeleted = $miscHashedDeleted = $categoryMinSizeDeleted = 0; // Delete old releases and finished collections. if ($this->echoCLI) { $this->pdo->log->doEcho($this->pdo->log->header("Process Releases -> Delete old releases and passworded releases.")); } // Releases past retention. if ($this->pdo->getSetting('releaseretentiondays') != 0) { $releases = $this->pdo->queryDirect(sprintf('SELECT id, guid FROM releases WHERE postdate < (NOW() - INTERVAL %d DAY)', $this->pdo->getSetting('releaseretentiondays'))); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $retentionDeleted++; } } } // Passworded releases. if ($this->pdo->getSetting('deletepasswordedrelease') == 1) { $releases = $this->pdo->queryDirect(sprintf('SELECT id, guid FROM releases WHERE passwordstatus = %d', \Releases::PASSWD_RAR)); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $passwordDeleted++; } } } // Possibly passworded releases. if ($this->pdo->getSetting('deletepossiblerelease') == 1) { $releases = $this->pdo->queryDirect(sprintf('SELECT id, guid FROM releases WHERE passwordstatus = %d', \Releases::PASSWD_POTENTIAL)); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $passwordDeleted++; } } } if ($this->crossPostTime != 0) { // Crossposted releases. do { $releases = $this->pdo->queryDirect(sprintf('SELECT id, guid FROM releases WHERE adddate > (NOW() - INTERVAL %d HOUR) GROUP BY name HAVING COUNT(name) > 1', $this->crossPostTime)); $total = 0; if ($releases && $releases->rowCount()) { $total = $releases->rowCount(); foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $duplicateDeleted++; } } } while ($total > 0); } if ($this->completion > 0) { $releases = $this->pdo->queryDirect(sprintf('SELECT id, guid FROM releases WHERE completion < %d AND completion > 0', $this->completion)); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $completionDeleted++; } } } // Disabled categories. $disabledCategories = $category->getDisabledIDs(); if (count($disabledCategories) > 0) { foreach ($disabledCategories as $disabledCategory) { $releases = $this->pdo->queryDirect(sprintf('SELECT id, guid FROM releases WHERE categoryid = %d', $disabledCategory['id'])); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $disabledCategoryDeleted++; $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); } } } } // Delete smaller than category minimum sizes. $categories = $this->pdo->queryDirect(' SELECT c.id AS id, CASE WHEN c.minsize = 0 THEN cp.minsize ELSE c.minsize END AS minsize FROM category c INNER JOIN category cp ON cp.id = c.parentid WHERE c.parentid IS NOT NULL'); if ($categories instanceof \Traversable) { foreach ($categories as $category) { if ($category['minsize'] > 0) { $releases = $this->pdo->queryDirect(sprintf(' SELECT r.id, r.guid FROM releases r WHERE r.categoryid = %d AND r.size < %d', $category['id'], $category['minsize'])); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $categoryMinSizeDeleted++; } } } } } // Disabled music genres. $genrelist = $genres->getDisabledIDs(); if (count($genrelist) > 0) { foreach ($genrelist as $genre) { $releases = $this->pdo->queryDirect(sprintf(' SELECT id, guid FROM releases INNER JOIN (SELECT id AS mid FROM musicinfo WHERE musicinfo.genre_id = %d) mi ON musicinfoid = mid', $genre['id'])); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $disabledGenreDeleted++; $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); } } } } // Misc other. if ($this->pdo->getSetting('miscotherretentionhours') > 0) { $releases = $this->pdo->queryDirect(sprintf(' SELECT id, guid FROM releases WHERE categoryid = %d AND adddate <= NOW() - INTERVAL %d HOUR', \Category::CAT_MISC, $this->pdo->getSetting('miscotherretentionhours'))); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $miscRetentionDeleted++; } } } // Misc hashed. if ($this->pdo->getSetting('mischashedretentionhours') > 0) { $releases = $this->pdo->queryDirect(sprintf(' SELECT id, guid FROM releases WHERE categoryid = %d AND adddate <= NOW() - INTERVAL %d HOUR', \Category::CAT_OTHER_HASHED, $this->pdo->getSetting('mischashedretentionhours'))); if ($releases instanceof \Traversable) { foreach ($releases as $release) { $this->releases->deleteSingle(['g' => $release['guid'], 'i' => $release['id']], $this->nzb, $this->releaseImage); $miscHashedDeleted++; } } } if ($this->echoCLI) { $this->pdo->log->doEcho($this->pdo->log->primary('Removed releases: ' . number_format($retentionDeleted) . ' past retention, ' . number_format($passwordDeleted) . ' passworded, ' . number_format($duplicateDeleted) . ' crossposted, ' . number_format($disabledCategoryDeleted) . ' from disabled categories, ' . number_format($categoryMinSizeDeleted) . ' smaller than category settings, ' . number_format($disabledGenreDeleted) . ' from disabled music genres, ' . number_format($miscRetentionDeleted) . ' from misc->other' . number_format($miscHashedDeleted) . ' from misc->hashed' . ($this->completion > 0 ? ', ' . number_format($completionDeleted) . ' under ' . $this->completion . '% completion.' : '.'))); $totalDeleted = $retentionDeleted + $passwordDeleted + $duplicateDeleted + $disabledCategoryDeleted + $disabledGenreDeleted + $miscRetentionDeleted + $miscHashedDeleted + $completionDeleted + $categoryMinSizeDeleted; if ($totalDeleted > 0) { $this->pdo->log->doEcho($this->pdo->log->primary("Removed " . number_format($totalDeleted) . ' releases in ' . $this->consoleTools->convertTime(time() - $startTime))); } } }
$sort = "DESC"; } else { $sort = ""; } } if (isset($argv[3]) && is_numeric($argv[3])) { $limit = "LIMIT " . $argv[3]; } else { if (isset($argv[2]) && is_numeric($argv[2])) { $limit = "LIMIT " . $argv[2]; } else { $limit = ""; } } $mask = $pdo->log->primary("%-50.50s %22.22s %22.22s %22.22s %22.22s %22.22s %22.22s %22.22s"); $releases = $pdo->queryDirect("SELECT name, backfill_target, first_record_postdate, last_updated, last_updated, CAST(last_record AS SIGNED)-CAST(first_record AS SIGNED) AS 'headers downloaded', TIMESTAMPDIFF(DAY,first_record_postdate,NOW()) AS days FROM groups"); if ($releases instanceof Traversable) { foreach ($releases as $release) { $count += $release['headers downloaded']; $groups++; } } $active = $pdo->queryOneRow("SELECT COUNT(*) AS count FROM groups WHERE ACTIVE = 1"); printf($mask, "\nGroup Name => " . $active['count'] . "[" . $groups . "] (" . number_format($count) . " downloaded)", "Backfilled Days", "Oldest Post", "Last Updated", "Headers Downloaded", "Releases", "Renamed", "PreDB Matches"); printf($mask, "==================================================", "======================", "======================", "======================", "======================", "======================", "======================", "======================"); $releases = $pdo->queryDirect(sprintf("\n\t\tSELECT name, backfill_target, first_record_postdate, last_updated,\n\t\tCAST(last_record as SIGNED)-CAST(first_record as SIGNED) AS 'headers downloaded', TIMESTAMPDIFF(DAY,first_record_postdate,NOW()) AS days,\n\t\tCOALESCE(rel.num, 0) AS num_releases,\n\t\tCOALESCE(pre.num, 0) AS pre_matches,\n\t\tCOALESCE(ren.num, 0) AS renamed FROM groups\n\t\tLEFT OUTER JOIN ( SELECT group_id, COUNT(id) AS num FROM releases GROUP BY group_id ) rel ON rel.group_id = groups.id\n\t\tLEFT OUTER JOIN ( SELECT group_id, COUNT(id) AS num FROM releases WHERE preid > 0 GROUP BY group_id ) pre ON pre.group_id = groups.id\n\t\tLEFT OUTER JOIN ( SELECT group_id, COUNT(id) AS num FROM releases WHERE iscategorized = 1 GROUP BY group_id ) ren ON ren.group_id = groups.id\n\t\tWHERE active = 1 AND first_record_postdate %s %s %s", $order, $sort, $limit)); if ($releases instanceof Traversable) { foreach ($releases as $release) { $headers = number_format($release['headers downloaded']); printf($mask, $release['name'], $release['backfill_target'] . "(" . $release['days'] . ")", $release['first_record_postdate'], $release['last_updated'], $headers, number_format($release['num_releases']), $release['num_releases'] == 0 ? number_format($release['num_releases']) : number_format($release['renamed']) . "(" . floor($release['renamed'] / $release['num_releases'] * 100) . "%)", $release['num_releases'] == 0 ? number_format($release['num_releases']) : number_format($release['pre_matches']) . "(" . floor($release['pre_matches'] / $release['num_releases'] * 100) . "%)"); }
exit('Unable to create temp directory:' . $tmpPath . PHP_EOL); } } $unrarPath = $pdo->getSetting('unrarpath'); if (empty($unrarPath)) { exit('The site setting for the unrar path must not be empty!' . PHP_EOL); } $nntp = new NNTP(['Settings' => $pdo]); $nfo = new Nfo(['Echo' => true, 'Settings' => $pdo]); $nzbContents = new NZBContents(array('Settings' => $pdo, 'Echo' => true, 'Nfo' => $nfo, 'PostProcess' => new PostProcess(['Settings' => $pdo, 'Nfo' => $nfo]), 'NNTP' => $nntp)); $categorize = new Categorize(['Settings' => $pdo]); $releases = $pdo->queryDirect(sprintf(' SELECT rf.name AS filename, r.categoryid, r.name, r.guid, r.id, r.group_id, r.postdate, r.searchname AS oldname, g.name AS groupname FROM releasefiles rf INNER JOIN releases r ON rf.releaseid = r.id INNER JOIN groups g ON r.group_id = g.id WHERE (r.isrenamed = 0 OR r.categoryid = 7020) AND r.passwordstatus = 0 AND rf.name %s ORDER BY r.postdate DESC', $pdo->likeString('Linux_2rename.sh'))); if ($releases instanceof Traversable) { $nntp->doConnect(); $sphinx = new SphinxSearch(); foreach ($releases as $release) { // Clear old files. foreach (glob($tmpPath . '*') as $file) { if (is_file($file)) { @unlink($file); } } // Load up the NZB as a XML file.