- Add a fallback parser in case Parse::Lex is not available
authorRalf Ertzinger <sun@ryoko-darknet.camperquake.de>
Sun, 15 Nov 2009 15:19:30 +0000 (16:19 +0100)
committerRalf Ertzinger <sun@ryoko-darknet.camperquake.de>
Sun, 15 Nov 2009 15:19:30 +0000 (16:19 +0100)
  (*cough*Debian*cough). JSArrayParser->new() will return the
  best available parser

videosite/JSArrayParser.pm [new file with mode: 0644]
videosite/JSLexArrayParser.pm
videosite/JSSimpleArrayParser.pm [new file with mode: 0644]
videosite/YouTubeGrabber.pm

diff --git a/videosite/JSArrayParser.pm b/videosite/JSArrayParser.pm
new file mode 100644 (file)
index 0000000..cadf8e8
--- /dev/null
@@ -0,0 +1,56 @@
+#
+# This is a stub class for more complex JS*ArrayParser objects.
+# It's new() method usually does _not_ return an object of
+# type videosite::JSArrayParser, but rather a child object of itself
+# which is able to do some actual work. The only time new() retuns
+# an videosite::JSArrayParser onject is when no child objects are
+# available.
+#
+
+package videosite::JSArrayParser;
+
+use strict;
+
+sub new {
+    my $class = shift;
+    my $self = {};
+
+    if ($class ne __PACKAGE__) {
+        # We were called from a child object. Return ourselves.
+        return bless($self, $class);
+    }
+
+    # Try to find a child object which is available and return that.
+    #
+    # See if videosite::JSLexArrayParser is available
+    eval {
+        require videosite::JSLexArrayParser;
+    };
+
+    unless($@) {
+        # Available. Return a JSLexArrayParser object
+        return videosite::JSLexArrayParser->new();
+    }
+
+    # See if JSSimleArrayParser is available
+    eval {
+        require videosite::JSSimpleArrayParser;
+    };
+
+    unless ($@) {
+        # Available. Return a JSSimpleArrayParser object
+        return videosite::JSSimpleArrayParser->new();
+    }
+
+    # Nothing available. Return ourselves.
+    return bless($self, $class);
+}
+
+sub parse {
+    my $self = shift;
+
+    # No functionality here
+    return undef;
+}
+
+1;
index 20e6e0e..f250d61 100644 (file)
@@ -6,7 +6,10 @@
 # package. Use 'yapp -m videosite::jsarray -s jsarray.yp' to regenerate
 #
 
-package videosite::JSArrayParser;
+package videosite::JSLexArrayParser;
+
+use videosite::JSArrayParser;
+@ISA = qw(videosite::JSArrayParser);
 
 use Parse::Lex;
 use videosite::jsarray;
@@ -23,10 +26,10 @@ my @tokens = (
 
 sub new {
     my $class = shift;
-    my $self = {
-        '_PARSER' => videosite::jsarray->new(),
-        '_LEXER' => Parse::Lex->new(@tokens),
-    };
+    my $self = $class->SUPER::new();
+
+    $self->{'_PARSER'} = videosite::jsarray->new();
+    $self->{'_LEXER'} = Parse::Lex->new(@tokens);
 
     return bless($self, $class);
 }
diff --git a/videosite/JSSimpleArrayParser.pm b/videosite/JSSimpleArrayParser.pm
new file mode 100644 (file)
index 0000000..0c1e36e
--- /dev/null
@@ -0,0 +1,38 @@
+#
+# A helper class for parsing textual JS hashes into perl 
+# hashes
+#
+# This parser is based on simple regexps.
+#
+
+package videosite::JSSimpleArrayParser;
+
+use videosite::JSArrayParser;
+@ISA = qw(videosite::JSArrayParser);
+
+use strict;
+
+sub new {
+    my $class = shift;
+    my $self = $class->SUPER::new();
+
+    return bless($self, $class);
+}
+
+sub parse {
+    my $self = shift;
+    my $s = shift;
+    my $ret;
+  
+    if ($s =~ /{(.*)}/) {
+        my $str = $1;
+        while ($str =~ /"(\S+)":\s+"([^"]*)"(,\s*)?/g) {
+          $ret->{$1} = $2;
+        }
+    } else {
+        return undef;
+    }
+    return $ret;
+}
+
+1;
index 2ed52a7..644584a 100644 (file)
@@ -111,6 +111,8 @@ sub _parse {
 
                 $self->debug("Found SWF_ARGS: %s", $args);
                 $jsp = videosite::JSArrayParser->new();
+                print ref($jsp);
+                $self->debug("Using %s to parse", ref($jsp));
                 $r = $jsp->parse($args);
 
                 unless(defined($r)) {