App-DrivePlayer
view release on metacpan or search on metacpan
lib/App/DrivePlayer/Scanner.pm view on Meta::CPAN
package App::DrivePlayer::Scanner;
use App::DrivePlayer::Setup;
use Encode qw( decode_utf8 is_utf8 );
my $FOLDER_MIME = 'application/vnd.google-apps.folder';
my $DRIVE_FIELDS = 'files(id,name,mimeType,size,modifiedTime,parents,videoMediaMetadata)';
# Google::RestApi returns HTTP bodies as raw UTF-8 byte strings (no utf8
# flag). Passing those directly to DBIx::Class with sqlite_unicode=1 causes
# double-encoding: each byte is re-encoded as if it were Latin-1. Decode
# once at the boundary so the rest of the code sees proper Unicode.
sub _u8 {
my ($s) = @_;
return $s unless defined $s && length $s && !is_utf8($s);
my $d = eval { decode_utf8($s, Encode::FB_CROAK) };
return $@ ? $s : $d;
}
Readonly my $LARGE_DELETION_THRESHOLD => 10;
has drive => (
is => 'ro',
isa => HasMethods['list'],
required => 1,
);
has db => (
is => 'ro',
isa => HasMethods['upsert_scan_folder', 'upsert_folder', 'upsert_track'],
required => 1,
);
has on_progress => (
is => 'ro',
isa => CodeRef,
predicate => 1,
);
has on_track_found => (
is => 'ro',
isa => CodeRef,
predicate => 1,
);
has on_large_deletion => (
is => 'ro',
isa => Maybe[CodeRef],
default => sub { undef },
);
has _stop => (
is => 'rw',
isa => Bool,
default => 0,
);
has _seen_track_ids => ( is => 'rw', isa => HashRef, default => sub { {} } );
has _seen_folder_ids => ( is => 'rw', isa => HashRef, default => sub { {} } );
sub stop { $_[0]->_stop(1) }
sub scan_folder {
my ($self, $drive_id, $name) = @_;
$self->_stop(0);
$self->_seen_track_ids({});
$self->_seen_folder_ids({});
my $scan_folder = $self->db->upsert_scan_folder($drive_id, $name);
( run in 0.624 second using v1.01-cache-2.11-cpan-d7f47b0818f )