358 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			358 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * SoustitreDownlaoder
 | 
						|
 *
 | 
						|
 * Ce script PHP permet de télécharger des sous-titres automatiques à partir du site addic7ed.com
 | 
						|
 *
 | 
						|
 * PHP 5
 | 
						|
 *
 | 
						|
 * @copyright     Copyright 2013, Spikto, Thomas Buée
 | 
						|
 */
 | 
						|
 
 | 
						|
//ini_set("display_errors", "1");
 | 
						|
set_time_limit(0);
 | 
						|
 | 
						|
$app = new getFileSubtitle($argv);
 | 
						|
 | 
						|
/**
 | 
						|
 * Gestion des sous-titres à télécharger
 | 
						|
 */
 | 
						|
class getFileSubtitle {
 | 
						|
	private $extFile = array("mp4","mkv","m4v","avi","mov","wmv","mpg");
 | 
						|
	private $fileToCheck=array();
 | 
						|
	private $pathSearch;
 | 
						|
	private $pathMove;
 | 
						|
	private $createFolder=false;
 | 
						|
	private $forceDownload=false;
 | 
						|
 | 
						|
	public function __construct($argv) {
 | 
						|
		$this->pathSearch = (isset($argv[1]) ? $argv[1] : "");
 | 
						|
		$this->pathMove = (isset($argv[2]) ? $argv[2] : "");
 | 
						|
		if (isset($argv[3])) {
 | 
						|
			for($i=0;$i<strlen($argv[3]);$i++) {
 | 
						|
				if ($argv[3][$i]=="f") $this->createFolder=true;
 | 
						|
				if ($argv[3][$i]=="d") $this->forceDownload=true;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		$this->logicPath();
 | 
						|
		$this->findFile();
 | 
						|
		$this->findSubtitle();
 | 
						|
	}	
 | 
						|
	
 | 
						|
	public function logicPath() {
 | 
						|
		if ($this->pathSearch!="" && substr($this->pathSearch, -1)!="/") $this->pathSearch .= "/";
 | 
						|
		if ($this->pathMove!="" && substr($this->pathMove, -1)!="/") $this->pathMove .= "/";
 | 
						|
	}
 | 
						|
	
 | 
						|
	/**
 | 
						|
	 * Recherche des sous-titres à télécharger
 | 
						|
	 */
 | 
						|
	public function findFile() {
 | 
						|
		$path = $this->pathSearch;
 | 
						|
		if ($path!="") {
 | 
						|
			$list = glob_perso($path);
 | 
						|
			foreach($list as $l) {
 | 
						|
				$info = pathinfo($l);
 | 
						|
				if (is_file($l) && in_array($info["extension"], $this->extFile) && !preg_match("#VOSTF|VOSTFR#i", $info["filename"])) {
 | 
						|
					if (!file_exists($path.$info["filename"].".srt")) {
 | 
						|
						$this->fileToCheck[] = new fileData($info);
 | 
						|
					}
 | 
						|
					else if ($this->pathMove!="") {
 | 
						|
						$data = new fileData($info);
 | 
						|
						$this->relocateEpisode($data);
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else if (is_dir($l)) {
 | 
						|
					$data = new fileData($info);
 | 
						|
					if ($data->isValid()) {
 | 
						|
						$sublist = glob_perso($l."/");
 | 
						|
						 foreach($sublist as $sl) {
 | 
						|
							$info = pathinfo($sl);
 | 
						|
							if (is_file($sl) && in_array($info["extension"], $this->extFile) && !preg_match("#VOSTF|VOSTFR#i", $info["filename"])) {
 | 
						|
								rename($sl, $path.$info["basename"]);
 | 
						|
								$info = pathinfo($path.$info["basename"]);
 | 
						|
								$this->fileToCheck[] = new fileData($info);
 | 
						|
							}
 | 
						|
							elseif (is_file($sl)) {
 | 
						|
								unlink($sl);
 | 
						|
							}
 | 
						|
						}
 | 
						|
						rmdir($l."/");
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}	
 | 
						|
	
 | 
						|
	/**
 | 
						|
	 * Déplace le fichier dans le dossier approprié : Série [ > Saison] > Episode
 | 
						|
	 */
 | 
						|
	public function relocateEpisode($data) {
 | 
						|
		$comp = "";
 | 
						|
		if (file_exists($this->pathMove.$data->serie)) {
 | 
						|
			$comp .= $data->serie;
 | 
						|
		}
 | 
						|
		elseif ($this->createFolder && !file_exists($this->pathMove.$data->serie)) {
 | 
						|
			mkdir($this->pathMove.$data->serie);
 | 
						|
			$comp .= $data->serie;
 | 
						|
		}
 | 
						|
		if ($comp!="") {
 | 
						|
			if (file_exists($this->pathMove.$data->serie."/Saison ".intval($data->saison))) $comp .= "/Saison ".intval($data->saison);
 | 
						|
			elseif (file_exists($this->pathMove.$data->serie."/Season ".intval($data->saison))) $comp .= "/Season ".intval($data->saison);
 | 
						|
		}
 | 
						|
		rename($this->pathSearch.$data->info["basename"], $this->pathMove.$comp."/".$data->info["basename"]);
 | 
						|
		rename($this->pathSearch.$data->info["filename"].".srt", $this->pathMove.$comp."/".$data->info["filename"].".srt");
 | 
						|
	}
 | 
						|
	
 | 
						|
	/**
 | 
						|
	 * Recherche du sous-titre
 | 
						|
	 */
 | 
						|
	public function findSubtitle() {
 | 
						|
		if (count($this->fileToCheck)>0) {
 | 
						|
			foreach($this->fileToCheck as $f) {
 | 
						|
				$addicted = new addictedSubtitle($f, $this->forceDownload);
 | 
						|
				if ($addicted->findEpisode()) {
 | 
						|
					if ($this->pathMove!="") {
 | 
						|
						$this->relocateEpisode($f);
 | 
						|
					}
 | 
						|
					echo "Un sous-titre a été trouvé\n";
 | 
						|
				}
 | 
						|
				else {
 | 
						|
					echo "Aucun sous-titre trouvé\n";
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			echo "Aucun sous-titre à rechercher.\n";
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Recupère les infos importantes à partir du nom du fichier
 | 
						|
 */
 | 
						|
class fileData {
 | 
						|
	public $saison;
 | 
						|
	public $episode;
 | 
						|
	public $serie;
 | 
						|
	public $version;
 | 
						|
	public $info;
 | 
						|
	
 | 
						|
	public function __construct($info) {
 | 
						|
		$this->info = $info;
 | 
						|
		$this->readName();
 | 
						|
	}
 | 
						|
 | 
						|
	
 | 
						|
	public function readName() {
 | 
						|
		$file = $this->info["filename"];
 | 
						|
		//preg_match("#([^0-9]+)([0-9]{2})E([0-9]{2})#", $file, $result2);
 | 
						|
 | 
						|
		if (preg_match("#S([0-9]{2})E([0-9]{2})#msui", $file, $result)) {
 | 
						|
			$this->saison = $result[1];
 | 
						|
			$this->episode = $result[2];
 | 
						|
			if (preg_match("#(.*)S".$this->saison."E".$this->episode."#msui", $file, $result2)) {
 | 
						|
				$this->serie = ucwords(trim(str_replace(".", " ", $result2[1])));
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else if (preg_match("#([0-9]{1,2})x([0-9]{2})#", $file, $result)) {
 | 
						|
			$this->saison = $result[1];
 | 
						|
			$this->episode = $result[2];
 | 
						|
			if (preg_match("#(.*)".$this->saison."x".$this->episode."#", $file, $result2)) {
 | 
						|
				$this->serie = ucwords(trim(str_replace(".", " ", $result2[1])));
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else if (preg_match_all("#[. ]([0-9])([0-9]{2})[. ]#", $file, $result, PREG_SET_ORDER)) {
 | 
						|
			$result = end($result);
 | 
						|
			$this->saison = ($result[1]<10 ? "0".$result[1] : $result[1]);
 | 
						|
			$this->episode = $result[2];
 | 
						|
			if (preg_match("#(.*)".$result[1].$this->episode."#", $file, $result2)) {
 | 
						|
				$this->serie = ucwords(trim(str_replace(".", " ", $result2[1])));
 | 
						|
			}
 | 
						|
		}
 | 
						|
		preg_match("#(LOL|AFG|FQM|ASAP|EVOLVE|IMMERSE|2HD|KILLERS)#msui", $file, $result3);
 | 
						|
		$this->version = strtoupper(isset($result3[1]) ? $result3[1] : "");
 | 
						|
	}
 | 
						|
	
 | 
						|
	public function getSimpleName() {
 | 
						|
		return $this->serie." ".$this->saison."x".$this->episode;
 | 
						|
	}
 | 
						|
	
 | 
						|
	public function isValid() {
 | 
						|
		return ($this->serie!="" && $this->saison!="" && $this->episode);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Base de source pour le téléchargement des sous-titres
 | 
						|
 */
 | 
						|
class sourceSubtitle {
 | 
						|
	public $base;
 | 
						|
	public $referer;
 | 
						|
	public $search;
 | 
						|
	public $forceExistant;
 | 
						|
 | 
						|
	public function __construct($search, $force = false) {
 | 
						|
		$this->search = $search;
 | 
						|
		$this->forceExistant = $force;
 | 
						|
	}
 | 
						|
	
 | 
						|
	protected function getDataFromLink($link) {
 | 
						|
		$cpt = 0;
 | 
						|
		$return = false;
 | 
						|
		while($return==false && $cpt<3) {
 | 
						|
			$curl = curl_init(); 
 | 
						|
			curl_setopt($curl, CURLOPT_URL, $this->base.$link); 
 | 
						|
			//curl_setopt($curl, CURLOPT_HEADER, true);
 | 
						|
			curl_setopt($curl, CURLOPT_COOKIESESSION, true); 
 | 
						|
			curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
 | 
						|
			curl_setopt($curl, CURLOPT_TIMEOUT, 120); 
 | 
						|
			if ($this->referer!="") curl_setopt($curl, CURLOPT_REFERER, $this->referer);
 | 
						|
 | 
						|
			$return = curl_exec($curl);
 | 
						|
			curl_close($curl); 
 | 
						|
			$cpt++;
 | 
						|
		}
 | 
						|
		$this->referer = $this->base.$link;
 | 
						|
		return $return;
 | 
						|
	}
 | 
						|
	
 | 
						|
	public function findEpisode($nom) {
 | 
						|
	
 | 
						|
	}
 | 
						|
	public function findSubtitle($link) {
 | 
						|
	
 | 
						|
	}
 | 
						|
	public function saveSubtitle($lien) {
 | 
						|
	
 | 
						|
	}
 | 
						|
	
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Source Addic7ed.com
 | 
						|
 */
 | 
						|
class addictedSubtitle extends sourceSubtitle {
 | 
						|
	public $base = "http://www.addic7ed.com/";
 | 
						|
	
 | 
						|
	public function findEpisode() {
 | 
						|
		$episodes = $this->getDataFromLink("search.php?search=".rawurlencode($this->search->getSimpleName())."&Submit=Search");
 | 
						|
				
 | 
						|
		preg_match("#<a href=\"([^\"]*)\"[^>]*>".$this->search->serie."[^<]*".$this->search->saison."x".$this->search->episode."[^<]*</a>#", $episodes, $result);
 | 
						|
 | 
						|
		if (count($result)>0) {
 | 
						|
			return $this->findSubtitle($result[1]);
 | 
						|
		}
 | 
						|
		else {
 | 
						|
			preg_match("#<a href=\"([^\"]*)\".*>.*".$this->search->saison."x".$this->search->episode.".*</a>#", $episodes, $result);
 | 
						|
			if (count($result)>0) {
 | 
						|
				return $this->findSubtitle($result[1]);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
 | 
						|
	public function findSubtitle($link) {
 | 
						|
		$soustitres = $this->getDataFromLink($link);
 | 
						|
		$blocs = explode("<div id=\"container95m\">", $soustitres);
 | 
						|
		$linkSubtitle="";
 | 
						|
		$completedLink = array();
 | 
						|
		foreach ($blocs as $b) {
 | 
						|
			$valid = true;
 | 
						|
			preg_match_all("#\/updated\/8\/([0-9/]*)#", $b, $resultLink);
 | 
						|
			foreach($resultLink[1] as $l) {
 | 
						|
				$resultVersion = array();
 | 
						|
				$dec = explode("/", $l);
 | 
						|
				preg_match_all("#Version ".($this->search->version!="" ? "(".$this->search->version.")" : "([^<]*)").".*starttranslation.php\?id=".$dec[0]."&fversion=".$dec[1]."\".*saveFavorite\(".$dec[0].",8,[0-9]*\).*([0-9]{0,2}\.?[0-9]{0,2}%? ?Completed).*\/updated\/8\/(".$dec[0]."\/".$dec[1].")\"#msui", $b, $resultVersion, PREG_SET_ORDER);
 | 
						|
				if (count($resultVersion) == 0) {
 | 
						|
					preg_match_all("#Version [^<]*.*starttranslation.php\?id=".$dec[0]."&fversion=".$dec[1]."\".*Works with ".($this->search->version!="" ? "[^<]*(".$this->search->version.")[^<]*" : "[^<]*").".*saveFavorite\(".$dec[0].",8,[0-9]*\).*([0-9]{0,2}\.?[0-9]{0,2}%? ?Completed).*\/updated\/8\/(".$dec[0]."\/".$dec[1].")\"#msui", $b, $resultVersion, PREG_SET_ORDER);
 | 
						|
				}
 | 
						|
				if (count($resultVersion) == 0) {
 | 
						|
					preg_match_all("#Version ([^<]*).*starttranslation.php\?id=".$dec[0]."&fversion=".$dec[1]."\".*saveFavorite\(".$dec[0].",8,[0-9]*\).*([0-9]{0,2}\.?[0-9]{0,2}%? ?Completed).*\/updated\/8\/(".$dec[0]."\/".$dec[1].")\"#msui", $b, $resultVersion, PREG_SET_ORDER);
 | 
						|
				}
 | 
						|
				if (count($resultVersion) > 0) {
 | 
						|
					if (!preg_match("#saveFavorite\(".$dec[0].",8,[0-9]*\).*[0-9]*\.[0-9]*% Completed.*\/updated\/8\/(".$dec[0]."\/".$dec[1].")#msui", $b)) {
 | 
						|
						$completedLink[] = "updated/8/".$l;
 | 
						|
					}
 | 
						|
					else {
 | 
						|
						$valid = false;
 | 
						|
					}
 | 
						|
					if ($this->search->version!="") {
 | 
						|
						if (strpos($resultVersion[0][1], $this->search->version)!==false) {
 | 
						|
							$completedLink[] = "updated/8/".$l;
 | 
						|
						}
 | 
						|
						else {
 | 
						|
							$valid = false;
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
				else {
 | 
						|
					$valid = false;
 | 
						|
				}
 | 
						|
				
 | 
						|
				if ($valid) {
 | 
						|
					$linkSubtitle = "updated/8/".$l;
 | 
						|
					break;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if ($valid && $linkSubtitle!="") break;
 | 
						|
		}
 | 
						|
		if ($this->forceExistant && $linkSubtitle=="" && !empty($completedLink)) {
 | 
						|
			$linkSubtitle = $completedLink[0];
 | 
						|
		}
 | 
						|
		if ($linkSubtitle!="") {
 | 
						|
			return $this->saveSubtitle($linkSubtitle);
 | 
						|
		}
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
	public function saveSubtitle($link) {
 | 
						|
		$soustitre = $this->getDataFromLink($link);
 | 
						|
		if ($soustitre!="") {
 | 
						|
			$fp = fopen($this->search->info["dirname"]."/".$this->search->info["filename"].".srt", "a+");
 | 
						|
			fwrite($fp, $soustitre);
 | 
						|
			fclose($fp);
 | 
						|
			return true;
 | 
						|
		}
 | 
						|
		return false;
 | 
						|
	}
 | 
						|
	
 | 
						|
	
 | 
						|
}
 | 
						|
 | 
						|
function glob_perso($path, $folder=array()) {
 | 
						|
	$globalPath;
 | 
						|
	$list = array();
 | 
						|
	if (!empty($folder)) {
 | 
						|
		if (!is_array($folder)) $folder = array($folder);
 | 
						|
		foreach ($folder as $value) {
 | 
						|
			if (file_exists($path.$value)) {
 | 
						|
				$path = $path.$value;
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				$handle = opendir($path);
 | 
						|
				if ($handle) {
 | 
						|
					while (false !== ($entry = readdir($handle))) {
 | 
						|
						if (strtolower($entry)==strtolower($value)) {
 | 
						|
							$path = $path.$entry."/";
 | 
						|
						}
 | 
						|
					}
 | 
						|
					closedir($handle);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	$globalPath = $path;
 | 
						|
	if (file_exists($globalPath)) {
 | 
						|
		$handle = opendir($globalPath);
 | 
						|
		if ($handle) {
 | 
						|
			while (false !== ($entry = readdir($handle))) {
 | 
						|
				if ($entry != "." && $entry != "..") {
 | 
						|
					$list[] = $globalPath.$entry;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			closedir($handle);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return $list;
 | 
						|
} |