Add YH Finance (FINANCEAPI) API Key to Quotes infrastructure.

And add financeapi to known sources.
This commit is contained in:
John Ralls 2024-09-19 13:00:33 -07:00
parent 19e6f7e1a3
commit a23506c88a
4 changed files with 75 additions and 36 deletions

View File

@ -3,7 +3,12 @@
<key name="alphavantage-api-key" type="s">
<default>''</default>
<summary>Alpha Vantage API key</summary>
<description>To retrieve online quotes from Alphavantage, this key needs to be set. A key can be retrieved from the Alpha Vantage website.</description>
<description>Alpha Vantage requires an API key to use their service. You can obtain a key by registering for a free account at the Alpha Vantage website, https://alphavantage.co/support/#api-key.</description>
</key>
<key name="yhfinance-api-key" type="s">
<default>''</default>
<summary>YH Finance (FinanceAPI) API key</summary>
<description>YH Finance requires an API key to use their FinanceAPI service. You can obtain a key by registering for a free account at the YH Finance website, https://financeapi.net/pricing.</description>
</key>
</schema>
</schemalist>

View File

@ -3656,10 +3656,10 @@ many months before the current month</property>
<property name="row-spacing">3</property>
<property name="column-spacing">6</property>
<child>
<object class="GtkLabel" id="apilabel">
<object class="GtkLabel" id="avapilabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="tooltip-text" translatable="yes">To retrieve online quotes from Alphavantage, this key needs to be set. A key can be retrieved from the Alpha Vantage website.</property>
<property name="tooltip-text" translatable="yes">Alpha Vantage requires an API key to use their service. You can obtain a key by registering for a free account at the Alpha Vantage website, https://www.alphavantage.co/support/#api-key.</property>
<property name="label" translatable="yes">Alpha Vantage API key</property>
</object>
<packing>
@ -3671,7 +3671,7 @@ many months before the current month</property>
<object class="GtkEntry" id="pref/general.finance-quote/alphavantage-api-key">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="tooltip-text" translatable="yes">To retrieve online quotes from Alphavantage, this key needs to be set. A key can be retrieved from the Alpha Vantage website.</property>
<property name="tooltip-text" translatable="yes">Alpha Vantage requires an API key to use their service. You can obtain a key by registering for a free account at the Alpha Vantage website, https://alphavantage.co/support/#api-key.</property>
<property name="hexpand">True</property>
</object>
<packing>
@ -3679,6 +3679,30 @@ many months before the current month</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="yhapilabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="tooltip-text" translatable="yes">YH Finance requires an API key to use their FinanceAPI service. You can obtain a key by registering for a free account at the YH Finance website, https://financeapi.net/pricing.</property>
<property name="label" translatable="yes">YH Finance (FinanceAPI) API key</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="pref/general.finance-quote/yhfinance-api-key">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="tooltip-text" translatable="yes">YH Finance requires an API key to use their FinanceAPI service. You can obtain a key by registering for a free account at the YH Finance website, https://financeapi.net/pricing.</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label22">
<property name="visible">True</property>

View File

@ -20,6 +20,7 @@
* Boston, MA 02110-1301, USA gnu@gnu.org *
\ *******************************************************************/
#include <boost/process/environment.hpp>
#include <config.h>
#include <qoflog.h>
@ -61,6 +62,8 @@
#include <qofbook.h>
static const QofLogModule log_module = "gnc.price-quotes";
static const char* av_api_env = "ALPHAVANTAGE_API_KEY";
static const char* yh_api_env = "FINANCEAPI_API_KEY";
namespace bl = boost::locale;
namespace bp = boost::process;
@ -128,7 +131,8 @@ class GncFQQuoteSource final : public GncQuoteSource
std::string c_fq_wrapper;
std::string m_version;
StrVec m_sources;
std::string m_api_key;
std::string m_av_api_key;
std::string m_yh_api_key;
public:
GncFQQuoteSource();
~GncFQQuoteSource() = default;
@ -146,9 +150,28 @@ static std::string parse_quotesource_error(const std::string& line);
static const std::string empty_string{};
static inline std::string
get_api_key(const char* prefskey, const char* envvar)
{
std::string keyval{};
auto key = gnc_prefs_get_string ("general.finance-quote", prefskey);
if (!(key && *key))
{
g_free (key);
key = g_strdup(getenv(envvar));
}
if (key)
{
keyval = std::string(key);
g_free (key);
}
return keyval;
}
GncFQQuoteSource::GncFQQuoteSource() :
c_cmd{bp::search_path("perl")},
m_version{}, m_sources{}, m_api_key{}
m_version{}, m_sources{}, m_av_api_key{}, m_yh_api_key{}
{
char *bindir = gnc_path_get_bindir();
c_fq_wrapper = std::string(bindir) + "/finance-quote-wrapper";
@ -180,20 +203,10 @@ m_version{}, m_sources{}, m_api_key{}
m_sources = std::move(sources);
std::sort (m_sources.begin(), m_sources.end());
auto av_key = gnc_prefs_get_string ("general.finance-quote", "alphavantage-api-key");
if (!(av_key && *av_key))
{
g_free (av_key);
av_key = g_strdup(getenv("ALPHAVANTAGE_API_KEY"));
}
if (av_key)
{
m_api_key = std::string(av_key);
g_free (av_key);
}
else
m_av_api_key = get_api_key("alphavantage-api-key", av_api_env);
if (m_av_api_key.empty())
PWARN("No Alpha Vantage API key set, currency quotes and other AlphaVantage based quotes won't work.");
m_yh_api_key = get_api_key("yhfinance-api-key", yh_api_env);
}
QuoteResult
@ -215,26 +228,22 @@ GncFQQuoteSource::run_cmd (const StrVec& args, const std::string& json_string) c
boost::asio::io_service svc;
auto input_buf = bp::buffer (json_string);
auto curr_env{boost::this_process::environment()};
bp::environment new_env{curr_env};
bp::child process;
if (m_api_key.empty())
process = bp::child(c_cmd, args,
bp::std_out > out_buf,
bp::std_err > err_buf,
bp::std_in < input_buf,
if (!m_av_api_key.empty())
new_env[av_api_env] = m_av_api_key;
if (!m_yh_api_key.empty())
new_env[yh_api_env] = m_yh_api_key;
process = bp::child(c_cmd, args,
bp::std_out > out_buf,
bp::std_err > err_buf,
bp::std_in < input_buf,
#ifdef BOOST_WINDOWS_API
bp::windows::create_no_window,
bp::windows::create_no_window,
#endif
svc);
else
process = bp::child(c_cmd, args,
bp::std_out > out_buf,
bp::std_err > err_buf,
bp::std_in < input_buf,
#ifdef BOOST_WINDOWS_API
bp::windows::create_no_window,
#endif
bp::env["ALPHAVANTAGE_API_KEY"] = m_api_key,
svc);
new_env,
svc);
svc.run();
process.wait();

View File

@ -217,6 +217,7 @@ static QuoteSourceList single_quote_sources =
{ false, SOURCE_SINGLE, "US Govt. Thrift Savings Plan", "tsp" },
{ false, SOURCE_SINGLE, "Yahoo as JSON", "yahoo_json" },
{ false, SOURCE_SINGLE, "Yahoo Web", "yahooweb" },
{ false, SOURCE_SINGLE, "YH Finance (FinanceAPI)", "financeapi" },
};
static QuoteSourceList multiple_quote_sources =