# Copyright 2016-2021 Alex Yatskov # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os import anki import anki.sync import aqt import enum # # Utilities # class MediaType(enum.Enum): Audio = 1 Video = 2 Picture = 3 def download(url): client = anki.sync.AnkiRequestsClient() client.timeout = setting('webTimeout') / 1000 resp = client.get(url) if resp.status_code != 200: raise Exception('{} download failed with return code {}'.format(url, resp.status_code)) return client.streamContent(resp) def api(*versions): def decorator(func): method = lambda *args, **kwargs: func(*args, **kwargs) setattr(method, 'versions', versions) setattr(method, 'api', True) return method return decorator def cardQuestion(card): if getattr(card, 'question', None) is None: return card._getQA()['q'] return card.question() def cardAnswer(card): if getattr(card, 'answer', None) is None: return card._getQA()['a'] return card.answer() def setting(key): defaults = { 'apiKey': None, 'apiLogPath': None, 'apiPollInterval': 25, 'apiVersion': 6, 'webBacklog': 5, 'webBindAddress': os.getenv('ANKICONNECT_BIND_ADDRESS', '127.0.0.1'), 'webBindPort': 8765, 'webCorsOrigin': os.getenv('ANKICONNECT_CORS_ORIGIN', None), 'webCorsOriginList': ['http://localhost'], 'webTimeout': 10000, } try: return aqt.mw.addonManager.getConfig(__name__).get(key, defaults[key]) except: raise Exception('setting {} not found'.format(key))