mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-28 17:01:16 +00:00
134 lines
4.3 KiB
PHP
134 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Category;
|
|
use App\Models\Release;
|
|
use App\Models\ReleaseFile;
|
|
use App\Models\UsenetGroup;
|
|
use App\Services\NameFixing\NameFixingService;
|
|
use App\Services\NNTP\NNTPService;
|
|
use dariusiii\rarinfo\Par2Info;
|
|
use Illuminate\Support\Carbon;
|
|
|
|
/**
|
|
* Service responsible for parsing PAR2 data and applying results to releases.
|
|
*/
|
|
class Par2Processor
|
|
{
|
|
private NameFixingService $nameFixingService;
|
|
|
|
private Par2Info $par2Info;
|
|
|
|
private bool $addPar2;
|
|
|
|
private bool $alternateNNTP;
|
|
|
|
public function __construct(NameFixingService $nameFixingService, Par2Info $par2Info, bool $addPar2, bool $alternateNNTP)
|
|
{
|
|
$this->nameFixingService = $nameFixingService;
|
|
$this->par2Info = $par2Info;
|
|
$this->addPar2 = $addPar2;
|
|
$this->alternateNNTP = $alternateNNTP;
|
|
}
|
|
|
|
/**
|
|
* Attempt to get a better name from a PAR2 file and categorize the release.
|
|
*
|
|
* @param string $messageID MessageID from NZB file.
|
|
* @param int $relID ID of the release.
|
|
* @param int $groupID Group ID of the release.
|
|
* @param NNTPService $nntp Class NNTPService
|
|
* @param int $show Only show result or apply it.
|
|
*/
|
|
public function parseFromMessage(string $messageID, int $relID, int $groupID, NNTPService $nntp, int $show): bool
|
|
{
|
|
if ($messageID === '') {
|
|
return false;
|
|
}
|
|
|
|
$query = Release::query()
|
|
->where(['isrenamed' => 0, 'id' => $relID])
|
|
->select(['id', 'groups_id', 'categories_id', 'name', 'searchname', 'postdate', 'id as releases_id'])
|
|
->first();
|
|
|
|
if ($query === null) {
|
|
return false;
|
|
}
|
|
|
|
// Only get a new name if the category is OTHER.
|
|
$foundName = true;
|
|
if (\in_array((int) $query['categories_id'], Category::OTHERS_GROUP, false)) {
|
|
$foundName = false;
|
|
}
|
|
|
|
// Get the PAR2 file.
|
|
$par2 = $nntp->getMessages(UsenetGroup::getNameByID($groupID), $messageID, $this->alternateNNTP);
|
|
if ($nntp->isError($par2)) {
|
|
return false;
|
|
}
|
|
|
|
// Put the PAR2 into Par2Info, check if there's an error.
|
|
$this->par2Info->setData($par2);
|
|
if ($this->par2Info->error) {
|
|
return false;
|
|
}
|
|
|
|
// Get the file list from Par2Info.
|
|
$files = $this->par2Info->getFileList();
|
|
if ($files !== false && \count($files) > 0) {
|
|
$filesAdded = 0;
|
|
|
|
// Loop through the files.
|
|
foreach ($files as $file) {
|
|
if (! isset($file['name'])) {
|
|
continue;
|
|
}
|
|
|
|
// If we found a name and added 20 files, stop.
|
|
if ($foundName === true && $filesAdded > 20) {
|
|
break;
|
|
}
|
|
|
|
if ($this->addPar2) {
|
|
// Add to release files.
|
|
if ($filesAdded < 21 && ReleaseFile::query()->where(['releases_id' => $relID, 'name' => $file['name']])->first() === null) {
|
|
// Try to add the files to the DB.
|
|
if (ReleaseFile::addReleaseFiles(
|
|
$relID,
|
|
$file['name'],
|
|
$file['size'] ?? 0,
|
|
$query['postdate'] !== null ? Carbon::createFromFormat('Y-m-d H:i:s', $query['postdate']) : now(),
|
|
0,
|
|
$file['hash_16K'] ?? ''
|
|
)) {
|
|
$filesAdded++;
|
|
}
|
|
}
|
|
} else {
|
|
$filesAdded++;
|
|
}
|
|
|
|
// Try to get a new name.
|
|
if ($foundName === false) {
|
|
$query['textstring'] = $file['name'];
|
|
if ($this->nameFixingService->checkName($query, true, 'PAR2, ', true, $show)) {
|
|
$foundName = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// If we found some files.
|
|
if ($filesAdded > 0) {
|
|
// Update the file count with the new file count + old file count.
|
|
Release::whereId($relID)->increment('rarinnerfilecount', $filesAdded);
|
|
}
|
|
if ($foundName === true) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|