Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Tekstityksien aikojen muuttaja

Sharph [09.03.2005 07:39:36]

#

Tällä skriptillä voit siirtää tekstityksen kaikkia aikoja eteen/taaksepäin tietyn määrän sekunteja, jos esim. latasit subtitlet, mutta siinä subtitlet alkaa väärästä kohdasta, jos on vaikka jotenkin erilainen alusta. Koodasin alunperin omiin tarpeisiin. SRT-subtitleille.

<?php

// Monta sekuntia siirretään ja mihin suuntaan (esimerkissä 3 sekuntia taaksepäin)
$amount=-3;

// Subtitletiedosto jonka ajat muutetaan
$in="joo.jee";

// Outputtitiedosto
$out="jee.joo";

$f=fopen($in, "r");
$out=fopen($out, "w");

// Niin kauan kunnes tiedosto loppuu

while(!feof($f)) {

  $row=fgets($f);

  // Jos se on tekstitysrivi
  if(ereg(" --> ", $row) && ereg(":", $row) && ereg(",", $row) && strlen(trim($row)) == 30) {

    // Paloitellaan kahteen aikaan
    $rivi=explode("-->", $row);

    // Erotetaan molemmista osa pilkun mukaan
    $vasen=explode(",", $rivi[0]);
    $oikea=explode(",", $rivi[1]);

    // Pilkotaan pilkun vasemmanpuolinen osa tunteihin, minuutteihin ja sekunteihin
    $vasenp=explode(":", $vasen[0]);
    $oikeap=explode(":", $oikea[0]);

    // Tehdään timestampit
    $vasenstamp=mktime($vasenp[0], $vasenp[1], $vasenp[2]);
    $oikeastamp=mktime($oikeap[0], $oikeap[1], $oikeap[2]);

    // Muutetaan timestamppeja $amountin verran
    $vasenstamp=$vasenstamp+$amount;
    $oikeastamp=$oikeastamp+$amount;

    // Tehdään uusi rivi muutetuilla asetuksilla, jos mikään aika ei pyörähdä ympäri, muuten jätetään alkuperäinen rivi
    if($vasenstamp >= mktime(0,0,0) && $oikeastamp > mktime(0,0,0)) {
      $row=date("H:i:s", $vasenstamp) . "," . $vasen[1] . " --> " . date("H:i:s", $oikeastamp) . "," . $oikea[1];
    }

  }

  fwrite($out, $row);

}

fclose($out);
fclose($f);

?>

ajv [09.03.2005 21:51:05]

#

Heh, onpas hyvä idea. Tulee kyllä käyttöön.
Koodista sen verran, että itse heittäisin noi explodet suohon ja hoitaisin homman säännöllisillä lausekkeilla:

<?php
  // Jos se on tekstitysrivi
  if(ereg("^([0-9]{2}):([0-9]{2}):([0-9]{2}),([0-9]{3}) --> ([0-9]{2}):([0-9]{2}):([0-9]{2}),([0-9]{3})",$row, $re)){

    //Tehdään timestampit
    $vasenstamp=mktime($re[1], $re[2], $re[3])+$amount;
    $oikeastamp=mktime($re[5], $re[6], $re[7])+$amount;
    :
    :
    :
    $row=date("H:i:s", $vasenstamp) . "," . $re[4] . " --> " . date("H:i:s", $oikeastamp) . "," . $re[8] . "\n";
  }
?>

En tiedä kumpi on optimaalisempi nopeuden kannalta ja sillähän ei ole tämänkaltaisessa skriptissä merkitystä, mutta ainakin lyhyempi tuo on ja koodarithan ovat tunnetusti laiskoja... :)

Sharph [09.03.2005 21:53:58]

#

Joo muttakun olen niin laiska oppimaan noita regexpejä..

phadej [10.03.2005 15:48:12]

#

regexpit kannattaa opetella, tekstin käsittelyyn ei kyl parempaa keinoa löydy

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta