Move Utility and Country into services

This commit is contained in:
DariusIII
2025-12-20 16:46:04 +01:00
parent d441fad32f
commit 717a5d89f6
20 changed files with 353 additions and 365 deletions
+1 -2
View File
@@ -2,7 +2,6 @@
namespace Blacklight;
use Blacklight\utility\Utility;
/**
* Basic IRC client for fetching IRCScraper.
@@ -556,7 +555,7 @@ class IRCClient
// Create SSL/TLS context if using secure connection
$context = $this->_remote_tls
? stream_context_create(Utility::streamSslContextOptions(true))
? stream_context_create(streamSslContextOptions(true))
: null;
$socket = stream_socket_client(
+1 -2
View File
@@ -11,7 +11,6 @@ use App\Services\FanartTvService;
use App\Services\ImdbScraper;
use App\Services\TmdbClient;
use App\Services\TvProcessing\Providers\TraktProvider;
use Blacklight\utility\Utility;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Database\Eloquent\Builder;
@@ -296,7 +295,7 @@ class Movie
}
}
$trailer = Utility::imdb_trailers($imdbId);
$trailer = imdb_trailers($imdbId);
if ($trailer) {
MovieInfo::query()->where('imdbid', $imdbId)->update(['trailer' => $trailer]);
+1 -2
View File
@@ -4,7 +4,6 @@ namespace Blacklight;
use App\Extensions\util\PhpYenc;
use App\Models\Settings;
use Blacklight\utility\Utility;
/*
* Class for connecting to the usenet, retrieving articles and article headers,
@@ -1274,7 +1273,7 @@ class NNTP extends \Net_NNTP_Client
// Attempt to connect to usenet.
// Only create SSL context if using TLS/SSL transport
$context = preg_match('/tls|ssl/', $transport)
? stream_context_create(Utility::streamSslContextOptions())
? stream_context_create(streamSslContextOptions())
: null;
$socket = stream_socket_client(
+1 -2
View File
@@ -7,7 +7,6 @@ namespace Blacklight;
use App\Models\Release;
use App\Models\Settings;
use App\Services\PostProcessService;
use Blacklight\utility\Utility;
/**
* Gets information contained within the NZB.
@@ -293,7 +292,7 @@ class NZBContents
}
// Attempt to decompress the NZB file
$nzbContents = Utility::unzipGzipFile($nzbPath);
$nzbContents = unzipGzipFile($nzbPath);
if (empty($nzbContents)) {
if ($this->echooutput) {
$perms = fileperms($nzbPath);
+1 -2
View File
@@ -3,7 +3,6 @@
namespace Blacklight;
use App\Models\UsenetGroup;
use Blacklight\utility\Utility;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
@@ -149,7 +148,7 @@ class NZBExport
}
// If not, decompress it and create a file to store it in.
} else {
$nzbContents = Utility::unzipGzipFile($nzbFile);
$nzbContents = unzipGzipFile($nzbFile);
if (! $nzbContents) {
if ($this->echoCLI) {
echo 'Unable to export NZB with GUID: '.$release['guid'];
+1 -2
View File
@@ -7,7 +7,6 @@ use App\Models\Settings;
use App\Models\UsenetGroup;
use App\Services\BlacklistService;
use App\Services\Categorization\CategorizationService;
use Blacklight\utility\Utility;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
@@ -123,7 +122,7 @@ class NZBImport
if (File::isFile($nzbFile)) {
// Get the contents of the NZB file as a string.
if (Str::endsWith($nzbFile, '.nzb.gz')) {
$nzbString = Utility::unzipGzipFile($nzbFile);
$nzbString = unzipGzipFile($nzbFile);
} else {
$nzbString = File::get($nzbFile);
}
+3 -4
View File
@@ -9,7 +9,6 @@ use App\Models\ReleaseNfo;
use App\Models\Settings;
use App\Models\UsenetGroup;
use App\Services\PostProcessService;
use Blacklight\utility\Utility;
use dariusiii\rarinfo\Par2Info;
use dariusiii\rarinfo\SfvInfo;
use Illuminate\Support\Facades\Cache;
@@ -275,8 +274,8 @@ class Nfo
// File/GetId3 work with files, so save to disk.
File::put($tmpPath, $possibleNFO);
// Use 'file' command via Utility::fileInfo if available
$result = Utility::fileInfo($tmpPath);
// Use 'file' command via fileInfo if available
$result = fileInfo($tmpPath);
if (! empty($result)) {
if (preg_match($this->_textFileRegex, $result)) {
$isNfo = true;
@@ -1214,7 +1213,7 @@ class Nfo
public function cleanNfoContent(string $nfoContent): string
{
// Convert to UTF-8 if needed (CP437 is common for NFOs)
$content = Utility::cp437toUTF($nfoContent);
$content = cp437toUTF($nfoContent);
// Normalize line endings
$content = str_replace(["\r\n", "\r"], "\n", $content);
-49
View File
@@ -1,49 +0,0 @@
<?php
/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see LICENSE.txt in the base directory. If
* not, see:
*
* @link <http://www.gnu.org/licenses/>.
*
* @author ruhllatio
* @copyright 2015 nZEDb
*/
namespace Blacklight\utility;
use App\Models\Country as CountryModel;
/**
* Class Country.
*/
class Country
{
/**
* Get a country code for a country name.
*
* @return mixed
*/
public static function countryCode(string $country)
{
if (\strlen($country) > 2) {
$code = CountryModel::whereFullName($country)->orWhere('name', $country)->first(['iso_3166_2']);
if ($code !== null && isset($code['iso_3166_2'])) {
return $code['iso_3166_2'];
}
}
return '';
}
}
-250
View File
@@ -1,250 +0,0 @@
<?php
namespace Blacklight\utility;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Process;
/**
* Class Utility.
*/
class Utility
{
/**
* Unzip a gzip file, return the output. Return false on error / empty.
*
* @return bool|string
*/
public static function unzipGzipFile(string $filePath)
{
$string = '';
$gzFile = @gzopen($filePath, 'rb', 0);
if ($gzFile) {
while (! gzeof($gzFile)) {
$temp = gzread($gzFile, 1024);
// Check for empty string.
// Without this the loop would be endless and consume 100% CPU.
// Do not set $string empty here, as the data might still be good.
if (! $temp) {
break;
}
$string .= $temp;
}
gzclose($gzFile);
}
return $string === '' ? false : $string;
}
/**
* Creates an array to be used with stream_context_create() to verify openssl certificates
* when connecting to a tls or ssl connection when using stream functions (fopen/file_get_contents/etc).
*
* @param bool $forceIgnore Force ignoring of verification (useful for self-signed certs in development).
* @return array Stream context options for SSL/TLS connections
*
* @static
*/
public static function streamSslContextOptions(bool $forceIgnore = false): array
{
$cafile = config('nntmux_ssl.ssl_cafile', '');
$capath = config('nntmux_ssl.ssl_capath', '');
$hasCustomCerts = $cafile !== '' || $capath !== '';
// Base options - either insecure (no certs configured) or configured
$options = [
'verify_peer' => ! $forceIgnore && $hasCustomCerts && config('nntmux_ssl.ssl_verify_peer', false),
'verify_peer_name' => ! $forceIgnore && $hasCustomCerts && config('nntmux_ssl.ssl_verify_host', false),
'allow_self_signed' => $forceIgnore ? true : config('nntmux_ssl.ssl_allow_self_signed', true),
];
// Add certificate paths if configured
if ($hasCustomCerts && ! $forceIgnore) {
if ($cafile !== '') {
$options['cafile'] = $cafile;
}
if ($capath !== '') {
$options['capath'] = $capath;
}
}
// Additional security options for modern TLS
$options['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT;
$options['disable_compression'] = true; // Prevent CRIME attacks
$options['SNI_enabled'] = true; // Enable Server Name Indication
// If we set the transport to tls and the server falls back to ssl,
// the context options would be for tls and would not apply to ssl,
// so set both tls and ssl context in case the server does not support tls.
return ['tls' => $options, 'ssl' => $options];
}
public static function getCoverURL(array $options = []): string
{
$defaults = [
'id' => null,
'suffix' => '-cover.jpg',
'type' => '',
];
$options += $defaults;
$fileSpecTemplate = '%s/%s%s';
$fileSpec = '';
if (! empty($options['id']) && \in_array(
$options['type'],
['anime', 'audio', 'audiosample', 'book', 'console', 'games', 'movies', 'music', 'preview', 'sample', 'tvrage', 'video', 'xxx'],
false
)
) {
$fileSpec = sprintf($fileSpecTemplate, $options['type'], $options['id'], $options['suffix']);
$fileSpec = file_exists(storage_path('covers/').$fileSpec) ? $fileSpec :
sprintf($fileSpecTemplate, $options['type'], 'no', $options['suffix']);
}
return $fileSpec;
}
/**
* Return file type/info using magic numbers.
* Try using `file` program where available, fallback to using PHP's finfo class.
*
* @param string $path Path to the file / folder to check.
* @return string File info. Empty string on failure.
*
* @throws \Exception
*/
public static function fileInfo(string $path): string
{
$magicPath = config('nntmux_settings.magic_file_path');
if ($magicPath !== null && Process::run('which file')->successful()) {
$magicSwitch = " -m $magicPath";
$output = runCmd('file'.$magicSwitch.' -b "'.$path.'"');
} else {
$fileInfo = $magicPath === null ? finfo_open(FILEINFO_RAW) : finfo_open(FILEINFO_RAW, $magicPath);
$output = finfo_file($fileInfo, $path);
if (empty($output)) {
$output = '';
}
finfo_close($fileInfo);
}
return $output;
}
/**
* Convert Code page 437 chars to UTF.
*/
public static function cp437toUTF(string $string): string
{
return iconv('CP437', 'UTF-8//IGNORE//TRANSLIT', $string);
}
/**
* Fetches an embeddable video to a IMDB trailer from http://www.traileraddict.com.
*/
public static function imdb_trailers($imdbID): string
{
$xml = getRawHtml('https://api.traileraddict.com/?imdb='.$imdbID);
if ($xml !== false && preg_match('#(v\.traileraddict\.com/\d+)#i', $xml, $html)) {
return 'https://'.$html[1];
}
return '';
}
public static function showApiError(int $errorCode = 900, string $errorText = '')
{
$errorHeader = 'HTTP 1.1 400 Bad Request';
if ($errorText === '') {
switch ($errorCode) {
case 100:
$errorText = 'Incorrect user credentials';
$errorHeader = 'HTTP 1.1 401 Unauthorized';
break;
case 101:
$errorText = 'Account suspended';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 102:
$errorText = 'Insufficient privileges/not authorized';
$errorHeader = 'HTTP 1.1 401 Unauthorized';
break;
case 103:
$errorText = 'Registration denied';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 104:
$errorText = 'Registrations are closed';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 105:
$errorText = 'Invalid registration (Email Address Taken)';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 106:
$errorText = 'Invalid registration (Email Address Bad Format)';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 107:
$errorText = 'Registration Failed (Data error)';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 200:
$errorText = 'Missing parameter';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 201:
$errorText = 'Incorrect parameter';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 202:
$errorText = 'No such function';
$errorHeader = 'HTTP 1.1 404 Not Found';
break;
case 203:
$errorText = 'Function not available';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 300:
$errorText = 'No such item';
$errorHeader = 'HTTP 1.1 404 Not Found';
break;
case 500:
$errorText = 'Request limit reached';
$errorHeader = 'HTTP 1.1 429 Too Many Requests';
break;
case 501:
$errorText = 'Download limit reached';
$errorHeader = 'HTTP 1.1 429 Too Many Requests';
break;
case 910:
$errorText = 'API disabled';
$errorHeader = 'HTTP 1.1 401 Unauthorized';
break;
default:
$errorText = 'Unknown error';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
}
}
$response =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".
'<error code="'.$errorCode.'" description="'.$errorText."\"/>\n";
return response($response)->header('Content-type', 'text/xml')->header('Content-Length', strlen($response))->header('X-NNTmux', 'API ERROR ['.$errorCode.'] '.$errorText)->header('HTTP/1.1', $errorHeader);
}
public static function getRange($tableName): LengthAwarePaginator
{
$range = DB::table($tableName);
if ($tableName === 'xxxinfo') {
$range->selectRaw('UNCOMPRESS(plot) AS plot');
}
return $range->orderByDesc('created_at')->paginate(config('nntmux.items_per_page'));
}
}
+305 -2
View File
@@ -1,8 +1,8 @@
<?php
use App\Models\Country as CountryModel;
use App\Models\Release;
use Blacklight\NZB;
use Blacklight\utility\Utility;
use Blacklight\XXX;
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
@@ -304,7 +304,7 @@ if (! function_exists('getStreamingZip')) {
foreach ($guids as $guid) {
$nzbPath = $nzb->NZBPath($guid);
if ($nzbPath) {
$nzbContents = Utility::unzipGzipFile($nzbPath);
$nzbContents = unzipGzipFile($nzbPath);
if ($nzbContents) {
$filename = $guid;
$r = Release::query()->where('guid', $guid)->first();
@@ -682,3 +682,306 @@ if (! function_exists('getAvailableTimezones')) {
return $timezones;
}
}
if (! function_exists('countryCode')) {
/**
* Get a country code for a country name.
*
* @return mixed
*/
function countryCode(string $country)
{
if (\strlen($country) > 2) {
$code = CountryModel::whereFullName($country)->orWhere('name', $country)->first(['iso_3166_2']);
if ($code !== null && isset($code['iso_3166_2'])) {
return $code['iso_3166_2'];
}
}
return '';
}
}
if (! function_exists('unzipGzipFile')) {
/**
* Unzip a gzip file, return the output. Return false on error / empty.
*
* @return bool|string
*/
function unzipGzipFile(string $filePath)
{
$string = '';
$gzFile = @gzopen($filePath, 'rb', 0);
if ($gzFile) {
while (! gzeof($gzFile)) {
$temp = gzread($gzFile, 1024);
// Check for empty string.
// Without this the loop would be endless and consume 100% CPU.
// Do not set $string empty here, as the data might still be good.
if (! $temp) {
break;
}
$string .= $temp;
}
gzclose($gzFile);
}
return $string === '' ? false : $string;
}
}
if (! function_exists('streamSslContextOptions')) {
/**
* Creates an array to be used with stream_context_create() to verify openssl certificates
* when connecting to a tls or ssl connection when using stream functions (fopen/file_get_contents/etc).
*
* @param bool $forceIgnore Force ignoring of verification (useful for self-signed certs in development).
* @return array Stream context options for SSL/TLS connections
*/
function streamSslContextOptions(bool $forceIgnore = false): array
{
$cafile = config('nntmux_ssl.ssl_cafile', '');
$capath = config('nntmux_ssl.ssl_capath', '');
$hasCustomCerts = $cafile !== '' || $capath !== '';
// Base options - either insecure (no certs configured) or configured
$options = [
'verify_peer' => ! $forceIgnore && $hasCustomCerts && config('nntmux_ssl.ssl_verify_peer', false),
'verify_peer_name' => ! $forceIgnore && $hasCustomCerts && config('nntmux_ssl.ssl_verify_host', false),
'allow_self_signed' => $forceIgnore ? true : config('nntmux_ssl.ssl_allow_self_signed', true),
];
// Add certificate paths if configured
if ($hasCustomCerts && ! $forceIgnore) {
if ($cafile !== '') {
$options['cafile'] = $cafile;
}
if ($capath !== '') {
$options['capath'] = $capath;
}
}
// Additional security options for modern TLS
$options['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT;
$options['disable_compression'] = true; // Prevent CRIME attacks
$options['SNI_enabled'] = true; // Enable Server Name Indication
// If we set the transport to tls and the server falls back to ssl,
// the context options would be for tls and would not apply to ssl,
// so set both tls and ssl context in case the server does not support tls.
return ['tls' => $options, 'ssl' => $options];
}
}
if (! function_exists('getCoverURL')) {
function getCoverURL(array $options = []): string
{
$defaults = [
'id' => null,
'suffix' => '-cover.jpg',
'type' => '',
];
$options += $defaults;
$fileSpecTemplate = '%s/%s%s';
$fileSpec = '';
if (! empty($options['id']) && \in_array(
$options['type'],
['anime', 'audio', 'audiosample', 'book', 'console', 'games', 'movies', 'music', 'preview', 'sample', 'tvrage', 'video', 'xxx'],
false
)
) {
$fileSpec = sprintf($fileSpecTemplate, $options['type'], $options['id'], $options['suffix']);
$fileSpec = file_exists(storage_path('covers/').$fileSpec) ? $fileSpec :
sprintf($fileSpecTemplate, $options['type'], 'no', $options['suffix']);
}
return $fileSpec;
}
}
if (! function_exists('fileInfo')) {
/**
* Return file type/info using magic numbers.
* Try using `file` program where available, fallback to using PHP's finfo class.
*
* @param string $path Path to the file / folder to check.
* @return string File info. Empty string on failure.
*
* @throws \Exception
*/
function fileInfo(string $path): string
{
$magicPath = config('nntmux_settings.magic_file_path');
if ($magicPath !== null && \Illuminate\Support\Facades\Process::run('which file')->successful()) {
$magicSwitch = " -m $magicPath";
$output = runCmd('file'.$magicSwitch.' -b "'.$path.'"');
} else {
$fileInfo = $magicPath === null ? finfo_open(FILEINFO_RAW) : finfo_open(FILEINFO_RAW, $magicPath);
$output = finfo_file($fileInfo, $path);
if (empty($output)) {
$output = '';
}
finfo_close($fileInfo);
}
return $output;
}
}
if (! function_exists('cp437toUTF')) {
/**
* Convert Code page 437 chars to UTF.
*/
function cp437toUTF(string $string): string
{
return iconv('CP437', 'UTF-8//IGNORE//TRANSLIT', $string);
}
}
if (! function_exists('imdb_trailers')) {
/**
* Fetches an embeddable video to a IMDB trailer from http://www.traileraddict.com.
*/
function imdb_trailers($imdbID): string
{
$xml = getRawHtml('https://api.traileraddict.com/?imdb='.$imdbID);
if ($xml !== false && preg_match('#(v\.traileraddict\.com/\d+)#i', $xml, $html)) {
return 'https://'.$html[1];
}
return '';
}
}
if (! function_exists('showApiError')) {
function showApiError(int $errorCode = 900, string $errorText = '')
{
$errorHeader = 'HTTP 1.1 400 Bad Request';
if ($errorText === '') {
switch ($errorCode) {
case 100:
$errorText = 'Incorrect user credentials';
$errorHeader = 'HTTP 1.1 401 Unauthorized';
break;
case 101:
$errorText = 'Account suspended';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 102:
$errorText = 'Insufficient privileges/not authorized';
$errorHeader = 'HTTP 1.1 401 Unauthorized';
break;
case 103:
$errorText = 'Registration denied';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 104:
$errorText = 'Registrations are closed';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 105:
$errorText = 'Invalid registration (Email Address Taken)';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 106:
$errorText = 'Invalid registration (Email Address Bad Format)';
$errorHeader = 'HTTP 1.1 403 Forbidden';
break;
case 107:
$errorText = 'Registration Failed (Data error)';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 200:
$errorText = 'Missing parameter';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 201:
$errorText = 'Incorrect parameter';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 202:
$errorText = 'No such function';
$errorHeader = 'HTTP 1.1 404 Not Found';
break;
case 203:
$errorText = 'Function not available';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
case 300:
$errorText = 'No such item';
$errorHeader = 'HTTP 1.1 404 Not Found';
break;
case 500:
$errorText = 'Request limit reached';
$errorHeader = 'HTTP 1.1 429 Too Many Requests';
break;
case 501:
$errorText = 'Download limit reached';
$errorHeader = 'HTTP 1.1 429 Too Many Requests';
break;
case 910:
$errorText = 'API disabled';
$errorHeader = 'HTTP 1.1 401 Unauthorized';
break;
default:
$errorText = 'Unknown error';
$errorHeader = 'HTTP 1.1 400 Bad Request';
break;
}
}
$response =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".
'<error code="'.$errorCode.'" description="'.$errorText."\"/>\n";
return response($response)->header('Content-type', 'text/xml')->header('Content-Length', strlen($response))->header('X-NNTmux', 'API ERROR ['.$errorCode.'] '.$errorText)->header('HTTP/1.1', $errorHeader);
}
}
if (! function_exists('getRange')) {
function getRange($tableName): \Illuminate\Contracts\Pagination\LengthAwarePaginator
{
$range = \Illuminate\Support\Facades\DB::table($tableName);
if ($tableName === 'xxxinfo') {
$range->selectRaw('UNCOMPRESS(plot) AS plot');
}
return $range->orderByDesc('created_at')->paginate(config('nntmux.items_per_page'));
}
}
if (! function_exists('isValidNewznabNzb')) {
/**
* Validate if the content is a valid Newznab NZB file.
*
* @param string $content The NZB file content
* @return bool True if valid NZB, false otherwise
*/
function isValidNewznabNzb(string $content): bool
{
// Check if content starts with valid XML declaration and contains NZB namespace
if (empty($content)) {
return false;
}
// Try to load as XML
libxml_use_internal_errors(true);
$xml = @simplexml_load_string($content);
if ($xml === false) {
libxml_clear_errors();
return false;
}
// Check for NZB namespace or nzb root element
$namespaces = $xml->getNamespaces(true);
$hasNzbNamespace = isset($namespaces['']) && str_contains($namespaces[''], 'nzb');
$isNzbRoot = strtolower($xml->getName()) === 'nzb';
libxml_clear_errors();
return $hasNzbNamespace || $isNzbRoot;
}
}
@@ -5,7 +5,6 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\BasePageController;
use Blacklight\Console;
use Blacklight\Genres;
use Blacklight\utility\Utility;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
@@ -22,7 +21,7 @@ class AdminConsoleController extends BasePageController
$meta_title = $title = 'Console List';
$consoleList = Utility::getRange('consoleinfo');
$consoleList = getRange('consoleinfo');
return view('admin.console.index', compact('consoleList', 'title', 'meta_title'));
}
@@ -5,7 +5,6 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\BasePageController;
use Blacklight\Genres;
use Blacklight\Music;
use Blacklight\utility\Utility;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
@@ -22,10 +21,10 @@ class AdminMusicController extends BasePageController
$search = $request->input('musicsearch', '');
if (! empty($search)) {
$musicList = Utility::getRange('musicinfo', $search);
$musicList = getRange('musicinfo', $search);
$lastSearch = $search;
} else {
$musicList = Utility::getRange('musicinfo');
$musicList = getRange('musicinfo');
$lastSearch = '';
}
+18 -19
View File
@@ -14,7 +14,6 @@ use App\Models\UserDownload;
use App\Models\UserRequest;
use Blacklight\NZB;
use Blacklight\Releases;
use Blacklight\utility\Utility;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
@@ -73,10 +72,10 @@ class ApiController extends BasePageController
$function = 'nzbAdd';
break;
default:
return Utility::showApiError(202, 'No such function ('.$request->input('t').')');
return showApiError(202, 'No such function ('.$request->input('t').')');
}
} else {
return Utility::showApiError(200, 'Missing parameter (t)');
return showApiError(200, 'Missing parameter (t)');
}
$uid = $apiKey = $oldestGrabTime = $thisOldestTime = '';
@@ -87,17 +86,17 @@ class ApiController extends BasePageController
if ($function !== 'c' && $function !== 'r') {
if ($request->missing('apikey') || ($request->has('apikey') && empty($request->input('apikey')))) {
return Utility::showApiError(200, 'Missing parameter (apikey)');
return showApiError(200, 'Missing parameter (apikey)');
}
$apiKey = $request->input('apikey');
$res = User::getByRssToken($apiKey);
if ($res === null) {
return Utility::showApiError(100, 'Incorrect user credentials (wrong API key)');
return showApiError(100, 'Incorrect user credentials (wrong API key)');
}
if ($res->hasRole('Disabled')) {
return Utility::showApiError(101);
return showApiError(101);
}
$uid = $res->id;
@@ -116,7 +115,7 @@ class ApiController extends BasePageController
$thisRequests = UserRequest::getApiRequests($uid);
$grabs = UserDownload::getDownloadRequests($uid);
if ($thisRequests > $maxRequests) {
return Utility::showApiError(500, 'Request limit reached ('.$thisRequests.'/'.$maxRequests.')');
return showApiError(500, 'Request limit reached ('.$thisRequests.'/'.$maxRequests.')');
}
}
@@ -265,7 +264,7 @@ class ApiController extends BasePageController
$this->addCoverURL(
$relData,
function ($release) {
return Utility::getCoverURL(['type' => 'movies', 'id' => $release->imdbid]);
return getCoverURL(['type' => 'movies', 'id' => $release->imdbid]);
}
);
@@ -281,12 +280,12 @@ class ApiController extends BasePageController
return redirect(url('/getnzb?r='.$apiKey.'&id='.$request->input('id').(($request->has('del') && $request->input('del') === '1') ? '&del=1' : '')));
}
return Utility::showApiError(300, 'No such item (the guid you provided has no release in our database)');
return showApiError(300, 'No such item (the guid you provided has no release in our database)');
// Get individual NZB details.
case 'd':
if ($request->missing('id')) {
return Utility::showApiError(200, 'Missing parameter (guid is required for single release details)');
return showApiError(200, 'Missing parameter (guid is required for single release details)');
}
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
@@ -298,7 +297,7 @@ class ApiController extends BasePageController
// Get an NFO file for an individual release.
case 'n':
if ($request->missing('id')) {
return Utility::showApiError(200, 'Missing parameter (id is required for retrieving an NFO)');
return showApiError(200, 'Missing parameter (id is required for retrieving an NFO)');
}
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
@@ -313,12 +312,12 @@ class ApiController extends BasePageController
}, $rel['searchname'].'.nfo', ['Content-type:' => 'application/octet-stream']);
}
echo nl2br(Utility::cp437toUTF($data['nfo']));
echo nl2br(cp437toUTF($data['nfo']));
} else {
return Utility::showApiError(300, 'Release does not have an NFO file associated.');
return showApiError(300, 'Release does not have an NFO file associated.');
}
} else {
return Utility::showApiError(300, 'Release does not exist.');
return showApiError(300, 'Release does not exist.');
}
break;
//
@@ -352,7 +351,7 @@ class ApiController extends BasePageController
return response('File is not an NZB file', 400);
}
// Check if the file is proper xml nzb file.
if (! Utility::isValidNewznabNzb($nzbFile->getContent())) {
if (! isValidNewznabNzb($nzbFile->getContent())) {
return response('File is not a valid Newznab NZB file', 400);
}
if (! File::isDirectory(config('nntmux.nzb_upload_folder'))) {
@@ -406,7 +405,7 @@ class ApiController extends BasePageController
header('Content-type: application/json');
}
if ($response === false) {
return Utility::showApiError(201);
return showApiError(201);
} else {
header('Content-Length: '.\strlen($response));
echo $response;
@@ -461,9 +460,9 @@ class ApiController extends BasePageController
$maxAge = -1;
if ($request->has('maxage')) {
if (! $request->filled('maxage')) {
return Utility::showApiError(201, 'Incorrect parameter (maxage must not be empty)');
return showApiError(201, 'Incorrect parameter (maxage must not be empty)');
} elseif (! is_numeric($request->input('maxage'))) {
return Utility::showApiError(201, 'Incorrect parameter (maxage must be numeric)');
return showApiError(201, 'Incorrect parameter (maxage must be numeric)');
} else {
$maxAge = (int) $request->input('maxage');
}
@@ -541,7 +540,7 @@ class ApiController extends BasePageController
public function verifyEmptyParameter(Request $request, string $parameter)
{
if ($request->has($parameter) && $request->isNotFilled($parameter)) {
return Utility::showApiError(201, 'Incorrect parameter ('.$parameter.' must not be empty)');
return showApiError(201, 'Incorrect parameter ('.$parameter.' must not be empty)');
}
}
+9 -10
View File
@@ -7,7 +7,6 @@ use App\Models\User;
use App\Models\UserDownload;
use App\Models\UsersRelease;
use Blacklight\NZB;
use Blacklight\utility\Utility;
use Exception;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
@@ -100,7 +99,7 @@ class GetNzbController extends BasePageController
private function getUserDataFromSession()
{
if ($this->userdata->hasRole('Disabled')) {
return Utility::showApiError(101);
return showApiError(101);
}
return [
@@ -119,16 +118,16 @@ class GetNzbController extends BasePageController
private function getUserDataFromRssToken(Request $request)
{
if ($request->missing('r')) {
return Utility::showApiError(200);
return showApiError(200);
}
$user = User::getByRssToken($request->input('r'));
if (! $user) {
return Utility::showApiError(100);
return showApiError(100);
}
if ($user->hasRole('Disabled')) {
return Utility::showApiError(101);
return showApiError(101);
}
return [
@@ -150,7 +149,7 @@ class GetNzbController extends BasePageController
{
$requests = UserDownload::getDownloadRequests($uid);
if ($requests > $maxDownloads) {
return Utility::showApiError(501);
return showApiError(501);
}
return null;
@@ -166,7 +165,7 @@ class GetNzbController extends BasePageController
$id = $request->input('id');
if (empty($id)) {
return Utility::showApiError(200, 'Parameter id is required');
return showApiError(200, 'Parameter id is required');
}
// Remove .nzb suffix if present
@@ -204,7 +203,7 @@ class GetNzbController extends BasePageController
// Check if zip download would exceed limits
$requests = UserDownload::getDownloadRequests($uid);
if ($requests + $guidCount > $maxDownloads) {
return Utility::showApiError(501);
return showApiError(501);
}
$zip = getStreamingZip($guids);
@@ -254,13 +253,13 @@ class GetNzbController extends BasePageController
// Get NZB file path and validate
$nzbPath = (new NZB)->getNZBPath($releaseId);
if (! File::exists($nzbPath)) {
return Utility::showApiError(300, 'NZB file not found!');
return showApiError(300, 'NZB file not found!');
}
// Get release data
$releaseData = Release::getByGuid($releaseId);
if ($releaseData === null) {
return Utility::showApiError(300, 'Release not found!');
return showApiError(300, 'Release not found!');
}
// Update statistics
+1 -2
View File
@@ -4,7 +4,6 @@ namespace App\Http\Controllers;
use App\Models\Release;
use App\Models\ReleaseNfo;
use Blacklight\utility\Utility;
use Illuminate\Http\Request;
class NfoController extends BasePageController
@@ -24,7 +23,7 @@ class NfoController extends BasePageController
$nfo = ReleaseNfo::getReleaseNfo($rel['id']);
if ($nfo !== null) {
$nfo['nfoUTF'] = Utility::cp437toUTF($nfo['nfo']);
$nfo['nfoUTF'] = cp437toUTF($nfo['nfo']);
$modal = $request->has('modal');
@@ -8,7 +8,6 @@ use App\Services\AdditionalProcessing\Config\ProcessingConfiguration;
use App\Services\AdditionalProcessing\DTO\ReleaseProcessingContext;
use App\Services\TempWorkspaceService;
use Blacklight\Releases;
use Blacklight\utility\Utility;
use Exception;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
@@ -685,7 +684,7 @@ class AdditionalProcessingOrchestrator
}
// Check file magic
$output = Utility::fileInfo($filePath);
$output = fileInfo($filePath);
if (empty($output)) {
continue;
}
@@ -3,7 +3,6 @@
namespace App\Services\AdditionalProcessing;
use Blacklight\NZB;
use Blacklight\utility\Utility;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
@@ -32,7 +31,7 @@ class NzbContentParser
return ['contents' => [], 'error' => 'NZB not found for GUID: '.$guid];
}
$nzbContents = Utility::unzipGzipFile($nzbPath);
$nzbContents = unzipGzipFile($nzbPath);
if (! $nzbContents) {
// Try repair on raw file contents
$nzbContents = $this->attemptRawRepair($nzbPath);
@@ -440,9 +440,9 @@ class ReleaseFileManager
}
// Try CP437 (DOS encoding - common for scene NFOs with ASCII art)
// Use the utility function if available
if (class_exists('\Blacklight\utility\Utility') && method_exists('\Blacklight\utility\Utility', 'cp437toUTF')) {
return \Blacklight\utility\Utility::cp437toUTF($data);
// Use the cp437toUTF helper function
if (function_exists('cp437toUTF')) {
return cp437toUTF($data);
}
// Fallback: try ISO-8859-1 (Latin-1)
@@ -10,7 +10,6 @@ use App\Models\TvInfo;
use App\Models\Video;
use Blacklight\ColorCLI;
use Blacklight\Releases;
use Blacklight\utility\Country;
use Illuminate\Support\Facades\DB;
/**
@@ -182,7 +181,7 @@ abstract class AbstractTvProvider extends BaseVideoProvider
// Check if the country is not a proper code and retrieve if not
if ($show['country'] !== '' && \strlen($show['country']) > 2) {
$show['country'] = Country::countryCode($show['country']);
$show['country'] = countryCode($show['country']);
}
// Check if video already exists based on site ID info
@@ -257,7 +256,7 @@ abstract class AbstractTvProvider extends BaseVideoProvider
public function update(int $videoId, array $show = []): void
{
if ($show['country'] !== '') {
$show['country'] = Country::countryCode($show['country']);
$show['country'] = countryCode($show['country']);
}
$ifStringID = 'IF(%s = 0, %s, %s)';
+1 -2
View File
@@ -7,7 +7,6 @@ use Blacklight\ColorCLI;
use Blacklight\NZB;
use Blacklight\ReleaseImage;
use Blacklight\Releases;
use Blacklight\utility\Utility;
use Illuminate\Support\Facades\File;
$dir = resource_path().'/movednzbs/';
@@ -41,7 +40,7 @@ $itr = new RecursiveIteratorIterator($dirItr, RecursiveIteratorIterator::LEAVES_
foreach ($itr as $filePath) {
$guid = stristr($filePath->getFilename(), '.nzb.gz', true);
if (File::isFile($filePath) && $guid) {
$nzbfile = Utility::unzipGzipFile($filePath);
$nzbfile = unzipGzipFile($filePath);
$nzbContents = $nzb->nzbFileList($nzbfile, ['no-file-key' => false, 'strip-count' => true]);
if (! $nzbfile || ! @simplexml_load_string($nzbfile) || count($nzbContents) === 0) {
if ($argv[1] === 'move') {