Coding 的痕迹

一位互联网奔跑者的网上日记

0%

(2019.2) Anki2.1 自建服务器临时解决方案及一些想法

导语

因为 Ankiweb 的服务器实在太慢,另外有网友指出,Anki 可能是一个个人项目,指不定哪天就不见了。稳妥起见,打算趁着寒假的空闲自建一个 Anki 服务器(这样就能好好背单词了)。然而事实证明建这个 Server 的时间能做不少东西……在此记录遇到的坑,想到的一些解决方案,作为纪念,也供将来折腾的人参考。

由于网上自建服务器的教程很多,重复之处不再赘述。我的目的是补充现有教程很多过时(out of date)的地方。考虑到一部分自建 Anki 的同学在技术操作上存在困难,先说结论:

imgClick and drag to move

  1. 目前 Anki (Windows)最新版本为 2.1.8, Ankidroid 最新版本为 2.8.4。
  2. 我的同步方案最高支持 Anki 2.1.7,尽管 Sync-Server 称支持 Anki 2.1,但是其声明了最高测试过支持 2.1.7,并且 2.1.7 和 2.1.8 在同步部分的代码有些不一样。建议在官方出解决方案之前不要使用 2.1.8 版本。
  3. Github 有如下两个 anki-sync-server 的项目:

https://github.com/dsnopek/anki-sync-server

https://github.com/tsudoko/anki-sync-server

前者更新于若干年前。后者近期仍然有更新,就是最高支持 2.1.7 的版本(不知道 Ankiweb 用的是啥?)。刚开始一直用旧版同步服务,PC 的 anki 2.1 一直连不上……

Em……简要地说明下步骤。

操作步骤

我的环境是 Debian 9.5,git clone 下 https://github.com/tsudoko/anki-sync-server 的代码,按照 README.md 中的 Installing 步骤安装。解决完依赖之后,根据需要修改 ankisycd.conf。我的是这样的:

imgClick and drag to move

需要修改 host 以及 data_root、auth_db_path、session_db_path 的目录,注意创建好所需的目录。

完成后 cd ankisyncd 进入主程序的目录,执行:

1
nohup python3 __main__.py &

Click and drag to move

PC 上的 Anki,以插件的形式在程序 load 时修改同步的 URL.

imgClick and drag to move

在 addons21 目录创建一个空文件夹,名称任意,然后把前述 anki-sync-server 下的 addon 目录内的内容拷进来,修改两个文件中的 URL为自己的同步的地址。Anki 2.1.8 使用这个脚本会报错,不知道为什么。

但是还存在一个问题,就是 Anki2.1.7 每次打开时仍然向Ankiweb 请求同步,然后返回密码错误。目前还没找到默认登录的URL存在哪。点击右上角的“同步”再重新输入用户名、密码就好了。因为平时使用手机端,电脑端只用来批量添加卡片,所以不算特别麻烦。


写在后面

这次折腾,我感觉 Github 真是个好平台,每个人可以提 issue,交流软件相关内容,但是项目缺乏主心骨,有些资料很乱(比如用的 fork 之后的 anki-sync-server 不能像老版本一样 ./ankisyncctl.py start ……咦,程序入口呢?),也不知道 ankiweb 所使用的版本(因为他们的server对接 anki2.1.8 没异常)。

一开始是想尽快搞定,用了很多网上的方法(主要是简书和知乎上的文章),但是大多数文章基于 Anki 2.0.x,“打开插件目录”这一项在 2.1.x 版本中就没有。这也浪费了我很多时间。

1
2
3
import anki.sync
anki.sync.SYNC_BASE = 'http://127.0.0.1:27701/'
anki.sync.SYNC_MEDIA_BASE = 'http://127.0.0.1:27701/msync/'

Click and drag to move

这个插件的代码好像只最高支持 2.0.x 版本,之后草草翻了一下 2.1.8 版本的代码,是这么写的:

1
2
3
4
5
6
7
8
# deck schema & syncing vars
SCHEMA_VERSION = 11
SYNC_ZIP_SIZE = int(2.5*1024*1024)
SYNC_ZIP_COUNT = 25
SYNC_BASE = "https://sync%s.ankiweb.net/"
SYNC_VER = 9

HELP_SITE="http://ankisrs.net/docs/manual.html"

Click and drag to move

没有出现 SYNC_MEDIA_SYNC ,也曾经想试过自己 build 一个 Anki,这样能实时调试,说不定还可以提交 commit ! 但是个人对 PyQt 实在不了解。刚开始想到这个方法,感觉尽管 Qt 套件和 python 均支持跨平台,代码可以直接移植,但是有关资料几乎没有,就放弃了,直到写这篇博客的时候,发现 Anki 源代码根目录下有个 Python3 文件 runaki:

1
2
3
4
cd ..
set PYTHONPATH=../lib
python anki
pause

Click and drag to move

可能可以用来执行。因为没有安装 pyaudio,等有空的时候再研究研究更完美的解决方案。

一更

在 Anki 打开的过程中,关闭它的“正在同步”框,进入主界面后再点同步,就不用次次输密码了。

参考资料

  1. Linux 技巧:让进程在后台可靠运行的几种方法

  2. Github 搜索 “anki sync”

  3. dsnopek\anki-sync-server 上的 issue

欢迎关注我的其它发布渠道