App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Yahoo.pm view on Meta::CPAN
(pred => $yahoo_pred,
name => __('_Yahoo Stock Page'),
desc => __('Open web browser at the Yahoo quote page for this stock'),
proc => sub {
my ($symbol) = @_;
return "https://"
. App::Chart::Database->preference_get ('yahoo-quote-host',
'finance.yahoo.com')
. "/quote/"
. URI::Escape::uri_escape($symbol);
});
#-----------------------------------------------------------------------------
# Quote Delays - Exchanges Page
#
# This uses the help page
#
use constant EXCHANGES_URL =>
'https://help.yahoo.com/kb/finance-app-for-android/exchanges-data-providers-yahoo-finance-sln2310.html';
#
# which has a table of quote delays for exchanges, by suffix.
#
# Past URL was https://help.yahoo.com/kb/SLN2310.html and the
# same SLN part would suggest it's about everything, meaning both
# web site data and any Yahoo mobile phone applications.
# Distant past URL was http://finance.yahoo.com/exchanges
# Refetch the exchanges page after EXCHANGES_UPDATE_DAYS.
# The page is bloated by a script greatly exceeding the actual info,
# and doesn't offer a Last-Modified. Expect it changes infrequently.
#
use constant EXCHANGES_UPDATE_DAYS => 14;
# containing arefs [$pred,'.XX']
my @quote_delay_aliases;
sub setup_quote_delay_alias {
my ($pred, $suffix) = @_;
push @quote_delay_aliases, [ $pred, $suffix ];
}
sub symbol_quote_delay {
my ($symbol) = @_;
# indices all in real time
if ($index_pred->match($symbol)) { return 0; }
my $suffix = App::Chart::symbol_suffix ($symbol);
my $h = exchanges_data();
my $delay = $h->{$suffix};
if (! defined $delay) {
if (my $elem = List::Util::first { $_->[0]->match ($symbol) }
@quote_delay_aliases) {
$suffix = $elem->[1];
$delay = $h->{$suffix};
}
}
if (! defined $delay) {
# guess default 20 minutes
$delay = 20;
}
return $delay;
}
# exchanges_data() return a hashref of exchange delay data like
# { '.AX' => 20, '.BI' => 15 }
# which means .AX quotes are delayed by 20 minutes.
#
sub exchanges_data {
require App::Chart::Pagebits;
return App::Chart::Pagebits::get
(name => __('Yahoo exchanges page'),
url => EXCHANGES_URL,
key => 'yahoo-quote-delays',
freq_days => EXCHANGES_UPDATE_DAYS,
parse => \&exchanges_parse);
}
sub exchanges_parse {
my ($content) = @_;
my $h = {};
require HTML::TableExtract;
my $te = HTML::TableExtract->new (headers => ['Suffix', 'Delay']);
$te->parse($content);
if (! $te->tables) {
warn "Yahoo exchanges page unrecognised, assuming 15 min quote delay";
return $h;
}
foreach my $row ($te->rows) {
my $suffix = $row->[0];
my $delay = $row->[1];
next if ($suffix eq 'N/A');
# eg "15 min"
# or "15 min**" with footnote
#
if ($delay =~ /^(\d+) min/) {
$delay = $1;
} elsif ($delay =~ /real/i) {
$delay = 0;
} else {
warn "Yahoo exchanges page unrecognised delay: \"$delay\"\n";
next;
}
$h->{$suffix} = $delay + 0;
}
return $h;
}
#-----------------------------------------------------------------------------
# Info - Share Names
#
# This uses the info pages like
#
# https://query2.finance.yahoo.com/v1/finance/search?q=CSCO&enableFuzzyQuery=false
#
( run in 1.410 second using v1.01-cache-2.11-cpan-39bf76dae61 )