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 )