[PHP] DivX Subtitles Tweaker

Pagina: 1
Acties:
  • 124 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wou gisteren DIvX'je kijken met subtitles... loopt het niet gelijk, toen maar even dit in elkaar gerost >

Kan alleen seconden erbij optellen bij files die er ongeveer zo uitzien:
1
00:01:51,192 --> 00:01:55,151
Als pasta is er inktvisravioli
in citroengrasbouillon.

2
00:01:55,312 --> 00:01:58,907
En geitenkaassoesjes
met een rucola-Caesarsalade.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?
    
    $subtFile = "american_psycho.srt";            //filename van divx
    $secDif = 32;                                        //seconde verschil

    @$file = fopen("$subtFile","r");

    if (!$file)
        echo "<table cellspacing=0 cellpadding=5 width=100%><TR><td width=100% bgcolor=black><font color=white>Fout</TD></TR></table>\n";
    else {
        while(!feof($file)){
//            [00:01:51,192 : 00:01:55,151 ] = {00} {01} {51,192} {00} {01} {55,151}
//            [org                         ] =   0    1        2    3     4       5
            $line = fgets($file, 200);
            $uqString = " --> ";

            if(eregi($uqString, $line)){
                $line = eregi_replace($uqString, ":", $line );
                $line = eregi_replace(",", ".", $line );
                $pieces = explode (":", $line);

                $aSize = sizeof($pieces);
                for($i=0; $i<$aSize; $i++){
                    $pieces[$i]    = trim($pieces[$i]);
                }

                $pieces[2] += $secDif;
                if($pieces[2] > 59){
                    $dif =  $pieces[2] - 59;
                    $pieces[2] = $dif;
                    $pieces[1] += 1;
                }

                if($pieces[1] > 59){
                    $dif =  $pieces[1] - 59;
                    $pieces[1] = $dif;
                    $pieces[0] += 1;
                }

                $pieces[5] += $secDif;
                if($pieces[5] > 59){
                    $dif =  $pieces[5] - 59;
                    $pieces[5] = $dif;
                    $pieces[4] += 1;
                }

                if($pieces[4] > 59){
                    $dif =  $pieces[4] - 59;
                    $pieces[3] = $dif;
                    $pieces[3] += 1;
                }

                for($i=0; $i<$aSize; $i++){
                    if(strlen(strval($pieces[$i])) == 1)
                        echo "0";

                    $pos = strpos(strval($pieces[$i]), ".");
                    if($pos == 1)
                        echo "0";

                    $pieces[$i]    = strval($pieces[$i]);

                    if($i==2 || $i==5){
                        $pieces[$i] = eregi_replace("\.", ",", $pieces[$i]);
                        
                        $sub = substr(strval($pieces[$i]), $pos, strlen(strval($pieces[$i])));

                        if(strlen($sub)>4){
                                $pieces[$i]= substr(strval($pieces[$i]), 0, 4);
                        }
                    }                        

                    echo $pieces[$i];

                    if($i==2 || $i==5){
                        $sub = substr(strval($pieces[$i]), $pos, strlen(strval($pieces[$i])));
                            if(strlen($sub)==3)
                                 echo  "0";
                }

                    if($i!=2 &amp;&amp; $i!=5)
                        echo ":";
                    else if($i!=5)
                        echo $uqString;
                }
                echo "<BR>";
            }
            else{
                echo $line."<BR>";
            }
        }
    }
?>

Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 07:35
:?

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Begrijp ik het nu goed? is het een proggie om seconden bij subs op te tellen?
Het zal best werken....maare waarom in PHP?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op dinsdag 22 januari 2002 14:38 schreef Glimi_ie het volgende:
Begrijp ik het nu goed? is het een proggie om seconden bij subs op te tellen?
Het zal best werken....maare waarom in PHP?
Ja je begrijpt het goed, stel je hebt een filmpie met zo'n leuk Warner Bros trailertje ervoor en die blijkt niet te zijn meegeteld in je subtitle...

Waarom PHP? Omdat ik daar het snelst in ben en toen het meest trek in had. Code is wel erg rought&dirty.

Acties:
  • 0 Henk 'm!

  • blackd
  • Registratie: Februari 2001
  • Niet online
