'update'
This commit is contained in:
@@ -202,6 +202,62 @@ class BookListManager:
|
||||
total[i] += readtime12m[i]
|
||||
return total
|
||||
|
||||
# ---------------- 已读完书籍 (本年度) ----------------
|
||||
def get_finished_books_this_year(self):
|
||||
"""返回本年度读完的书籍列表 [(asset_id, info, finished_date_ts), ...]
|
||||
|
||||
依据 ZISFINISHED=1 且 ZDATEFINISHED 在今年内。
|
||||
如果 plist 信息缺少显示名则回退 asset_id。
|
||||
"""
|
||||
booksinfo = self.get_books_info()
|
||||
import datetime, sqlite3
|
||||
year = datetime.datetime.now().year
|
||||
results = []
|
||||
if not os.path.exists(self.db_path):
|
||||
return results
|
||||
try:
|
||||
conn = sqlite3.connect(self.db_path)
|
||||
cur = conn.cursor()
|
||||
# ZDATEFINISHED: Apple CoreData 时间戳(相对 2001-01-01 秒)
|
||||
cur.execute("""
|
||||
SELECT ZASSETID, ZDATEFINISHED, ZISFINISHED
|
||||
FROM ZBKLIBRARYASSET
|
||||
WHERE ZISFINISHED=1 AND ZDATEFINISHED IS NOT NULL
|
||||
""")
|
||||
rows = cur.fetchall()
|
||||
conn.close()
|
||||
# 调试:原始满足完成条件的行数
|
||||
try:
|
||||
if getattr(self, '_debug_finished_books', True):
|
||||
print(f"[debug finished] raw_rows={len(rows)} (ZISFINISHED=1 & ZDATEFINISHED not null)")
|
||||
except Exception:
|
||||
pass
|
||||
except Exception as e:
|
||||
print(f'警告: 查询已读完书籍失败: {e}')
|
||||
return results
|
||||
base = datetime.datetime(2001,1,1)
|
||||
for asset_id, finished_ts, flag in rows:
|
||||
try:
|
||||
if not asset_id or finished_ts is None:
|
||||
continue
|
||||
finished_dt = base + datetime.timedelta(seconds=finished_ts)
|
||||
if finished_dt.year != year:
|
||||
continue
|
||||
info = booksinfo.get(asset_id, {})
|
||||
results.append((asset_id, info, finished_dt))
|
||||
except Exception:
|
||||
pass
|
||||
try:
|
||||
if getattr(self, '_debug_finished_books', True):
|
||||
print(f"[debug finished] after year filter={len(results)}, year={year}")
|
||||
if results:
|
||||
print("[debug finished] sample asset_ids:", ','.join(r[0] for r in results[:5]))
|
||||
except Exception:
|
||||
pass
|
||||
# 按完成时间倒序
|
||||
results.sort(key=lambda x: x[2], reverse=True)
|
||||
return results
|
||||
|
||||
if __name__ == '__main__':
|
||||
manager = BookListManager()
|
||||
booksinfo = manager.get_books_info()
|
||||
|
||||
Reference in New Issue
Block a user