Search code examples
javascriptjquerysrt

Parse a SRT file with jQuery Javascript


I'm trying to parse .srt but I get an internal error and I can't figure out what is it.

Here is my code:

    var subtitles;
    jQuery.get('SB_LKRG-eng.srt', function(data) {
        //alert(data);
        function strip(s) {
            return s.replace(/^\s+|\s+$/g,"");
        }
        srt = data.replace(/\r\n|\r|\n/g, '\n');
        //alert(srt);
        srt = strip(srt);
        //alert(srt);
        var srt_ = srt.split('\n\n');
        alert(srt_);
        var cont = 0;
        for(s in srt_) {
            st = srt_[s].split('\n');
            alert(st);
            if(st.length >=2) {
              n = st[0];
              i = strip(st[1].split(' --> ')[0]);
              o = strip(st[1].split(' --> ')[1]);
              t = st[2];

              if(st.length > 2) {
                for(j=3; j<st.length;j++)
                  t += '\n'+st[j];
              }

            subtitles[cont].number = n;
            subtitles[cont].start = i;
            subtitles[cont].end = o;
            subtitles[cont].text = t;
            //alert(subtitles[cont].start);
            }
            cont++;
        }

    });

I can extract the first 4 subtitles and then the code stops and breaks exception: TypeError, I can't understand why... Here a sample of the subtitles file:

1
00:00:01,000 --> 00:00:04,000
Descargados de www.AllSubs.org

2
00:00:49,581 --> 00:00:52,049
Bueno, tienes que escapar, tengo que ir a jugar

3
00:00:52,084 --> 00:00:55,178
Tengo que encontrar un día que está lleno de nada más que sol

4
00:00:55,220 --> 00:00:57,552
Crucero por la calle, moviéndose al compás

5
00:00:57,589 --> 00:01:00,683
Todos los que conoces está teniendo nada más que diversión

6
00:01:00,726 --> 00:01:03,251
Deja todo detrás de ti

7
00:01:03,295 --> 00:01:06,128
Siente esas palmeras soplan

8
00:01:06,165 --> 00:01:09,157
La gente en el norte no puede encontrar

9
00:01:09,201 --> 00:01:11,829
Están fuera de palear la nieve

10
00:01:11,870 --> 00:01:14,998
El tiempo para moverse, pero no seas lento

11
00:01:15,040 --> 00:01:17,941
En sus marcas, prepárate para ir

Part of the code is from: http://v2v.cc/~j/jquery.srt/jquery.srt.js

Can anyone help me?

Thank you


Solution

  • var PF_SRT = function() {
      //SRT format
      var pattern = /(\d+)\n([\d:,]+)\s+-{2}\>\s+([\d:,]+)\n([\s\S]*?(?=\n{2}|$))/gm;
      var _regExp;
    
      var init = function() {
        _regExp = new RegExp(pattern);
      };
      var parse = function(f) {
        if (typeof(f) != "string")
          throw "Sorry, Parser accept string only.";
    
        var result = [];
        if (f == null)
          return _subtitles;
    
        f = f.replace(/\r\n|\r|\n/g, '\n')
    
        while ((matches = pattern.exec(f)) != null) {
          result.push(toLineObj(matches));
        }
        return result;
      }
      var toLineObj = function(group) {
        return {
          line: group[1],
          startTime: group[2],
          endTime: group[3],
          text: group[4]
        };
      }
      init();
      return {
        parse: parse
      }
    }();
    

     

      jQuery.get('demo.srt')
       .done(function(text) {
           try {
             //Array with {line, startTime, endTime, text}
             var result = PF_SRT.parse(text);
           } catch (e) {
             //handle parsing error
           }
      });
    

    Demo

    https://jsfiddle.net/5v7wz4bq/