summaryrefslogtreecommitdiffstats
path: root/py3status/modules/bitcoin-price-checker.py
diff options
context:
space:
mode:
authorAndré Doser <doser.andre@gmail.com>2015-01-27 16:45:41 +0100
committerAndré Doser <doser.andre@gmail.com>2015-01-27 16:45:41 +0100
commit347bf9d24e2dfd314c7a29d786cfd02c5452290c (patch)
treeb4b22267f498eca1c41a7e36a9fc03f0514784c2 /py3status/modules/bitcoin-price-checker.py
parent27111e8806ca2101a07fb7aed23413c7c1a43474 (diff)
Using bitcoincharts.
Diffstat (limited to 'py3status/modules/bitcoin-price-checker.py')
-rw-r--r--py3status/modules/bitcoin-price-checker.py113
1 files changed, 41 insertions, 72 deletions
diff --git a/py3status/modules/bitcoin-price-checker.py b/py3status/modules/bitcoin-price-checker.py
index f20db00..c717952 100644
--- a/py3status/modules/bitcoin-price-checker.py
+++ b/py3status/modules/bitcoin-price-checker.py
@@ -1,14 +1,11 @@
# -*- coding: utf-8 -*-
"""
-Module for displaying bitcoin prices.
+Module for displaying bitcoin prices using
+the API by www.bitcoincharts.com.
Written and contributed by @tasse:
Andre Doser <doser.andre AT gmail.com>
"""
-# -*- coding: utf-8 -*-
-"""
-Module for displaying bitcoin prices.
-"""
import json
import urllib.request as ul
from time import time
@@ -18,77 +15,49 @@ last_price = 0
class Py3status:
- # btc-e, api,bitfinex, bitstamp, bitpay
- websites = 'btc-e'
- value = 'last'
- cache_timeout = 120
-
- def __init__(self):
- self._hoster = {'https://btc-e.com/api/2/btc_usd/ticker': self._get_btce,
- 'https://bitstamp.net/api/ticker/': self._get_bitstamp,
- 'https://api.bitfinex.com/v1/pubticker/BTCUSD': self._get_bitfinex,
- 'https://bitpay.com/api/rates': self._get_bitpay}
-
- # returns the price for a given site in USD
- # value is elem of {high, low, avg, last}
- def _get_btce(self, url, value):
- try:
- data = json.loads(ul.urlopen(url).read().decode())
- # default is 'last' price
- value = data['ticker'].get(value, data['ticker']['last'])
- except:
- value = 'N/A'
- return 'BTC-e', value
-
- def _get_bitstamp(self, url, value):
- # bitstamp API is different in the following
- if value == 'avg':
- value = 'vwap'
- try:
- data = json.loads(ul.urlopen(url).read().decode())
- value = data.get(value, data['last'])
- except:
- value = 'N/A'
- return 'BS', value
-
- def _get_bitfinex(self, url, value):
- # bitfinex API is different in the following
- if value == 'avg':
- value = 'mid'
- if value == 'last':
- value = 'last_price'
- try:
- data = json.loads(ul.urlopen(url).read().decode())
- value = data.get(value, data['last_price'])
- except:
- value = 'N/A'
- return 'BF', value
-
- def _get_bitpay(self, url, value):
- try:
- data = json.loads(ul.urlopen(url).read().decode())
- value = [x['rate'] for x in data if x['code'] == 'USD'][0]
- except:
- value = 'N/A'
- return 'BP', value
+ # possible markets see http://bitcoincharts.com/markets/list/
+ markets = 'btceEUR, btcdeEUR'
+ field = 'close'
+ cache_timeout = 900 # bitcoincharts: load max. every 15 min
+ symbols = True
+ color_index = -1
+ _url = 'http://api.bitcoincharts.com/v1/markets.json'
+ _map = {'EUR': '€', 'USD': '$', 'GBP': '£', 'YEN': '¥', 'CNY': '¥',
+ 'AUD': '$'}
+ # markets according to the following lists:
+ #
+ def _get_price(self, data, market, field):
+ for m in data:
+ if m['symbol'] == market:
+ return m[field]
def get_rate(self, i3s_output_list, i3s_config):
response = {'full_text': '', 'name': 'bitcoin rates',
'cached_until': time() + self.cache_timeout}
- rates = []
- cnt = 0
- for url, f in self._hoster.items():
- rgx = re.search('.*//(.*)\..*', url).group(1)
- if rgx not in self.websites:
- continue
- name, rate = f(url, self.value)
- rates.append('{}: '.format(name)
- + ('N/A' if rate == 'N/A'
- else ('{:.2f}$'.format(float(rate)))))
- cnt += 1
- # don't color multiple sites
+ # get the data from the bitcoincharts website
+ try:
+ data = json.loads(ul.urlopen(self._url).read().decode())
+ except Exception:
+ response['color'] = i3s_config['color_bad']
+ response['full_text'] = 'Bitcoincharts not reachable'
+ return response
+ # get the rate for each market given
+ rates, markets = [], self.markets.split(",")
+ color_rate = None
+ for i, market in enumerate(markets):
+ market = market.strip()
+ try:
+ rate = self._get_price(data, market, self.field)
+ if i == self.color_index:
+ color_rate = rate
+ except Exception:
+ pass
+ rates.append('{}: '.format((market[:-3] if rate else market))
+ + ('N/A' if not rate
+ else ('{:.2f}{}'.format(rate, (self._map.get(market[-3:], market[-3:]) if self.symbols else market[-3:])))))
+ # don't color multiple sites if no color_index is given
global last_price
- if cnt == 1:
+ if len(rates) == 1 or self.color_index >= -1:
if last_price == 0:
pass
elif rate < last_price:
@@ -105,4 +74,4 @@ if __name__ == '__main__':
while True:
print(x.get_rate([], {'color_good': 'green',
'color_bad': 'red'}))
- sleep(1)
+ sleep(5)