ReleaseUpdateService::updateRelease()   C
last analyzed

Complexity

Conditions 13
Paths 60

Size

Total Lines 69
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 32
c 2
b 0
f 0
dl 0
loc 69
rs 6.6166
cc 13
nc 60
nop 8

How to fix   Long Method    Complexity    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Services\NameFixing;
6
7
use App\Models\Category;
8
use App\Models\Predb;
9
use App\Models\Release;
10
use App\Models\UsenetGroup;
11
use App\Services\Categorization\CategorizationService;
12
use App\Services\Search\ElasticSearchService;
13
use App\Services\Search\ManticoreSearchService;
14
use Blacklight\ColorCLI;
15
use Blacklight\ReleaseCleaning;
16
use Illuminate\Support\Arr;
17
18
/**
19
 * Service for updating releases with new names.
20
 *
21
 * Handles the actual database updates and category re-determination
22
 * when a release is renamed.
23
 */
24
class ReleaseUpdateService
25
{
26
    /**
27
     * PreDB regex pattern for scene release names.
28
     */
29
    public const PREDB_REGEX = '/([\w.\'()\[\]-]+(?:[\s._-]+[\w.\'()\[\]-]+)+[-.][\w]+)/ui';
30
31
    // Constants for name fixing status
32
    public const PROC_NFO_NONE = 0;
33
    public const PROC_NFO_DONE = 1;
34
    public const PROC_FILES_NONE = 0;
35
    public const PROC_FILES_DONE = 1;
36
    public const PROC_PAR2_NONE = 0;
37
    public const PROC_PAR2_DONE = 1;
38
    public const PROC_UID_NONE = 0;
39
    public const PROC_UID_DONE = 1;
40
    public const PROC_HASH16K_NONE = 0;
41
    public const PROC_HASH16K_DONE = 1;
42
    public const PROC_SRR_NONE = 0;
43
    public const PROC_SRR_DONE = 1;
44
    public const PROC_CRC_NONE = 0;
45
    public const PROC_CRC_DONE = 1;
46
47
    // Constants for overall rename status
48
    public const IS_RENAMED_NONE = 0;
49
    public const IS_RENAMED_DONE = 1;
50
51
    protected CategorizationService $category;
52
    protected ManticoreSearchService $manticore;
53
    protected ElasticSearchService $elasticsearch;
54
    protected FileNameCleaner $fileNameCleaner;
55
    protected ColorCLI $colorCLI;
56
    protected bool $echoOutput;
57
58
    /**
59
     * The release ID we are trying to rename.
60
     */
61
    protected int $relid = 0;
62
63
    /**
64
     * Has the current release found a new name?
65
     */
66
    public bool $matched = false;
67
68
    /**
69
     * Was the check completed?
70
     */
71
    public bool $done = false;
72
73
    /**
74
     * How many releases have got a new name?
75
     */
76
    public int $fixed = 0;
77
78
    /**
79
     * How many releases were checked.
80
     */
81
    public int $checked = 0;
82
83
    public function __construct(
84
        ?CategorizationService $category = null,
85
        ?ManticoreSearchService $manticore = null,
86
        ?ElasticSearchService $elasticsearch = null,
87
        ?FileNameCleaner $fileNameCleaner = null,
88
        ?ColorCLI $colorCLI = null
89
    ) {
90
        $this->category = $category ?? new CategorizationService();
91
        $this->manticore = $manticore ?? app(ManticoreSearchService::class);
92
        $this->elasticsearch = $elasticsearch ?? app(ElasticSearchService::class);
93
        $this->fileNameCleaner = $fileNameCleaner ?? new FileNameCleaner();
94
        $this->colorCLI = $colorCLI ?? new ColorCLI();
95
        $this->echoOutput = config('nntmux.echocli');
96
    }
97
98
    /**
99
     * Update the release with the new information.
100
     *
101
     * @param object|array $release The release to update
102
     * @param string $name The new name
103
     * @param string $method The method that found the name
104
     * @param bool $echo Whether to actually update the database
105
     * @param string $type The type string for logging
106
     * @param bool $nameStatus Whether to update status columns
107
     * @param bool $show Whether to show output
108
     * @param int|null $preId PreDB ID if matched
109
     * @throws \Exception
110
     */
111
    public function updateRelease(
112
        object|array $release,
113
        string $name,
114
        string $method,
115
        bool $echo,
116
        string $type,
117
        bool $nameStatus,
118
        bool $show,
119
        ?int $preId = 0
120
    ): void {
121
        $preId = $preId ?? 0;
122
        if (is_array($release)) {
0 ignored issues
show
introduced by
The condition is_array($release) is always true.
Loading history...
123
            $release = (object) $release;
124
        }
125
126
        // If $release does not have a releases_id, we should add it.
127
        if (!isset($release->releases_id)) {
128
            $release->releases_id = $release->id;
129
        }
130
131
        if ($this->relid !== $release->releases_id) {
132
            $newName = (new ReleaseCleaning())->fixerCleaner($name);
133
            // Normalize and sanity-check candidate for non-trusted sources
134
            $newName = $this->fileNameCleaner->normalizeCandidateTitle($newName);
135
136
            // Determine if the source is trusted enough to bypass plausibility checks
137
            $trustedSource = $this->isTrustedSource($type, $method, $preId);
138
139
            if (!$trustedSource && !$this->fileNameCleaner->isPlausibleReleaseTitle($newName)) {
140
                // Skip low-quality rename candidates for untrusted sources
141
                $this->done = true;
142
                return;
143
            }
144
145
            if (strtolower($newName) !== strtolower($release->searchname)) {
146
                $this->matched = true;
147
                $this->relid = (int) $release->releases_id;
148
149
                $determinedCategory = $this->category->determineCategory(
150
                    $release->groups_id,
151
                    $newName,
152
                    !empty($release->fromname) ? $release->fromname : ''
153
                );
154
155
                if ($type === 'PAR2, ') {
156
                    $newName = ucwords($newName);
157
                    if (preg_match('/(.+?)\.[a-z0-9]{2,3}(PAR2)?$/i', $name, $hit)) {
158
                        $newName = $hit[1];
159
                    }
160
                }
161
162
                $this->fixed++;
163
164
                // Split on path separator backslash to strip any path
165
                $newName = explode('\\', $newName);
166
                $newName = preg_replace(['/^[=_.:\s-]+/', '/[=_.:\s-]+$/'], '', $newName[0]);
167
168
                if ($this->echoOutput && $show) {
169
                    $this->echoReleaseInfo($release, $newName, $determinedCategory, $type, $method);
170
                }
171
172
                $newTitle = substr($newName, 0, 299);
173
174
                if ($echo === true) {
175
                    $this->performDatabaseUpdate($release, $newTitle, $determinedCategory, $type, $nameStatus, $preId);
176
                }
177
            }
178
        }
179
        $this->done = true;
180
    }
181
182
    /**
183
     * Check if the source is trusted enough to bypass plausibility checks.
184
     */
185
    protected function isTrustedSource(string $type, string $method, int $preId): bool
186
    {
187
        return (
188
            (!empty($preId) && $preId > 0) ||
189
            str_starts_with($type, 'PreDB') ||
190
            str_starts_with($type, 'PreDb') ||
191
            $type === 'UID, ' ||
192
            $type === 'PAR2 hash, ' ||
193
            $type === 'CRC32, ' ||
194
            $type === 'SRR, ' ||
195
            stripos($method, 'Title Match') !== false ||
196
            stripos($method, 'file matched source') !== false ||
197
            stripos($method, 'PreDb') !== false ||
198
            stripos($method, 'preDB') !== false
199
        );
200
    }
201
202
    /**
203
     * Echo release information to CLI.
204
     */
205
    public function echoReleaseInfo(
206
        object $release,
207
        string $newName,
208
        array $determinedCategory,
209
        string $type,
210
        string $method
211
    ): void {
212
        $groupName = UsenetGroup::getNameByID($release->groups_id);
213
        $oldCatName = Category::getNameByID($release->categories_id);
214
        $newCatName = Category::getNameByID($determinedCategory['categories_id']);
215
216
        if ($type === 'PAR2, ') {
217
            echo PHP_EOL;
218
        }
219
220
        echo PHP_EOL;
221
222
        $this->colorCLI->primary('Release Information:');
223
224
        echo '  ' . $this->colorCLI->headerOver('New name:   ') . $this->colorCLI->primary(substr($newName, 0, 100)) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('New name: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->primary...bstr($newName, 0, 100)) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->headerOver('New name: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

224
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('New name:   ') . $this->colorCLI->primary(substr($newName, 0, 100)) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary...bstr($newName, 0, 100)) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

224
        echo '  ' . $this->colorCLI->headerOver('New name:   ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary(substr($newName, 0, 100)) . PHP_EOL;
Loading history...
225
        echo '  ' . $this->colorCLI->headerOver('Old name:   ') . $this->colorCLI->primary(substr((string) $release->searchname, 0, 100)) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('Old name: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->primary...e->searchname, 0, 100)) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->headerOver('Old name: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

225
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('Old name:   ') . $this->colorCLI->primary(substr((string) $release->searchname, 0, 100)) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary...e->searchname, 0, 100)) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

225
        echo '  ' . $this->colorCLI->headerOver('Old name:   ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary(substr((string) $release->searchname, 0, 100)) . PHP_EOL;
Loading history...
226
        echo '  ' . $this->colorCLI->headerOver('Use name:   ') . $this->colorCLI->primary(substr((string) $release->name, 0, 100)) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure $this->colorCLI->headerOver('Use name: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

226
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('Use name:   ') . $this->colorCLI->primary(substr((string) $release->name, 0, 100)) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary...release->name, 0, 100)) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

226
        echo '  ' . $this->colorCLI->headerOver('Use name:   ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary(substr((string) $release->name, 0, 100)) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->primary...release->name, 0, 100)) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('Use name: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
227
        echo PHP_EOL;
228
229
        echo '  ' . $this->colorCLI->headerOver('New cat:    ') . $this->colorCLI->primary($newCatName) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->colorCLI->primary($newCatName) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary($newCatName) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

229
        echo '  ' . $this->colorCLI->headerOver('New cat:    ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary($newCatName) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure $this->colorCLI->headerOver('New cat: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

229
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('New cat:    ') . $this->colorCLI->primary($newCatName) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('New cat: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
230
        echo '  ' . $this->colorCLI->headerOver('Old cat:    ') . $this->colorCLI->primary($oldCatName) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('Old cat: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->primary($oldCatName) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->headerOver('Old cat: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

230
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('Old cat:    ') . $this->colorCLI->primary($oldCatName) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary($oldCatName) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

230
        echo '  ' . $this->colorCLI->headerOver('Old cat:    ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary($oldCatName) . PHP_EOL;
Loading history...
231
        echo '  ' . $this->colorCLI->headerOver('Group:      ') . $this->colorCLI->primary($groupName) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('Group: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary($groupName) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

231
        echo '  ' . $this->colorCLI->headerOver('Group:      ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary($groupName) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->primary($groupName) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->headerOver('Group: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

231
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('Group:      ') . $this->colorCLI->primary($groupName) . PHP_EOL;
Loading history...
232
        echo PHP_EOL;
233
234
        echo '  ' . $this->colorCLI->headerOver('Method:     ') . $this->colorCLI->primary($type . $method) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->colorCLI->primary($type . $method) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('Method: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary($type . $method) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

234
        echo '  ' . $this->colorCLI->headerOver('Method:     ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary($type . $method) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure $this->colorCLI->headerOver('Method: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

234
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('Method:     ') . $this->colorCLI->primary($type . $method) . PHP_EOL;
Loading history...
235
        echo '  ' . $this->colorCLI->headerOver('Release ID: ') . $this->colorCLI->primary((string) $release->releases_id) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('Release ID: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->headerOver('Release ID: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

235
        echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('Release ID: ') . $this->colorCLI->primary((string) $release->releases_id) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->primary...)$release->releases_id) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary...)$release->releases_id) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

235
        echo '  ' . $this->colorCLI->headerOver('Release ID: ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary((string) $release->releases_id) . PHP_EOL;
Loading history...
236
237
        if (!empty($release->filename)) {
238
            echo '  ' . $this->colorCLI->headerOver('Filename:   ') . $this->colorCLI->primary(substr((string) $release->filename, 0, 100)) . PHP_EOL;
0 ignored issues
show
Bug introduced by
Are you sure $this->colorCLI->headerOver('Filename: ') of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

238
            echo '  ' . /** @scrutinizer ignore-type */ $this->colorCLI->headerOver('Filename:   ') . $this->colorCLI->primary(substr((string) $release->filename, 0, 100)) . PHP_EOL;
Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->headerOver('Filename: ') targeting Blacklight\ColorCLI::headerOver() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure the usage of $this->colorCLI->primary...ase->filename, 0, 100)) targeting Blacklight\ColorCLI::primary() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
Bug introduced by
Are you sure $this->colorCLI->primary...ase->filename, 0, 100)) of type void can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

238
            echo '  ' . $this->colorCLI->headerOver('Filename:   ') . /** @scrutinizer ignore-type */ $this->colorCLI->primary(substr((string) $release->filename, 0, 100)) . PHP_EOL;
Loading history...
239
        }
240
241
        if ($type !== 'PAR2, ') {
242
            echo PHP_EOL;
243
        }
244
    }
245
246
    /**
247
     * Perform the actual database update.
248
     */
249
    protected function performDatabaseUpdate(
250
        object $release,
251
        string $newTitle,
252
        array $determinedCategory,
253
        string $type,
254
        bool $nameStatus,
255
        int $preId
256
    ): void {
257
        if ($nameStatus === true) {
258
            $status = $this->getStatusColumnsForType($type);
259
260
            $updateColumns = [
261
                'videos_id' => 0,
262
                'tv_episodes_id' => 0,
263
                'imdbid' => '',
264
                'musicinfo_id' => '',
265
                'consoleinfo_id' => '',
266
                'bookinfo_id' => '',
267
                'anidbid' => '',
268
                'predb_id' => $preId,
269
                'searchname' => $newTitle,
270
                'categories_id' => $determinedCategory['categories_id'],
271
            ];
272
273
            if (!empty($status)) {
274
                foreach ($status as $key => $stat) {
275
                    $updateColumns = Arr::add($updateColumns, $key, $stat);
276
                }
277
            }
278
279
            Release::query()
280
                ->where('id', $release->releases_id)
281
                ->update($updateColumns);
282
        } else {
283
            Release::query()
284
                ->where('id', $release->releases_id)
285
                ->update([
286
                    'videos_id' => 0,
287
                    'tv_episodes_id' => 0,
288
                    'imdbid' => null,
289
                    'musicinfo_id' => null,
290
                    'consoleinfo_id' => null,
291
                    'bookinfo_id' => null,
292
                    'anidbid' => null,
293
                    'predb_id' => $preId,
294
                    'searchname' => $newTitle,
295
                    'categories_id' => $determinedCategory['categories_id'],
296
                    'iscategorized' => 1,
297
                ]);
298
        }
299
300
        // Update search index
301
        if (config('nntmux.elasticsearch_enabled') === true) {
302
            $this->elasticsearch->updateRelease($release->releases_id);
303
        } else {
304
            $this->manticore->updateRelease($release->releases_id);
305
        }
306
    }
307
308
    /**
309
     * Get the status columns to update for a given type.
310
     */
311
    protected function getStatusColumnsForType(string $type): array
312
    {
313
        return match ($type) {
314
            'NFO, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_nfo' => 1],
315
            'PAR2, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_par2' => 1],
316
            'Filenames, ', 'file matched source: ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_files' => 1],
317
            'SHA1, ', 'MD5, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'dehashstatus' => 1],
318
            'PreDB FT Exact, ' => ['isrenamed' => 1, 'iscategorized' => 1],
319
            'sorter, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_sorter' => 1],
320
            'UID, ', 'Mediainfo, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_uid' => 1],
321
            'PAR2 hash, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_hash16k' => 1],
