diff options
Diffstat (limited to 'lib/AniDB/Manager.pm')
-rw-r--r-- | lib/AniDB/Manager.pm | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/lib/AniDB/Manager.pm b/lib/AniDB/Manager.pm index eeb724f..0539c07 100644 --- a/lib/AniDB/Manager.pm +++ b/lib/AniDB/Manager.pm @@ -4,12 +4,17 @@ use experimental 'signatures'; use Moo; use Log::Any '$log'; use Path::Tiny; +use AniDB::Hashing; use namespace::clean; has datastore => ( is => 'ro', required => 1, - handles => [qw(update)], +); + +has api_client => ( + is => 'ro', + required => 1, ); around BUILDARGS => sub($orig,$class,@args) { @@ -20,6 +25,12 @@ around BUILDARGS => sub($orig,$class,@args) { database => $db_name, }); } + if (my $username = $args->{username}) { + require AniDB::APIClient;; + $args->{api_client} = AniDB::APIClient->new({ + %{$args}{qw(username password)}, + }); + } return $args; }; @@ -35,6 +46,7 @@ sub _build_renamer { sub new_name_for($self,$path) { $path = path($path)->realpath; + $self->update($path); my $full_info = $self->datastore->full_info_for($path); return $self->renamer->new_name_for($path,$full_info); } @@ -61,4 +73,38 @@ sub rename($self,$path,$new_path) { } } +sub update($self,$path) { + $path = path($path)->realpath; + + my $stat = $path->stat; + + return unless $self->datastore->has_changed($path,$stat); + + my $hash = AniDB::Hashing::hash_fd($path->openr_raw); + + $self->datastore->update_path_info( + $path => my $path_info = { + size => $stat->size, + mtime => $stat->mtime, + hash => $hash, + }, + ); + + my $episode_info = $self->datastore->episode_info_for($path_info); + unless ($episode_info) { + $episode_info = $self->api_client->episode_info_for($path_info); + $self->datastore->update_episode_info( + $path_info, $episode_info, + ); + } + + my $anime_info = $self->datastore->anime_info_for($episode_info); + unless ($anime_info) { + $anime_info = $self->api_client->anime_info_for($episode_info); + $self->datastore->update_anime_info( + $episode_info, $anime_info, + ); + } +} + 1; |