diff --git a/textarchive/oggtags.pl b/textarchive/oggtags.pl
new file mode 100755
index 0000000000000000000000000000000000000000..b008cfa9a36ff839ea1621aa93a70042f89f9b3c
--- /dev/null
+++ b/textarchive/oggtags.pl
@@ -0,0 +1,74 @@
+#!/usr/bin/perl
+
+use strict;
+
+use Data::Dumper;
+$Data::Dumper::Indent= 1;
+
+use FileHandle;
+
+binmode( STDOUT, ':utf8' ); autoflush STDOUT 1;
+binmode( STDERR, ':utf8' ); autoflush STDERR 1;
+binmode( STDIN,  ':utf8' );
+
+my $dir= shift(@ARGV) || '.';
+
+my $res= scan_ogg_dir($dir);
+print __LINE__, " res: ", Dumper($res);
+
+print_info ($res);
+exit;
+
+sub print_info
+{
+  my $d= shift;
+
+  foreach my $track (@$d)
+  {
+    printf ("%2d %s\n", $track->{TRACKNUMBER}, $track->{TITLE});
+  }
+}
+
+sub scan_ogg_dir
+{
+  my $dir= shift || '.';
+
+  chdir($dir) unless ($dir eq '.');
+  my @cmd= ('ogginfo', '*.ogg');
+
+  open(OI, '-|:utf8', "ogginfo *.ogg") or die;
+  my @res=();
+  my $track;
+  my $st= undef;
+  while (<OI>)
+  {
+    chop;
+    print __LINE__, " st=[$st] l=[$_]\n";
+    if (m#^Processing file "(.*)"...#)
+    {
+      my $fnm= $1;
+      $track= { filename => $fnm };
+      push (@res, $track);
+      $st= undef;
+    }
+    elsif ($_ eq 'User comments section follows...')
+    {
+      $st= 'UCS';
+    }
+    elsif ($_ =~ m#Vorbis stream (\d+):#)
+    {
+      my $stream_num= $1;
+      $st= 'SI';
+    }
+    elsif ($st eq 'UCS' && m#^[\t ]+([A-Z_]+)=(.+)#)
+    {
+      my ($label, $value)= ($1, $2);
+      print __LINE__, " label=[$label] value=[$value]\n";
+      $track->{$label}= $value;
+    }
+  }
+  close(OI);
+
+  \@res;
+}
+