/** * Fetch MediaInfo and a OGG sample for a Audio file. * * @param string $fileLocation * @param string $fileExtension * * @return bool */ protected function _getAudioInfo($fileLocation, $fileExtension) { // Return values. $retVal = $audVal = false; // Check if audio sample fetching is on. if ($this->_processAudioSample === false) { $audVal = true; } // Check if media info fetching is on. if ($this->_processAudioInfo === false) { $retVal = true; } // Make sure the category is music or other. $rQuery = $this->pdo->queryOneRow(sprintf('SELECT searchname, categoryid AS id, group_id FROM releases WHERE proc_pp = 0 AND id = %d', $this->_release['id'])); $musicParent = (string) Category::CAT_PARENT_MUSIC; if ($rQuery === false || !preg_match(sprintf('/%d\\d{3}|%d|%d|%d/', $musicParent[0], Category::CAT_MISC, Category::CAT_MOVIE_OTHER, Category::CAT_TV_OTHER), $rQuery['id'])) { return false; } if (is_file($fileLocation)) { // Check if media info is enabled. if ($retVal === false) { // Get the media info for the file. $xmlArray = Misc::runCmd($this->_killString . $this->pdo->getSetting('mediainfopath') . '" --Output=XML "' . $fileLocation . '"'); if (is_array($xmlArray)) { // Convert to array. $arrXml = Misc::objectsIntoArray(@simplexml_load_string(implode("\n", $xmlArray))); if (isset($arrXml['File']['track'])) { foreach ($arrXml['File']['track'] as $track) { if (isset($track['Album']) && isset($track['Performer'])) { if (nZEDb_RENAME_MUSIC_MEDIAINFO && $this->_release['preid'] == 0) { // Make the extension upper case. $ext = strtoupper($fileExtension); // Form a new search name. if (!empty($track['Recorded_date']) && preg_match('/(?:19|20)\\d\\d/', $track['Recorded_date'], $Year)) { $newName = $track['Performer'] . ' - ' . $track['Album'] . ' (' . $Year[0] . ') ' . $ext; } else { $newName = $track['Performer'] . ' - ' . $track['Album'] . ' ' . $ext; } // Get the category or try to determine it. if ($ext === 'MP3') { $newCat = Category::CAT_MUSIC_MP3; } else { if ($ext === 'FLAC') { $newCat = Category::CAT_MUSIC_LOSSLESS; } else { $newCat = $this->_categorize->determineCategory($rQuery['group_id'], $newName); } } $newTitle = $this->pdo->escapeString(substr($newName, 0, 255)); // Update the search name. $this->pdo->queryExec(sprintf(' UPDATE releases SET searchname = %s, categoryid = %d, iscategorized = 1, isrenamed = 1, proc_pp = 1 WHERE id = %d', $newTitle, $newCat, $this->_release['id'])); $this->sphinx->updateRelease($this->_release['id'], $this->pdo); // Echo the changed name. if ($this->_echoCLI) { NameFixer::echoChangedReleaseName(['new_name' => $newName, 'old_name' => $rQuery['searchname'], 'new_category' => $newCat, 'old_category' => $rQuery['id'], 'group' => $rQuery['group_id'], 'release_id' => $this->_release['id'], 'method' => 'ProcessAdditional->_getAudioInfo']); } } // Add the media info. $this->_releaseExtra->addFromXml($this->_release['id'], $xmlArray); $retVal = true; $this->_foundAudioInfo = true; if ($this->_echoCLI) { $this->_echo('a', 'primaryOver', false); } break; } } } } } // Check if creating audio samples is enabled. if ($audVal === false) { // File name to store audio file. $audioFileName = $this->_release['guid'] . '.ogg'; // Create an audio sample. Misc::runCmd($this->_killString . $this->pdo->getSetting('ffmpegpath') . '" -t 30 -i "' . $fileLocation . '" -acodec libvorbis -loglevel quiet -y "' . $this->tmpPath . $audioFileName . '"'); // Check if the new file was created. if (is_file($this->tmpPath . $audioFileName)) { // Try to move the temp audio file. $renamed = rename($this->tmpPath . $audioFileName, $this->_audioSavePath . $audioFileName); if (!$renamed) { // Try to copy it if it fails. $copied = copy($this->tmpPath . $audioFileName, $this->_audioSavePath . $audioFileName); // Delete the old file. unlink($this->tmpPath . $audioFileName); // If it didn't copy continue. if (!$copied) { return false; } } // Try to set the file perms. @chmod($this->_audioSavePath . $audioFileName, 0764); // Update DB to said we got a audio sample. $this->pdo->queryExec(sprintf(' UPDATE releases SET audiostatus = 1 WHERE id = %d', $this->_release['id'])); $audVal = $this->_foundAudioSample = true; if ($this->_echoCLI) { $this->_echo('A', 'primaryOver', false); } } } } return $retVal && $audVal; }
public function getRageMatch($showInfo) { $title = $showInfo['cleanname']; // Full search gives us the akas. $xml = Misc::getUrl(['url' => $this->xmlFullSearchUrl . urlencode(strtolower($title))]); if ($xml !== false) { $arrXml = @Misc::objectsIntoArray(simplexml_load_string($xml)); if (isset($arrXml['show']) && is_array($arrXml)) { // We got a valid xml response $titleMatches = $urlMatches = $akaMatches = []; if (isset($arrXml['show']['showid'])) { // We got exactly 1 match so lets convert it to an array so we can use it in the logic below. $newArr = []; $newArr[] = $arrXml['show']; unset($arrXml); $arrXml['show'] = $newArr; } foreach ($arrXml['show'] as $arr) { $tvrlink = ''; // Get a match percentage based on our name and the name returned from tvr. $titlepct = $this->checkMatch($title, $arr['name']); if ($titlepct !== false) { $titleMatches[$titlepct][] = ['title' => $arr['name'], 'showid' => $arr['showid'], 'country' => $this->countryCode($arr['country']), 'genres' => $arr['genres'], 'tvr' => $arr]; } // Get a match percentage based on our name and the url returned from tvr. if (isset($arr['link']) && preg_match('/tvrage\\.com\\/((?!shows)[^\\/]*)$/i', $arr['link'], $tvrlink)) { $urltitle = str_replace('_', ' ', $tvrlink[1]); $urlpct = $this->checkMatch($title, $urltitle); if ($urlpct !== false) { $urlMatches[$urlpct][] = ['title' => $urltitle, 'showid' => $arr['showid'], 'country' => $this->countryCode($arr['country']), 'genres' => $arr['genres'], 'tvr' => $arr]; } } // Check if there are any akas for this result and get a match percentage for them too. if (isset($arr['akas']['aka'])) { if (is_array($arr['akas']['aka'])) { // Multuple akas. foreach ($arr['akas']['aka'] as $aka) { $akapct = $this->checkMatch($title, $aka); if ($akapct !== false) { $akaMatches[$akapct][] = ['title' => $aka, 'showid' => $arr['showid'], 'country' => $this->countryCode($arr['country']), 'genres' => $arr['genres'], 'tvr' => $arr]; } } } else { // One aka. $akapct = $this->checkMatch($title, $arr['akas']['aka']); if ($akapct !== false) { $akaMatches[$akapct][] = ['title' => $arr['akas']['aka'], 'showid' => $arr['showid'], 'country' => $this->countryCode($arr['country']), 'genres' => $arr['genres'], 'tvr' => $arr]; } } } } // Reverse sort our matches so highest matches are first. krsort($titleMatches); krsort($urlMatches); krsort($akaMatches); // Look for 100% title matches first. if (isset($titleMatches[100])) { if ($this->echooutput) { echo $this->pdo->log->primary('Found 100% match: "' . $titleMatches[100][0]['title'] . '"'); } return $titleMatches[100][0]; } // Look for 100% url matches next. if (isset($urlMatches[100])) { if ($this->echooutput) { echo $this->pdo->log->primary('Found 100% url match: "' . $urlMatches[100][0]['title'] . '"'); } return $urlMatches[100][0]; } // Look for 100% aka matches next. if (isset($akaMatches[100])) { if ($this->echooutput) { echo $this->pdo->log->primary('Found 100% aka match: "' . $akaMatches[100][0]['title'] . '"'); } return $akaMatches[100][0]; } // No 100% matches, loop through what we got and if our next closest match is more than TvRage::MATCH_PROBABILITY % of the title lets take it. foreach ($titleMatches as $mk => $mv) { // Since its not 100 match if we have country info lets use that to make sure we get the right show. if (isset($showInfo['country']) && !empty($showInfo['country']) && !empty($mv[0]['country'])) { if (strtolower($showInfo['country']) != strtolower($mv[0]['country'])) { continue; } } if ($this->echooutput) { echo $this->pdo->log->primary('Found ' . $mk . '% match: "' . $titleMatches[$mk][0]['title'] . '"'); } return $titleMatches[$mk][0]; } // Same as above but for akas. foreach ($akaMatches as $ak => $av) { if (isset($showInfo['country']) && !empty($showInfo['country']) && !empty($av[0]['country'])) { if (strtolower($showInfo['country']) != strtolower($av[0]['country'])) { continue; } } if ($this->echooutput) { echo $this->pdo->log->primary('Found ' . $ak . '% aka match: "' . $akaMatches[$ak][0]['title'] . '"'); } return $akaMatches[$ak][0]; } if ($this->echooutput) { echo $this->pdo->log->primary('No match found on TVRage trying Trakt.'); } return false; } else { if ($this->echooutput) { echo $this->pdo->log->primary('Nothing returned from tvrage.'); } return false; } } else { return -1; } }
/** * Main function for matching a releae searchname to a TvRage title * Returns basic show information array or -1 int if no match * * @param $showInfo * * @return array|int */ public function getShowInfo($showInfo) { $matchedTitle = -1; $title = $showInfo['cleanname']; // Full search gives us the akas. $xml = Misc::getUrl(['url' => $this->xmlFullSearchUrl . urlencode(strtolower($title))]); if ($xml !== false) { $arrXml = @Misc::objectsIntoArray(simplexml_load_string($xml)); // CheckXML Response is valid before processing if (isset($arrXml['show']) && is_array($arrXml)) { // We got exactly 1 match so lets convert it to an array so we can use it in the logic below. if (isset($arrXml['show']['showid'])) { $newArr[] = $arrXml['show']; unset($arrXml); $arrXml['show'] = $newArr; } $highestPercent = 0; foreach ($arrXml['show'] as $show) { if ($title == $show['name']) { $matchedTitle = $show; break; } // Get a match percentage based on our name and the name returned from tvr. $matchPercent = $this->checkMatch($title, $show['name'], self::MATCH_PROBABILITY); if ($matchPercent > $highestPercent) { $matchedTitle = $show; $highestPercent = $matchPercent; } // Check if there are any akas for this result and get a match percentage for them too. if (isset($show['akas']['aka'])) { if (is_array($show['akas']['aka'])) { // Multiple akas. foreach ($show['akas']['aka'] as $aka) { $matchPercent = $this->checkMatch($title, $aka, self::MATCH_PROBABILITY); if ($matchPercent > $highestPercent) { $matchedTitle = $show; $highestPercent = $matchPercent; } } } else { // One aka. $matchPercent = $this->checkMatch($title, $show['akas']['aka'], self::MATCH_PROBABILITY); if ($matchPercent > $highestPercent) { $show['akas']['aka'][] = $show['akas']['aka']; $matchedTitle = $show; $highestPercent = $matchPercent; } } } } } else { if ($this->echooutput) { echo $this->pdo->log->primary('Nothing returned from tvrage.'); } } } return $this->formatShowInfo($matchedTitle); }
public function addFromXml($releaseID, $xml) { $xmlObj = @simplexml_load_string($xml); $arrXml = Misc::objectsIntoArray($xmlObj); $containerformat = ''; $overallbitrate = ''; if (isset($arrXml['File']) && isset($arrXml['File']['track'])) { foreach ($arrXml['File']['track'] as $track) { if (isset($track['@attributes']) && 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']; } } else { if ($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); } else { if ($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 (isset($track['Title'])) { $audiotitle = $track['Title']; } $this->addAudio($releaseID, $audioID, $audioformat, $audiomode, $audiobitratemode, $audiobitrate, $audiochannels, $audiosamplerate, $audiolibrary, $audiolanguage, $audiotitle); } else { if ($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); } } } } } } } }