Monkey patch anki at runtime

The server should work fine with /usr/share/anki now, as long as
external Anki version >= 2.1.
This commit is contained in:
flan 2017-11-06 22:50:44 +01:00
parent 2a27d78591
commit c0ea23c307
3 changed files with 33 additions and 55 deletions

View File

@ -21,17 +21,13 @@ Installing
$ pip install webob $ pip install webob
2. Patch the bundled libanki: 2. Modify ankisyncd.conf according to your needs
$ (cd anki-bundled && git apply ../libanki.patch) 3. Create user:
3. Modify ankisyncd.conf according to your needs
4. Create user:
$ ./ankisyncctl.py adduser <username> $ ./ankisyncctl.py adduser <username>
5. Run ankisyncd: 4. Run ankisyncd:
$ python ./ankisyncd/sync_app.py ankisyncd.conf $ python ./ankisyncd/sync_app.py ankisyncd.conf

View File

@ -1,2 +1,32 @@
import functools
import sys import sys
def __mediapatch():
"""
Monkey-patch Anki's MediaManager to ignore the "server" attribute.
It's needed because MediaManager's __init__(), connect() and close() are
close to no-ops when self.col.server is True. If self.col.server is False,
Syncer.usnLim() doesn't match entities that are supposed to be sent to the
client, thus breaking serverclient deck sync.
"""
def noserver(f):
@functools.wraps(f)
def wrapped(self, *args, **kwargs):
orig = self.col.server
self.col.server = False
ret = f(self, *args, **kwargs)
self.col.server = orig
return ret
return wrapped
from anki.media import MediaManager
orig_init = MediaManager.__init__
MediaManager.__init__ = functools.wraps(MediaManager.__init__)(lambda self, col, _: orig_init(self, col, False))
MediaManager.connect = noserver(MediaManager.connect)
MediaManager.close = noserver(MediaManager.close)
sys.path.insert(0, "/usr/share/anki") sys.path.insert(0, "/usr/share/anki")
__mediapatch()

View File

@ -1,48 +0,0 @@
diff --git a/anki/collection.py b/anki/collection.py
index 6cec228..189c706 100644
--- a/anki/collection.py
+++ b/anki/collection.py
@@ -60,7 +60,7 @@ class _Collection:
self.server = server
self._lastSave = time.time()
self.clearUndo()
- self.media = MediaManager(self, server)
+ self.media = MediaManager(self)
self.models = ModelManager(self)
self.decks = DeckManager(self)
self.tags = TagManager(self)
diff --git a/anki/media.py b/anki/media.py
index 4e3ccf3..3bfdc81 100644
--- a/anki/media.py
+++ b/anki/media.py
@@ -26,11 +26,8 @@ class MediaManager:
]
regexps = soundRegexps + imgRegexps
- def __init__(self, col, server):
+ def __init__(self, col):
self.col = col
- if server:
- self._dir = None
- return
# media directory
self._dir = re.sub("(?i)\.(anki2)$", ".media", self.col.path)
if not os.path.exists(self._dir):
@@ -48,8 +45,6 @@ class MediaManager:
self.connect()
def connect(self):
- if self.col.server:
- return
path = self.dir()+".db2"
create = not os.path.exists(path)
os.chdir(self._dir)
@@ -100,8 +95,6 @@ create table meta (dirMod int, lastUsn int); insert into meta values (0, 0);
os.rename("../collection.media.db", npath)
def close(self):
- if self.col.server:
- return
self.db.close()
self.db = None
# change cwd back to old location