mirror of
https://github.com/ankitects/anki.git
synced 2025-09-20 15:02:21 -04:00
Merge branch 'master' of git://ichi2.net/libanki
This commit is contained in:
commit
7d34b35b75
6 changed files with 39 additions and 13 deletions
|
@ -68,7 +68,7 @@ cardsTable = Table(
|
||||||
class Card(object):
|
class Card(object):
|
||||||
"A card."
|
"A card."
|
||||||
|
|
||||||
def __init__(self, fact=None, cardModel=None):
|
def __init__(self, fact=None, cardModel=None, due=None):
|
||||||
self.tags = u""
|
self.tags = u""
|
||||||
self.id = genID()
|
self.id = genID()
|
||||||
# new cards start as new & due
|
# new cards start as new & due
|
||||||
|
@ -77,8 +77,11 @@ class Card(object):
|
||||||
self.timerStarted = False
|
self.timerStarted = False
|
||||||
self.timerStopped = False
|
self.timerStopped = False
|
||||||
self.modified = time.time()
|
self.modified = time.time()
|
||||||
self.due = self.modified
|
if due:
|
||||||
self.combinedDue = self.modified
|
self.due = due
|
||||||
|
else:
|
||||||
|
self.due = self.modified
|
||||||
|
self.combinedDue = self.due
|
||||||
if fact:
|
if fact:
|
||||||
self.fact = fact
|
self.fact = fact
|
||||||
if cardModel:
|
if cardModel:
|
||||||
|
|
|
@ -471,7 +471,7 @@ where id != :id and factId = :factId""",
|
||||||
else:
|
else:
|
||||||
due = self.delay0
|
due = self.delay0
|
||||||
else:
|
else:
|
||||||
due = card.interval * 86400.0
|
due = card.interval * 86400.0
|
||||||
return due + time.time()
|
return due + time.time()
|
||||||
|
|
||||||
def updateFactor(self, card, ease):
|
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:
|
if self.newCardOrder == NEW_CARDS_RANDOM:
|
||||||
# we need to re-randomize now
|
# we need to re-randomize now
|
||||||
self.randomizeNewCards(ids)
|
self.randomizeNewCards(ids)
|
||||||
|
self.flushMod()
|
||||||
self.refresh()
|
self.refresh()
|
||||||
|
|
||||||
def randomizeNewCards(self, cardIds=None):
|
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
|
select count(id) from cards
|
||||||
where factId = :fid and cardModelId = :cmid""",
|
where factId = :fid and cardModelId = :cmid""",
|
||||||
fid=fact.id, cmid=cardModel.id) == 0:
|
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.updateCardTags([card.id])
|
||||||
self.updatePriority(card)
|
self.updatePriority(card)
|
||||||
self.cardCount += 1
|
self.cardCount += 1
|
||||||
|
@ -2651,6 +2653,7 @@ class DeckStorage(object):
|
||||||
DeckStorage._addIndices(deck)
|
DeckStorage._addIndices(deck)
|
||||||
for m in deck.models:
|
for m in deck.models:
|
||||||
deck.updateCardsFromModel(m)
|
deck.updateCardsFromModel(m)
|
||||||
|
deck.created = time.time()
|
||||||
deck.finishProgress()
|
deck.finishProgress()
|
||||||
# fix a bug with current model being unset
|
# fix a bug with current model being unset
|
||||||
if not deck.currentModel and deck.models:
|
if not deck.currentModel and deck.models:
|
||||||
|
|
|
@ -25,11 +25,11 @@ def runHook(hook, *args):
|
||||||
for func in hook:
|
for func in hook:
|
||||||
func(*args)
|
func(*args)
|
||||||
|
|
||||||
def runFilter(hook, arg):
|
def runFilter(hook, arg, *args):
|
||||||
hook = _hooks.get(hook, None)
|
hook = _hooks.get(hook, None)
|
||||||
if hook:
|
if hook:
|
||||||
for func in hook:
|
for func in hook:
|
||||||
arg = func(arg)
|
arg = func(arg, *args)
|
||||||
return arg
|
return arg
|
||||||
|
|
||||||
def addHook(hook, func):
|
def addHook(hook, func):
|
||||||
|
|
|
@ -8,7 +8,7 @@ Sound support
|
||||||
"""
|
"""
|
||||||
__docformat__ = 'restructuredtext'
|
__docformat__ = 'restructuredtext'
|
||||||
|
|
||||||
import re, sys, threading, time, subprocess, os, signal
|
import re, sys, threading, time, subprocess, os, signal, atexit, errno
|
||||||
|
|
||||||
# Shared utils
|
# Shared utils
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -126,6 +126,9 @@ class MplayerMonitor(threading.Thread):
|
||||||
mplayerCond.wait()
|
mplayerCond.wait()
|
||||||
if not self.mplayer:
|
if not self.mplayer:
|
||||||
self.startProcess()
|
self.startProcess()
|
||||||
|
if self.mplayer != -1 and self.mplayer.poll() is not None:
|
||||||
|
self.mplayer.wait()
|
||||||
|
self.startProcess()
|
||||||
nextClears = False
|
nextClears = False
|
||||||
while mplayerQueue:
|
while mplayerQueue:
|
||||||
item = mplayerQueue.pop(0)
|
item = mplayerQueue.pop(0)
|
||||||
|
@ -144,7 +147,8 @@ class MplayerMonitor(threading.Thread):
|
||||||
def startProcess(self):
|
def startProcess(self):
|
||||||
try:
|
try:
|
||||||
self.mplayer = subprocess.Popen(
|
self.mplayer = subprocess.Popen(
|
||||||
mplayerCmd, startupinfo=si, stdin=subprocess.PIPE)
|
mplayerCmd, startupinfo=si, stdin=subprocess.PIPE,
|
||||||
|
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
except OSError:
|
except OSError:
|
||||||
raise Exception("Audio player not found")
|
raise Exception("Audio player not found")
|
||||||
|
|
||||||
|
@ -160,8 +164,25 @@ def clearMplayerQueue():
|
||||||
mplayerQueue.append(None)
|
mplayerQueue.append(None)
|
||||||
mplayerCond.release()
|
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 = MplayerMonitor()
|
||||||
mplayerManager.start()
|
mplayerManager.start()
|
||||||
|
atexit.register(stopMplayer)
|
||||||
|
|
||||||
# PyAudio recording
|
# PyAudio recording
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -1053,7 +1053,7 @@ class HttpSyncServerProxy(SyncServer):
|
||||||
self.deckName = None
|
self.deckName = None
|
||||||
self.username = user
|
self.username = user
|
||||||
self.password = passwd
|
self.password = passwd
|
||||||
self.protocolVersion = 4
|
self.protocolVersion = 5
|
||||||
self.sourcesToCheck = []
|
self.sourcesToCheck = []
|
||||||
|
|
||||||
def connect(self, clientVersion=""):
|
def connect(self, clientVersion=""):
|
||||||
|
|
5
setup.py
5
setup.py
|
@ -24,9 +24,8 @@ setup(name='anki',
|
||||||
author_email='anki@ichi2.net',
|
author_email='anki@ichi2.net',
|
||||||
url='http://ichi2.net/anki/index.html',
|
url='http://ichi2.net/anki/index.html',
|
||||||
license='GPLv3',
|
license='GPLv3',
|
||||||
packages=["anki", "anki.features", "anki.features.chinese", "anki.importing"],
|
packages=["anki", "anki.importing"],
|
||||||
package_data={'anki': ['samples/*','locale/*/*/*'],
|
package_data={'anki': ['locale/*/*/*'],},
|
||||||
'anki.features.chinese': ['unihan.db']},
|
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
install_requires=[
|
install_requires=[
|
||||||
|
|
Loading…
Reference in a new issue