Daar heb je toch van die subtitle converter proggies voor? Da's toch veel makkelijker en sneller dan een nieuw prog schrijven?

9000Wp o/w SolarEdge SE6K - Panasonic 5kW bi-bloc - gasloos sinds 17-7-2023


Acties:
  • 0 Henk 'm!

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 01-09 11:48
offtopic:
[quote]
Op dinsdag 22 januari 2002 10:54 schreef fruit.Mics het volgende:
Wou gisteren DIvX'je kijken met subtitles... loopt het niet gelijk, toen maar even dit in elkaar gerost
[/quote]

Hehehe rotflmyo! in elkaar gerost.. Komt er zo droog uit :D Bijna net zo droog als die scene in "The whole 9 yards" waar de tandarts niet doodgeschoten wordt op de boot, maar de dikke grote mede-hitkiller. Daarna wordt hem een biertje aangegooid, maar de tandarts is ZO van de kaart, die ziet het biertje niet eens: PLONS. Ook zo heerlijk droog :D


Jammer dat er gewoon al proggies voor bestaan.. Maar ja, wel knap dat je dit "even in elkaar rost"!

Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 16-08 21:48

TheLunatic

Ouwe boxen.

En we dopen dit programma : SubSync


Nee zo'n programma was er niet nog :Z (nofi)

maar toch leuk dat je het zelf heb gemaakt natuurlijk :)

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

  • Nikel
  • Registratie: Juli 2000
  • Niet online
Een tijd geleden heb ik ook eens zoiets gemaakt, maar dan wat geavanceerder. Hij kan niet alleen delay veranderen, maar ook de "snelheid" wijzigen.

Mijn excuses voor het ontbrekende commentaar in de source, en voor het niet netjes xhtml-compliant zijn van de gegenereerde html.

Die vieze <? en ?> dingen die topix er bij meent te moeten plaatsen moet je maar negeren.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<?
<html>
<?php
/*
Auteur: Nikel Kruizinga
Datum: 19-9-2001


Uit het form komen de volgende variabelen binnen:

$submit                    Als deze bestaat dan is de pagina opgevraagd dmv een post actie en moet de invoer dus verwerkt worden
                
$nummerEerste            Het nummer van de eerste subtitle, zoals dat is af te lezen uit de .srt
$juisteEersteTijd        De tijd waarop de eerste subtitle zou moeten beginnen

$nummerLaatste            Het nummer van de tweede subtitle, zoals dat is af te lezen uit de .srt
$juisteLaatsteTijd        De tijd waarop de tweede subtitle zou moeten beginnen

$inhoud                    De inhoud van de volledige .srt file die gewijzigd moet worden

*/

// Is om een of andere reden niet standaard in php aanwezig, of ik kon hem niet vinden :)
function div($a,$b)
{ 
    return (int) ($a/$b); 
}



// input: een tijd in miliseconden
// output: een string in formaat dat in .srt files gebruikt wordt
function secsToTijd($input)
{
    $input = round($input);
    while (strlen($input) < 8)
    {
        $input = "0" . $input;
    }
    
    $secs = substr($input, 0, 5);
    
    $uren = div($secs, 3600);
    $secs = $secs - $uren * 3600;
    
    $minuten = div($secs, 60);
    
    $seconden = $secs - $minuten * 60;

    $output =     (strlen($uren) == 1 ? "0" . $uren : $uren) .
            ":" .
            (strlen($minuten) == 1 ? "0" . $minuten : $minuten) .
            ":" .
            (strlen($seconden) == 1 ? "0" . $seconden : $seconden) .
            "," .
            substr($input, 5, 3);
    
    
    
    return $output;
}

// input: een tijd in stringformaat
// output: de tijd in milliseconden    
function maakMilliSecs($input)
{
    $input = explode(":", str_replace (",", ":", $input));
    $output = $input[3] + 1000 * $input[2] + 60000 * $input[1] + 3600000 * $input[0];
    return $output;



}

