diff --git a/pylib/anki/__init__.py b/pylib/anki/__init__.py index 9eb069794..0142b8098 100644 --- a/pylib/anki/__init__.py +++ b/pylib/anki/__init__.py @@ -4,7 +4,7 @@ import sys from anki.buildinfo import version -from anki.storage import Collection +from anki.collection import Collection if sys.version_info[0] < 3 or sys.version_info[1] < 7: raise Exception("Anki requires Python 3.7+") diff --git a/pylib/anki/cards.py b/pylib/anki/cards.py index 29248df2f..f07852450 100644 --- a/pylib/anki/cards.py +++ b/pylib/anki/cards.py @@ -33,7 +33,9 @@ class Card: lastIvl: int ord: int - def __init__(self, col: anki.storage._Collection, id: Optional[int] = None) -> None: + def __init__( + self, col: anki.collection.Collection, id: Optional[int] = None + ) -> None: self.col = col.weakref() self.timerStarted = None self._render_output: Optional[anki.template.TemplateRenderOutput] = None diff --git a/pylib/anki/collection.py b/pylib/anki/collection.py index 6a3e94bf9..944df96f0 100644 --- a/pylib/anki/collection.py +++ b/pylib/anki/collection.py @@ -33,21 +33,19 @@ from anki.tags import TagManager from anki.utils import devMode, ids2str, intTime -# this is initialized by storage.Collection -class _Collection: - db: Optional[DBProxy] +class Collection: sched: Union[V1Scheduler, V2Scheduler] _undo: List[Any] def __init__( self, path: str, - backend: Optional[RustBackend], + backend: Optional[RustBackend] = None, server: bool = False, log: bool = False, ) -> None: self.backend = backend or RustBackend(server=server) - self.db = None + self.db: Optional[DBProxy] = None self._should_log = log self.server = server self.path = os.path.abspath(path) @@ -70,7 +68,7 @@ class _Collection: def tr(self, key: TR, **kwargs: Union[str, int, float]) -> str: return self.backend.translate(key, **kwargs) - def weakref(self) -> anki.storage._Collection: + def weakref(self) -> Collection: "Shortcut to create a weak reference that doesn't break code completion." return weakref.proxy(self) @@ -654,3 +652,7 @@ select id from notes where mid = ?) limit 1""" self.usn(), intTime(), ) + + +# legacy name +_Collection = Collection diff --git a/pylib/anki/config.py b/pylib/anki/config.py index 600d8e7e7..74afb0d80 100644 --- a/pylib/anki/config.py +++ b/pylib/anki/config.py @@ -26,7 +26,7 @@ import anki class ConfigManager: - def __init__(self, col: anki.storage._Collection): + def __init__(self, col: anki.collection.Collection): self.col = col.weakref() def get_immutable(self, key: str) -> Any: diff --git a/pylib/anki/decks.py b/pylib/anki/decks.py index c0e5bf37e..e4112cc6e 100644 --- a/pylib/anki/decks.py +++ b/pylib/anki/decks.py @@ -21,7 +21,7 @@ defaultDynamicDeck = 1 class DecksDictProxy: - def __init__(self, col: anki.storage._Collection): + def __init__(self, col: anki.collection.Collection): self._col = col.weakref() def _warn(self): @@ -60,7 +60,7 @@ class DeckManager: # Registry save/load ############################################################# - def __init__(self, col: anki.storage._Collection) -> None: + def __init__(self, col: anki.collection.Collection) -> None: self.col = col.weakref() self.decks = DecksDictProxy(col) diff --git a/pylib/anki/exporting.py b/pylib/anki/exporting.py index f6e0c6a1f..2ed2efad0 100644 --- a/pylib/anki/exporting.py +++ b/pylib/anki/exporting.py @@ -12,9 +12,8 @@ from typing import Any, Dict, List, Optional, Tuple, Union from zipfile import ZipFile from anki import hooks -from anki.collection import _Collection +from anki.collection import Collection from anki.lang import _ -from anki.storage import Collection from anki.utils import ids2str, namedtmp, splitFields, stripHTML @@ -23,7 +22,7 @@ class Exporter: def __init__( self, - col: _Collection, + col: Collection, did: Optional[int] = None, cids: Optional[List[int]] = None, ) -> None: @@ -122,7 +121,7 @@ class TextNoteExporter(Exporter): includeTags = True includeHTML = True - def __init__(self, col: _Collection) -> None: + def __init__(self, col: Collection) -> None: Exporter.__init__(self, col) self.includeID = False @@ -164,7 +163,7 @@ class AnkiExporter(Exporter): includeSched: Union[bool, None] = False includeMedia = True - def __init__(self, col: _Collection) -> None: + def __init__(self, col: Collection) -> None: Exporter.__init__(self, col) def deckIds(self) -> List[int]: @@ -311,7 +310,7 @@ class AnkiPackageExporter(AnkiExporter): key = _("Anki Deck Package") ext = ".apkg" - def __init__(self, col: _Collection) -> None: + def __init__(self, col: Collection) -> None: AnkiExporter.__init__(self, col) def exportInto(self, path: str) -> None: diff --git a/pylib/anki/find.py b/pylib/anki/find.py index 40ee63ed6..23dff8d5d 100644 --- a/pylib/anki/find.py +++ b/pylib/anki/find.py @@ -9,11 +9,11 @@ from anki.hooks import * from anki.utils import ids2str, splitFields, stripHTMLMedia if TYPE_CHECKING: - from anki.collection import _Collection + from anki.collection import Collection class Finder: - def __init__(self, col: Optional[_Collection]) -> None: + def __init__(self, col: Optional[Collection]) -> None: self.col = col.weakref() print("Finder() is deprecated, please use col.find_cards() or .find_notes()") @@ -29,7 +29,7 @@ class Finder: def findReplace( - col: _Collection, + col: Collection, nids: List[int], src: str, dst: str, @@ -41,7 +41,7 @@ def findReplace( return col.backend.find_and_replace(nids, src, dst, regex, fold, field) -def fieldNamesForNotes(col: _Collection, nids: List[int]) -> List[str]: +def fieldNamesForNotes(col: Collection, nids: List[int]) -> List[str]: return list(col.backend.field_names_for_note_ids(nids)) @@ -61,7 +61,7 @@ def fieldNames(col, downcase=True) -> List: # returns array of ("dupestr", [nids]) def findDupes( - col: _Collection, fieldName: str, search: str = "" + col: Collection, fieldName: str, search: str = "" ) -> List[Tuple[Any, List]]: # limit search to notes with applicable field name if search: diff --git a/pylib/anki/hooks.py b/pylib/anki/hooks.py index 00bcf1ee4..70a2c34ed 100644 --- a/pylib/anki/hooks.py +++ b/pylib/anki/hooks.py @@ -358,21 +358,21 @@ note_will_flush = _NoteWillFlushHook() class _NotesWillBeDeletedHook: - _hooks: List[Callable[["anki.storage._Collection", List[int]], None]] = [] + _hooks: List[Callable[["anki.collection.Collection", List[int]], None]] = [] def append( - self, cb: Callable[["anki.storage._Collection", List[int]], None] + self, cb: Callable[["anki.collection.Collection", List[int]], None] ) -> None: """(col: anki.storage._Collection, ids: List[int])""" self._hooks.append(cb) def remove( - self, cb: Callable[["anki.storage._Collection", List[int]], None] + self, cb: Callable[["anki.collection.Collection", List[int]], None] ) -> None: if cb in self._hooks: self._hooks.remove(cb) - def __call__(self, col: anki.storage._Collection, ids: List[int]) -> None: + def __call__(self, col: anki.collection.Collection, ids: List[int]) -> None: for hook in self._hooks: try: hook(col, ids) diff --git a/pylib/anki/importing/anki2.py b/pylib/anki/importing/anki2.py index d01e351ea..66561e3ee 100644 --- a/pylib/anki/importing/anki2.py +++ b/pylib/anki/importing/anki2.py @@ -5,12 +5,11 @@ import os import unicodedata from typing import Any, Dict, List, Optional, Tuple -from anki.collection import _Collection +from anki.collection import Collection from anki.consts import * from anki.decks import DeckManager from anki.importing.base import Importer from anki.lang import _ -from anki.storage import Collection from anki.utils import intTime, joinFields, splitFields GUID = 1 @@ -23,10 +22,10 @@ class Anki2Importer(Importer): needMapper = False deckPrefix: Optional[str] = None allowUpdate = True - src: _Collection - dst: _Collection + src: Collection + dst: Collection - def __init__(self, col: _Collection, file: str) -> None: + def __init__(self, col: Collection, file: str) -> None: super().__init__(col, file) # set later, defined here for typechecking diff --git a/pylib/anki/importing/base.py b/pylib/anki/importing/base.py index 1eee9e7c8..959059251 100644 --- a/pylib/anki/importing/base.py +++ b/pylib/anki/importing/base.py @@ -3,7 +3,7 @@ from typing import Any, List, Optional -from anki.collection import _Collection +from anki.collection import Collection from anki.utils import maxID # Base importer @@ -14,9 +14,9 @@ class Importer: needMapper = False needDelimiter = False - dst: Optional[_Collection] + dst: Optional[Collection] - def __init__(self, col: _Collection, file: str) -> None: + def __init__(self, col: Collection, file: str) -> None: self.file = file self.log: List[str] = [] self.col = col.weakref() diff --git a/pylib/anki/importing/csvfile.py b/pylib/anki/importing/csvfile.py index 17b957bdd..e6adefbad 100644 --- a/pylib/anki/importing/csvfile.py +++ b/pylib/anki/importing/csvfile.py @@ -5,7 +5,7 @@ import csv import re from typing import Any, List, Optional, TextIO, Union -from anki.collection import _Collection +from anki.collection import Collection from anki.importing.noteimp import ForeignNote, NoteImporter from anki.lang import _ @@ -15,7 +15,7 @@ class TextImporter(NoteImporter): needDelimiter = True patterns = "\t|,;:" - def __init__(self, col: _Collection, file: str) -> None: + def __init__(self, col: Collection, file: str) -> None: NoteImporter.__init__(self, col, file) self.lines = None self.fileobj: Optional[TextIO] = None diff --git a/pylib/anki/importing/noteimp.py b/pylib/anki/importing/noteimp.py index 753b2f94c..e59670b3d 100644 --- a/pylib/anki/importing/noteimp.py +++ b/pylib/anki/importing/noteimp.py @@ -4,7 +4,7 @@ import html from typing import Dict, List, Optional, Tuple, Union -from anki.collection import _Collection +from anki.collection import Collection from anki.consts import NEW_CARDS_RANDOM, STARTING_FACTOR from anki.importing.base import Importer from anki.lang import _, ngettext @@ -68,7 +68,7 @@ class NoteImporter(Importer): mapping: Optional[List[str]] tagModified: Optional[str] - def __init__(self, col: _Collection, file: str) -> None: + def __init__(self, col: Collection, file: str) -> None: Importer.__init__(self, col, file) self.model = col.models.current() self.mapping = None diff --git a/pylib/anki/importing/supermemo_xml.py b/pylib/anki/importing/supermemo_xml.py index 248a1fa10..99398c897 100644 --- a/pylib/anki/importing/supermemo_xml.py +++ b/pylib/anki/importing/supermemo_xml.py @@ -12,7 +12,7 @@ from typing import List, Optional, Union from xml.dom import minidom from xml.dom.minidom import Element, Text -from anki.collection import _Collection +from anki.collection import Collection from anki.importing.noteimp import ForeignCard, ForeignNote, NoteImporter from anki.lang import _, ngettext from anki.stdmodels import addBasicModel @@ -83,7 +83,7 @@ class SupermemoXmlImporter(NoteImporter): Code should be upgrade to support importing of SM2006 exports. """ - def __init__(self, col: _Collection, file: str) -> None: + def __init__(self, col: Collection, file: str) -> None: """Initialize internal varables. Pameters to be exposed to GUI are stored in self.META""" NoteImporter.__init__(self, col, file) diff --git a/pylib/anki/latex.py b/pylib/anki/latex.py index 6202980c0..23013073d 100644 --- a/pylib/anki/latex.py +++ b/pylib/anki/latex.py @@ -42,7 +42,7 @@ def on_card_did_render( output.answer_text = render_latex(output.answer_text, ctx.note_type(), ctx.col()) -def render_latex(html: str, model: NoteType, col: anki.storage._Collection) -> str: +def render_latex(html: str, model: NoteType, col: anki.collection.Collection) -> str: "Convert embedded latex tags in text to image links." html, err = render_latex_returning_errors(html, model, col) if err: @@ -53,7 +53,7 @@ def render_latex(html: str, model: NoteType, col: anki.storage._Collection) -> s def render_latex_returning_errors( html: str, model: NoteType, - col: anki.storage._Collection, + col: anki.collection.Collection, expand_clozes: bool = False, ) -> Tuple[str, List[str]]: """Returns (text, errors). @@ -80,7 +80,7 @@ def render_latex_returning_errors( def _save_latex_image( - col: anki.storage._Collection, + col: anki.collection.Collection, extracted: ExtractedLatex, header: str, footer: str, diff --git a/pylib/anki/media.py b/pylib/anki/media.py index 410298b7f..ff5f7ecd7 100644 --- a/pylib/anki/media.py +++ b/pylib/anki/media.py @@ -41,7 +41,7 @@ class MediaManager: ] regexps = soundRegexps + imgRegexps - def __init__(self, col: anki.storage._Collection, server: bool) -> None: + def __init__(self, col: anki.collection.Collection, server: bool) -> None: self.col = col.weakref() if server: self._dir = None diff --git a/pylib/anki/models.py b/pylib/anki/models.py index fe5f86b23..a23852552 100644 --- a/pylib/anki/models.py +++ b/pylib/anki/models.py @@ -22,7 +22,7 @@ Template = Dict[str, Union[str, int, None]] class ModelsDictProxy: - def __init__(self, col: anki.storage._Collection): + def __init__(self, col: anki.collection.Collection): self._col = col.weakref() def _warn(self): @@ -61,7 +61,7 @@ class ModelManager: # Saving/loading registry ############################################################# - def __init__(self, col: anki.storage._Collection) -> None: + def __init__(self, col: anki.collection.Collection) -> None: self.col = col.weakref() self.models = ModelsDictProxy(col) # do not access this directly! diff --git a/pylib/anki/notes.py b/pylib/anki/notes.py index 5c774b998..f720f9371 100644 --- a/pylib/anki/notes.py +++ b/pylib/anki/notes.py @@ -19,7 +19,7 @@ class Note: def __init__( self, - col: anki.storage._Collection, + col: anki.collection.Collection, model: Optional[NoteType] = None, id: Optional[int] = None, ) -> None: diff --git a/pylib/anki/sched.py b/pylib/anki/sched.py index abe544664..ff3f0c5d0 100644 --- a/pylib/anki/sched.py +++ b/pylib/anki/sched.py @@ -27,7 +27,7 @@ class Scheduler(V2): _burySiblingsOnAnswer = True def __init__( # pylint: disable=super-init-not-called - self, col: anki.storage._Collection + self, col: anki.collection.Collection ) -> None: self.col = col.weakref() self.queueLimit = 50 diff --git a/pylib/anki/schedv2.py b/pylib/anki/schedv2.py index 12bc58277..28eef6a77 100644 --- a/pylib/anki/schedv2.py +++ b/pylib/anki/schedv2.py @@ -6,8 +6,6 @@ from __future__ import annotations import random import time from heapq import * - -# from anki.collection import _Collection from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Union import anki # pylint: disable=unused-import @@ -33,7 +31,7 @@ class Scheduler: _burySiblingsOnAnswer = True revCount: int - def __init__(self, col: anki.storage._Collection) -> None: + def __init__(self, col: anki.collection.Collection) -> None: self.col = col.weakref() self.queueLimit = 50 self.reportLimit = 1000 diff --git a/pylib/anki/stats.py b/pylib/anki/stats.py index 59ed68ea8..62474c4b7 100644 --- a/pylib/anki/stats.py +++ b/pylib/anki/stats.py @@ -24,7 +24,7 @@ PERIOD_LIFE = 2 class CardStats: - def __init__(self, col: anki.storage._Collection, card: anki.cards.Card) -> None: + def __init__(self, col: anki.collection.Collection, card: anki.cards.Card) -> None: if col: self.col = col.weakref() self.card = card @@ -108,7 +108,7 @@ colSusp = "#ff0" class CollectionStats: - def __init__(self, col: anki.storage._Collection) -> None: + def __init__(self, col: anki.collection.Collection) -> None: self.col = col.weakref() self._stats = None self.type = PERIOD_MONTH diff --git a/pylib/anki/stdmodels.py b/pylib/anki/stdmodels.py index 400a30283..8303bf2f1 100644 --- a/pylib/anki/stdmodels.py +++ b/pylib/anki/stdmodels.py @@ -3,7 +3,7 @@ from typing import Callable, List, Tuple -from anki.collection import _Collection +from anki.collection import Collection from anki.models import NoteType from anki.rsbackend import StockNoteType @@ -12,38 +12,38 @@ from anki.rsbackend import StockNoteType models: List[Tuple] = [] -def add_stock_notetype(col: _Collection, kind: StockNoteType) -> NoteType: +def add_stock_notetype(col: Collection, kind: StockNoteType) -> NoteType: m = col.backend.get_stock_notetype_legacy(kind) col.models.add(m) return m -def addBasicModel(col: _Collection) -> NoteType: +def addBasicModel(col: Collection) -> NoteType: return add_stock_notetype(col, StockNoteType.STOCK_NOTE_TYPE_BASIC) -def addBasicTypingModel(col: _Collection) -> NoteType: +def addBasicTypingModel(col: Collection) -> NoteType: return add_stock_notetype(col, StockNoteType.STOCK_NOTE_TYPE_BASIC_TYPING) -def addForwardReverse(col: _Collection) -> NoteType: +def addForwardReverse(col: Collection) -> NoteType: return add_stock_notetype(col, StockNoteType.STOCK_NOTE_TYPE_BASIC_AND_REVERSED) -def addForwardOptionalReverse(col: _Collection) -> NoteType: +def addForwardOptionalReverse(col: Collection) -> NoteType: return add_stock_notetype( col, StockNoteType.STOCK_NOTE_TYPE_BASIC_OPTIONAL_REVERSED ) -def addClozeModel(col: _Collection) -> NoteType: +def addClozeModel(col: Collection) -> NoteType: return add_stock_notetype(col, StockNoteType.STOCK_NOTE_TYPE_CLOZE) def get_stock_notetypes( - col: _Collection, -) -> List[Tuple[str, Callable[[_Collection], NoteType]]]: - out: List[Tuple[str, Callable[[_Collection], NoteType]]] = [] + col: Collection, +) -> List[Tuple[str, Callable[[Collection], NoteType]]]: + out: List[Tuple[str, Callable[[Collection], NoteType]]] = [] # add standard for (kind, func) in [ (StockNoteType.STOCK_NOTE_TYPE_BASIC, addBasicModel), diff --git a/pylib/anki/storage.py b/pylib/anki/storage.py index 2fa407f67..bf71689cd 100644 --- a/pylib/anki/storage.py +++ b/pylib/anki/storage.py @@ -1,17 +1,8 @@ # Copyright: Ankitects Pty Ltd and contributors # License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html -from typing import Optional +# Legacy code expects to find Collection in this module. -from anki.collection import _Collection -from anki.rsbackend import RustBackend +from anki.collection import Collection - -def Collection( - path: str, - backend: Optional[RustBackend] = None, - server: bool = False, - log: bool = False, -) -> _Collection: - "Open a new or existing collection. Path must be unicode." - return _Collection(path, backend, server, log) +_Collection = Collection diff --git a/pylib/anki/sync.py b/pylib/anki/sync.py index 3a597cdde..8182d8468 100644 --- a/pylib/anki/sync.py +++ b/pylib/anki/sync.py @@ -33,7 +33,7 @@ class UnexpectedSchemaChange(Exception): class Syncer: chunkRows: Optional[List[Sequence]] - def __init__(self, col: anki.storage._Collection, server=None) -> None: + def __init__(self, col: anki.collection.Collection, server=None) -> None: self.col = col.weakref() self.server = server diff --git a/pylib/anki/tags.py b/pylib/anki/tags.py index db3e3daba..7e27b4f81 100644 --- a/pylib/anki/tags.py +++ b/pylib/anki/tags.py @@ -19,7 +19,7 @@ from anki.utils import ids2str class TagManager: - def __init__(self, col: anki.storage._Collection) -> None: + def __init__(self, col: anki.collection.Collection) -> None: self.col = col.weakref() # all tags diff --git a/pylib/anki/template.py b/pylib/anki/template.py index 5568dfd9f..689cd97be 100644 --- a/pylib/anki/template.py +++ b/pylib/anki/template.py @@ -74,7 +74,7 @@ class TemplateRenderContext: def __init__( self, - col: anki.storage._Collection, + col: anki.collection.Collection, card: Card, note: Note, browser: bool = False, @@ -97,7 +97,7 @@ class TemplateRenderContext: # hooks, you can insert it into this dictionary self.extra_state: Dict[str, Any] = {} - def col(self) -> anki.storage._Collection: + def col(self) -> anki.collection.Collection: return self._col # legacy diff --git a/qt/aqt/browser.py b/qt/aqt/browser.py index cd50a6ca8..9d7422f9f 100644 --- a/qt/aqt/browser.py +++ b/qt/aqt/browser.py @@ -16,7 +16,7 @@ import aqt import aqt.forms from anki import hooks from anki.cards import Card -from anki.collection import _Collection +from anki.collection import Collection from anki.consts import * from anki.lang import _, ngettext from anki.models import NoteType @@ -569,7 +569,7 @@ class SidebarModel(QAbstractItemModel): class Browser(QMainWindow): model: DataModel mw: AnkiQt - col: _Collection + col: Collection editor: Optional[Editor] def __init__(self, mw: AnkiQt) -> None: diff --git a/qt/aqt/gui_hooks.py b/qt/aqt/gui_hooks.py index ebdb36dce..ff7e83aa1 100644 --- a/qt/aqt/gui_hooks.py +++ b/qt/aqt/gui_hooks.py @@ -702,17 +702,17 @@ card_will_show = _CardWillShowFilter() class _CollectionDidLoadHook: - _hooks: List[Callable[["anki.storage._Collection"], None]] = [] + _hooks: List[Callable[["anki.collection.Collection"], None]] = [] - def append(self, cb: Callable[["anki.storage._Collection"], None]) -> None: + def append(self, cb: Callable[["anki.collection.Collection"], None]) -> None: """(col: anki.storage._Collection)""" self._hooks.append(cb) - def remove(self, cb: Callable[["anki.storage._Collection"], None]) -> None: + def remove(self, cb: Callable[["anki.collection.Collection"], None]) -> None: if cb in self._hooks: self._hooks.remove(cb) - def __call__(self, col: anki.storage._Collection) -> None: + def __call__(self, col: anki.collection.Collection) -> None: for hook in self._hooks: try: hook(col) diff --git a/qt/aqt/main.py b/qt/aqt/main.py index 6386de29d..80595d6a9 100644 --- a/qt/aqt/main.py +++ b/qt/aqt/main.py @@ -27,12 +27,11 @@ import aqt.stats import aqt.toolbar import aqt.webview from anki import hooks -from anki.collection import _Collection +from anki.collection import Collection from anki.hooks import runHook from anki.lang import _, ngettext from anki.rsbackend import RustBackend from anki.sound import AVTag, SoundOrVideoTag -from anki.storage import Collection from anki.utils import devMode, ids2str, intTime, isMac, isWin, splitFields from aqt import gui_hooks from aqt.addons import DownloadLogEntry, check_and_prompt_for_updates, show_log_to_user @@ -71,7 +70,7 @@ class ResetRequired: class AnkiQt(QMainWindow): - col: _Collection + col: Collection pm: ProfileManagerType web: aqt.webview.AnkiWebView bottomWeb: aqt.webview.AnkiWebView @@ -88,7 +87,7 @@ class AnkiQt(QMainWindow): self.backend = backend self.state = "startup" self.opts = opts - self.col: Optional[_Collection] = None + self.col: Optional[Collection] = None self.taskman = TaskManager(self) self.media_syncer = MediaSyncer(self) aqt.mw = self @@ -1265,7 +1264,7 @@ and if the problem comes up again, please ask on the support site.""" # Log note deletion ########################################################################## - def onRemNotes(self, col: _Collection, nids: List[int]) -> None: + def onRemNotes(self, col: Collection, nids: List[int]) -> None: path = os.path.join(self.pm.profileFolder(), "deleted.txt") existed = os.path.exists(path) with open(path, "ab") as f: diff --git a/qt/aqt/mediasrv.py b/qt/aqt/mediasrv.py index 4ec231191..6705ce4d9 100644 --- a/qt/aqt/mediasrv.py +++ b/qt/aqt/mediasrv.py @@ -9,7 +9,7 @@ import threading from http import HTTPStatus from typing import Optional -from anki.collection import _Collection +from anki.collection import Collection from anki.utils import devMode from aqt.qt import * from aqt.utils import aqt_data_folder @@ -74,7 +74,7 @@ class MediaServer(threading.Thread): class RequestHandler(http.server.SimpleHTTPRequestHandler): timeout = 1 - mw: Optional[_Collection] = None + mw: Optional[Collection] = None def do_GET(self): f = self.send_head()