322
            'SRR, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_srr' => 1],
323
            'CRC32, ' => ['isrenamed' => 1, 'iscategorized' => 1, 'proc_crc32' => 1],
324
            default => [],
325
        };
326
    }
327
328
    /**
329
     * Update a single column in releases.
330
     */
331
    public function updateSingleColumn(string $column, int $status, int $id): void
332
    {
333
        if ($column !== '' && $id !== 0) {
334
            Release::query()->where('id', $id)->update([$column => $status]);
335
        }
336
    }
337
338
    /**
339
     * Check if a release matches a PreDB entry.
340
     */
341
    public function checkPreDbMatch(object $release, string $textstring): ?array
0 ignored issues
show
Unused Code introduced by
The parameter $release is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

341
    public function checkPreDbMatch(/** @scrutinizer ignore-unused */ object $release, string $textstring): ?array

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
342
    {
343
        if (preg_match_all(self::PREDB_REGEX, $textstring, $hits) && !preg_match('/Source\s\:/i', $textstring)) {
344
            foreach ($hits as $hit) {
345
                foreach ($hit as $val) {
346
                    $title = Predb::query()->where('title', trim($val))->select(['title', 'id'])->first();
347
                    if ($title !== null) {
348
                        return ['title' => $title['title'], 'id' => $title['id']];
349
                    }
350
                }
351
            }
352
        }
353
        return null;
354
    }
355
356
    /**
357
     * Reset status variables for new processing.
358
     */
359
    public function reset(): void
360
    {
361
        $this->done = $this->matched = false;
362
    }
363
364
    /**
365
     * Increment the checked counter.
366
     */
367
    public function incrementChecked(): void
368
    {
369
        $this->checked++;
370
    }
371
372
    /**
373
     * Get the current statistics.
374
     */
375
    public function getStats(): array
376
    {
377
        return [
378
            'fixed' => $this->fixed,
379
            'checked' => $this->checked,
380
            'matched' => $this->matched,
381
            'done' => $this->done,
382
        ];
383
    }
384
}
385
386