App-DrivePlayer
view release on metacpan or search on metacpan
lib/App/DrivePlayer/GUI.pm view on Meta::CPAN
App::DrivePlayer::GUI::MetadataFetch
App::DrivePlayer::GUI::SheetSync
App::DrivePlayer::GUI::FolderBrowse
);
sub _bearer_token {
my ($self) = @_;
return unless $self->rest_api;
my %h = @{ $self->rest_api->auth->headers() };
return $h{Authorization};
}
sub _build_db {
my ($self) = @_;
return App::DrivePlayer::DB->new(path => $self->config->db_path());
}
sub BUILD {
my ($self) = @_;
$self->_init_logging();
}
sub run {
my ($self) = @_;
my $db_is_new = !-f $self->config->db_path();
$self->_build_ui();
$self->_auto_sync_from_sheet_on_new_db() if $db_is_new;
$self->_prune_removed_folders();
$self->_load_library();
Glib::Timeout->add($POLL_INTERVAL_MS, sub {
$self->_player_poll();
return TRUE;
});
Gtk3->main();
$self->player->quit() if $self->player;
}
# ---- Initialisation ----
sub _init_logging {
my ($self) = @_;
$self->config->ensure_dirs();
my $level = $self->config->log_level();
my $file = $self->config->log_file() // '/tmp/drive_player.log';
my $log4perl_conf = "
log4perl.rootLogger=$level, Screen, File
log4perl.appender.Screen=Log::Log4perl::Appender::Screen
log4perl.appender.Screen.layout=Log::Log4perl::Layout::PatternLayout
log4perl.appender.Screen.layout.ConversionPattern=%d [%p] %m%n
log4perl.appender.File=Log::Log4perl::Appender::File
log4perl.appender.File.filename=$file
log4perl.appender.File.utf8=1
log4perl.appender.File.layout=Log::Log4perl::Layout::PatternLayout
log4perl.appender.File.layout.ConversionPattern=%d [%p] %m%n
";
if (eval { require Log::Log4perl; 1 }) {
Log::Log4perl->init(\$log4perl_conf);
binmode STDERR, ':encoding(UTF-8)';
}
}
sub _init_api {
my ($self) = @_;
return $self->rest_api if $self->rest_api;
my $auth_cfg = $self->config->auth_config();
unless ($auth_cfg->{client_id} && $auth_cfg->{client_secret}) {
$self->_show_error(
"Google API credentials not configured.\n\n" .
"Open File > Settings and enter your OAuth Client ID and Secret.\n\n" .
"You can obtain these from the Google Cloud Console under\n" .
"APIs & Services > Credentials (OAuth 2.0 Client ID, Desktop app type)."
);
return;
}
unless (-f ($auth_cfg->{token_file} // '')) {
$self->_show_error("OAuth token file not found: $auth_cfg->{token_file}\n\n" .
"Run the token creator from p5-google-restapi:\n" .
" bin/google_restapi_oauth_token_creator");
return;
}
my $api = eval { Google::RestApi->new(auth => $auth_cfg) };
if ($@) {
$self->_show_error("Failed to initialise Google API: $@");
return;
}
$self->rest_api($api);
$self->drive(Google::RestApi::DriveApi3->new(api => $api));
$self->player(App::DrivePlayer::Player->new(
auth => $api->auth(),
on_track_end => sub { $self->_on_track_end() },
on_position => sub { $self->_on_position(@_) },
on_state_change => sub { $self->_on_state_change(@_) },
));
return $self->rest_api;
}
sub _reinit_api {
my ($self) = @_;
if ($self->player) {
$self->player->quit();
$self->player(undef);
}
$self->rest_api(undef);
$self->drive(undef);
return $self->_init_api();
}
# ---- UI Construction ----
sub _build_ui {
my ($self) = @_;
Gtk3::Window::set_default_icon_name('multimedia-player');
( run in 0.766 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )