IPTV – Come automatizzare il download dei canali con uno snippet PHP

17 Apr 2019 | M.A.D.R.

Benvenuti a tutti, vediamo come creare il download dei canali delle ultime liste IPTV e avere un buon piano a medio termine di  come mantenerle aggiornate…

Naturalmente potreste ampliare il servizio avendo una vostra risorsa statica con contenuto dinamico (ma questa è una faccenda che ora non riguarda questo post).

Pronti per partire…

Prendiamo carta e penna ed inizia a buttare giù qualche riga di cosa dovrebbe fare questo codice….

  • Recuperare attraverso l’uso di automatismi, le ultime liste televisive mantenendo aggiornato l’ultima esecuzione.
  • Memorizzare “da qualche parte” le liste trovate
  • Gestire in modo intelligente il nome e il numero di lista da salvare
  • Rinunciare ad eseguire il codice se le risorse sono uguali

Il punto quattro ha 2 criticità:

  • Quali sono le risorse uguali
  • Come identificarle

Il concetto sembrerebbe banale, ma non lo è… Potremmo salvare l’ultimo timestamp utile per effettuare il match, ma… Qui l’inganno…

Se salvassimo ogni volta il timestamp va da se che ad ogni richiesta il codice cercherà di scaricare e scrivere sul disco le risorse, e questa cosa non mi da l’idea di essere proprio corretta, infatti giacché stiamo parlando di recuperare le liste da servizi esterni, dobbiamo prima di tutto trovare il nostro marcatore di tempo che utilizzeremo per effettuare il match per le differenze….

Detto questo, utilizziamo il concetto di data articolo, in questo caso “pubDate” senza effettuare strane conversioni utilizziamola così…

Bene dopo tutta la pappardella, andiamo nella parte operativa, indicando quali sono le dipendenze dello script:

Una sola? E si… É uno snippet no la rivistazione di una distro UNIX….;)

Questa è la funzione che ci permette di verificare se il nostro distributore iptv di fiducia ha pubblicato nuove liste, quindi diciamo che il primo punto siamo riusciti ad eseguirlo abbastanza correttamente…. Il parametro category della funzione init è esattamente la Nazione sulla quale operare, nel mio caso (non sono masochista) utilizzo “Italy”.

include_once('./simple_html_dom.php');
function init($category){
	$link='';
	$pub='';
	$my_cat=$category;
	$content='';
	$find_replace=['<content:encoded>','</content:encoded>'];
	$replace=['<content>','</content>'];
	$url='url_da_analizzare';
	$movies = new SimpleXMLElement(str_replace($find_replace,$replace,file_get_contents($url)));
	foreach ($movies as $item){
		foreach ($item->item as $k=>$v){
			foreach ($v->category as $cat){
				if($cat==$my_cat){
					$link=$v->link;
					$pub=(string)$v->pubDate;
					$content=(string)$v->content;
				}
			}
		}
	}
	return ['link'=>$link,'pub'=>$pub,'content'=>$content];
}

Fatto ciò andiamo a vedere un pò di logica e di come implementarla… Abbiamo anticipato che il nostro script deve verificare le date per eseguire correttamente il codice, allora la cosa più banale è recuperare l’ultima azione da un file, nulla vieta che per comodità possiate utilizzare un DB, Redis, BlackHole etc…

Codice per analisi delle date, cosa fa…

Bene $from_feed non è altro che la data trovata dalla funzione init, mentre download sarà passata sempre in FALSE, analizzando lo script vediamo subito che ho utilizzato un file per appoggiarmi, e siccome mi piacciono le estensioni strane l’ho chiamata .info…. ;9

Effettuiamo il controllo di valorizzazione della variabile last ed effettuiamo i controlli che ci servono (non commento perchè banale)…

La funzione avraà come return un valore bool ossia TRUE o FALSE, nel caso sia TRUE, viene scritto nel file di appoggio “$db” la data passata alla funzione “$from_feed”.

Questo snippet può tornare utile anche per altri porgetti… conservatelo e create la vostra personal lib.

function controlla_date($from_feed,$download){
	$db=__DIR__.'/last_execution.info';
	$last=file_get_contents($db);
	if(!empty($last)){
		if($from_feed!=$last){
			$download=TRUE;
		}
	}else{
		$download=TRUE;
	}
	if($download)file_put_contents($db,$from_feed,LOCK_EX);
	return $download;
}

Ed eccoci arrivati al cuore dello scrap (si bhè questo è più scrap che altro… ma che fa… risorse free… non danneggiamo nessuno…), le famose liste IPTV…

function init_parsing_page($contenuto){
         //chiamiamo la funzione della nostra libreria inclusa in precedenza
	$parsing_=file_get_html($contenuto,true);
	$num_file=1;
	foreach ($parsing_->find('a') as $element){
		$title=$element->plaintext;
		$url=$element->href;
		capture_file($url,$num_file);
		$num_file++;
	}
}

Bhè, inutile dire che $num_file è l’iteratore, mentre capture_file è la funzione che provvederà a salvare il file, e che in basso la trovate, senza commenti perchè non neccessita di ulteriori spiegazioni….

function capture_file($url,$file_num){
	$file=file_get_contents($url);
	$file_name=__DIR__.'/'.date('Y-m-d').'-'.$file_num.'.m3u';
	file_put_contents($file_name,$file);
}

Ma come si richiama tutto l’ambaradram?

$start=init('Italy');
if(isset($start['pub']) &&$start['pub']!='' && isset($start['content']) && $start['content']!=''){
	if(controlla_date(strtotime((string)$start['pub']),FALSE)){
		init_parsing_page((string)$start['content']);
	}
}else{
	echo 'Errore';
}

Ed ecco a voi che lo scrapperino per avere  sempre aggiornate le  liste IPTV aggiornate è fatto….

Spero sia piaciuto e soprattutto abbia incuriosito alcuni di voi….

Soluzioni complete per ogni esigenza