// input: een regel uit de .srt file, waarin begin- en eindtijd van een subtitle staan
// output: de verbeterde regel voor in de .srt file
function maakNieuweTijd($input)
{
    global $juisteLengte;
    global $lengte;
    global $delay;
    
    
    $milliSecs1 = maakMilliSecs(substr($input, 0, 12));
    $milliSecs2 = maakMilliSecs(substr($input, 17, 12));
    
    $milliSecs1 = $milliSecs1 * ($juisteLengte / $lengte) + $delay;
    $milliSecs2 = $milliSecs2 * ($juisteLengte / $lengte) + $delay;

    return secsToTijd($milliSecs1) . " --> " . secsToTijd($milliSecs2) . "\n";


}


if (!$submit) // Er is niets gesubmit, dus laat het invoerformulier zien
{
    echo '
    
    <form action="sub.php" method="post">
        <input type="hidden" name="submit" value="yes" />
        
        Nummer eerste subtitle:<br />
        <input type="text" name="nummerEerste" /><br />
        Gewenste tijd eerste (uu:mm:ss:hhh) :<br /> <input length="12" type="text" name="juisteEersteTijd" />
        <br /><br />
        
        Nummer laatste subtitle:<br /> <input type="text" name="nummerLaatste" /><br />
        Gewenste tijd tweede (uu:mm:ss:hhh) :<br /> <input length="12" type="text" name="juisteLaatsteTijd" />
        <br /><br />
        
        Paste hier de .srt file: <br />
        <textarea name="inhoud" rows="10" cols="70"></textarea><br /><br />
        <input type="submit" value="Wha!" />
    </form>
    '; //end echo
}    
else // Er is invoer dus gaan we deze verwerken
{
    echo "<pre>";
    
    $inhoud = explode("\n", $inhoud);
    
    for ($i = 0;; $i++) // We doorlopen alle regels tot we bij het nummer van de tweede subtitle hebben gevonden
    {
        if (trim($inhoud[$i]) == $nummerEerste)
        {
            $eersteTijd = substr($inhoud[$i+1], 0, 12); // $eersteTijd bevat nu de oude begintijd van de eerste subtitle in string-formaat
        }
        
        if (trim($inhoud[$i]) == $nummerLaatste)
        {
            $laatsteTijd = substr($inhoud[$i+1], 0, 12);
            break;
        }
    }
        
    $eersteMilliSecs = maakMilliSecs($eersteTijd);
    $laatsteMilliSecs = maakMilliSecs($laatsteTijd);

    $juisteEersteMilliSecs = maakMilliSecs($juisteEersteTijd);
    $juisteLaatsteMilliSecs = maakMilliSecs($juisteLaatsteTijd);
    
    $lengte = $laatsteMilliSecs - $eersteMilliSecs;
    
    $juisteLengte = $juisteLaatsteMilliSecs - $juisteEersteMilliSecs;
    
    $tempEersteTijd = $eersteMilliSecs * ($juisteLengte / $lengte);
    
    $delay = $juisteEersteMilliSecs - $tempEersteTijd;
    
    
    for ($i = 0; $i < sizeof($inhoud); $i++)
    {
        if (substr($inhoud[$i], 12, 5) == " --> ")
        {
            $inhoud[$i] = maakNieuweTijd($inhoud[$i]);
        }
        echo stripslashes($inhoud[$i]);
        
    }
    echo "</pre>";    
}
?>
</html>
?>

Acties:
  • 0 Henk 'm!

  • Nikel
  • Registratie: Juli 2000
  • Niet online
Enige uitleg dan ook maar.

Er bestaat zo'n prog voor wat dit zelfde kan, maar dat wilde bij mij om een of andere vage reden niet werken.

De werking:


Kies twee subtitles uit de file uit waarvan je goed kunt bepalen wanneer die moeten verschijnen, liefst een uit het begin en een uit het eind van de film natuurlijk.

Open de .avi met een player die de tijden erg precies laat zien (standaard mediaplayer
_niet_ dus :)). Zoek dus uit op welke tijd die subs precies moeten beginnen. (gewoon pauzeren en tijd aflezen).

Vul de nummers van de subtitles en hun bijbehorende nummers (die staan dus in de .srt file) in in dit php-ding, en paste de inhoud van de .srt erbij. tadaa :)

Acties:
  • 0 Henk 'm!

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 11-09 17:26
je heb daar ook een heel leuk programma voor dat divxplayer heet. met dit progje kun je gewoon opgeven hoelang tijd je er bij de start wil optellen of aftrekken.

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal

Pagina: 1