Skip to content

Instantly share code, notes, and snippets.

@Behinder
Last active February 5, 2024 23:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Behinder/af3a7ee8bbc4224e31a3a0fc45fcef46 to your computer and use it in GitHub Desktop.
Save Behinder/af3a7ee8bbc4224e31a3a0fc45fcef46 to your computer and use it in GitHub Desktop.
Cut commercials from Channels DVR recording
<?php
function czyLokalnaEdycja($id)
{
$json=file_get_contents("http://localhost:8089/dvr/files/".$id."/comskip/status");
$obj = json_decode($json,true);
return $obj["HasLocalComskipResults"];
}
// Główne zmienne
$id = $argv[1];
$channelsfolder = "/Volumes/T7/ChannelsDVR/";
$docelowyfolder = "/Volumes/T7/ChannelsDVR/Przetworzone";
$comskiplog = "/Volumes/T7/ChannelsDVR/Logs/comskip/".$id;
$pliklogu = $comskiplog . "/video.ffsplit";
$apiurl = "http://localhost:8089/dvr/files/".$id;
//pobieramy curlem JSON
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //to musi byc inaczej nam zwroci 1
$costam = curl_exec($ch);
//Dekodowanie JSONa
$zdekodowany = json_decode($costam,true);
$sciezka = $zdekodowany["Path"];
$sciezkadopliku = $channelsfolder . $sciezka;
$tablicakomend=[];
$poczatekkomendy = 'ffmpeg6 -i "'.$sciezkadopliku.'" ';
if (czyLokalnaEdycja($id) == 0) {
// procedura jeśli nie było lokalnej edycji reklam
foreach (file($pliklogu) as $linia) {
$linia = str_replace("-c copy", "-c:v h264", $linia);
$komenda = $poczatekkomendy . $linia;
array_push($tablicakomend, $komenda);
}
$tworzkomendeconcat = 'for s in segment*.ts ;do echo "file ${s}" >> concat.txt ; done';
$komendascal ="ffmpeg6 -f concat -i concat.txt -c copy output.mp4";
array_push($tablicakomend,$tworzkomendeconcat);
array_push($tablicakomend,$komendascal);
//zmiana nazwy pliku
$nazwapliku = basename($sciezka,".mpg");
array_push($tablicakomend,'mv output.mp4 "'.$nazwapliku.'.mp4"');
array_push($tablicakomend,"rm segment*.ts && rm concat.txt");
echo "Wykonujemy komendy \n";
foreach ($tablicakomend as $polecenie) {
shell_exec($polecenie);
}
} else {
$nrsegmentu=0;
echo "Wycinanie reklam wg. ręcznego zaznaczenia \n";
$json = file_get_contents("http://localhost:8089/dvr/files/".$id."/comskip/info?source=local&apply_edits=true%22");
$obj = json_decode($json,true);
$bloki = $obj["Blocks"]; //tablica elementów
$czaspoczatkowy=0;
$czaskoncowy = $obj["Run"]["Duration"]*60;
$poczateksegmentu = 1;
// warunek sprawdzający czy pierwszy blok to reklama
// jesli tak to poczatekreklam = 0 żeby pierwsza linia nie byla wtedy dodawana
//
if ($bloki[0]["IsCommercial"] == 1) {
$poczatekreklam =0;
} else {
$poczatekreklam = 1;
}
foreach ($bloki as $kafelek) {
$nrsegmentustring=str_pad($nrsegmentu, 3,"0",STR_PAD_LEFT);
// sprawdzamy każdy kafelek osobno
if ($kafelek["IsCommercial"] ==false) {
$poczatekreklam = 1;
//fragment programu
if ($poczateksegmentu == 1) {
$czaspoczatkowy = $kafelek["TimeStart"];
$czaskoncowy = $kafelek["TimeEnd"];
} else {
$czaskoncowy = $kafelek["TimeEnd"];
}
$poczateksegmentu = 0;
} else {
//znaleziono reklame -- kolejny segment bedzie znowu 1
$poczateksegmentu = 1;
// generujemy komendę którą wpiszemy do tablicy
if ($poczatekreklam == 1) {
$linia = '-c:v h264 -c:a aac -ss '.$czaspoczatkowy.' -to '.$czaskoncowy . ' segment'.$nrsegmentustring.'.ts';
$nrsegmentu=$nrsegmentu + 1;
// generujemy komendę
$komenda = $poczatekkomendy . $linia ;
//zapisujemy komendę do tablicy
array_push($tablicakomend,$komenda);
$poczatekreklam = 0;
}
}
} // koniec for-each
$tworzkomendeconcat = 'for s in segment*.ts ;do echo "file ${s}" >> concat.txt ; done';
$komendascal ="ffmpeg6 -f concat -i concat.txt -c copy output.mp4";
array_push($tablicakomend,$tworzkomendeconcat);
array_push($tablicakomend,$komendascal);
//zmiana nazwy pliku
$nazwapliku = basename($sciezka,".mpg");
array_push($tablicakomend,'mv output.mp4 "'.$nazwapliku.'.mp4"');
array_push($tablicakomend,"rm segment*.ts && rm concat.txt");
print_r($tablicakomend);
echo "Wykonujemy komendy \n";
foreach ($tablicakomend as $polecenie) {
shell_exec($polecenie);
}
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment