# -*- coding: UTF-8 -*- # pylint: disable=C0111,R0903 """Display a stock quote from finance.yahoo.com Requires the following python packages: * requests Parameters: * stock.symbols : Comma-separated list of symbols to fetch * stock.change : Should we fetch change in stock value (defaults to True) contributed by `msoulier `_ - many thanks! """ import json import urllib.request import logging import core.module import core.widget import core.decorators import util.format class Module(core.module.Module): @core.decorators.every(hours=1) def __init__(self, config, theme): super().__init__(config, theme, core.widget.Widget(self.value)) self.__symbols = self.parameter("symbols", "") self.__change = util.format.asbool(self.parameter("change", True)) self.__value = None def value(self, widget): results = [] if not self.__value: return "n/a" data = json.loads(self.__value) for symbol in data["quoteResponse"]["result"]: valkey = "regularMarketChange" if self.__change else "regularMarketPrice" sym = symbol.get("symbol", "n/a") currency = symbol.get("currency", "USD") val = "n/a" if not valkey in symbol else "{:.2f}".format(symbol[valkey]) results.append("{} {} {}".format(sym, val, currency)) return " ".join(results) def fetch(self): if self.__symbols: url = "https://query1.finance.yahoo.com/v7/finance/quote?symbols=" url += ( self.__symbols + "&fields=regularMarketPrice,currency,regularMarketChange" ) try: return urllib.request.urlopen(url).read().strip() except urllib.request.URLError: logging.error("unable to open stock exchange url") return None else: logging.error("unable to retrieve stock exchange rate") return None def update(self): self.__value = self.fetch() # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4