Change:
With the current packaged version of Anki, downloading addons fails with an SSLCERTIFICATEVERIFYFAILED. Download any addon from the Ankiweb library. I used , but any addon causes the issue. Go to to enter the ID. Then this error shows up in a dialog box: Please run and paste the results. system: host os: multi-user?: sandbox: version: channels(root): nixpkgs:
The update to anki 2.1 () will close this issue, according to my testing. (Add-on downloads work perfectly.)
(oops, I'll keep it open until that PR is merged)
Given that some useful addons don't support Anki 2.1, I'd like this to be fixed for 2.0. OTOH I'm not sure how this can be done.
You can still manually install addons by dropping the files in . An example is described .

Discussion:
<del> { buildPythonPackage, isPy3k, pkgs }: buildPythonPackage rec { name = "beautifulsoup-3.2.1"; disabled = isPy3k; src = pkgs.fetchurl { url = "http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-3.2.1.tar.gz"; sha256 = "1nshbcpdn0jpcj51x0spzjp519pkmqz0n0748j7dgpz70zlqbfpm"; }; # error: invalid command 'test' doCheck = false; meta = { homepage = http://www.crummy.com/software/BeautifulSoup/; license = "bsd"; description = "Undemanding HTML/XML parser"; }; } </del>

, lib , python , fetchurl <del> , substituteAll </del> , lame , mplayer , libpulseaudio <del> , pyqt4 </del> <ins> , pyqt5 , decorator , beautifulsoup4 </ins> , sqlalchemy , pyaudio <del> , httplib2 </del> <ins> , requests , markdown </ins> , matplotlib , pytest , glibcLocales

, plotsSupport ? true }: <del> let # Development version of anki has bumped to beautifulsoup4 beautifulsoup = callPackage ./beautifulsoup.nix { }; qt4 = pyqt4.qt; in buildPythonApplication rec { version = "2.0.52"; </del> <ins> buildPythonApplication rec { version = "2.1.6-beta1"; </ins> name = "anki-${version}"; src = fetchurl { urls = [ <del> "https://apps.ankiweb.net/downloads/current/${name}-source.tgz" </del> <ins> "https://apps.ankiweb.net/downloads/beta/${name}-source.tgz" # "https://apps.ankiweb.net/downloads/current/${name}-source.tgz" </ins> # "http://ankisrs.net/download/mirror/${name}.tgz" # "http://ankisrs.net/download/mirror/archive/${name}.tgz" ]; <del> sha256 = "0yjyxgpk79rplz9z2r93kmlk09ari6xxfrz1cfm2yl9v8zfw1n6l"; </del> <ins> sha256 = "0yqn8qjx9dyf754jljhyyrk8mahii188nz0yifl1lr3py9sxzbsf"; </ins> }; <del> propagatedBuildInputs = [ pyqt4 sqlalchemy pyaudio beautifulsoup httplib2 send2trash ] </del> <ins> propagatedBuildInputs = [ pyqt5 sqlalchemy beautifulsoup4 send2trash pyaudio requests decorator markdown ] </ins> ++ lib.optional plotsSupport matplotlib; checkInputs = [ pytest glibcLocales nose ]; buildInputs = [ lame mplayer libpulseaudio  ]; <ins> makeWrapperArgs = [ ''--prefix PATH ':' "${lame}/bin:${mplayer}/bin"'' ]; </ins> patches = [ # Disable updated version check. ./no-version-check.patch <del> (substituteAll { src = ./fix-paths.patch; inherit lame mplayer qt4; qt4name = qt4.name; }) </del> ]; buildPhase = ''

''; postPatch = '' <del> substituteInPlace oldanki/lang.py --subst-var-by anki $out substituteInPlace anki/lang.py --subst-var-by anki $out </del> # Remove unused starter. We'll create our own, minimalistic, # starter. <del> rm anki/anki </del> <ins> # rm anki/anki </ins> # Remove QT translation files. We'll use the standard QT ones. rm "locale/"*.qm

cp -v anki.xml $out/share/mime/packages/ cp -v anki.{png,xpm} $out/share/pixmaps/ cp -rv locale $out/share/ <del> cp -rv anki aqt $pp/ </del> <ins> cp -rv anki aqt web $pp/ </ins> wrapPythonPrograms '';

<del> --- anki-2.0.46/anki/lang.py.orig	2017-08-06 15:30:10.781419237 +0200 +++ anki-2.0.46/anki/lang.py	2017-08-06 15:31:33.023043036 +0200 @@ -71,15 +71,7 @@ return localTranslation().ungettext(single, plural, n) def langDir(): -    dir = os.path.join(os.path.dirname( -        os.path.abspath(__file__)), "locale") -    if not os.path.isdir(dir): -        dir = os.path.join(os.path.dirname(sys.argv[0]), "locale") -    if not os.path.isdir(dir): -        dir = "/usr/share/anki/locale" -    if not os.path.isdir(dir): -        dir = "/usr/local/share/anki/bin/locale" -    return dir +    return "@anki@/share/locale" def setLang(lang, local=True): trans = gettext.translation( diff -Nurp anki-2.0.33.orig/anki/sound.py anki-2.0.33/anki/sound.py --- anki-2.0.33.orig/anki/sound.py	2015-12-27 11:23:02.334908723 +0100 +++ anki-2.0.33/anki/sound.py	2015-12-27 11:34:11.863147265 +0100 @@ -29,8 +29,9 @@ processingDst = u"rec.mp3" processingChain = [] recFiles = [] +lameCmd = "@lame@/bin/lame" processingChain = [ -    ["lame", "rec.wav", processingDst, "--noreplaygain", "--quiet"], +    [lameCmd, "rec.wav", processingDst, "--noreplaygain", "--quiet"], ] # don't show box on windows @@ -44,13 +45,6 @@ if isWin: else: si = None -if isMac: -    # make sure lame, which is installed in /usr/local/bin, is in the path -    os.environ['PATH'] += ":" + "/usr/local/bin" -    dir = os.path.dirname(os.path.abspath(__file__)) -    dir = os.path.abspath(dir + "/../../../..") -    os.environ['PATH'] += ":" + dir + "/audio" - def retryWait(proc): # osx throws interrupted system call errors frequently while 1: @@ -62,13 +56,7 @@ def retryWait(proc): # Mplayer settings ########################################################################## -if isWin: -    mplayerCmd = ["mplayer.exe", "-ao", "win32"] -    dir = os.path.dirname(os.path.abspath(sys.argv[0])) -    os.environ['PATH'] += ";" + dir -    os.environ['PATH'] += ";" + dir + "..wintop" # for testing -else: -    mplayerCmd = ["mplayer"] +mplayerCmd = ["@mplayer@/bin/mplayer"] mplayerCmd += ["-really-quiet", "-noautosub"] # Mplayer in slave mode @@ -220,7 +208,7 @@ class _Recorder(object): self.encode = encode for c in processingChain: #print c -            if not self.encode and c[0] == 'lame': +            if not self.encode and c[0] == lameCmd: continue try: ret = retryWait(subprocess.Popen(c, startupinfo=si)) diff -Nurp anki-2.0.33.orig/aqt/__init__.py anki-2.0.33/aqt/__init__.py --- anki-2.0.33.orig/aqt/__init__.py	2015-12-27 11:23:02.338908782 +0100 +++ anki-2.0.33/aqt/__init__.py	2015-12-27 12:35:03.405565214 +0100 @@ -107,7 +107,7 @@ def setupLang(pm, app, force=None): app.setLayoutDirection(Qt.LeftToRight) # qt _qtrans = QTranslator() -    if _qtrans.load("qt_" + lang, dir): +    if _qtrans.load("qt_" + lang, "@qt4@/share/@qt4name@/translations"): app.installTranslator(_qtrans) # App initialisation diff -Nurp anki-2.0.33.orig/oldanki/lang.py anki-2.0.33/oldanki/lang.py --- anki-2.0.33.orig/oldanki/lang.py	2015-12-27 11:23:02.390909551 +0100 +++ anki-2.0.33/oldanki/lang.py	2015-12-27 14:05:51.663920453 +0100 @@ -32,11 +32,7 @@ def ngettext(single, plural, n): return localTranslation().ungettext(single, plural, n) def setLang(lang, local=True): -    base = os.path.dirname(os.path.abspath(__file__)) -    localeDir = os.path.join(base, "locale") -    if not os.path.exists(localeDir): -        localeDir = os.path.join( -            os.path.dirname(sys.argv[0]), "locale") +    localeDir = "@anki@/share/locale" trans = gettext.translation('libanki', localeDir, languages=[lang], fallback=True) </del>

angband = callPackage ../games/angband { }; <del> anki = python2Packages.callPackage ../games/anki { }; </del> <ins> anki = python3Packages.callPackage ../games/anki { }; </ins> armagetronad = callPackage ../games/armagetronad { };