#!/usr/bin/env perl use warnings FATAL => 'all'; use strict; use 5.010; use MP4::Info 'get_mp4tag'; my %func = ( external => sub { my $file=shift; return `AtomicParsley "$file" -T 1 2>/dev/null`=~/hdvd/i; }, scan => sub { my $file=shift; my $BUFN = 1024; $BUFN *= 4096; my $SIG = '68 64 76 64 00 00 00 11 64 61 74 61 00 00 00 15' .'00 00 00 00 02 00 00 00'; $SIG =~ tr[ ][]d; $SIG = pack 'H*', $SIG; open my $in, '<:raw', $file or die $!; my( $offset, $buffer ) = ( 0, '' ); while( sysread( $in, $buffer, $BUFN, length $buffer ) ) { my $pos = 1+index( $buffer, $SIG ); if( $pos ) { return 1; } $offset += length( $buffer ) - length( $SIG ); $buffer = substr $buffer, - length $SIG; } close $in; return; }, mp4info => sub { my $file=shift; my $tag = get_mp4tag($file) or return; return !!$tag->{HDVD}; }, ); die "Usage: $0 ".join('|',sort keys %func)." PATH\n" unless @ARGV==2 && exists $func{$ARGV[0]} && -d $ARGV[1]; my $FUNC = $ARGV[0]; my $PATH = $ARGV[1]; use File::Find 'find'; my ($yes,$no,$size) = (0,0,0); find({ wanted=>sub { return unless -f && /\.(mp4|m4[apvb])$/i; $size+=-s; if ($func{$FUNC}->($_)) { $yes++; say "YES $_"; } else { $no++; say " no $_"; } }}, $PATH); say "yes=$yes, no=$no, size=$size";