mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-29 01:08:56 +00:00
0eeba5532d
[ci skip] [skip ci]
541 lines
21 KiB
PHP
Executable File
541 lines
21 KiB
PHP
Executable File
<?php
|
|
|
|
namespace Blacklight;
|
|
|
|
use App\Models\AudioData;
|
|
use App\Models\VideoData;
|
|
use App\Models\ReleaseUnique;
|
|
use App\Models\ReleaseSubtitle;
|
|
use Blacklight\utility\Utility;
|
|
use App\Models\ReleaseExtraFull;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class ReleaseExtra
|
|
{
|
|
/**
|
|
* @var \PDO
|
|
*/
|
|
public $pdo;
|
|
|
|
/**
|
|
* ReleaseExtra constructor.
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->pdo = DB::connection()->getPdo();
|
|
}
|
|
|
|
/**
|
|
* @param $id
|
|
*
|
|
* @return \Illuminate\Database\Eloquent\Model|null|static
|
|
*/
|
|
public function get($id)
|
|
{
|
|
// hopefully nothing will use this soon and it can be deleted
|
|
return VideoData::query()->where('releases_id', $id)->first();
|
|
}
|
|
|
|
/**
|
|
* @param $id
|
|
*
|
|
* @return array|false
|
|
*/
|
|
public function getVideo($id)
|
|
{
|
|
$result = VideoData::query()->where('releases_id', $id)->first();
|
|
|
|
if ($result !== null) {
|
|
return $result->toArray();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @param $id
|
|
*
|
|
* @return array|false
|
|
*/
|
|
public function getAudio($id)
|
|
{
|
|
$result = AudioData::query()->where('releases_id', $id)->orderBy('audioid')->get();
|
|
|
|
if ($result !== null) {
|
|
return $result->toArray();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @param $id
|
|
*
|
|
* @return \Illuminate\Database\Eloquent\Model|null|static
|
|
*/
|
|
public function getSubs($id)
|
|
{
|
|
return ReleaseSubtitle::query()->where('releases_id', $id)->select([DB::raw("GROUP_CONCAT(subslanguage SEPARATOR ', ') AS subs")])->orderBy('subsid')->first();
|
|
}
|
|
|
|
/**
|
|
* @param string $guid
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getBriefByGuid($guid): array
|
|
{
|
|
return DB::select(sprintf("SELECT containerformat, videocodec, videoduration, videoaspect,
|
|
CONCAT(video_data.videowidth,'x',video_data.videoheight,' @',format(videoframerate,0),'fps') AS size,
|
|
GROUP_CONCAT(DISTINCT audio_data.audiolanguage SEPARATOR ', ') AS audio,
|
|
GROUP_CONCAT(DISTINCT audio_data.audioformat,' (',SUBSTRING(audio_data.audiochannels,1,1),' ch)' SEPARATOR ', ') AS audioformat,
|
|
GROUP_CONCAT(DISTINCT audio_data.audioformat,' (',SUBSTRING(audio_data.audiochannels,1,1),' ch)' SEPARATOR ', ') AS audioformat,
|
|
GROUP_CONCAT(DISTINCT release_subtitles.subslanguage SEPARATOR ', ') AS subs
|
|
FROM video_data
|
|
LEFT OUTER JOIN release_subtitles ON video_data.releases_id = release_subtitles.releases_id
|
|
LEFT OUTER JOIN audio_data ON video_data.releases_id = audio_data.releases_id
|
|
INNER JOIN releases r ON r.id = video_data.releases_id
|
|
WHERE r.guid = %s
|
|
GROUP BY r.id LIMIT 1", $this->pdo->quote($guid)));
|
|
}
|
|
|
|
/**
|
|
* @param $guid
|
|
*
|
|
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|\Illuminate\Database\Query\Builder|null|object
|
|
*/
|
|
public function getByGuid($guid)
|
|
{
|
|
return VideoData::query()->where('r.guid', $guid)->leftJoin('releases as r', 'r.id', '=', 'video_data.releases_id')->first();
|
|
}
|
|
|
|
/**
|
|
* @param $id
|
|
*/
|
|
public function delete($id): void
|
|
{
|
|
AudioData::query()->where('releases_id', $id)->delete();
|
|
ReleaseSubtitle::query()->where('releases_id', $id)->delete();
|
|
VideoData::query()->where('releases_id', $id)->delete();
|
|
}
|
|
|
|
/**
|
|
* @param $releaseID
|
|
* @param $xml
|
|
*/
|
|
public function addFromXml($releaseID, $xml): void
|
|
{
|
|
$xmlObj = @simplexml_load_string($xml);
|
|
$arrXml = Utility::objectsIntoArray($xmlObj);
|
|
$containerFormat = '';
|
|
$overallBitRate = '';
|
|
|
|
$mediaInfoVersion = 0;
|
|
if (\in_array('File', $arrXml, false) && \in_array('track', $arrXml['File'], false)) {
|
|
$mediaInfoVersion = 1;
|
|
}
|
|
if (\in_array('@attributes', $arrXml, false) && \in_array('@version', $arrXml['@attributes'], false)) {
|
|
$mediaInfoVersion = (int) $arrXml['@attributes']['version'];
|
|
}
|
|
if ($mediaInfoVersion < 1) {
|
|
if (isset($arrXml['File']['track'])) {
|
|
$mediaInfoVersion = 1;
|
|
}
|
|
if (isset($arrXml['@attributes']['version'])) {
|
|
$mediaInfoVersion = (int) $arrXml['@attributes']['version'];
|
|
}
|
|
}
|
|
|
|
switch ($mediaInfoVersion) {
|
|
|
|
/*
|
|
* MediaInfo Schema v1 (1.x - 7.99)
|
|
*/
|
|
case 1:
|
|
foreach ($arrXml['File']['track'] as $track) {
|
|
if (isset($track['@attributes']['type'])) {
|
|
if ($track['@attributes']['type'] === 'General') {
|
|
if (isset($track['Format'])) {
|
|
$containerFormat = $track['Format'];
|
|
}
|
|
if (isset($track['Overall_bit_rate'])) {
|
|
$overallBitRate = $track['Overall_bit_rate'];
|
|
}
|
|
if (isset($track['Unique_ID']) && preg_match('/(?P<uid>^\d+)/i', $track['Unique_ID'], $matches)) {
|
|
$uniqueId = $matches['uid'];
|
|
$this->addUID($releaseID, $uniqueId);
|
|
}
|
|
} elseif ($track['@attributes']['type'] === 'Video') {
|
|
$videoDuration = $videoFormat = $videoCodec = $videoWidth = $videoHeight = $videoAspect = $videoFrameRate = $videoLibrary = '';
|
|
if (isset($track['Duration'])) {
|
|
$videoDuration = $track['Duration'];
|
|
}
|
|
if (isset($track['Format'])) {
|
|
$videoFormat = $track['Format'];
|
|
}
|
|
if (isset($track['Codec_ID'])) {
|
|
$videoCodec = $track['Codec_ID'];
|
|
}
|
|
if (isset($track['Width'])) {
|
|
$videoWidth = preg_replace('/[^0-9]/', '', $track['Width']);
|
|
}
|
|
if (isset($track['Height'])) {
|
|
$videoHeight = preg_replace('/[^0-9]/', '', $track['Height']);
|
|
}
|
|
if (isset($track['Display_aspect_ratio'])) {
|
|
$videoAspect = $track['Display_aspect_ratio'];
|
|
}
|
|
if (isset($track['Frame_rate'])) {
|
|
$videoFrameRate = str_replace(' fps', '', $track['Frame_rate']);
|
|
}
|
|
if (isset($track['Writing_library'])) {
|
|
$videoLibrary = $track['Writing_library'];
|
|
}
|
|
$this->addVideo($releaseID, $containerFormat, $overallBitRate, $videoDuration, $videoFormat, $videoCodec, $videoWidth, $videoHeight, $videoAspect, $videoFrameRate, $videoLibrary);
|
|
} elseif ($track['@attributes']['type'] === 'Audio') {
|
|
$audioID = 1;
|
|
$audioFormat = $audioMode = $audioBitRateMode = $audioBitRate = $audioChannels = $audioSampleRate = $audioLibrary = $audioLanguage = $audioTitle = '';
|
|
if (isset($track['@attributes']['streamid'])) {
|
|
$audioID = $track['@attributes']['streamid'];
|
|
}
|
|
if (isset($track['Format'])) {
|
|
$audioFormat = $track['Format'];
|
|
}
|
|
if (isset($track['Mode'])) {
|
|
$audioMode = $track['Mode'];
|
|
}
|
|
if (isset($track['Bit_rate_mode'])) {
|
|
$audioBitRateMode = $track['Bit_rate_mode'];
|
|
}
|
|
if (isset($track['Bit_rate'])) {
|
|
$audioBitRate = $track['Bit_rate'];
|
|
}
|
|
if (isset($track['Channel_s_'])) {
|
|
$audioChannels = $track['Channel_s_'];
|
|
}
|
|
if (isset($track['Sampling_rate'])) {
|
|
$audioSampleRate = $track['Sampling_rate'];
|
|
}
|
|
if (isset($track['Writing_library'])) {
|
|
$audioLibrary = $track['Writing_library'];
|
|
}
|
|
if (isset($track['Language'])) {
|
|
$audioLanguage = $track['Language'];
|
|
}
|
|
if (! empty($track['Title'])) {
|
|
$audioTitle = $track['Title'];
|
|
}
|
|
$this->addAudio($releaseID, $audioID, $audioFormat, $audioMode, $audioBitRateMode, $audioBitRate, $audioChannels, $audioSampleRate, $audioLibrary, $audioLanguage, $audioTitle);
|
|
} elseif ($track['@attributes']['type'] === 'Text') {
|
|
$subsID = 1;
|
|
$subsLanguage = 'Unknown';
|
|
if (isset($track['@attributes']['streamid'])) {
|
|
$subsID = $track['@attributes']['streamid'];
|
|
}
|
|
if (isset($track['Language'])) {
|
|
$subsLanguage = $track['Language'];
|
|
}
|
|
$this->addSubs($releaseID, $subsID, $subsLanguage);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
/*
|
|
* MediaInfo Schema v2 (mediaInfo version > 7.99)
|
|
*/
|
|
foreach ($arrXml['media']['track'] as $track) {
|
|
$type = '';
|
|
|
|
if (isset($track['@attributes']['type'])) {
|
|
$type = $track['@attributes']['type'];
|
|
}
|
|
|
|
if (isset($track['type'])) {
|
|
$type = $track['type'];
|
|
}
|
|
|
|
if ($type === 'General') {
|
|
if (! empty($track['UniqueID']) && (int) $track['UniqueID'] !== 1) {
|
|
$uniqueId = $track['UniqueID'];
|
|
$this->addUID($releaseID, $uniqueId);
|
|
}
|
|
|
|
if (isset($track['Format'])) {
|
|
$containerFormat = $track['Format'];
|
|
}
|
|
|
|
if (isset($track['OverallBitRate_Nominal'])) {
|
|
$overallBitRate = $track['OverallBitRate_Nominal'];
|
|
}
|
|
|
|
if (isset($track['OverallBitRate'])) {
|
|
$overallBitRate = $track['OverallBitRate'];
|
|
}
|
|
} elseif ($type === 'Video') {
|
|
$videoDuration = $videoFormat = $videoCodec = $videoWidth = $videoHeight = $videoAspect = $videoFrameRate = $videoLibrary = $videoBitRate = '';
|
|
|
|
if (isset($track['Duration'])) {
|
|
$videoDuration = $track['Duration'];
|
|
}
|
|
|
|
if (isset($track['Format'])) {
|
|
$videoFormat = $track['Format'];
|
|
}
|
|
|
|
if (isset($track['CodecID'])) {
|
|
$videoCodec = $track['CodecID'];
|
|
}
|
|
|
|
if (isset($track['Width'])) {
|
|
$videoWidth = $track['Width'];
|
|
}
|
|
|
|
if (isset($track['Height'])) {
|
|
$videoHeight = $track['Height'];
|
|
}
|
|
|
|
if (isset($track['DisplayAspectRatio'])) {
|
|
$videoAspect = $track['DisplayAspectRatio'];
|
|
}
|
|
|
|
if (isset($track['FrameRate'])) {
|
|
$videoFrameRate = $track['FrameRate'];
|
|
}
|
|
|
|
if (isset($track['Encoded_Library_Version'])) {
|
|
$videoLibrary = $track['Encoded_Library_Version'];
|
|
}
|
|
|
|
if (isset($track['Encoded_Library'])) {
|
|
$videoLibrary = $track['Encoded_Library'];
|
|
}
|
|
|
|
if (isset($track['BitRate'])) {
|
|
$videoBitRate = $track['BitRate'];
|
|
}
|
|
|
|
if (isset($track['BitRate_Nominal'])) {
|
|
$videoBitRate = $track['BitRate_Nominal'];
|
|
}
|
|
|
|
if (! empty($videoBitRate)) {
|
|
$overallBitRate = $videoBitRate;
|
|
}
|
|
|
|
$this->addVideo($releaseID, $containerFormat, $overallBitRate, $videoDuration, $videoFormat, $videoCodec, $videoWidth, $videoHeight, $videoAspect, $videoFrameRate, $videoLibrary);
|
|
} elseif ($type === 'Audio') {
|
|
$audioID = 1;
|
|
$audioFormat = $audioMode = $audioBitRateMode = $audioBitRate = $audioChannels = $audioSampleRate = $audioLibrary = $audioLanguage = $audioTitle = '';
|
|
|
|
if (isset($track['ID'])) {
|
|
$audioID = $track['ID'];
|
|
}
|
|
|
|
if (isset($track['Format'])) {
|
|
$audioFormat = $track['Format'];
|
|
}
|
|
|
|
if (isset($track['Mode'])) {
|
|
$audioMode = $track['Mode'];
|
|
}
|
|
|
|
if (isset($track['Format_Settings_Mode'])) {
|
|
$audioMode = $track['Format_Settings_Mode'];
|
|
}
|
|
|
|
if (isset($track['BitRate_Mode'])) {
|
|
$audioBitRateMode = $track['BitRate_Mode'];
|
|
}
|
|
|
|
if (isset($track['BitRate'])) {
|
|
$audioBitRate = $track['BitRate'];
|
|
}
|
|
|
|
if (isset($track['Channels'])) {
|
|
$audioChannels = $track['Channels'];
|
|
}
|
|
|
|
if (isset($track['SamplingRate'])) {
|
|
$audioSampleRate = $track['SamplingRate'];
|
|
}
|
|
|
|
if (isset($track['Encoded_Library'])) {
|
|
$audioLibrary = $track['Encoded_Library'];
|
|
}
|
|
|
|
if (isset($track['Language'])) {
|
|
$audioLanguage = $track['Language'];
|
|
}
|
|
|
|
if (isset($track['Title'])) {
|
|
$audioTitle = $track['Title'];
|
|
}
|
|
|
|
$this->addAudio($releaseID, $audioID, $audioFormat, $audioMode, $audioBitRateMode, $audioBitRate, $audioChannels, $audioSampleRate, $audioLibrary, $audioLanguage, $audioTitle);
|
|
} elseif ($type === 'Text') {
|
|
$subsID = 1;
|
|
$subsLanguage = 'Unknown';
|
|
|
|
if (isset($track['ID'])) {
|
|
$subsID = $track['ID'];
|
|
}
|
|
|
|
if (isset($track['Language'])) {
|
|
$subsLanguage = $track['Language'];
|
|
}
|
|
|
|
$this->addSubs($releaseID, $subsID, $subsLanguage);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $releaseID
|
|
* @param $containerFormat
|
|
* @param $overallBitRate
|
|
* @param $videoDuration
|
|
* @param $videoFormat
|
|
* @param $videoCodec
|
|
* @param $videoWidth
|
|
* @param $videoHeight
|
|
* @param $videoAspect
|
|
* @param $videoFrameRate
|
|
* @param $videoLibrary
|
|
*/
|
|
public function addVideo(
|
|
$releaseID,
|
|
$containerFormat,
|
|
$overallBitRate,
|
|
$videoDuration,
|
|
$videoFormat,
|
|
$videoCodec,
|
|
$videoWidth,
|
|
$videoHeight,
|
|
$videoAspect,
|
|
$videoFrameRate,
|
|
$videoLibrary
|
|
): void {
|
|
$ckid = VideoData::query()->where('releases_id', $releaseID)->first(['releases_id']);
|
|
if ($ckid === null) {
|
|
VideoData::query()->insert([
|
|
'releases_id' => $releaseID,
|
|
'containerformat' => $containerFormat,
|
|
'overallbitrate' => $overallBitRate,
|
|
'videoduration' => $videoDuration,
|
|
'videoformat' => $videoFormat,
|
|
'videocodec' => $videoCodec,
|
|
'videowidth' => $videoWidth,
|
|
'videoheight' => $videoHeight,
|
|
'videoaspect' => $videoAspect,
|
|
'videoframerate' => $videoFrameRate,
|
|
'videolibrary' => substr($videoLibrary, 0, 50),
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $releaseID
|
|
* @param $audioID
|
|
* @param $audioFormat
|
|
* @param $audioMode
|
|
* @param $audioBitRateMode
|
|
* @param $audioBitRate
|
|
* @param $audioChannels
|
|
* @param $audioSampleRate
|
|
* @param $audioLibrary
|
|
* @param $audioLanguage
|
|
* @param $audioTitle
|
|
*/
|
|
private function addAudio($releaseID, $audioID, $audioFormat, $audioMode, $audioBitRateMode, $audioBitRate, $audioChannels, $audioSampleRate, $audioLibrary, $audioLanguage, $audioTitle): void
|
|
{
|
|
$ckid = AudioData::query()->where('releases_id', $releaseID)->first(['releases_id']);
|
|
if ($ckid === null) {
|
|
AudioData::query()->insert([
|
|
'releases_id' => $releaseID,
|
|
'audioid' => $audioID,
|
|
'audioformat' => $audioFormat,
|
|
'audiomode' => $audioMode,
|
|
'audiobitratemode' => $audioBitRateMode,
|
|
'audiobitrate' => substr($audioBitRate, 0, 10),
|
|
'audiochannels' => $audioChannels,
|
|
'audiosamplerate' => substr($audioSampleRate, 0, 25),
|
|
'audiolibrary' => substr($audioLibrary, 0, 50),
|
|
'audiolanguage' => $audioLanguage,
|
|
'audiotitle' => substr($audioTitle, 0, 50),
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $releaseID
|
|
* @param $subsID
|
|
* @param $subsLanguage
|
|
*/
|
|
private function addSubs($releaseID, $subsID, $subsLanguage): void
|
|
{
|
|
$ckid = ReleaseSubtitle::query()->where('releases_id', $releaseID)->first(['releases_id']);
|
|
if ($ckid === null) {
|
|
ReleaseSubtitle::query()->insert([
|
|
'releases_id' => $releaseID,
|
|
'subsid' => $subsID,
|
|
'subslanguage' => $subsLanguage,
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param int $releaseID
|
|
* @param string $uniqueId
|
|
*/
|
|
public function addUID($releaseID, $uniqueId): void
|
|
{
|
|
$dupecheck = ReleaseUnique::query()->where('releases_id', $releaseID)->orWhere([
|
|
'releases_id' => $releaseID,
|
|
'uniqueid' => $uniqueId,
|
|
])->first(['releases_id']);
|
|
if ($dupecheck === null) {
|
|
ReleaseUnique::query()->insert([
|
|
'releases_id' => $releaseID,
|
|
'uniqueid' => $uniqueId,
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $id
|
|
*
|
|
* @return \Illuminate\Database\Eloquent\Model|null|static
|
|
*/
|
|
public function getFull($id)
|
|
{
|
|
return ReleaseExtraFull::query()->where('releases_id', $id)->first();
|
|
}
|
|
|
|
/***
|
|
* @param $id
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function deleteFull($id)
|
|
{
|
|
return ReleaseExtraFull::query()->where('releases_id', $id)->delete();
|
|
}
|
|
|
|
/**
|
|
* @param $id
|
|
* @param $xml
|
|
*/
|
|
public function addFull($id, $xml): void
|
|
{
|
|
$ckid = ReleaseExtraFull::query()->where('releases_id', $id)->first();
|
|
if ($ckid === null) {
|
|
ReleaseExtraFull::query()->insert(['releases_id' => $id, 'mediainfo' => $xml]);
|
|
}
|
|
}
|
|
}
|