diff --git a/anki/cards.py b/anki/cards.py index 8fd2bbcbb..599ef0ab5 100644 --- a/anki/cards.py +++ b/anki/cards.py @@ -68,7 +68,7 @@ cardsTable = Table( class Card(object): "A card." - def __init__(self, fact=None, cardModel=None): + def __init__(self, fact=None, cardModel=None, due=None): self.tags = u"" self.id = genID() # new cards start as new & due @@ -77,8 +77,11 @@ class Card(object): self.timerStarted = False self.timerStopped = False self.modified = time.time() - self.due = self.modified - self.combinedDue = self.modified + if due: + self.due = due + else: + self.due = self.modified + self.combinedDue = self.due if fact: self.fact = fact if cardModel: diff --git a/anki/deck.py b/anki/deck.py index 2301d4994..16a61ce26 100644 --- a/anki/deck.py +++ b/anki/deck.py @@ -471,7 +471,7 @@ where id != :id and factId = :factId""", else: due = self.delay0 else: - due = card.interval * 86400.0 + due = card.interval * 86400.0 return due + time.time() def updateFactor(self, card, ease): @@ -515,6 +515,7 @@ where id in %s""" % ids2str(ids), now=time.time(), new=0) if self.newCardOrder == NEW_CARDS_RANDOM: # we need to re-randomize now self.randomizeNewCards(ids) + self.flushMod() self.refresh() def randomizeNewCards(self, cardIds=None): @@ -1032,7 +1033,8 @@ where type = 2 and priority in (1,2,3,4)""") or 0 select count(id) from cards where factId = :fid and cardModelId = :cmid""", fid=fact.id, cmid=cardModel.id) == 0: - card = anki.cards.Card(fact, cardModel) + card = anki.cards.Card( + fact, cardModel, due=fact.created+cardModel.ordinal) self.updateCardTags([card.id]) self.updatePriority(card) self.cardCount += 1 @@ -2651,6 +2653,7 @@ class DeckStorage(object): DeckStorage._addIndices(deck) for m in deck.models: deck.updateCardsFromModel(m) + deck.created = time.time() deck.finishProgress() # fix a bug with current model being unset if not deck.currentModel and deck.models: diff --git a/anki/hooks.py b/anki/hooks.py index 3880defb8..c43e104bf 100644 --- a/anki/hooks.py +++ b/anki/hooks.py @@ -25,11 +25,11 @@ def runHook(hook, *args): for func in hook: func(*args) -def runFilter(hook, arg): +def runFilter(hook, arg, *args): hook = _hooks.get(hook, None) if hook: for func in hook: - arg = func(arg) + arg = func(arg, *args) return arg def addHook(hook, func): diff --git a/anki/sound.py b/anki/sound.py index f9dce324b..5da54c671 100644 --- a/anki/sound.py +++ b/anki/sound.py @@ -8,7 +8,7 @@ Sound support """ __docformat__ = 'restructuredtext' -import re, sys, threading, time, subprocess, os, signal +import re, sys, threading, time, subprocess, os, signal, atexit, errno # Shared utils ########################################################################## @@ -126,6 +126,9 @@ class MplayerMonitor(threading.Thread): mplayerCond.wait() if not self.mplayer: self.startProcess() + if self.mplayer != -1 and self.mplayer.poll() is not None: + self.mplayer.wait() + self.startProcess() nextClears = False while mplayerQueue: item = mplayerQueue.pop(0) @@ -144,7 +147,8 @@ class MplayerMonitor(threading.Thread): def startProcess(self): try: self.mplayer = subprocess.Popen( - mplayerCmd, startupinfo=si, stdin=subprocess.PIPE) + mplayerCmd, startupinfo=si, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) except OSError: raise Exception("Audio player not found") @@ -160,8 +164,25 @@ def clearMplayerQueue(): mplayerQueue.append(None) mplayerCond.release() +def stopMplayer(): + mplayerCond.acquire() + if mplayerManager.mplayer: + while 1: + try: + mplayerManager.mplayer.communicate("quit\n") + break + except OSError, e: + if e.errno != errno.EINTR: + # osx throws interrupt errors regularly, but we want to + # ignore other errors on shutdown + break + mplayerManager.mplayer = -1 + mplayerCond.notify() + mplayerCond.release() + mplayerManager = MplayerMonitor() mplayerManager.start() +atexit.register(stopMplayer) # PyAudio recording ########################################################################## diff --git a/anki/sync.py b/anki/sync.py index 72db20c98..1297e96da 100644 --- a/anki/sync.py +++ b/anki/sync.py @@ -1053,7 +1053,7 @@ class HttpSyncServerProxy(SyncServer): self.deckName = None self.username = user self.password = passwd - self.protocolVersion = 4 + self.protocolVersion = 5 self.sourcesToCheck = [] def connect(self, clientVersion=""): diff --git a/setup.py b/setup.py index 239a8ad9b..6c959a6a9 100644 --- a/setup.py +++ b/setup.py @@ -24,9 +24,8 @@ setup(name='anki', author_email='anki@ichi2.net', url='http://ichi2.net/anki/index.html', license='GPLv3', - packages=["anki", "anki.features", "anki.features.chinese", "anki.importing"], - package_data={'anki': ['samples/*','locale/*/*/*'], - 'anki.features.chinese': ['unihan.db']}, + packages=["anki", "anki.importing"], + package_data={'anki': ['locale/*/*/*'],}, include_package_data=True, zip_safe=False, install_requires=[