From 01323307a29b1cc7eeae1c9a1fe9188ce12ea64f Mon Sep 17 00:00:00 2001 From: Dean Jackson Date: Sat, 15 Jul 2017 23:09:17 +0200 Subject: [PATCH 1/2] Interleave HTTP requests --- src/convert.py | 26 +++++++++++--------- src/currency.py | 64 +++++++++++++++++++++++++++++++++---------------- src/version | 1 - 3 files changed, 58 insertions(+), 33 deletions(-) delete mode 100644 src/version diff --git a/src/convert.py b/src/convert.py index 659d466..defa533 100755 --- a/src/convert.py +++ b/src/convert.py @@ -181,11 +181,9 @@ def convert(query): number = format_number(conv.magnitude) log.debug('%s %s' % (number, conv.units)) - # fmt = '%%0.%df' % DECIMAL_PLACES - # number = fmt % conv.magnitude - # number = number.replace('.', DECIMAL_SEPARATOR) + # log.debug('%r', str(conv.units)) - return number, conv.units + return number, str(conv.units), str(conv.dimensionality) def main(wf): @@ -220,6 +218,7 @@ def main(wf): # Update currency rates cmd = ['/usr/bin/python', wf.workflowfile('currency.py')] run_in_background('update', cmd) + wf.rerun = 0.5 if is_running('update'): wf.rerun = 0.5 @@ -235,7 +234,7 @@ def main(wf): number = None try: - number, unit = convert(query) + number, unit, dim = convert(query) except UndefinedUnitError as err: log.critical('unknown unit : %s', err.unit_names) error = 'Unknown unit : {}'.format(err.unit_names) @@ -265,12 +264,17 @@ def main(wf): if not COPY_UNIT: copytext = number - wf.add_item(value, - valid=True, - arg=copytext, - copytext=copytext, - largetext=value, - icon='icon.png') + it = wf.add_item(value, + valid=True, + arg=copytext, + copytext=copytext, + largetext=value, + icon='icon.png') + + mod = it.add_modifier('cmd', 'Save {} as default unit for {}'.format( + unit, dim)) + mod.setvar('unit', unit) + mod.setvar('dimensionality', dim) wf.send_feedback() log.debug('finished') diff --git a/src/currency.py b/src/currency.py index c132c57..106d6b8 100644 --- a/src/currency.py +++ b/src/currency.py @@ -13,15 +13,15 @@ from __future__ import print_function import csv -from itertools import izip_longest +from itertools import chain, izip_longest from multiprocessing.dummy import Pool import re import time from workflow import Workflow, web -from config import (CURRENCY_CACHE_NAME, - CURRENCY_CACHE_AGE, +from config import (CURRENCY_CACHE_AGE, + CURRENCY_CACHE_NAME, REFERENCE_CURRENCY, CURRENCIES, CRYPTO_CURRENCIES, @@ -35,21 +35,40 @@ parse_yahoo_response = re.compile(REFERENCE_CURRENCY + '(.+)=X').match -def grouper(n, iterable, fillvalue=None): +def grouper(n, iterable): """Return iterable that splits `iterable` into groups of size `n`. Args: n (int): Size of each group. iterable (iterable): The iterable to split into groups. - fillvalue (object, optional): Value to pad short sequences with. Returns: - iterator: Yields tuples of length `n` containing items + list: Tuples of length `n` containing items from `iterable`. """ + sentinel = object() args = [iter(iterable)] * n - return izip_longest(fillvalue=fillvalue, *args) + groups = [] + for l in izip_longest(*args, fillvalue=sentinel): + groups.append([v for v in l if v is not sentinel]) + return groups + + +def interleave(*iterables): + """Interleave elements of ``iterables``. + + Args: + *iterables: Iterables to interleave + + Returns: + list: Elements of ``iterables`` interleaved + + """ + sentinel = object() + it = izip_longest(*iterables, fillvalue=sentinel) + c = chain.from_iterable(it) + return list(filter(lambda v: v is not sentinel, c)) def load_cryptocurrency_rates(symbols): @@ -69,8 +88,7 @@ def load_cryptocurrency_rates(symbols): r.raise_for_status() data = r.json() - log.debug('url=%r', url) - log.debug('data=%r', data) + log.debug('fetching %s ...', url) return data @@ -101,6 +119,7 @@ def load_yahoo_rates(symbols): # Fetch data # log.debug('Fetching %s ...', url) + log.debug('fetching %s ...', url) r = web.get(url) r.raise_for_status() @@ -145,7 +164,7 @@ def load_yahoo_rates(symbols): return rates -def fetch_currency_rates(): +def fetch_exchange_rates(): """Retrieve all currency exchange rates. Batch currencies into requests of `SYMBOLS_PER_REQUEST` currencies each. @@ -157,14 +176,17 @@ def fetch_currency_rates(): """ rates = {} futures = [] - pool = Pool(6) + yjobs = [] for symbols in grouper(SYMBOLS_PER_REQUEST, CURRENCIES.keys()): - symbols = [s for s in symbols if s] - futures.append(pool.apply_async(load_yahoo_rates, (symbols,))) + yjobs.append((load_yahoo_rates, (symbols,))) + cjobs = [] for symbols in grouper(SYMBOLS_PER_REQUEST, CRYPTO_CURRENCIES.keys()): - symbols = [s for s in symbols if s] - futures.append(pool.apply_async(load_cryptocurrency_rates, (symbols,))) + cjobs.append((load_cryptocurrency_rates, (symbols,))) + + pool = Pool(4) + for job in interleave(yjobs, cjobs): + futures.append(pool.apply_async(*job)) pool.close() pool.join() @@ -185,16 +207,16 @@ def main(wf): start_time = time.time() log.info('fetching exchange rates from Yahoo! and CryptoCompare.com ...') - exchange_rates = wf.cached_data(CURRENCY_CACHE_NAME, - fetch_currency_rates, - CURRENCY_CACHE_AGE) + rates = wf.cached_data(CURRENCY_CACHE_NAME, + fetch_exchange_rates, + CURRENCY_CACHE_AGE) elapsed = time.time() - start_time log.info('%d exchange rates updated in %0.2f seconds.', - len(exchange_rates), elapsed) + len(rates), elapsed) - for currency, rate in exchange_rates.items(): - wf.logger.debug('1 EUR = %s %s', rate, currency) + for currency, rate in sorted(rates.items()): + log.debug('1 EUR = %s %s', rate, currency) if __name__ == '__main__': diff --git a/src/version b/src/version deleted file mode 100644 index c20c8ac..0000000 --- a/src/version +++ /dev/null @@ -1 +0,0 @@ -2.6 \ No newline at end of file From 26a4494e6fbeab75e121663a207edb5d762b51db Mon Sep 17 00:00:00 2001 From: Dean Jackson Date: Sun, 16 Jul 2017 10:08:33 +0200 Subject: [PATCH 2/2] Add default units and user-configured currencies --- src/active_currencies.txt.default | 187 +++ src/config.py | 2435 +++++++++++++++-------------- src/convert.py | 26 +- src/currency.py | 59 +- src/defaults.py | 135 ++ src/info.plist | 187 ++- src/info.py | 36 +- 7 files changed, 1798 insertions(+), 1267 deletions(-) create mode 100644 src/active_currencies.txt.default create mode 100644 src/defaults.py diff --git a/src/active_currencies.txt.default b/src/active_currencies.txt.default new file mode 100644 index 0000000..2f13932 --- /dev/null +++ b/src/active_currencies.txt.default @@ -0,0 +1,187 @@ +# This file contains the symbols of active currencies, one per line. +# Fiat currencies are at the top, crypto currencies below. +# Lines beginning with # are ignored. +# +# For a list of all supported currencies, use `convinfo` in Alfred and +# choose "View All Supported Currencies". You can filter that list and +# hit CMD+C to copy the currency symbol to paste in this file. + +# Fiat currencies +AED +AFN +ALL +AMD +ANG +AOA +ARS +AUD +AWG +AZN +BAM +BBD +BDT +BGN +BHD +BIF +BMD +BND +BOB +BRL +BSD +BTN +BWP +BYR +BZD +CAD +CDF +CHF +CLF +CLP +CNY +COP +CRC +CUP +CVE +CZK +DJF +DKK +DOP +DZD +EGP +ERN +ETB +EUR +FJD +FKP +GBP +GEL +GHS +GIP +GMD +GNF +GTQ +GYD +HKD +HNL +HRK +HTG +HUF +IDR +ILS +INR +IQD +IRR +ISK +JMD +JOD +JPY +KES +KGS +KHR +KMF +KPW +KRW +KWD +KYD +KZT +LAK +LBP +LKR +LRD +LSL +LYD +MAD +MDL +MGA +MKD +MMK +MNT +MOP +MRO +MUR +MVR +MWK +MXN +MXV +MYR +MZN +NAD +NGN +NIO +NOK +NPR +NZD +OMR +PAB +PEN +PGK +PHP +PKR +PLN +PYG +QAR +RON +RSD +RUB +RWF +SAR +SBD +SCR +SDG +SEK +SGD +SHP +SLL +SOS +SRD +STD +SVC +SYP +SZL +THB +TJS +TMT +TND +TOP +TRY +TTD +TWD +TZS +UAH +UGX +USD +UYU +UZS +VEF +VND +VUV +WST +XAF +XAG +XAU +XCD +XDR +XOF +XPD +XPF +XPT +YER +ZAR +ZMW +ZWL + +# Crypto currencies +AUR +BTC +DASH +DOGE +ETC +ETH +LSK +LTC +MAID +SJCX +XEM +XMR +XRP +ZEC diff --git a/src/config.py b/src/config.py index 5450048..1de1c12 100644 --- a/src/config.py +++ b/src/config.py @@ -10,9 +10,8 @@ """Variables required by more than one script.""" -from __future__ import print_function, unicode_literals - import os +import shutil # ---------------------------------------------------------------------- # Keywords assigned to Alfred Keywords/Script Filters @@ -48,6 +47,8 @@ BUILTIN_UNIT_DEFINITIONS = os.path.join(os.path.dirname(__file__), CUSTOM_DEFINITIONS_FILENAME) +ACTIVE_CURRENCIES_FILENAME = 'active_currencies.txt' + # with open(os.path.join(os.path.dirname(__file__), # 'currencies.tsv'), 'rb') as fp: # reader = csv.reader(fp, delimiter=b'\t') @@ -78,7 +79,6 @@ 'BOB': u'Boliviano', 'BRL': u'Brazilian Real', 'BSD': u'Bahamian Dollar', - # 'BTC': u'Bitcoin', 'BTN': u'Ngultrum', 'BWP': u'Pula', 'BYR': u'Belarussian Ruble', @@ -238,1225 +238,1225 @@ # '808': u'808', # Pint doesn't accept units that begin with digits # '888': u'Octocoin', # Pint doesn't accept units that begin with digits # '8BIT': u'8BIT Coin', # Pint doesn't accept units that begin with digits - # 'ABY': u'ArtByte', - # 'AC': u'Asia Coin', - # 'ACES': u'AcesCoin', - # 'ACID': u'AcidCoin', - # 'ACN': u'AvonCoin', - # 'ACOIN': u'ACoin', - # 'ACP': u'Anarchists Prime', - # 'ADC': u'AudioCoin', - # 'ADCN': u'Asiadigicoin', - # 'ADN': u'Aiden', - # 'ADX': u'AdEx', - # 'ADZ': u'Adzcoin', - # 'AEC': u'AcesCoin', - # 'AEON': u'AeonCoin', - # 'AERO': u'Aero Coin', - # 'AGS': u'Aegis', - # 'AIB': u'AdvancedInternetBlock', - # 'AIR': u'Aircoin', - # 'ALC': u'Arab League Coin', - # 'ALEX': u'Alexandrite', - # 'ALF': u'AlphaCoin', - # 'ALN': u'AlienCoin', - # 'AM': u'AeroMe', - # 'AMBER': u'AmberCoin', - # 'AMC': u'AmericanCoin', - # 'AMIS': u'AMIS', - # 'AMP': u'Synereo', - # 'AMS': u'Amsterdam Coin', - # 'ANAL': u'AnalCoin', - # 'ANC': u'Anoncoin', - # 'AND': u'AndromedaCoin', - # 'ANS': u'Antshares', - # 'ANT': u'Aragon', - # 'ANTI': u'Anti Bitcoin', - # 'APC': u'AlpaCoin', - # 'APEX': u'ApexCoin', - # 'APT': u'Aptcoin', - # 'APX': u'Apx', - # 'ARB': u'Arbit Coin', - # 'ARCH': u'ArchCoin', - # 'ARCO': u'AquariusCoin', - # 'ARDR': u'Ardor', - # 'ARG': u'Argentum', - # 'ARGUS': u'ArgusCoin', - # 'ARI': u'AriCoin', - # 'ARK': u'ARK', - # 'ARM': u'Armory Coin', - # 'ARPA': u'ArpaCoin', - # 'ASAFE': u'Allsafe', - # 'ASN': u'Ascension Coin', - # 'AST': u'Astral', - # 'ATM': u'Autumncoin', - # 'ATMS': u'Atmos', - # 'ATOM': u'Atomic Coin', - # 'ATX': u'ArtexCoin', + 'ABY': u'ArtByte', + 'AC': u'Asia Coin', + 'ACES': u'AcesCoin', + 'ACID': u'AcidCoin', + 'ACN': u'AvonCoin', + 'ACOIN': u'ACoin', + 'ACP': u'Anarchists Prime', + 'ADC': u'AudioCoin', + 'ADCN': u'Asiadigicoin', + 'ADN': u'Aiden', + 'ADX': u'AdEx', + 'ADZ': u'Adzcoin', + 'AEC': u'AcesCoin', + 'AEON': u'AeonCoin', + 'AERO': u'Aero Coin', + 'AGS': u'Aegis', + 'AIB': u'AdvancedInternetBlock', + 'AIR': u'Aircoin', + 'ALC': u'Arab League Coin', + 'ALEX': u'Alexandrite', + 'ALF': u'AlphaCoin', + 'ALN': u'AlienCoin', + 'AM': u'AeroMe', + 'AMBER': u'AmberCoin', + 'AMC': u'AmericanCoin', + 'AMIS': u'AMIS', + 'AMP': u'Synereo', + 'AMS': u'Amsterdam Coin', + 'ANAL': u'AnalCoin', + 'ANC': u'Anoncoin', + 'AND': u'AndromedaCoin', + 'ANS': u'Antshares', + 'ANT': u'Aragon', + 'ANTI': u'Anti Bitcoin', + 'APC': u'AlpaCoin', + 'APEX': u'ApexCoin', + 'APT': u'Aptcoin', + 'APX': u'Apx', + 'ARB': u'Arbit Coin', + 'ARCH': u'ArchCoin', + 'ARCO': u'AquariusCoin', + 'ARDR': u'Ardor', + 'ARG': u'Argentum', + 'ARGUS': u'ArgusCoin', + 'ARI': u'AriCoin', + 'ARK': u'ARK', + 'ARM': u'Armory Coin', + 'ARPA': u'ArpaCoin', + 'ASAFE': u'Allsafe', + 'ASN': u'Ascension Coin', + 'AST': u'Astral', + 'ATM': u'Autumncoin', + 'ATMS': u'Atmos', + 'ATOM': u'Atomic Coin', + 'ATX': u'ArtexCoin', 'AUR': u'Aurora Coin', - # 'AV': u'Avatar Coin', - # 'AVT': u'AventCoin', - # 'AXIOM': u'Axiom Coin', - # 'AXR': u'AXRON', - # 'B3': u'B3 Coin', - # 'B@': u'BankCoin', - # 'BAC': u'BitalphaCoin', - # 'BAN': u'Babes and Nerds', - # 'BASH': u'LuckChain', - # 'BAT': u'Basic Attention Token', - # 'BAY': u'BitBay', - # 'BBCC': u'BaseballCardCoin', - # 'BBR': u'Boolberry', - # 'BCAP': u'Blockchain Capital', - # 'BCCOIN': u'BitConnect Coin', - # 'BCF': u'BitcoinFast', - # 'BCN': u'ByteCoin', - # 'BCR': u'BitCredit', - # 'BCX': u'BattleCoin', - # 'BCY': u'BitCrystals', - # 'BELA': u'BelaCoin', - # 'BEN': u'Benjamins', - # 'BENJI': u'BenjiRolls', - # 'BERN': u'BERNcash', - # 'BEST': u'BestChain', - # 'BET': u'BetaCoin', - # 'BFX': u'BitFinex Tokens', - # 'BHC': u'BighanCoin', - # 'BIC': u'Bikercoins', - # 'BIGUP': u'BigUp', - # 'BIOB': u'BioBar', - # 'BIOS': u'BiosCrypto', - # 'BIP': u'BipCoin', - # 'BIT16': u'16BitCoin', - # 'BITB': u'BitBean', - # 'BITCNY': u'bitCNY', - # 'BITOK': u'BitOKX', - # 'BITS': u'BitstarCoin', - # 'BITUSD': u'bitUSD', - # 'BITZ': u'Bitz Coin', - # 'BLAZR': u'BlazerCoin', - # 'BLC': u'BlakeCoin', - # 'BLITZ': u'BlitzCoin', - # 'BLK': u'BlackCoin', - # 'BLOCK': u'BlockNet', - # 'BLRY': u'BillaryCoin', - # 'BLU': u'BlueCoin', - # 'BM': u'BitMoon', - # 'BNB': u'Boats and Bitches', - # 'BNT': u'Bancor Network Token', - # 'BNX': u'BnrtxCoin', - # 'BOB': u'Bob Coin', - # 'BOLI': u'BolivarCoin', - # 'BOMB': u'BombCoin', - # 'BON': u'BonesCoin', - # 'BOOM': u'BOOM Coin', - # 'BOS': u'BOScoin', - # 'BOSON': u'BosonCoin', - # 'BOSS': u'BitBoss', - # 'BOST': u'BoostCoin', - # 'BQC': u'BQCoin', - # 'BQX': u'Bitquence', - # 'BRAIN': u'BrainCoin', - # 'BRDD': u'BeardDollars', - # 'BRK': u'BreakoutCoin', - # 'BRONZ': u'BitBronze', - # 'BS': u'BlackShadowCoin', - # 'BSC': u'BowsCoin', - # 'BSD': u'BitSend', - # 'BST': u'BitStone', - # 'BSTAR': u'Blackstar', - # 'BSTK': u'BattleStake', - # 'BSTY': u'GlobalBoost', - # 'BTA': u'Bata', - # 'BTB': u'BitBar', + 'AV': u'Avatar Coin', + 'AVT': u'AventCoin', + 'AXIOM': u'Axiom Coin', + 'AXR': u'AXRON', + 'B3': u'B3 Coin', + 'B@': u'BankCoin', + 'BAC': u'BitalphaCoin', + 'BAN': u'Babes and Nerds', + 'BASH': u'LuckChain', + 'BAT': u'Basic Attention Token', + 'BAY': u'BitBay', + 'BBCC': u'BaseballCardCoin', + 'BBR': u'Boolberry', + 'BCAP': u'Blockchain Capital', + 'BCCOIN': u'BitConnect Coin', + 'BCF': u'BitcoinFast', + 'BCN': u'ByteCoin', + 'BCR': u'BitCredit', + 'BCX': u'BattleCoin', + 'BCY': u'BitCrystals', + 'BELA': u'BelaCoin', + 'BEN': u'Benjamins', + 'BENJI': u'BenjiRolls', + 'BERN': u'BERNcash', + 'BEST': u'BestChain', + 'BET': u'BetaCoin', + 'BFX': u'BitFinex Tokens', + 'BHC': u'BighanCoin', + 'BIC': u'Bikercoins', + 'BIGUP': u'BigUp', + 'BIOB': u'BioBar', + 'BIOS': u'BiosCrypto', + 'BIP': u'BipCoin', + 'BIT16': u'16BitCoin', + 'BITB': u'BitBean', + 'BITCNY': u'bitCNY', + 'BITOK': u'BitOKX', + 'BITS': u'BitstarCoin', + 'BITUSD': u'bitUSD', + 'BITZ': u'Bitz Coin', + 'BLAZR': u'BlazerCoin', + 'BLC': u'BlakeCoin', + 'BLITZ': u'BlitzCoin', + 'BLK': u'BlackCoin', + 'BLOCK': u'BlockNet', + 'BLRY': u'BillaryCoin', + 'BLU': u'BlueCoin', + 'BM': u'BitMoon', + 'BNB': u'Boats and Bitches', + 'BNT': u'Bancor Network Token', + 'BNX': u'BnrtxCoin', + 'BOB': u'Bob Coin', + 'BOLI': u'BolivarCoin', + 'BOMB': u'BombCoin', + 'BON': u'BonesCoin', + 'BOOM': u'BOOM Coin', + 'BOS': u'BOScoin', + 'BOSON': u'BosonCoin', + 'BOSS': u'BitBoss', + 'BOST': u'BoostCoin', + 'BQC': u'BQCoin', + 'BQX': u'Bitquence', + 'BRAIN': u'BrainCoin', + 'BRDD': u'BeardDollars', + 'BRK': u'BreakoutCoin', + 'BRONZ': u'BitBronze', + 'BS': u'BlackShadowCoin', + 'BSC': u'BowsCoin', + 'BSD': u'BitSend', + 'BST': u'BitStone', + 'BSTAR': u'Blackstar', + 'BSTK': u'BattleStake', + 'BSTY': u'GlobalBoost', + 'BTA': u'Bata', + 'BTB': u'BitBar', 'BTC': u'Bitcoin', - # 'BTCD': u'BitcoinDark', - # 'BTCR': u'BitCurrency', - # 'BTCRY': u'BitCrystal', - # 'BTCS': u'Bitcoin Scrypt', - # 'BTD': u'Bitcloud', - # 'BTE': u'ByteCoin', - # 'BTG': u'BitGem', - # 'BTLC': u'BitLuckCoin', - # 'BTM': u'BitMark', - # 'BTMI': u'BitMiles', - # 'BTQ': u'BitQuark', - # 'BTS': u'Bitshares', - # 'BTTF': u'Coin to the Future', - # 'BTX': u'BitcoinTX', - # 'BTZ': u'BitzCoin', - # 'BUCKS': u'SwagBucks', - # 'BUK': u'CryptoBuk', - # 'BURST': u'BurstCoin', - # 'BUZZ': u'BuzzCoin', - # 'BVC': u'BeaverCoin', - # 'BXC': u'Bitcedi', - # 'BXT': u'BitTokens', - # 'BYC': u'ByteCent', - # 'C2': u'Coin.2', - # 'CAB': u'CabbageUnit', - # 'CACH': u'Cachecoin', - # 'CAIX': u'CAIx', - # 'CALC': u'CaliphCoin', - # 'CAM': u'Camcoin', - # 'CANN': u'CannabisCoin', - # 'CAP': u'BottleCaps', - # 'CARBON': u'Carboncoin', - # 'CASH': u'CashCoin', - # 'CAT': u'Catcoin', - # 'CBD': u'CBD Crystals', - # 'CBX': u'CryptoBullion', - # 'CC': u'CyberCoin', - # 'CCN': u'CannaCoin', - # 'CCRB': u'CryptoCarbon', - # 'CCX': u'CoolDarkCoin', - # 'CDN': u'Canada eCoin', - # 'CELL': u'SolarFarm', - # 'CESC': u'Crypto Escudo', - # 'CETI': u'CETUS Coin', - # 'CF': u'Californium', - # 'CFC': u'CoffeeCoin', - # 'CFI': u'Cofound.it', - # 'CFT': u'CryptoForecast', - # 'CGA': u'Cryptographic Anomaly', - # 'CHA': u'Charity Coin', - # 'CHAO': u'23 Skidoo', - # 'CHASH': u'CleverHash', - # 'CHAT': u'ChatCoin', - # 'CHC': u'ChainCoin', - # 'CHESS': u'ChessCoin', - # 'CHIEF': u'TheChiefCoin', - # 'CHILD': u'ChildCoin', - # 'CHIP': u'Chip', - # 'CHOOF': u'ChoofCoin', - # 'CIN': u'CinderCoin', - # 'CINNI': u'CINNICOIN', - # 'CIR': u'CircuitCoin', - # 'CIRC': u'CryptoCircuits', - # 'CJ': u'CryptoJacks', - # 'CJC': u'CryptoJournal', - # 'CKC': u'Clockcoin', - # 'CLAM': u'CLAMS', - # 'CLICK': u'Clickcoin', - # 'CLINT': u'Clinton', - # 'CLOAK': u'CloakCoin', - # 'CLR': u'CopperLark', - # 'CLUB': u' ClubCoin', - # 'CLUD': u'CludCoin', - # 'CLV': u'CleverCoin', - # 'CMC': u'CosmosCoin', - # 'CMT': u'CometCoin', - # 'CNC': u'ChinaCoin', - # 'CNL': u'ConcealCoin', - # 'CNMT': u'Coinomat', - # 'CNO': u'Coino', - # 'CNT': u'Centurion', - # 'COC': u'Community Coin', - # 'COIN': u'Coin', - # 'COMM': u'Community Coin', - # 'CON': u'Paycon', - # 'COOL': u'CoolCoin', - # 'CORAL': u'CoralPay', - # 'COV': u'CovenCoin', - # 'COVAL': u'Circuits of Value', - # 'COX': u'CobraCoin', - # 'CPC': u'CapriCoin', - # 'CQST': u'ConquestCoin', - # 'CRAB': u'CrabCoin', - # 'CRACK': u'CrackCoin', - # 'CRAFT': u'Craftcoin', - # 'CRAIG': u'CraigsCoin', - # 'CRAVE': u'CraveCoin', - # 'CRBIT': u'Creditbit ', - # 'CRC': u'CraftCoin', - # 'CRE': u'Credits', - # 'CREA': u'CreativeChain', - # 'CREVA': u'Creva Coin', - # 'CRNK': u'CrankCoin', - # 'CRPS': u'CryptoPennies', - # 'CRW': u'Crown Coin', - # 'CRX': u'ChronosCoin', - # 'CRYPT': u'CryptCoin', - # 'CS': u'CryptoSpots', - # 'CSC': u'CasinoCoin', - # 'CSH': u'CashOut', - # 'CSMIC': u'Cosmic', - # 'CTC': u'CarterCoin', - # 'CTIC': u'Coinmatic', - # 'CTO': u'Crypto', - # 'CUBE': u'DigiCube', - # 'CURE': u'Curecoin', - # 'CV2': u'ColossusCoin2.0', - # 'CWXT': u'CryptoWorldXToken', - # 'CXC': u'CheckCoin', - # 'CXT': u'Coinonat', - # 'CYC': u'ConSpiracy Coin ', - # 'CYG': u'Cygnus', - # 'CYP': u'CypherPunkCoin', - # 'CYT': u'Cryptokenz', - # 'DANK': u'DarkKush', - # 'DAR': u'Darcrus', - # 'DARK': u'Dark', + 'BTCD': u'BitcoinDark', + 'BTCR': u'BitCurrency', + 'BTCRY': u'BitCrystal', + 'BTCS': u'Bitcoin Scrypt', + 'BTD': u'Bitcloud', + 'BTE': u'ByteCoin', + 'BTG': u'BitGem', + 'BTLC': u'BitLuckCoin', + 'BTM': u'BitMark', + 'BTMI': u'BitMiles', + 'BTQ': u'BitQuark', + 'BTS': u'Bitshares', + 'BTTF': u'Coin to the Future', + 'BTX': u'BitcoinTX', + 'BTZ': u'BitzCoin', + 'BUCKS': u'SwagBucks', + 'BUK': u'CryptoBuk', + 'BURST': u'BurstCoin', + 'BUZZ': u'BuzzCoin', + 'BVC': u'BeaverCoin', + 'BXC': u'Bitcedi', + 'BXT': u'BitTokens', + 'BYC': u'ByteCent', + 'C2': u'Coin.2', + 'CAB': u'CabbageUnit', + 'CACH': u'Cachecoin', + 'CAIX': u'CAIx', + 'CALC': u'CaliphCoin', + 'CAM': u'Camcoin', + 'CANN': u'CannabisCoin', + 'CAP': u'BottleCaps', + 'CARBON': u'Carboncoin', + 'CASH': u'CashCoin', + 'CAT': u'Catcoin', + 'CBD': u'CBD Crystals', + 'CBX': u'CryptoBullion', + 'CC': u'CyberCoin', + 'CCN': u'CannaCoin', + 'CCRB': u'CryptoCarbon', + 'CCX': u'CoolDarkCoin', + 'CDN': u'Canada eCoin', + 'CELL': u'SolarFarm', + 'CESC': u'Crypto Escudo', + 'CETI': u'CETUS Coin', + 'CF': u'Californium', + 'CFC': u'CoffeeCoin', + 'CFI': u'Cofound.it', + 'CFT': u'CryptoForecast', + 'CGA': u'Cryptographic Anomaly', + 'CHA': u'Charity Coin', + 'CHAO': u'23 Skidoo', + 'CHASH': u'CleverHash', + 'CHAT': u'ChatCoin', + 'CHC': u'ChainCoin', + 'CHESS': u'ChessCoin', + 'CHIEF': u'TheChiefCoin', + 'CHILD': u'ChildCoin', + 'CHIP': u'Chip', + 'CHOOF': u'ChoofCoin', + 'CIN': u'CinderCoin', + 'CINNI': u'CINNICOIN', + 'CIR': u'CircuitCoin', + 'CIRC': u'CryptoCircuits', + 'CJ': u'CryptoJacks', + 'CJC': u'CryptoJournal', + 'CKC': u'Clockcoin', + 'CLAM': u'CLAMS', + 'CLICK': u'Clickcoin', + 'CLINT': u'Clinton', + 'CLOAK': u'CloakCoin', + 'CLR': u'CopperLark', + 'CLUB': u' ClubCoin', + 'CLUD': u'CludCoin', + 'CLV': u'CleverCoin', + 'CMC': u'CosmosCoin', + 'CMT': u'CometCoin', + 'CNC': u'ChinaCoin', + 'CNL': u'ConcealCoin', + 'CNMT': u'Coinomat', + 'CNO': u'Coino', + 'CNT': u'Centurion', + 'COC': u'Community Coin', + 'COIN': u'Coin', + 'COMM': u'Community Coin', + 'CON': u'Paycon', + 'COOL': u'CoolCoin', + 'CORAL': u'CoralPay', + 'COV': u'CovenCoin', + 'COVAL': u'Circuits of Value', + 'COX': u'CobraCoin', + 'CPC': u'CapriCoin', + 'CQST': u'ConquestCoin', + 'CRAB': u'CrabCoin', + 'CRACK': u'CrackCoin', + 'CRAFT': u'Craftcoin', + 'CRAIG': u'CraigsCoin', + 'CRAVE': u'CraveCoin', + 'CRBIT': u'Creditbit ', + 'CRC': u'CraftCoin', + 'CRE': u'Credits', + 'CREA': u'CreativeChain', + 'CREVA': u'Creva Coin', + 'CRNK': u'CrankCoin', + 'CRPS': u'CryptoPennies', + 'CRW': u'Crown Coin', + 'CRX': u'ChronosCoin', + 'CRYPT': u'CryptCoin', + 'CS': u'CryptoSpots', + 'CSC': u'CasinoCoin', + 'CSH': u'CashOut', + 'CSMIC': u'Cosmic', + 'CTC': u'CarterCoin', + 'CTIC': u'Coinmatic', + 'CTO': u'Crypto', + 'CUBE': u'DigiCube', + 'CURE': u'Curecoin', + 'CV2': u'ColossusCoin2.0', + 'CWXT': u'CryptoWorldXToken', + 'CXC': u'CheckCoin', + 'CXT': u'Coinonat', + 'CYC': u'ConSpiracy Coin ', + 'CYG': u'Cygnus', + 'CYP': u'CypherPunkCoin', + 'CYT': u'Cryptokenz', + 'DANK': u'DarkKush', + 'DAR': u'Darcrus', + 'DARK': u'Dark', 'DASH': u'DigitalCash', - # 'DB': u'DarkBit', - # 'DBG': u'Digital Bullion Gold', - # 'DBIC': u'DubaiCoin', - # 'DBIX': u'DubaiCoin', - # 'DBTC': u'DebitCoin', - # 'DCC': u'DarkCrave', - # 'DCK': u'DickCoin', - # 'DCR': u'Decred', - # 'DCRE': u'DeltaCredits', - # 'DCT': u'Decent', - # 'DCY': u'Dinastycoin', - # 'DDF': u'Digital Developers Fund', - # 'DEA': u'Degas Coin', - # 'DEM': u'eMark', - # 'DENT': u'Dent', - # 'DES': u'Destiny', - # 'DETH': u'DarkEther', - # 'DEUR': u'DigiEuro', - # 'DGB': u'DigiByte', - # 'DGC': u'DigiCoin', - # 'DGD': u'Digix DAO', - # 'DGDC': u'DarkGold', - # 'DGMS': u'Digigems', - # 'DGORE': u'DogeGoreCoin', - # 'DICE': u'Etheroll', - # 'DIEM': u'CarpeDiemCoin', - # 'DIGS': u'Diggits', - # 'DIME': u'DimeCoin', - # 'DISK': u'Dark Lisk', - # 'DKC': u'DarkKnightCoin', - # 'DLC': u'DollarCoin', - # 'DLISK': u'Dlisk', - # 'DMD': u'Diamond', - # 'DNET': u'Darknet', + 'DB': u'DarkBit', + 'DBG': u'Digital Bullion Gold', + 'DBIC': u'DubaiCoin', + 'DBIX': u'DubaiCoin', + 'DBTC': u'DebitCoin', + 'DCC': u'DarkCrave', + 'DCK': u'DickCoin', + 'DCR': u'Decred', + 'DCRE': u'DeltaCredits', + 'DCT': u'Decent', + 'DCY': u'Dinastycoin', + 'DDF': u'Digital Developers Fund', + 'DEA': u'Degas Coin', + 'DEM': u'eMark', + 'DENT': u'Dent', + 'DES': u'Destiny', + 'DETH': u'DarkEther', + 'DEUR': u'DigiEuro', + 'DGB': u'DigiByte', + 'DGC': u'DigiCoin', + 'DGD': u'Digix DAO', + 'DGDC': u'DarkGold', + 'DGMS': u'Digigems', + 'DGORE': u'DogeGoreCoin', + 'DICE': u'Etheroll', + 'DIEM': u'CarpeDiemCoin', + 'DIGS': u'Diggits', + 'DIME': u'DimeCoin', + 'DISK': u'Dark Lisk', + 'DKC': u'DarkKnightCoin', + 'DLC': u'DollarCoin', + 'DLISK': u'Dlisk', + 'DMD': u'Diamond', + 'DNET': u'Darknet', 'DOGE': u'Dogecoin', - # 'DOGED': u'DogeCoinDark', - # 'DOGETH': u'EtherDoge', - # 'DOPE': u'DopeCoin', - # 'DOT': u'Dotcoin', - # 'DOV': u'DonationCoin', - # 'DP': u'DigitalPrice', - # 'DPAY': u'DelightPay', - # 'DRA': u'DraculaCoin', - # 'DRACO': u'DT Token', - # 'DRKC': u'DarkCash', - # 'DRKT': u'DarkTron', - # 'DRM8': u'Dream8Coin', - # 'DROP': u'FaucetCoin', - # 'DRZ': u'Droidz', - # 'DSB': u'DarkShibe', - # 'DSH': u'Dashcoin', - # 'DT': u'DarkToken', - # 'DTB': u'Databits', - # 'DTC': u'DayTrader Coin', - # 'DUB': u'DubCoin', - # 'DUCK': u'DuckDuckCoin', - # 'DUO': u'ParallelCoin', - # 'DUX': u'DuxCoin', - # 'DVC': u'DevCoin', - # 'DYN': u'Dynamic', - # 'EA': u'EagleCoin', - # 'EAC': u'EarthCoin', - # 'EAGS': u'EagsCoin', - # 'EB3': u'EB3coin', - # 'EBS': u'EbolaShare', - # 'EC': u'Eclipse', - # 'ECO': u'ECOcoin', - # 'ECOB': u'EcoBit', - # 'EDC': u'EducoinV', - # 'EDG': u'Edgeless', - # 'EDGE': u'EdgeCoin', - # 'EDR': u'E-Dinar Coin', - # 'EDRC': u'EDRCoin', - # 'EFL': u'E-Gulden', - # 'EGC': u'EverGreenCoin', - # 'EGG': u'EggCoin', - # 'EGO': u'EGOcoin', - # 'EKN': u'Elektron', - # 'EKO': u'EkoCoin', - # 'ELC': u'Elacoin', - # 'ELE': u'Elementrem', - # 'ELS': u'Elysium', - # 'EMB': u'EmberCoin', - # 'EMC': u'Emercoin', - # 'EMC2': u'Einsteinium', - # 'EMD': u'Emerald', - # 'EMPC': u'EmporiumCoin', - # 'ENE': u'EneCoin', - # 'ENRG': u'EnergyCoin', - # 'ENT': u'Eternity', - # 'ENTER': u'EnterCoin (ENTER)', - # 'EOC': u'EveryonesCoin', - # 'EOS': u'EOS', - # 'EPY': u'Empyrean', - # 'EQM': u'Equilibrium Coin', - # 'EQT': u'EquiTrader', - # 'EQUAL': u'EqualCoin', - # 'ERC': u'EuropeCoin', - # 'ERR': u'ErrorCoin', - # 'ERY': u'Eryllium', - # 'ESP': u'Espers', + 'DOGED': u'DogeCoinDark', + 'DOGETH': u'EtherDoge', + 'DOPE': u'DopeCoin', + 'DOT': u'Dotcoin', + 'DOV': u'DonationCoin', + 'DP': u'DigitalPrice', + 'DPAY': u'DelightPay', + 'DRA': u'DraculaCoin', + 'DRACO': u'DT Token', + 'DRKC': u'DarkCash', + 'DRKT': u'DarkTron', + 'DRM8': u'Dream8Coin', + 'DROP': u'FaucetCoin', + 'DRZ': u'Droidz', + 'DSB': u'DarkShibe', + 'DSH': u'Dashcoin', + 'DT': u'DarkToken', + 'DTB': u'Databits', + 'DTC': u'DayTrader Coin', + 'DUB': u'DubCoin', + 'DUCK': u'DuckDuckCoin', + 'DUO': u'ParallelCoin', + 'DUX': u'DuxCoin', + 'DVC': u'DevCoin', + 'DYN': u'Dynamic', + 'EA': u'EagleCoin', + 'EAC': u'EarthCoin', + 'EAGS': u'EagsCoin', + 'EB3': u'EB3coin', + 'EBS': u'EbolaShare', + 'EC': u'Eclipse', + 'ECO': u'ECOcoin', + 'ECOB': u'EcoBit', + 'EDC': u'EducoinV', + 'EDG': u'Edgeless', + 'EDGE': u'EdgeCoin', + 'EDR': u'E-Dinar Coin', + 'EDRC': u'EDRCoin', + 'EFL': u'E-Gulden', + 'EGC': u'EverGreenCoin', + 'EGG': u'EggCoin', + 'EGO': u'EGOcoin', + 'EKN': u'Elektron', + 'EKO': u'EkoCoin', + 'ELC': u'Elacoin', + 'ELE': u'Elementrem', + 'ELS': u'Elysium', + 'EMB': u'EmberCoin', + 'EMC': u'Emercoin', + 'EMC2': u'Einsteinium', + 'EMD': u'Emerald', + 'EMPC': u'EmporiumCoin', + 'ENE': u'EneCoin', + 'ENRG': u'EnergyCoin', + 'ENT': u'Eternity', + 'ENTER': u'EnterCoin (ENTER)', + 'EOC': u'EveryonesCoin', + 'EOS': u'EOS', + 'EPY': u'Empyrean', + 'EQM': u'Equilibrium Coin', + 'EQT': u'EquiTrader', + 'EQUAL': u'EqualCoin', + 'ERC': u'EuropeCoin', + 'ERR': u'ErrorCoin', + 'ERY': u'Eryllium', + 'ESP': u'Espers', 'ETC': u'Ethereum Classic', 'ETH': u'Ethereum ', - # 'ETHS': u'EthereumScrypt', - # 'EUC': u'Eurocoin', - # 'EVENT': u'Event Token', - # 'EVIL': u'EvilCoin', - # 'EXB': u'ExaByte (EXB)', - # 'EXCL': u'Exclusive Coin', - # 'EXE': u'ExeCoin', - # 'EXIT': u'ExitCoin', - # 'EXP': u'Expanse', - # 'EZC': u'EZCoin', - # 'F16': u'F16Coin', - # 'FAIR': u'FairCoin', - # 'FAME': u'FameCoin', - # 'FAZZ': u'FazzCoin', - # 'FC2': u'Fuel2Coin', - # 'FCN': u'FantomCoin ', - # 'FCS': u'CryptoFocus', - # 'FCT': u'Factoids', - # 'FFC': u'FireflyCoin', - # 'FGZ': u'Free Game Zone', - # 'FIBRE': u'FIBRE', - # 'FIND': u'FindCoin', - # 'FIRE': u'FireCoin', - # 'FIRST': u'FirstCoin', - # 'FIST': u'FistBump', - # 'FIT': u'Fitcoin', - # 'FJC': u'FujiCoin', - # 'FLDC': u'Folding Coin', - # 'FLO': u'FlorinCoin', - # 'FLT': u'FlutterCoin', - # 'FLVR': u'FlavorCoin', - # 'FLX': u'Flash', - # 'FLY': u'FlyCoin', - # 'FONZ': u'FonzieCoin', - # 'FOREX': u'ForexCoin', - # 'FRAC': u'FractalCoin', - # 'FRC': u'FireRoosterCoin', - # 'FRE': u'FreeCoin', - # 'FRK': u'Franko', - # 'FRN': u'Francs', - # 'FRST': u'FirstCoin', - # 'FRWC': u'Frankywillcoin', - # 'FSC2': u'FriendshipCoin', - # 'FSN': u'Fusion', - # 'FST': u'FastCoin', - # 'FTC': u'FeatherCoin', - # 'FTP': u'FuturePoints', - # 'FUN': u'FunFair', - # 'FUNC': u'FunCoin', - # 'FUTC': u'FutCoin', - # 'FUZZ': u'Fuzzballs', - # 'FX': u'FCoin', - # 'FYN': u'FundYourselfNow', - # 'GAIA': u'GAIA Platform', - # 'GAKH': u'GAKHcoin', - # 'GAM': u'Gambit coin', - # 'GAME': u'Gamecredits', - # 'GAP': u'Gapcoin', - # 'GAY': u'GayCoin', - # 'GB': u'GoldBlocks', - # 'GBIT': u'GravityBit', - # 'GBRC': u'GBR Coin', - # 'GBT': u'GameBetCoin', - # 'GBYTE': u'Byteball', - # 'GCC': u'GuccioneCoin', - # 'GCR': u'Global Currency Reserve', - # 'GDC': u'GrandCoin', - # 'GEMZ': u'Gemz Social', - # 'GEN': u'Genstake', - # 'GEO': u'GeoCoin', - # 'GHC': u'GhostCoin', - # 'GHOUL': u'Ghoul Coin', - # 'GHS': u'Giga Hash', - # 'GIFT': u'GiftNet', - # 'GIG': u'GigCoin', - # 'GIVE': u'GiveCoin', - # 'GIZ': u'GIZMOcoin', - # 'GLC': u'GlobalCoin', - # 'GLD': u'GoldCoin', - # 'GLOBE': u'Global', - # 'GLX': u'GalaxyCoin', - # 'GLYPH': u'GlyphCoin', - # 'GMC': u'Gridmaster', - # 'GML': u'GameLeagueCoin', - # 'GMX': u'Goldmaxcoin', - # 'GNJ': u'GanjaCoin V2', - # 'GNO': u'Gnosis', - # 'GNT': u'Golem Network Token', - # 'GOAT': u'Goat', - # 'GOLOS': u'Golos', - # 'GOON': u'Goonies', - # 'GOT': u'Giotto Coin', - # 'GOTX': u'GothicCoin', - # 'GP': u'GoldPieces', - # 'GPL': u'Gold Pressed Latinum', - # 'GPU': u'GPU Coin', - # 'GRAM': u'Gram Coin', - # 'GRAV': u'Graviton', - # 'GRC': u'GridCoin', - # 'GRE': u'GreenCoin', - # 'GREXIT': u'GrexitCoin', - # 'GRID': u'GridPay', - # 'GRM': u'GridMaster', - # 'GROW': u'GrownCoin', - # 'GRS': u'Groestlcoin ', - # 'GRT': u'Grantcoin', - # 'GRW': u'GrowthCoin', - # 'GSM': u'GSM Coin', - # 'GSX': u'GlowShares', - # 'GSY': u'GenesysCoin', - # 'GUE': u'GuerillaCoin', - # 'GUP': u'Guppy', - # 'HAL': u'Halcyon', - # 'HALLO': u'Halloween Coin', - # 'HAMS': u'HamsterCoin', - # 'HAZE': u'HazeCoin', - # 'HBN': u'HoboNickels', - # 'HCC': u'HappyCreatorCoin ', - # 'HEAT': u'Heat Ledger', - # 'HEDG': u'Hedgecoin', - # 'HEEL': u'HeelCoin', - # 'HILL': u'President Clinton', - # 'HIRE': u'BitHIRE', - # 'HKG': u'Hacker Gold', - # 'HMP': u'HempCoin', - # 'HMQ': u'Humaniq', - # 'HNC': u'Hellenic Coin', - # 'HODL': u'HOdlcoin', - # 'HPC': u'HappyCoin', - # 'HRB': u'Harbour DAO', - # 'HSP': u'Horse Power', - # 'HTC': u'Hitcoin', - # 'HTML5': u'HTML Coin', - # 'HUC': u'HunterCoin', - # 'HUGE': u'BigCoin', - # 'HUSH': u'Hush', - # 'HVC': u'HeavyCoin', - # 'HVCO': u'High Voltage Coin', - # 'HXX': u'HexxCoin', - # 'HYP': u'Hyperstake', - # 'HYPER': u'HyperCoin', - # 'HZ': u'Horizon', - # 'HZT': u'HazMatCoin', - # 'I0C': u'I0coin', - # 'IBANK': u'iBankCoin', - # 'ICASH': u'ICASH', - # 'ICB': u'IceBergCoin', - # 'ICN': u'Iconomi', - # 'ICOB': u'Icobid', - # 'ICON': u'Iconic', - # 'IEC': u'IvugeoEvolutionCoin', - # 'IFC': u'Infinite Coin', - # 'IFLT': u'InflationCoin', - # 'ILC': u'ILCoin', - # 'IMPCH': u'Impeach', - # 'IMPS': u'Impulse Coin', - # 'IMS': u'Independent Money System', - # 'IN': u'InCoin', - # 'INC': u'Incrementum', - # 'INCNT': u'Incent', - # 'INCP': u'InceptionCoin', - # 'INFX': u'Influxcoin', - # 'INPAY': u'InPay', - # 'INSANE': u'InsaneCoin', - # 'INSN': u'Insane Coin', - # 'INV': u'Invictus', - # 'IOC': u'IOCoin', - # 'ION': u'Ionomy', - # 'IOP': u'Internet of People', - # 'IOT': u'IOTA', - # 'IOU': u'IOU1', - # 'ISL': u'IslaCoin', - # 'IVZ': u'InvisibleCoin', - # 'IW': u'iWallet', - # 'IXC': u'IXcoin', - # 'IXT': u'InsureX', - # 'J': u'JoinCoin', - # 'JANE': u'JaneCoin', - # 'JBS': u'JumBucks Coin', - # 'JIF': u'JiffyCoin', - # 'JIO': u'JIO Token', - # 'JKC': u'JunkCoin', - # 'JNS': u'Janus', - # 'JOBS': u'JobsCoin', - # 'JOK': u'JokerCoin', - # 'JPC': u'JackPotCoin', - # 'JUDGE': u'JudgeCoin', - # 'JWL': u'Jewels', - # 'KARM': u'Karmacoin', - # 'KAT': u'KATZcoin', - # 'KAYI': u'Kayı', - # 'KC': u'Kernalcoin', - # 'KDC': u'Klondike Coin', - # 'KED': u'Klingon Empire Darsek', - # 'KEY': u'KeyCoin', - # 'KGC': u'KrugerCoin', - # 'KLC': u'KiloCoin', - # 'KMD': u'Komodo', - # 'KNC': u'Khancoin', - # 'KOBO': u'KoboCoin', - # 'KORE': u'KoreCoin', - # 'KR': u'Krypton', - # 'KRAK': u'Kraken', - # 'KRB': u'Karbowanec', - # 'KRC': u'KRCoin', - # 'KTK': u'KryptCoin', - # 'KUBO': u'KubosCoin', - # 'KURT': u'Kurrent', - # 'KUSH': u'KushCoin', - # 'LAB': u'CoinWorksCoin', - # 'LANA': u'LanaCoin', - # 'LAZ': u'Lazarus', - # 'LBC': u'LBRY Credits', - # 'LC': u'Lutetium Coin', - # 'LDOGE': u'LiteDoge', - # 'LEA': u'LeaCoin', - # 'LEMON': u'LemonCoin', - # 'LENIN': u'LeninCoin', - # 'LEO': u'LEOcoin', - # 'LEPEN': u'LePenCoin', - # 'LFC': u'BigLifeCoin', - # 'LGBTQ': u'LGBTQoin', - # 'LGD': u'Legends Cryptocurrency', - # 'LIMX': u'LimeCoinX', - # 'LIR': u'Let it Ride', - # 'LIV': u'LiviaCoin', - # 'LK7': u'Lucky7Coin', - # 'LKY': u'LuckyCoin', - # 'LMC': u'LomoCoin', - # 'LOC': u'Loco', - # 'LOG': u'Wood Coin', - # 'LOOK': u'LookCoin', - # 'LQD': u'Liquid', - # 'LSD': u'LightSpeedCoin', + 'ETHS': u'EthereumScrypt', + 'EUC': u'Eurocoin', + 'EVENT': u'Event Token', + 'EVIL': u'EvilCoin', + 'EXB': u'ExaByte (EXB)', + 'EXCL': u'Exclusive Coin', + 'EXE': u'ExeCoin', + 'EXIT': u'ExitCoin', + 'EXP': u'Expanse', + 'EZC': u'EZCoin', + 'F16': u'F16Coin', + 'FAIR': u'FairCoin', + 'FAME': u'FameCoin', + 'FAZZ': u'FazzCoin', + 'FC2': u'Fuel2Coin', + 'FCN': u'FantomCoin ', + 'FCS': u'CryptoFocus', + 'FCT': u'Factoids', + 'FFC': u'FireflyCoin', + 'FGZ': u'Free Game Zone', + 'FIBRE': u'FIBRE', + 'FIND': u'FindCoin', + 'FIRE': u'FireCoin', + 'FIRST': u'FirstCoin', + 'FIST': u'FistBump', + 'FIT': u'Fitcoin', + 'FJC': u'FujiCoin', + 'FLDC': u'Folding Coin', + 'FLO': u'FlorinCoin', + 'FLT': u'FlutterCoin', + 'FLVR': u'FlavorCoin', + 'FLX': u'Flash', + 'FLY': u'FlyCoin', + 'FONZ': u'FonzieCoin', + 'FOREX': u'ForexCoin', + 'FRAC': u'FractalCoin', + 'FRC': u'FireRoosterCoin', + 'FRE': u'FreeCoin', + 'FRK': u'Franko', + 'FRN': u'Francs', + 'FRST': u'FirstCoin', + 'FRWC': u'Frankywillcoin', + 'FSC2': u'FriendshipCoin', + 'FSN': u'Fusion', + 'FST': u'FastCoin', + 'FTC': u'FeatherCoin', + 'FTP': u'FuturePoints', + 'FUN': u'FunFair', + 'FUNC': u'FunCoin', + 'FUTC': u'FutCoin', + 'FUZZ': u'Fuzzballs', + 'FX': u'FCoin', + 'FYN': u'FundYourselfNow', + 'GAIA': u'GAIA Platform', + 'GAKH': u'GAKHcoin', + 'GAM': u'Gambit coin', + 'GAME': u'Gamecredits', + 'GAP': u'Gapcoin', + 'GAY': u'GayCoin', + 'GB': u'GoldBlocks', + 'GBIT': u'GravityBit', + 'GBRC': u'GBR Coin', + 'GBT': u'GameBetCoin', + 'GBYTE': u'Byteball', + 'GCC': u'GuccioneCoin', + 'GCR': u'Global Currency Reserve', + 'GDC': u'GrandCoin', + 'GEMZ': u'Gemz Social', + 'GEN': u'Genstake', + 'GEO': u'GeoCoin', + 'GHC': u'GhostCoin', + 'GHOUL': u'Ghoul Coin', + 'GHS': u'Giga Hash', + 'GIFT': u'GiftNet', + 'GIG': u'GigCoin', + 'GIVE': u'GiveCoin', + 'GIZ': u'GIZMOcoin', + 'GLC': u'GlobalCoin', + 'GLD': u'GoldCoin', + 'GLOBE': u'Global', + 'GLX': u'GalaxyCoin', + 'GLYPH': u'GlyphCoin', + 'GMC': u'Gridmaster', + 'GML': u'GameLeagueCoin', + 'GMX': u'Goldmaxcoin', + 'GNJ': u'GanjaCoin V2', + 'GNO': u'Gnosis', + 'GNT': u'Golem Network Token', + 'GOAT': u'Goat', + 'GOLOS': u'Golos', + 'GOON': u'Goonies', + 'GOT': u'Giotto Coin', + 'GOTX': u'GothicCoin', + 'GP': u'GoldPieces', + 'GPL': u'Gold Pressed Latinum', + 'GPU': u'GPU Coin', + 'GRAM': u'Gram Coin', + 'GRAV': u'Graviton', + 'GRC': u'GridCoin', + 'GRE': u'GreenCoin', + 'GREXIT': u'GrexitCoin', + 'GRID': u'GridPay', + 'GRM': u'GridMaster', + 'GROW': u'GrownCoin', + 'GRS': u'Groestlcoin ', + 'GRT': u'Grantcoin', + 'GRW': u'GrowthCoin', + 'GSM': u'GSM Coin', + 'GSX': u'GlowShares', + 'GSY': u'GenesysCoin', + 'GUE': u'GuerillaCoin', + 'GUP': u'Guppy', + 'HAL': u'Halcyon', + 'HALLO': u'Halloween Coin', + 'HAMS': u'HamsterCoin', + 'HAZE': u'HazeCoin', + 'HBN': u'HoboNickels', + 'HCC': u'HappyCreatorCoin ', + 'HEAT': u'Heat Ledger', + 'HEDG': u'Hedgecoin', + 'HEEL': u'HeelCoin', + 'HILL': u'President Clinton', + 'HIRE': u'BitHIRE', + 'HKG': u'Hacker Gold', + 'HMP': u'HempCoin', + 'HMQ': u'Humaniq', + 'HNC': u'Hellenic Coin', + 'HODL': u'HOdlcoin', + 'HPC': u'HappyCoin', + 'HRB': u'Harbour DAO', + 'HSP': u'Horse Power', + 'HTC': u'Hitcoin', + 'HTML5': u'HTML Coin', + 'HUC': u'HunterCoin', + 'HUGE': u'BigCoin', + 'HUSH': u'Hush', + 'HVC': u'HeavyCoin', + 'HVCO': u'High Voltage Coin', + 'HXX': u'HexxCoin', + 'HYP': u'Hyperstake', + 'HYPER': u'HyperCoin', + 'HZ': u'Horizon', + 'HZT': u'HazMatCoin', + 'I0C': u'I0coin', + 'IBANK': u'iBankCoin', + 'ICASH': u'ICASH', + 'ICB': u'IceBergCoin', + 'ICN': u'Iconomi', + 'ICOB': u'Icobid', + 'ICON': u'Iconic', + 'IEC': u'IvugeoEvolutionCoin', + 'IFC': u'Infinite Coin', + 'IFLT': u'InflationCoin', + 'ILC': u'ILCoin', + 'IMPCH': u'Impeach', + 'IMPS': u'Impulse Coin', + 'IMS': u'Independent Money System', + 'IN': u'InCoin', + 'INC': u'Incrementum', + 'INCNT': u'Incent', + 'INCP': u'InceptionCoin', + 'INFX': u'Influxcoin', + 'INPAY': u'InPay', + 'INSANE': u'InsaneCoin', + 'INSN': u'Insane Coin', + 'INV': u'Invictus', + 'IOC': u'IOCoin', + 'ION': u'Ionomy', + 'IOP': u'Internet of People', + 'IOT': u'IOTA', + 'IOU': u'IOU1', + 'ISL': u'IslaCoin', + 'IVZ': u'InvisibleCoin', + 'IW': u'iWallet', + 'IXC': u'IXcoin', + 'IXT': u'InsureX', + 'J': u'JoinCoin', + 'JANE': u'JaneCoin', + 'JBS': u'JumBucks Coin', + 'JIF': u'JiffyCoin', + 'JIO': u'JIO Token', + 'JKC': u'JunkCoin', + 'JNS': u'Janus', + 'JOBS': u'JobsCoin', + 'JOK': u'JokerCoin', + 'JPC': u'JackPotCoin', + 'JUDGE': u'JudgeCoin', + 'JWL': u'Jewels', + 'KARM': u'Karmacoin', + 'KAT': u'KATZcoin', + 'KAYI': u'Kayı', + 'KC': u'Kernalcoin', + 'KDC': u'Klondike Coin', + 'KED': u'Klingon Empire Darsek', + 'KEY': u'KeyCoin', + 'KGC': u'KrugerCoin', + 'KLC': u'KiloCoin', + 'KMD': u'Komodo', + 'KNC': u'Khancoin', + 'KOBO': u'KoboCoin', + 'KORE': u'KoreCoin', + 'KR': u'Krypton', + 'KRAK': u'Kraken', + 'KRB': u'Karbowanec', + 'KRC': u'KRCoin', + 'KTK': u'KryptCoin', + 'KUBO': u'KubosCoin', + 'KURT': u'Kurrent', + 'KUSH': u'KushCoin', + 'LAB': u'CoinWorksCoin', + 'LANA': u'LanaCoin', + 'LAZ': u'Lazarus', + 'LBC': u'LBRY Credits', + 'LC': u'Lutetium Coin', + 'LDOGE': u'LiteDoge', + 'LEA': u'LeaCoin', + 'LEMON': u'LemonCoin', + 'LENIN': u'LeninCoin', + 'LEO': u'LEOcoin', + 'LEPEN': u'LePenCoin', + 'LFC': u'BigLifeCoin', + 'LGBTQ': u'LGBTQoin', + 'LGD': u'Legends Cryptocurrency', + 'LIMX': u'LimeCoinX', + 'LIR': u'Let it Ride', + 'LIV': u'LiviaCoin', + 'LK7': u'Lucky7Coin', + 'LKY': u'LuckyCoin', + 'LMC': u'LomoCoin', + 'LOC': u'Loco', + 'LOG': u'Wood Coin', + 'LOOK': u'LookCoin', + 'LQD': u'Liquid', + 'LSD': u'LightSpeedCoin', 'LSK': u'Lisk', - # 'LTB': u'Litebar ', - # 'LTBC': u'LTBCoin', + 'LTB': u'Litebar ', + 'LTBC': u'LTBCoin', 'LTC': u'Litecoin', - # 'LTCD': u'LitecoinDark', - # 'LTCR': u'LiteCreed', - # 'LTCX': u'LitecoinX', - # 'LTD': u'Limited Coin', - # 'LTH': u'Lathaan', - # 'LTS': u'Litestar Coin', - # 'LUCKY': u'LuckyBlocks (LUCKY)', - # 'LUN': u'Lunyr', - # 'LUX': u'BitLux', - # 'LVG': u'Leverage Coin', - # 'LXC': u'LibrexCoin', - # 'LYB': u'LyraBar', - # 'LYC': u'LycanCoin', - # 'M1': u'SupplyShock', - # 'MAC': u'MachineCoin', - # 'MAD': u'SatoshiMadness', + 'LTCD': u'LitecoinDark', + 'LTCR': u'LiteCreed', + 'LTCX': u'LitecoinX', + 'LTD': u'Limited Coin', + 'LTH': u'Lathaan', + 'LTS': u'Litestar Coin', + 'LUCKY': u'LuckyBlocks (LUCKY)', + 'LUN': u'Lunyr', + 'LUX': u'BitLux', + 'LVG': u'Leverage Coin', + 'LXC': u'LibrexCoin', + 'LYB': u'LyraBar', + 'LYC': u'LycanCoin', + 'M1': u'SupplyShock', + 'MAC': u'MachineCoin', + 'MAD': u'SatoshiMadness', 'MAID': u'MaidSafe Coin', - # 'MAPC': u'MapCoin', - # 'MAR': u'MarijuanaCoin', - # 'MARS': u'MarsCoin ', - # 'MARV': u'Marvelous', - # 'MARX': u'MarxCoin', - # 'MARYJ': u'MaryJane Coin', - # 'MAT': u'Manet Coin', - # 'MAX': u'MaxCoin', - # 'MBIT': u'Mbitbooks', - # 'MCAP': u'MCAP', - # 'MCAR': u'MasterCar', - # 'MCN': u'MonetaVerde', - # 'MCO': u'Monaco', - # 'MCRN': u'MacronCoin', - # 'MDC': u'MedicCoin', - # 'MDT': u'Midnight ', - # 'MEC': u'MegaCoin', - # 'MED': u'MediterraneanCoin', - # 'MEGA': u'MegaFlash', - # 'MEME': u'Pepe', - # 'MER': u'Mercury', - # 'METAL': u'MetalCoin', - # 'MG': u'Mind Gene', - # 'MGO': u'MobileGo', - # 'MI': u'XiaoMiCoin', - # 'MIL': u'Milllionaire Coin', - # 'MILO': u'MiloCoin', - # 'MIN': u'Minerals Coin', - # 'MINE': u'Instamine Nuggets', - # 'MINT': u'MintCoin', - # 'MIS': u'MIScoin', - # 'MKR': u'Maker', - # 'MLITE': u'MeLite', - # 'MLN': u'Melon', - # 'MM': u'MasterMint', - # 'MMC': u'MemoryCoin', - # 'MMNXT': u'MMNXT ', - # 'MMXIV': u'MaieutiCoin', - # 'MMXVI': u'MMXVI', - # 'MN': u'Cryptsy Mining Contract', - # 'MNC': u'MinCoin', - # 'MND': u'MindCoin', - # 'MNE': u'Minereum', - # 'MNM': u'Mineum', - # 'MOIN': u'MoinCoin', - # 'MOJO': u'Mojocoin', - # 'MONA': u'MonaCoin', - # 'MONETA': u'Moneta', - # 'MONEY': u'MoneyCoin', - # 'MOON': u'MoonCoin', - # 'MOOND': u'Dark Moon', - # 'MOTO': u'Motocoin', - # 'MPRO': u'MediumProject', - # 'MRP': u'MorpheusCoin', - # 'MRS': u'MarsCoin', - # 'MRSA': u'MrsaCoin', - # 'MRT': u'MinersReward', - # 'MRY': u'MemoryCoin', - # 'MSC': u'MasterCoin', - # 'MST': u'MustangCoin', - # 'MT': u'Mycelium Token', - # 'MTL': u'Metal', - # 'MTR': u'MasterTraderCoin', - # 'MUDRA': u'MudraCoin', - # 'MUE': u'MonetaryUnit', - # 'MUSIC': u'Musiccoin', - # 'MUU': u'MilkCoin', - # 'MWC': u'MultiWallet Coin', - # 'MXT': u'MartexCoin', - # 'MYB': u'MyBit', - # 'MYC': u'MayaCoin', - # 'MYST': u'MysteryCoin', - # 'MZC': u'MazaCoin', - # 'N7': u'Number7', - # 'NAN': u'NanoToken', - # 'NANAS': u'BananaBits', - # 'NAS2': u'Nas2Coin', - # 'NAUT': u'Nautilus Coin', - # 'NAV': u'NavCoin', - # 'NBIT': u'NetBit', - # 'NBL': u'Nybble', - # 'NBT': u'NuBits', - # 'NDOGE': u'NinjaDoge', - # 'NEBU': u'Nebuchadnezzar', - # 'NEC': u'NeoCoin', - # 'NEF': u'NefariousCoin', - # 'NEOS': u'NeosCoin', - # 'NET': u'NetCoin', - # 'NETC': u'NetworkCoin', - # 'NETKO': u'Netko', - # 'NEU': u'NeuCoin', - # 'NEVA': u'NevaCoin', - # 'NIC': u'NewInvestCoin', - # 'NICE': u'NiceCoin', - # 'NKA': u'IncaKoin', - # 'NKC': u'Nukecoinz', - # 'NKT': u'NakomotoDark', - # 'NLC': u'NoLimitCoin', - # 'NLG': u'Gulden', - # 'NMB': u'Nimbus Coin', - # 'NMC': u'NameCoin', - # 'NMR': u'Numerai', - # 'NOBL': u'NobleCoin', - # 'NODE': u'Node', - # 'NOO': u'Noocoin', - # 'NOTE': u'Dnotes', - # 'NPC': u'NPCcoin', - # 'NRB': u'NoirBits', - # 'NRC': u'Neurocoin', - # 'NRS': u'NoirShares', - # 'NSR': u'NuShares', - # 'NTC': u'NineElevenTruthCoin', - # 'NTCC': u'NeptuneClassic', - # 'NTRN': u'Neutron', - # 'NUBIS': u'NubisCoin', - # 'NUKE': u'NukeCoin', - # 'NUM': u'NumbersCoin', - # 'NVC': u'NovaCoin', - # 'NXC': u'Nexium', - # 'NXE': u'NXEcoin', - # 'NXS': u'Nexus', - # 'NXT': u'Nxt', - # 'NXTI': u'NXTI', - # 'NXTTY': u'NXTTY', - # 'NYAN': u'NyanCoin', - # 'NZC': u'NewZealandCoin', - # 'OAX': u'OpenANX', - # 'OBITS': u'Obits Coin', - # 'OBS': u'Obscurebay', - # 'OC': u'OrangeCoin', - # 'OCTO': u'OctoCoin', - # 'ODNT': u'Old Dogs New Tricks', - # 'OK': u'OKCash', - # 'OLDSF': u'OldSafeCoin', - # 'OLYMP': u'OlympCoin', - # 'OMA': u'OmegaCoin', - # 'OMC': u'OmniCron', - # 'OMNI': u'Omni', - # 'OPAL': u'OpalCoin', - # 'OPES': u'Opes', - # 'OPTION': u'OptionCoin', - # 'ORB': u'Orbitcoin', - # 'ORLY': u'OrlyCoin', - # 'ORO': u'OroCoin', - # 'OS76': u'OsmiumCoin', - # 'OSC': u'OpenSourceCoin', - # 'PAC': u'PacCoin', - # 'PAK': u'Pakcoin', - # 'PARA': u'ParanoiaCoin', - # 'PASC': u'Pascal Coin', - # 'PASL': u'Pascal Lite', - # 'PAY': u'TenX', - # 'PAYP': u'PayPeer', - # 'PBC': u'PabyosiCoin', - # 'PCM': u'Procom', - # 'PCS': u'Pabyosi Coin', - # 'PDC': u'Project Decorum', - # 'PEC': u'PeaceCoin', - # 'PEN': u'PenCoin', - # 'PEPECASH': u'Pepe Cash', - # 'PEX': u'PosEx', - # 'PHR': u'Phreak', - # 'PHS': u'PhilosophersStone', - # 'PIE': u'Persistent Information Exchange', - # 'PIGGY': u'Piggy Coin', - # 'PING': u'CryptoPing', - # 'PINK': u'PinkCoin', - # 'PINKX': u'PantherCoin', - # 'PIO': u'Pioneershares', - # 'PIVX': u'Private Instant Verified Transaction', - # 'PIZZA': u'PizzaCoin', - # 'PKB': u'ParkByte', - # 'PLANET': u'PlanetCoin', - # 'PLBT': u'Polybius', - # 'PLNC': u'PLNCoin', - # 'PLU': u'Pluton', - # 'PNC': u'PlatiniumCoin', - # 'PND': u'PandaCoin', - # 'PNK': u'SteamPunk', - # 'POINTS': u'Cryptsy Points', - # 'POLY': u'PolyBit', - # 'POST': u'PostCoin', - # 'POSW': u'PoSWallet', - # 'POT': u'PotCoin', - # 'PPC': u'PeerCoin', - # 'PPT': u'Populous', - # 'PPY': u'Peerplays', - # 'PRC': u'ProsperCoin', - # 'PRE': u'Premium', - # 'PRES': u'President Trump', - # 'PRIME': u'PrimeChain', - # 'PRM': u'PrismChain', - # 'PROC': u'ProCurrency', - # 'PRX': u'Printerium', - # 'PSB': u'PesoBit', - # 'PSEUD': u'PseudoCash', - # 'PSI': u'PSIcoin', - # 'PSY': u'Psilocybin', - # 'PTA': u'PentaCoin', - # 'PTC': u'PesetaCoin', - # 'PTOY': u'Patientory', - # 'PTS': u'Protoshares', - # 'PULSE': u'Pulse', - # 'PUPA': u'PupaCoin', - # 'PUT': u'PutinCoin', - # 'PWR': u'PowerCoin', - # 'PX': u'PXcoin', - # 'PXC': u'PhoenixCoin', - # 'PXI': u'Prime-X1', - # 'PXL': u'Phalanx', - # 'PYC': u'PayCoin', - # 'QAU': u'Quantum', - # 'QBC': u'Quebecoin', - # 'QBK': u'QuBuck Coin', - # 'QBT': u'Cubits', - # 'QCN': u'Quazar Coin', - # 'QORA': u'QoraCoin', - # 'QRK': u'QuarkCoin', - # 'QRL': u'Quantum Resistant Ledger', - # 'QSLV': u'Quicksilver coin', - # 'QTL': u'Quatloo', - # 'QTUM': u'QTUM', - # 'QTZ': u'Quartz', - # 'QWARK': u'Qwark', - # 'RADI': u'RadicalCoin', - # 'RADS': u'Radium', - # 'RAIN': u'Condensate', - # 'RATIO': u'Ratio', - # 'RBIES': u'Rubies', - # 'RBIT': u'ReturnBit', - # 'RBR': u'Ribbit Rewards', - # 'RBT': u'Rimbit', - # 'RBX': u'RiptoBuX', - # 'RBY': u'RubyCoin', - # 'RC': u'Russiacoin', - # 'RCN': u'RCoin', - # 'RCX': u'RedCrowCoin', - # 'RDD': u'ReddCoin', - # 'RDN': u'RadonPay', - # 'RED': u'Redcoin', - # 'REE': u'ReeCoin', - # 'REP': u'Augur', - # 'REV': u'Revenu', - # 'RIC': u'Riecoin', - # 'RICE': u'RiceCoin', - # 'RIDE': u'Ride My Car', - # 'RING': u'RingCoin', - # 'RIPO': u'RipOffCoin', - # 'RISE': u'Rise', - # 'RLC': u'iEx.ec', - # 'RMS': u'Resumeo Shares', - # 'RNC': u'ReturnCoin', - # 'RNS': u'RenosCoin', - # 'ROOT': u'RootCoin', - # 'ROS': u'ROS Coin', - # 'ROUND': u'RoundCoin', - # 'ROYAL': u'RoyalCoin', - # 'RPC': u'RonPaulCoin', - # 'RRT': u'Recovery Right Tokens', - # 'RT2': u'RotoCoin', - # 'RUBIT': u'Rublebit', - # 'RUST': u'RustCoin', - # 'RYC': u'RoyalCoin', - # 'RYCN': u'RoyalCoin 2.0', - # 'RZR': u'RazorCoin', - # 'S8C': u'S88 Coin', - # 'SAK': u'SharkCoin', - # 'SAN': u'Santiment', - # 'SANDG': u'Save and Gain', - # 'SAR': u'SARCoin', - # 'SAT2': u'Saturn2Coin', - # 'SBC': u'StableCoin', - # 'SBD': u'Steem Backed Dollars', - # 'SC': u'Siacoin', - # 'SCASH': u'SpaceCash', - # 'SCN': u'Swiscoin', - # 'SCOT': u'Scotcoin', - # 'SCRPT': u'ScryptCoin', - # 'SCRT': u'SecretCoin', - # 'SCT': u'ScryptToken', - # 'SDC': u'ShadowCash', - # 'SDP': u'SydPakCoin', - # 'SEC': u'SafeExchangeCoin', - # 'SEEDS': u'SeedShares', - # 'SEL': u'SelenCoin', - # 'SEN': u'Sentaro', - # 'SEQ': u'Sequence', - # 'SFC': u'Solarflarecoin', - # 'SFE': u'Safecoin', - # 'SFR': u'SaffronCoin', - # 'SH': u'Shilling', - # 'SHADE': u'ShadeCoin', - # 'SHIFT': u'Shift', - # 'SHLD': u'ShieldCoin', - # 'SHORTY': u'ShortyCoin', - # 'SIB': u'SibCoin', - # 'SIGU': u'Singular', - # 'SILK': u'SilkCoin', + 'MAPC': u'MapCoin', + 'MAR': u'MarijuanaCoin', + 'MARS': u'MarsCoin ', + 'MARV': u'Marvelous', + 'MARX': u'MarxCoin', + 'MARYJ': u'MaryJane Coin', + 'MAT': u'Manet Coin', + 'MAX': u'MaxCoin', + 'MBIT': u'Mbitbooks', + 'MCAP': u'MCAP', + 'MCAR': u'MasterCar', + 'MCN': u'MonetaVerde', + 'MCO': u'Monaco', + 'MCRN': u'MacronCoin', + 'MDC': u'MedicCoin', + 'MDT': u'Midnight ', + 'MEC': u'MegaCoin', + 'MED': u'MediterraneanCoin', + 'MEGA': u'MegaFlash', + 'MEME': u'Pepe', + 'MER': u'Mercury', + 'METAL': u'MetalCoin', + 'MG': u'Mind Gene', + 'MGO': u'MobileGo', + 'MI': u'XiaoMiCoin', + 'MIL': u'Milllionaire Coin', + 'MILO': u'MiloCoin', + 'MIN': u'Minerals Coin', + 'MINE': u'Instamine Nuggets', + 'MINT': u'MintCoin', + 'MIS': u'MIScoin', + 'MKR': u'Maker', + 'MLITE': u'MeLite', + 'MLN': u'Melon', + 'MM': u'MasterMint', + 'MMC': u'MemoryCoin', + 'MMNXT': u'MMNXT ', + 'MMXIV': u'MaieutiCoin', + 'MMXVI': u'MMXVI', + 'MN': u'Cryptsy Mining Contract', + 'MNC': u'MinCoin', + 'MND': u'MindCoin', + 'MNE': u'Minereum', + 'MNM': u'Mineum', + 'MOIN': u'MoinCoin', + 'MOJO': u'Mojocoin', + 'MONA': u'MonaCoin', + 'MONETA': u'Moneta', + 'MONEY': u'MoneyCoin', + 'MOON': u'MoonCoin', + 'MOOND': u'Dark Moon', + 'MOTO': u'Motocoin', + 'MPRO': u'MediumProject', + 'MRP': u'MorpheusCoin', + 'MRS': u'MarsCoin', + 'MRSA': u'MrsaCoin', + 'MRT': u'MinersReward', + 'MRY': u'MemoryCoin', + 'MSC': u'MasterCoin', + 'MST': u'MustangCoin', + 'MT': u'Mycelium Token', + 'MTL': u'Metal', + 'MTR': u'MasterTraderCoin', + 'MUDRA': u'MudraCoin', + 'MUE': u'MonetaryUnit', + 'MUSIC': u'Musiccoin', + 'MUU': u'MilkCoin', + 'MWC': u'MultiWallet Coin', + 'MXT': u'MartexCoin', + 'MYB': u'MyBit', + 'MYC': u'MayaCoin', + 'MYST': u'MysteryCoin', + 'MZC': u'MazaCoin', + 'N7': u'Number7', + 'NAN': u'NanoToken', + 'NANAS': u'BananaBits', + 'NAS2': u'Nas2Coin', + 'NAUT': u'Nautilus Coin', + 'NAV': u'NavCoin', + 'NBIT': u'NetBit', + 'NBL': u'Nybble', + 'NBT': u'NuBits', + 'NDOGE': u'NinjaDoge', + 'NEBU': u'Nebuchadnezzar', + 'NEC': u'NeoCoin', + 'NEF': u'NefariousCoin', + 'NEOS': u'NeosCoin', + 'NET': u'NetCoin', + 'NETC': u'NetworkCoin', + 'NETKO': u'Netko', + 'NEU': u'NeuCoin', + 'NEVA': u'NevaCoin', + 'NIC': u'NewInvestCoin', + 'NICE': u'NiceCoin', + 'NKA': u'IncaKoin', + 'NKC': u'Nukecoinz', + 'NKT': u'NakomotoDark', + 'NLC': u'NoLimitCoin', + 'NLG': u'Gulden', + 'NMB': u'Nimbus Coin', + 'NMC': u'NameCoin', + 'NMR': u'Numerai', + 'NOBL': u'NobleCoin', + 'NODE': u'Node', + 'NOO': u'Noocoin', + 'NOTE': u'Dnotes', + 'NPC': u'NPCcoin', + 'NRB': u'NoirBits', + 'NRC': u'Neurocoin', + 'NRS': u'NoirShares', + 'NSR': u'NuShares', + 'NTC': u'NineElevenTruthCoin', + 'NTCC': u'NeptuneClassic', + 'NTRN': u'Neutron', + 'NUBIS': u'NubisCoin', + 'NUKE': u'NukeCoin', + 'NUM': u'NumbersCoin', + 'NVC': u'NovaCoin', + 'NXC': u'Nexium', + 'NXE': u'NXEcoin', + 'NXS': u'Nexus', + 'NXT': u'Nxt', + 'NXTI': u'NXTI', + 'NXTTY': u'NXTTY', + 'NYAN': u'NyanCoin', + 'NZC': u'NewZealandCoin', + 'OAX': u'OpenANX', + 'OBITS': u'Obits Coin', + 'OBS': u'Obscurebay', + 'OC': u'OrangeCoin', + 'OCTO': u'OctoCoin', + 'ODNT': u'Old Dogs New Tricks', + 'OK': u'OKCash', + 'OLDSF': u'OldSafeCoin', + 'OLYMP': u'OlympCoin', + 'OMA': u'OmegaCoin', + 'OMC': u'OmniCron', + 'OMNI': u'Omni', + 'OPAL': u'OpalCoin', + 'OPES': u'Opes', + 'OPTION': u'OptionCoin', + 'ORB': u'Orbitcoin', + 'ORLY': u'OrlyCoin', + 'ORO': u'OroCoin', + 'OS76': u'OsmiumCoin', + 'OSC': u'OpenSourceCoin', + 'PAC': u'PacCoin', + 'PAK': u'Pakcoin', + 'PARA': u'ParanoiaCoin', + 'PASC': u'Pascal Coin', + 'PASL': u'Pascal Lite', + 'PAY': u'TenX', + 'PAYP': u'PayPeer', + 'PBC': u'PabyosiCoin', + 'PCM': u'Procom', + 'PCS': u'Pabyosi Coin', + 'PDC': u'Project Decorum', + 'PEC': u'PeaceCoin', + 'PEN': u'PenCoin', + 'PEPECASH': u'Pepe Cash', + 'PEX': u'PosEx', + 'PHR': u'Phreak', + 'PHS': u'PhilosophersStone', + 'PIE': u'Persistent Information Exchange', + 'PIGGY': u'Piggy Coin', + 'PING': u'CryptoPing', + 'PINK': u'PinkCoin', + 'PINKX': u'PantherCoin', + 'PIO': u'Pioneershares', + 'PIVX': u'Private Instant Verified Transaction', + 'PIZZA': u'PizzaCoin', + 'PKB': u'ParkByte', + 'PLANET': u'PlanetCoin', + 'PLBT': u'Polybius', + 'PLNC': u'PLNCoin', + 'PLU': u'Pluton', + 'PNC': u'PlatiniumCoin', + 'PND': u'PandaCoin', + 'PNK': u'SteamPunk', + 'POINTS': u'Cryptsy Points', + 'POLY': u'PolyBit', + 'POST': u'PostCoin', + 'POSW': u'PoSWallet', + 'POT': u'PotCoin', + 'PPC': u'PeerCoin', + 'PPT': u'Populous', + 'PPY': u'Peerplays', + 'PRC': u'ProsperCoin', + 'PRE': u'Premium', + 'PRES': u'President Trump', + 'PRIME': u'PrimeChain', + 'PRM': u'PrismChain', + 'PROC': u'ProCurrency', + 'PRX': u'Printerium', + 'PSB': u'PesoBit', + 'PSEUD': u'PseudoCash', + 'PSI': u'PSIcoin', + 'PSY': u'Psilocybin', + 'PTA': u'PentaCoin', + 'PTC': u'PesetaCoin', + 'PTOY': u'Patientory', + 'PTS': u'Protoshares', + 'PULSE': u'Pulse', + 'PUPA': u'PupaCoin', + 'PUT': u'PutinCoin', + 'PWR': u'PowerCoin', + 'PX': u'PXcoin', + 'PXC': u'PhoenixCoin', + 'PXI': u'Prime-X1', + 'PXL': u'Phalanx', + 'PYC': u'PayCoin', + 'QAU': u'Quantum', + 'QBC': u'Quebecoin', + 'QBK': u'QuBuck Coin', + 'QBT': u'Cubits', + 'QCN': u'Quazar Coin', + 'QORA': u'QoraCoin', + 'QRK': u'QuarkCoin', + 'QRL': u'Quantum Resistant Ledger', + 'QSLV': u'Quicksilver coin', + 'QTL': u'Quatloo', + 'QTUM': u'QTUM', + 'QTZ': u'Quartz', + 'QWARK': u'Qwark', + 'RADI': u'RadicalCoin', + 'RADS': u'Radium', + 'RAIN': u'Condensate', + 'RATIO': u'Ratio', + 'RBIES': u'Rubies', + 'RBIT': u'ReturnBit', + 'RBR': u'Ribbit Rewards', + 'RBT': u'Rimbit', + 'RBX': u'RiptoBuX', + 'RBY': u'RubyCoin', + 'RC': u'Russiacoin', + 'RCN': u'RCoin', + 'RCX': u'RedCrowCoin', + 'RDD': u'ReddCoin', + 'RDN': u'RadonPay', + 'RED': u'Redcoin', + 'REE': u'ReeCoin', + 'REP': u'Augur', + 'REV': u'Revenu', + 'RIC': u'Riecoin', + 'RICE': u'RiceCoin', + 'RIDE': u'Ride My Car', + 'RING': u'RingCoin', + 'RIPO': u'RipOffCoin', + 'RISE': u'Rise', + 'RLC': u'iEx.ec', + 'RMS': u'Resumeo Shares', + 'RNC': u'ReturnCoin', + 'RNS': u'RenosCoin', + 'ROOT': u'RootCoin', + 'ROS': u'ROS Coin', + 'ROUND': u'RoundCoin', + 'ROYAL': u'RoyalCoin', + 'RPC': u'RonPaulCoin', + 'RRT': u'Recovery Right Tokens', + 'RT2': u'RotoCoin', + 'RUBIT': u'Rublebit', + 'RUST': u'RustCoin', + 'RYC': u'RoyalCoin', + 'RYCN': u'RoyalCoin 2.0', + 'RZR': u'RazorCoin', + 'S8C': u'S88 Coin', + 'SAK': u'SharkCoin', + 'SAN': u'Santiment', + 'SANDG': u'Save and Gain', + 'SAR': u'SARCoin', + 'SAT2': u'Saturn2Coin', + 'SBC': u'StableCoin', + 'SBD': u'Steem Backed Dollars', + 'SC': u'Siacoin', + 'SCASH': u'SpaceCash', + 'SCN': u'Swiscoin', + 'SCOT': u'Scotcoin', + 'SCRPT': u'ScryptCoin', + 'SCRT': u'SecretCoin', + 'SCT': u'ScryptToken', + 'SDC': u'ShadowCash', + 'SDP': u'SydPakCoin', + 'SEC': u'SafeExchangeCoin', + 'SEEDS': u'SeedShares', + 'SEL': u'SelenCoin', + 'SEN': u'Sentaro', + 'SEQ': u'Sequence', + 'SFC': u'Solarflarecoin', + 'SFE': u'Safecoin', + 'SFR': u'SaffronCoin', + 'SH': u'Shilling', + 'SHADE': u'ShadeCoin', + 'SHIFT': u'Shift', + 'SHLD': u'ShieldCoin', + 'SHORTY': u'ShortyCoin', + 'SIB': u'SibCoin', + 'SIGU': u'Singular', + 'SILK': u'SilkCoin', 'SJCX': u'StorjCoin', - # 'SKB': u'SkullBuzz', - # 'SKY': u'Skycoin', - # 'SLG': u'SterlingCoin', - # 'SLING': u'Sling Coin', - # 'SLM': u'SlimCoin', - # 'SLR': u'SolarCoin', - # 'SLS': u'SaluS', - # 'SMAC': u'Social Media Coin', - # 'SMC': u'SmartCoin', - # 'SMF': u'SmurfCoin', - # 'SMLY': u'SmileyCoin', - # 'SMSR': u'Samsara Coin', - # 'SNC': u'SunContract', - # 'SNGLS': u'SingularDTV', - # 'SNM': u'SONM', - # 'SNRG': u'Synergy', - # 'SNT': u'Status Network Token', - # 'SOIL': u'SoilCoin', - # 'SOLE': u'SoleCoin', - # 'SONG': u'Song Coin', - # 'SOON': u'SoonCoin', - # 'SOUL': u'SoulCoin', - # 'SP': u'Sex Pistols', - # 'SPA': u'SpainCoin', - # 'SPACE': u'SpaceCoin', - # 'SPC': u'SpinCoin', - # 'SPEC': u'SpecCoin', - # 'SPHR': u'Sphere Coin', - # 'SPKTR': u'Ghost Coin', - # 'SPM': u'Supreme', - # 'SPORT': u'SportsCoin', - # 'SPOTS': u'Spots', - # 'SPR': u'Spreadcoin', - # 'SPRTS': u'Sprouts', - # 'SPT': u'Spots', - # 'SPX': u'Specie', - # 'SQL': u'Squall Coin', - # 'SRC': u'SecureCoin', - # 'SSD': u'Sonic Screw Driver Coin', - # 'SSTC': u'SunShotCoin', - # 'SSV': u'SSVCoin', - # 'STA': u'Stakers', - # 'STALIN': u'StalinCoin', - # 'STAR': u'StarCoin', - # 'START': u'StartCoin', - # 'STEEM': u'Steem', - # 'STEPS': u'Steps', - # 'STHR': u'Stakerush', - # 'STO': u'Save The Ocean', - # # 'STR*': u'StarCoin', - # 'STRAT': u'Stratis', - # 'STS': u'STRESScoin', - # 'STV': u'Sativa Coin', - # 'SUB': u'Subscriptio', - # 'SUP': u'Supcoin', - # 'SUPER': u'SuperCoin', - # 'SUR': u'Suretly', - # 'SWARM': u'SwarmCoin', - # 'SWEET': u'SweetStake', - # 'SWIFT': u'BitSwift', - # 'SWING': u'SwingCoin', - # 'SWT': u'Swarm City Token', - # 'SXC': u'SexCoin', - # 'SYNC': u'SyncCoin', - # 'SYNX': u'Syndicate', - # 'SYS': u'SysCoin', - # 'TAAS': u'Token as a Service', - # 'TAB': u'MollyCoin', - # 'TAG': u'TagCoin', - # 'TAGR': u'Think And Get Rich Coin', - # 'TAJ': u'TajCoin', - # 'TAK': u'TakCoin', - # 'TAM': u'TamaGucci', - # 'TAP': u'TappingCoin', - # 'TBCX': u'TrashBurn', - # 'TCR': u'Thecreed', - # 'TDFB': u'TDFB', - # 'TEAM': u'TeamUP', - # 'TEC': u'TeCoin', - # 'TECH': u'TechCoin', - # 'TEK': u'TekCoin', - # 'TELL': u'Tellurion', - # 'TENNET': u'Tennet', - # 'TES': u'TeslaCoin', - # 'TESLA': u'TeslaCoilCoin', - # 'TFL': u'True Flip Lottery', - # 'TGC': u'TigerCoin', - # 'THC': u'The Hempcoin', - # 'THS': u'TechShares', - # 'TIA': u'Tianhe', - # 'TIC': u'TrueInvestmentCoin', - # 'TIME': u'Time', - # 'TIT': u'TitCoin', - # 'TIX': u'Blocktix', - # 'TKN': u'TokenCard ', - # 'TKS': u'Tokes', - # 'TMC': u'TimesCoin', - # 'TODAY': u'TodayCoin', - # 'TOR': u'TorCoin', - # 'TOT': u'TotCoin', - # 'TPAY': u'TrollPlay', - # 'TPG': u'Troll Payment', - # 'TRA': u'Tetra', - # 'TRC': u'TerraCoin', - # 'TRI': u'Triangles Coin', - # 'TRICK': u'TrickyCoin', - # 'TRIG': u'Trigger', - # 'TRK': u'TruckCoin', - # 'TRON': u'Positron', - # 'TRST': u'TrustCoin', - # 'TRUMP': u'TrumpCoin', - # 'TRUST': u'TrustPlus', - # 'TSE': u'TattooCoin', - # 'TTC': u'TittieCoin', - # 'TUR': u'Turron', - # 'TWIST': u'TwisterCoin', - # 'TWLV': u'Twelve Coin', - # 'TX': u'Transfer', - # 'U': u'Ucoin', - # 'UBIQ': u'Ubiqoin', - # 'UBQ': u'Ubiq', - # 'UFO': u'UFO Coin', - # 'UIS': u'Unitus', - # 'ULTC': u'Umbrella', - # 'UNAT': u'Unattanium', - # 'UNB': u'UnbreakableCoin', - # 'UNC': u'UnCoin', - # 'UNF': u'Unfed Coin', - # 'UNI': u'Universe', - # 'UNIQ': u'Uniqredit', - # 'UNIT': u'Universal Currency', - # 'UNITS': u'GameUnits', - # 'UNITY': u'SuperNET', - # 'UNO': u'Unobtanium', - # 'UR': u'UR', - # 'URO': u'UroCoin', - # 'USC': u'Ultimate Secure Cash', - # 'USDE': u'UnitaryStatus Dollar', - # 'USDT': u'Tether', - # 'UTC': u'UltraCoin', - # 'UTH': u'Uther', - # 'UTIL': u'Utility Coin', - # 'VAPOR': u'Vaporcoin', - # 'VDO': u'VidioCoin', - # 'VEC2': u'VectorCoin 2.0 ', - # 'VEG': u'BitVegan', - # 'VERI': u'Veritaseum', - # 'VERSA': u'Versa Token', - # 'VIA': u'ViaCoin', - # 'VIDZ': u'PureVidz', - # 'VIOR': u'ViorCoin', - # 'VIP': u'VIP Tokens', - # 'VIRAL': u'Viral Coin', - # 'VISIO': u'Visio', - # 'VLT': u'Veltor', - # 'VLTC': u'VaultCoin', - # 'VMC': u'VirtualMining Coin', - # 'VOLT': u'BitVolt', - # 'VOOT': u'VootCoin', - # 'VOX': u'Voxels', - # 'VOYA': u'Voyacoin', - # 'VPRC': u'VapersCoin', - # 'VRC': u'VeriCoin', - # 'VRM': u'Verium', - # 'VRS': u'Veros', - # 'VSL': u'vSlice', - # 'VTA': u'VirtaCoin', - # 'VTC': u'VertCoin', - # 'VTR': u'Vtorrent', - # 'VTX': u'Vertex', - # 'VTY': u'Victoriouscoin', - # 'VUC': u'Virta Unique Coin', - # 'WARP': u'WarpCoin', - # 'WASH': u'WashingtonCoin', - # 'WAVES': u'Waves', - # 'WAY': u'WayCoin', - # 'WBB': u'Wild Beast Coin', - # 'WBTC': u'wBTC', - # 'WC': u'WhiteCoin', - # 'WCT': u'Waves Community Token', - # 'WDC': u'WorldCoin', - # 'WEALTH': u'WealthCoin', - # 'WEX': u'Wexcoin', - # 'WGC': u'World Gold Coin', - # 'WGO': u'WavesGO', - # 'WGR': u'Wagerr', - # 'WINE': u'WineCoin', - # 'WINGS': u'Wings DAO', - # 'WISC': u'WisdomCoin', - # 'WMC': u'WMCoin', - # 'WOLF': u'Insanity Coin', - # 'WOP': u'WorldPay', - # 'WRC': u'WarCoin', - # 'WSX': u'WeAreSatoshi', - # 'WTT': u'Giga Watt', - # 'X2': u'X2Coin', - # 'XAI': u'SapienceCoin', - # 'XAU': u'XauCoin', - # 'XAUR': u'Xaurum', - # 'XBC': u'BitcoinPlus', - # 'XBOT': u'SocialXbotCoin', - # 'XBS': u'Bitstake', - # 'XBTS': u'Beats', - # 'XBY': u'XtraBYtes', - # 'XC': u'X11 Coin', - # 'XCASH': u'Xcash', - # 'XCE': u'Cerium', - # 'XCI': u'Cannabis Industry Coin', - # 'XCN': u'Cryptonite', - # 'XCO': u'XCoin', - # 'XCP': u'CounterParty', - # 'XCR': u'Crypti', - # 'XCRE': u'Creatio', - # 'XCT': u'C-Bits', - # 'XDB': u'DragonSphere', - # 'XDE2': u'XDE II', - # 'XDN': u'DigitalNote ', - # 'XDP': u'DogeParty', - # 'XDQ': u'Dirac Coin', - # 'XEL': u'Elastic', + 'SKB': u'SkullBuzz', + 'SKY': u'Skycoin', + 'SLG': u'SterlingCoin', + 'SLING': u'Sling Coin', + 'SLM': u'SlimCoin', + 'SLR': u'SolarCoin', + 'SLS': u'SaluS', + 'SMAC': u'Social Media Coin', + 'SMC': u'SmartCoin', + 'SMF': u'SmurfCoin', + 'SMLY': u'SmileyCoin', + 'SMSR': u'Samsara Coin', + 'SNC': u'SunContract', + 'SNGLS': u'SingularDTV', + 'SNM': u'SONM', + 'SNRG': u'Synergy', + 'SNT': u'Status Network Token', + 'SOIL': u'SoilCoin', + 'SOLE': u'SoleCoin', + 'SONG': u'Song Coin', + 'SOON': u'SoonCoin', + 'SOUL': u'SoulCoin', + 'SP': u'Sex Pistols', + 'SPA': u'SpainCoin', + 'SPACE': u'SpaceCoin', + 'SPC': u'SpinCoin', + 'SPEC': u'SpecCoin', + 'SPHR': u'Sphere Coin', + 'SPKTR': u'Ghost Coin', + 'SPM': u'Supreme', + 'SPORT': u'SportsCoin', + 'SPOTS': u'Spots', + 'SPR': u'Spreadcoin', + 'SPRTS': u'Sprouts', + 'SPT': u'Spots', + 'SPX': u'Specie', + 'SQL': u'Squall Coin', + 'SRC': u'SecureCoin', + 'SSD': u'Sonic Screw Driver Coin', + 'SSTC': u'SunShotCoin', + 'SSV': u'SSVCoin', + 'STA': u'Stakers', + 'STALIN': u'StalinCoin', + 'STAR': u'StarCoin', + 'START': u'StartCoin', + 'STEEM': u'Steem', + 'STEPS': u'Steps', + 'STHR': u'Stakerush', + 'STO': u'Save The Ocean', + # 'STR*': u'StarCoin', + 'STRAT': u'Stratis', + 'STS': u'STRESScoin', + 'STV': u'Sativa Coin', + 'SUB': u'Subscriptio', + 'SUP': u'Supcoin', + 'SUPER': u'SuperCoin', + 'SUR': u'Suretly', + 'SWARM': u'SwarmCoin', + 'SWEET': u'SweetStake', + 'SWIFT': u'BitSwift', + 'SWING': u'SwingCoin', + 'SWT': u'Swarm City Token', + 'SXC': u'SexCoin', + 'SYNC': u'SyncCoin', + 'SYNX': u'Syndicate', + 'SYS': u'SysCoin', + 'TAAS': u'Token as a Service', + 'TAB': u'MollyCoin', + 'TAG': u'TagCoin', + 'TAGR': u'Think And Get Rich Coin', + 'TAJ': u'TajCoin', + 'TAK': u'TakCoin', + 'TAM': u'TamaGucci', + 'TAP': u'TappingCoin', + 'TBCX': u'TrashBurn', + 'TCR': u'Thecreed', + 'TDFB': u'TDFB', + 'TEAM': u'TeamUP', + 'TEC': u'TeCoin', + 'TECH': u'TechCoin', + 'TEK': u'TekCoin', + 'TELL': u'Tellurion', + 'TENNET': u'Tennet', + 'TES': u'TeslaCoin', + 'TESLA': u'TeslaCoilCoin', + 'TFL': u'True Flip Lottery', + 'TGC': u'TigerCoin', + 'THC': u'The Hempcoin', + 'THS': u'TechShares', + 'TIA': u'Tianhe', + 'TIC': u'TrueInvestmentCoin', + 'TIME': u'Time', + 'TIT': u'TitCoin', + 'TIX': u'Blocktix', + 'TKN': u'TokenCard ', + 'TKS': u'Tokes', + 'TMC': u'TimesCoin', + 'TODAY': u'TodayCoin', + 'TOR': u'TorCoin', + 'TOT': u'TotCoin', + 'TPAY': u'TrollPlay', + 'TPG': u'Troll Payment', + 'TRA': u'Tetra', + 'TRC': u'TerraCoin', + 'TRI': u'Triangles Coin', + 'TRICK': u'TrickyCoin', + 'TRIG': u'Trigger', + 'TRK': u'TruckCoin', + 'TRON': u'Positron', + 'TRST': u'TrustCoin', + 'TRUMP': u'TrumpCoin', + 'TRUST': u'TrustPlus', + 'TSE': u'TattooCoin', + 'TTC': u'TittieCoin', + 'TUR': u'Turron', + 'TWIST': u'TwisterCoin', + 'TWLV': u'Twelve Coin', + 'TX': u'Transfer', + 'U': u'Ucoin', + 'UBIQ': u'Ubiqoin', + 'UBQ': u'Ubiq', + 'UFO': u'UFO Coin', + 'UIS': u'Unitus', + 'ULTC': u'Umbrella', + 'UNAT': u'Unattanium', + 'UNB': u'UnbreakableCoin', + 'UNC': u'UnCoin', + 'UNF': u'Unfed Coin', + 'UNI': u'Universe', + 'UNIQ': u'Uniqredit', + 'UNIT': u'Universal Currency', + 'UNITS': u'GameUnits', + 'UNITY': u'SuperNET', + 'UNO': u'Unobtanium', + 'UR': u'UR', + 'URO': u'UroCoin', + 'USC': u'Ultimate Secure Cash', + 'USDE': u'UnitaryStatus Dollar', + 'USDT': u'Tether', + 'UTC': u'UltraCoin', + 'UTH': u'Uther', + 'UTIL': u'Utility Coin', + 'VAPOR': u'Vaporcoin', + 'VDO': u'VidioCoin', + 'VEC2': u'VectorCoin 2.0 ', + 'VEG': u'BitVegan', + 'VERI': u'Veritaseum', + 'VERSA': u'Versa Token', + 'VIA': u'ViaCoin', + 'VIDZ': u'PureVidz', + 'VIOR': u'ViorCoin', + 'VIP': u'VIP Tokens', + 'VIRAL': u'Viral Coin', + 'VISIO': u'Visio', + 'VLT': u'Veltor', + 'VLTC': u'VaultCoin', + 'VMC': u'VirtualMining Coin', + 'VOLT': u'BitVolt', + 'VOOT': u'VootCoin', + 'VOX': u'Voxels', + 'VOYA': u'Voyacoin', + 'VPRC': u'VapersCoin', + 'VRC': u'VeriCoin', + 'VRM': u'Verium', + 'VRS': u'Veros', + 'VSL': u'vSlice', + 'VTA': u'VirtaCoin', + 'VTC': u'VertCoin', + 'VTR': u'Vtorrent', + 'VTX': u'Vertex', + 'VTY': u'Victoriouscoin', + 'VUC': u'Virta Unique Coin', + 'WARP': u'WarpCoin', + 'WASH': u'WashingtonCoin', + 'WAVES': u'Waves', + 'WAY': u'WayCoin', + 'WBB': u'Wild Beast Coin', + 'WBTC': u'wBTC', + 'WC': u'WhiteCoin', + 'WCT': u'Waves Community Token', + 'WDC': u'WorldCoin', + 'WEALTH': u'WealthCoin', + 'WEX': u'Wexcoin', + 'WGC': u'World Gold Coin', + 'WGO': u'WavesGO', + 'WGR': u'Wagerr', + 'WINE': u'WineCoin', + 'WINGS': u'Wings DAO', + 'WISC': u'WisdomCoin', + 'WMC': u'WMCoin', + 'WOLF': u'Insanity Coin', + 'WOP': u'WorldPay', + 'WRC': u'WarCoin', + 'WSX': u'WeAreSatoshi', + 'WTT': u'Giga Watt', + 'X2': u'X2Coin', + 'XAI': u'SapienceCoin', + 'XAU': u'XauCoin', + 'XAUR': u'Xaurum', + 'XBC': u'BitcoinPlus', + 'XBOT': u'SocialXbotCoin', + 'XBS': u'Bitstake', + 'XBTS': u'Beats', + 'XBY': u'XtraBYtes', + 'XC': u'X11 Coin', + 'XCASH': u'Xcash', + 'XCE': u'Cerium', + 'XCI': u'Cannabis Industry Coin', + 'XCN': u'Cryptonite', + 'XCO': u'XCoin', + 'XCP': u'CounterParty', + 'XCR': u'Crypti', + 'XCRE': u'Creatio', + 'XCT': u'C-Bits', + 'XDB': u'DragonSphere', + 'XDE2': u'XDE II', + 'XDN': u'DigitalNote ', + 'XDP': u'DogeParty', + 'XDQ': u'Dirac Coin', + 'XEL': u'Elastic', 'XEM': u'NEM', - # 'XEN': u'XenixCoin', - # 'XFC': u'Forever Coin', - # 'XG': u'XG Sports', - # 'XGB': u'GoldenBird', - # 'XGR': u'GoldReserve', - # 'XHI': u'HiCoin', - # 'XID': u'International Diamond Coin', - # 'XJO': u'JouleCoin', - # 'XLB': u'LibertyCoin', - # 'XLM': u'Stellar', - # 'XLR': u'Solaris', - # 'XMG': u'Coin Magi', + 'XEN': u'XenixCoin', + 'XFC': u'Forever Coin', + 'XG': u'XG Sports', + 'XGB': u'GoldenBird', + 'XGR': u'GoldReserve', + 'XHI': u'HiCoin', + 'XID': u'International Diamond Coin', + 'XJO': u'JouleCoin', + 'XLB': u'LibertyCoin', + 'XLM': u'Stellar', + 'XLR': u'Solaris', + 'XMG': u'Coin Magi', 'XMR': u'Monero', - # 'XMS': u'Megastake', - # 'XMY': u'MyriadCoin', - # 'XNA': u'DeOxyRibose', - # 'XNC': u'Numismatic Collections', - # 'XNG': u'Enigma', - # 'XNX': u'XanaxCoin', - # 'XPB': u'Pebble Coin', - # 'XPD': u'PetroDollar', - # 'XPH': u'PharmaCoin', - # 'XPM': u'PrimeCoin', - # 'XPO': u'Opair', - # 'XPOKE': u'PokeChain', - # 'XPRO': u'ProCoin', - # 'XPS': u'PoisonIvyCoin', - # 'XPY': u'PayCoin', - # 'XQN': u'Quotient', - # 'XRA': u'Ratecoin', - # 'XRB': u'RaiBlocks', - # 'XRE': u'RevolverCoin', - # 'XRL': u'Rialto.AI', + 'XMS': u'Megastake', + 'XMY': u'MyriadCoin', + 'XNA': u'DeOxyRibose', + 'XNC': u'Numismatic Collections', + 'XNG': u'Enigma', + 'XNX': u'XanaxCoin', + 'XPB': u'Pebble Coin', + 'XPD': u'PetroDollar', + 'XPH': u'PharmaCoin', + 'XPM': u'PrimeCoin', + 'XPO': u'Opair', + 'XPOKE': u'PokeChain', + 'XPRO': u'ProCoin', + 'XPS': u'PoisonIvyCoin', + 'XPY': u'PayCoin', + 'XQN': u'Quotient', + 'XRA': u'Ratecoin', + 'XRB': u'RaiBlocks', + 'XRE': u'RevolverCoin', + 'XRL': u'Rialto.AI', 'XRP': u'Ripple', - # 'XSEED': u'BitSeeds', - # 'XSI': u'Stability Shares', - # 'XSP': u'PoolStamp', - # 'XSPEC': u'Spectre', - # 'XST': u'StealthCoin', - # 'XT': u'ExtremeCoin', - # 'XTC': u'TileCoin', - # 'XTZ': u'Tezos', - # 'XUP': u'UPcoin', - # 'XVC': u'Vcash', - # 'XVE': u'The Vegan Initiative', - # 'XVG': u'Verge', - # 'XVP': u'VirtacoinPlus', - # 'XVS': u'Vsync', - # 'XWC': u'WhiteCoin', - # 'XWT': u'World Trade Funds', - # 'XXX': u'XXXCoin', - # 'XZC': u'ZCoin', - # 'YAC': u'YAcCoin', - # 'YAY': u'YAYcoin', - # 'YBC': u'YbCoin', - # 'YES': u'YesCoin', - # 'YMC': u'YamahaCoin', - # 'YOC': u'YoCoin', - # 'YOVI': u'YobitVirtualCoin', - # 'ZBC': u'Zilbercoin', - # 'ZCC': u'ZCC Coin', - # 'ZCL': u'ZClassic', + 'XSEED': u'BitSeeds', + 'XSI': u'Stability Shares', + 'XSP': u'PoolStamp', + 'XSPEC': u'Spectre', + 'XST': u'StealthCoin', + 'XT': u'ExtremeCoin', + 'XTC': u'TileCoin', + 'XTZ': u'Tezos', + 'XUP': u'UPcoin', + 'XVC': u'Vcash', + 'XVE': u'The Vegan Initiative', + 'XVG': u'Verge', + 'XVP': u'VirtacoinPlus', + 'XVS': u'Vsync', + 'XWC': u'WhiteCoin', + 'XWT': u'World Trade Funds', + 'XXX': u'XXXCoin', + 'XZC': u'ZCoin', + 'YAC': u'YAcCoin', + 'YAY': u'YAYcoin', + 'YBC': u'YbCoin', + 'YES': u'YesCoin', + 'YMC': u'YamahaCoin', + 'YOC': u'YoCoin', + 'YOVI': u'YobitVirtualCoin', + 'ZBC': u'Zilbercoin', + 'ZCC': u'ZCC Coin', + 'ZCL': u'ZClassic', 'ZEC': u'ZCash', - # 'ZECD': u'ZCashDarkCoin', - # 'ZED': u'ZedCoins', - # 'ZEIT': u'ZeitCoin', - # 'ZEN': u'ZenCash', - # 'ZENI': u'Zennies', - # 'ZER': u'Zero', - # 'ZET': u'ZetaCoin', - # 'ZET2': u'Zeta2Coin', - # 'ZLQ': u'ZLiteQubit', - # 'ZNE': u'ZoneCoin', - # 'ZNY': u'BitZeny', - # 'ZOI': u'Zoin', - # 'ZOOM': u'ZoomCoin', - # 'ZRC': u'ZrCoin', - # 'ZSE': u'ZSEcoin', - # 'ZUR': u'Zurcoin', - # 'ZXT': u'Zcrypt', - # 'ZYD': u'ZayedCoin', + 'ZECD': u'ZCashDarkCoin', + 'ZED': u'ZedCoins', + 'ZEIT': u'ZeitCoin', + 'ZEN': u'ZenCash', + 'ZENI': u'Zennies', + 'ZER': u'Zero', + 'ZET': u'ZetaCoin', + 'ZET2': u'Zeta2Coin', + 'ZLQ': u'ZLiteQubit', + 'ZNE': u'ZoneCoin', + 'ZNY': u'BitZeny', + 'ZOI': u'Zoin', + 'ZOOM': u'ZoomCoin', + 'ZRC': u'ZrCoin', + 'ZSE': u'ZSEcoin', + 'ZUR': u'Zurcoin', + 'ZXT': u'Zcrypt', + 'ZYD': u'ZayedCoin', } # ---------------------------------------------------------------------- @@ -1477,3 +1477,22 @@ # ---------------------------------------------------------------------- UPDATE_SETTINGS = {'github_slug': 'deanishe/alfred-convert'} DEFAULT_SETTINGS = {} + + +def bootstrap(wf): + """Copy default files to user data if necessary. + + Args: + wf (Workflow3): Active `Workflow3` object. + + """ + filepaths = [ + (wf.datafile(CUSTOM_DEFINITIONS_FILENAME), + wf.workflowfile(CUSTOM_DEFINITIONS_FILENAME + '.sample')), + (wf.datafile(ACTIVE_CURRENCIES_FILENAME), + wf.workflowfile(ACTIVE_CURRENCIES_FILENAME + '.default')), + ] + + for path, default in filepaths: + if not os.path.exists(path): + shutil.copy(default, path) diff --git a/src/convert.py b/src/convert.py index defa533..e5737ae 100755 --- a/src/convert.py +++ b/src/convert.py @@ -13,7 +13,6 @@ from __future__ import print_function, unicode_literals import os -import shutil import sys from pint import UnitRegistry, UndefinedUnitError, DimensionalityError @@ -21,6 +20,7 @@ from workflow import Workflow3, ICON_WARNING, ICON_INFO from workflow.background import run_in_background, is_running from config import ( + bootstrap, BUILTIN_UNIT_DEFINITIONS, COPY_UNIT, CURRENCY_CACHE_AGE, @@ -34,6 +34,7 @@ THOUSANDS_SEPARATOR, UPDATE_SETTINGS, ) +from defaults import Defaults log = None @@ -72,10 +73,6 @@ def register_units(): # User's custom units if os.path.exists(user_definitions): ureg.load_definitions(user_definitions) - else: # Copy template to data dir - shutil.copy( - wf.workflowfile('{}.sample'.format(CUSTOM_DEFINITIONS_FILENAME)), - user_definitions) def register_exchange_rates(exchange_rates): @@ -194,10 +191,14 @@ def main(wf): """ if not len(wf.args): - return 1 + return + query = wf.args[0] # .lower() log.debug('query : %s', query) + # Create data files if necessary + bootstrap(wf) + # Add workflow and user units to unit registry register_units() @@ -259,7 +260,9 @@ def main(wf): wf.add_item(error, 'For example: 2.5cm in | 178lb kg | 200m/s mph', valid=False, icon=ICON_WARNING) + else: # Show result + defs = Defaults(wf) value = copytext = '{} {}'.format(number, unit) if not COPY_UNIT: copytext = number @@ -271,8 +274,15 @@ def main(wf): largetext=value, icon='icon.png') - mod = it.add_modifier('cmd', 'Save {} as default unit for {}'.format( - unit, dim)) + action = 'save' + name = 'Save' + if defs.is_default(dim, unit): + action = 'delete' + name = 'Remove' + + mod = it.add_modifier('cmd', '{} {} as default unit for {}'.format( + name, unit, dim)) + mod.setvar('action', action) mod.setvar('unit', unit) mod.setvar('dimensionality', dim) diff --git a/src/currency.py b/src/currency.py index 106d6b8..d12f03c 100644 --- a/src/currency.py +++ b/src/currency.py @@ -15,19 +15,25 @@ import csv from itertools import chain, izip_longest from multiprocessing.dummy import Pool +import os import re +import shutil import time from workflow import Workflow, web -from config import (CURRENCY_CACHE_AGE, - CURRENCY_CACHE_NAME, - REFERENCE_CURRENCY, - CURRENCIES, - CRYPTO_CURRENCIES, - CRYPTO_COMPARE_BASE_URL, - YAHOO_BASE_URL, - SYMBOLS_PER_REQUEST) +from config import ( + bootstrap, + ACTIVE_CURRENCIES_FILENAME, + CURRENCY_CACHE_AGE, + CURRENCY_CACHE_NAME, + REFERENCE_CURRENCY, + CURRENCIES, + CRYPTO_CURRENCIES, + CRYPTO_COMPARE_BASE_URL, + YAHOO_BASE_URL, + SYMBOLS_PER_REQUEST, +) log = None @@ -164,6 +170,30 @@ def load_yahoo_rates(symbols): return rates +def load_active_currencies(): + """Load active currencies from user settings (or defaults). + + Returns: + set: Symbols for active currencies. + + """ + symbols = set() + + user_currencies = wf.datafile(ACTIVE_CURRENCIES_FILENAME) + if not os.path.exists(user_currencies): + return symbols + + with open(user_currencies) as fp: + for line in fp: + line = line.strip() + if line.startswith('#'): + continue + + symbols.add(line.upper()) + + return symbols + + def fetch_exchange_rates(): """Retrieve all currency exchange rates. @@ -176,14 +206,21 @@ def fetch_exchange_rates(): """ rates = {} futures = [] + active = load_active_currencies() + + # batch symbols into groups and interleave requests to the + # different services yjobs = [] - for symbols in grouper(SYMBOLS_PER_REQUEST, CURRENCIES.keys()): + syms = [s for s in CURRENCIES.keys() if s in active] + for symbols in grouper(SYMBOLS_PER_REQUEST, syms): yjobs.append((load_yahoo_rates, (symbols,))) cjobs = [] - for symbols in grouper(SYMBOLS_PER_REQUEST, CRYPTO_CURRENCIES.keys()): + syms = [sym for sym in CRYPTO_CURRENCIES.keys() if sym in active] + for symbols in grouper(SYMBOLS_PER_REQUEST, syms): cjobs.append((load_cryptocurrency_rates, (symbols,))) + # fetch data in a thread pool pool = Pool(4) for job in interleave(yjobs, cjobs): futures.append(pool.apply_async(*job)) @@ -205,6 +242,8 @@ def main(wf): """ start_time = time.time() + bootstrap(wf) + log.info('fetching exchange rates from Yahoo! and CryptoCompare.com ...') rates = wf.cached_data(CURRENCY_CACHE_NAME, diff --git a/src/defaults.py b/src/defaults.py new file mode 100644 index 0000000..7ee56b2 --- /dev/null +++ b/src/defaults.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# encoding: utf-8 +# +# Copyright (c) 2017 Dean Jackson +# +# MIT Licence. See http://opensource.org/licenses/MIT +# +# Created on 2017-07-16 +# + +"""defaults.py (save|delete) + +Save/delete default units for given dimensionality. + +Usage: + defaults.py save + defaults.py delete + defaults.py --help + +Options: + -h, --help Show this message + +""" + +from __future__ import print_function, absolute_import + +from collections import defaultdict + +from docopt import docopt +from workflow import Workflow3 + + +log = None + + +class Defaults(object): + """Manage default units for dimensionalities. + + Saves default units in workflow's settings file. + + """ + + def __init__(self, wf): + """Create new `Defaults` for workflow. + + Args: + wf (Workflow3): Active Workflow3 object. + """ + self._wf = wf + self._defs = self._load() + + def defaults(self, dimensionality): + """Default units for dimensionality. + + Args: + dimensionality (str): Dimensionality to return units for + + Returns: + list: Sequence of default units + + """ + return self._defs[dimensionality][:] + + def save(self, dimensionality, unit): + """Save ``unit`` as default for ``dimensionality``. + + Args: + dimensionality (str): Dimensionality + unit (str): Unit + + """ + if not self.is_default(dimensionality, unit): + self._defs[dimensionality].append(unit) + self._save() + + def remove(self, dimensionality, unit): + """Remove ``unit`` as default for ``dimensionality``. + + Args: + dimensionality (str): Dimensionality + unit (str): Unit + + """ + if self.is_default(dimensionality, unit): + self._defs[dimensionality].remove(unit) + self._save() + + def is_default(self, dimensionality, unit): + """Check whether ``unit`` is a default for ``dimensionality``. + + Args: + dimensionality (str): Dimensionality + unit (str): Unit + + Returns: + bool: ``True`` if ``unit`` is a default. + + """ + return unit in self._defs[dimensionality] + + def _load(self): + defs = defaultdict(list) + defs.update(self._wf.settings.get('default_units', {})) + return defs + + def _save(self): + self._wf.settings['default_units'] = dict(self._defs) + + +def main(wf): + """Run script.""" + args = docopt(__doc__, wf.args) + log.debug('args=%r', args) + + defs = Defaults(wf) + log.debug('defaults=%r', defs._defs) + + dimensionality = args[''] + unit = args[''] + + if args['save']: + defs.save(dimensionality, unit) + print(u'Saved {} as default unit for {}'.format(unit, dimensionality)) + return + + if args['delete']: + defs.remove(dimensionality, unit) + print(u'Removed {} as default unit for {}'.format(unit, dimensionality)) + return + + +if __name__ == '__main__': + wf = Workflow3() + log = wf.logger + wf.run(main) diff --git a/src/info.plist b/src/info.plist index 053c43d..6e53a16 100644 --- a/src/info.plist +++ b/src/info.plist @@ -10,7 +10,7 @@ destinationuid - 607FA0B2-94A5-48E4-96E9-0BFA8872F7EE + 54F0C711-EDE6-4387-B397-34AB8A8FFCB2 modifiers 0 modifiersubtext @@ -20,7 +20,20 @@ destinationuid - 67960284-5834-4BB2-849E-E5CF3254D3CF + CFE51A32-D227-42BA-966C-DBDED818F1D4 + modifiers + 0 + modifiersubtext + + vitoclose + + + + 54F0C711-EDE6-4387-B397-34AB8A8FFCB2 + + + destinationuid + 607FA0B2-94A5-48E4-96E9-0BFA8872F7EE modifiers 0 modifiersubtext @@ -42,6 +55,19 @@ + CFE51A32-D227-42BA-966C-DBDED818F1D4 + + + destinationuid + F738EA53-3486-4210-B03B-CFB792FD1798 + modifiers + 0 + modifiersubtext + + vitoclose + + + EF92F243-C49B-4DFC-B0A4-72317B2457A7 @@ -55,6 +81,19 @@ + F738EA53-3486-4210-B03B-CFB792FD1798 + + + destinationuid + 03379773-30CB-4371-BC49-8E2EA4C9947A + modifiers + 0 + modifiersubtext + + vitoclose + + + createdby Dean Jackson @@ -84,9 +123,9 @@ queuedelayimmediatelyinitially queuedelaymode - 0 + 1 queuemode - 2 + 1 runningsubtext Convertifying… script @@ -131,21 +170,19 @@ config - lastpathcomponent - - onlyshowifquerypopulated - - removeextension - - text - {query} - title - Copied to Clipboard + inputstring + {var:action} + matchcasesensitive + + matchmode + 0 + matchstring + type - alfred.workflow.output.notification + alfred.workflow.utility.filter uid - 67960284-5834-4BB2-849E-E5CF3254D3CF + 54F0C711-EDE6-4387-B397-34AB8A8FFCB2 version 1 @@ -159,14 +196,14 @@ removeextension text - - title {query} + title + Updated Default Units type alfred.workflow.output.notification uid - 14C63701-669A-43A3-BF6A-65A23759DA5F + 03379773-30CB-4371-BC49-8E2EA4C9947A version 1 @@ -176,9 +213,9 @@ concurrently escaping - 0 + 102 script - /usr/bin/python info.py $1 + /usr/bin/python defaults.py $action $dimensionality $unit scriptargtype 1 scriptfile @@ -189,10 +226,50 @@ type alfred.workflow.action.script uid - 96CC03AC-25D6-4FDB-AA8B-FCF145F4D597 + F738EA53-3486-4210-B03B-CFB792FD1798 version 2 + + config + + inputstring + {var:action} + matchcasesensitive + + matchmode + 1 + matchstring + + + type + alfred.workflow.utility.filter + uid + CFE51A32-D227-42BA-966C-DBDED818F1D4 + version + 1 + + + config + + lastpathcomponent + + onlyshowifquerypopulated + + removeextension + + text + + title + {query} + + type + alfred.workflow.output.notification + uid + 14C63701-669A-43A3-BF6A-65A23759DA5F + version + 1 + config @@ -238,6 +315,29 @@ version 2 + + config + + concurrently + + escaping + 0 + script + /usr/bin/python info.py $1 + scriptargtype + 1 + scriptfile + + type + 0 + + type + alfred.workflow.action.script + uid + 96CC03AC-25D6-4FDB-AA8B-FCF145F4D597 + version + 2 + readme Offline Conversions @@ -264,12 +364,19 @@ THOUSANDS_SEPARATOR is the character used to separate thousands. UPDATE_INTERVAL is the number of minutes between exchange rate updates. uidata + 03379773-30CB-4371-BC49-8E2EA4C9947A + + xpos + 610 + ypos + 160 + 14C63701-669A-43A3-BF6A-65A23759DA5F xpos 440 ypos - 270 + 300 1E12C11D-30DB-44A8-AD75-F5BE7F2DA451 @@ -278,33 +385,51 @@ UPDATE_INTERVAL is the number of minutes between exchange rate updates. ypos 30 - 607FA0B2-94A5-48E4-96E9-0BFA8872F7EE + 54F0C711-EDE6-4387-B397-34AB8A8FFCB2 + note + Default action xpos - 440 + 250 ypos - 30 + 60 - 67960284-5834-4BB2-849E-E5CF3254D3CF + 607FA0B2-94A5-48E4-96E9-0BFA8872F7EE xpos 440 ypos - 150 + 30 96CC03AC-25D6-4FDB-AA8B-FCF145F4D597 xpos 240 ypos - 270 + 300 + + CFE51A32-D227-42BA-966C-DBDED818F1D4 + + note + Save/delete unit + xpos + 250 + ypos + 190 EF92F243-C49B-4DFC-B0A4-72317B2457A7 xpos 40 ypos - 270 + 300 + + F738EA53-3486-4210-B03B-CFB792FD1798 + + xpos + 440 + ypos + 160 variables @@ -316,7 +441,7 @@ UPDATE_INTERVAL is the number of minutes between exchange rate updates. DECIMAL_SEPARATOR . THOUSANDS_SEPARATOR - + , UPDATE_INTERVAL 360 diff --git a/src/info.py b/src/info.py index a834a26..9c7e35d 100755 --- a/src/info.py +++ b/src/info.py @@ -16,22 +16,22 @@ info.py [] info.py (-h|--help) info.py --openhelp + info.py --openactive info.py --openunits info.py --currencies [] Options: -h, --help Show this message --openhelp Open help file in default browser + --openactive Open active currency file in default editor --openunits Open custom units file in default editor --currencies View/search supported currencies """ -from __future__ import print_function, absolute_import +from __future__ import absolute_import from datetime import timedelta -import os -import shutil import subprocess import sys @@ -39,7 +39,6 @@ from workflow import ( ICON_INFO, - ICON_SETTINGS, ICON_WARNING, MATCH_ALL, MATCH_ALLCHARS, @@ -47,6 +46,8 @@ ) from config import ( + bootstrap, + ACTIVE_CURRENCIES_FILENAME, CURRENCIES, CRYPTO_CURRENCIES, CURRENCY_CACHE_NAME, @@ -100,6 +101,12 @@ def human_timedelta(td): def handle_delimited_query(query): + """Process sub-commands. + + Args: + query (str): User query + + """ # Currencies or decimal places if query.endswith(DELIMITER): # User deleted trailing space subprocess.call(['osascript', '-e', ALFRED_AS]) @@ -136,6 +143,8 @@ def handle_delimited_query(query): for name, symbol in currencies: wf.add_item(u'{} // {}'.format(name, symbol), u'Use `{}` in conversions'.format(symbol), + copytext=symbol, + valid=False, icon=ICON_CURRENCY) wf.send_feedback() @@ -154,6 +163,8 @@ def main(wf): query = args.get('') + bootstrap(wf) + # Alternative actions ---------------------------------------------- if args.get('--openhelp'): @@ -162,12 +173,11 @@ def main(wf): if args.get('--openunits'): path = wf.datafile(CUSTOM_DEFINITIONS_FILENAME) - if not os.path.exists(path): - shutil.copy( - wf.workflowfile('{}.sample'.format( - CUSTOM_DEFINITIONS_FILENAME)), - path) + subprocess.call(['open', path]) + return 0 + if args.get('--openactive'): + path = wf.datafile(ACTIVE_CURRENCIES_FILENAME) subprocess.call(['open', path]) return 0 @@ -187,11 +197,17 @@ def main(wf): arg='--openhelp', icon=ICON_HELP), - dict(title='View Supported Currencies', + dict(title='View All Supported Currencies', subtitle='View and search list of supported currencies', autocomplete=u'currencies {} '.format(DELIMITER), icon=ICON_CURRENCY), + dict(title='Edit Active Currencies', + subtitle='Edit the list of active currencies', + valid=True, + arg='--openactive', + icon='icon.png'), + dict(title='Edit Custom Units', subtitle='Add and edit your own custom units', valid=True,