This commit is contained in:
douboer
2025-09-07 01:19:00 +08:00
parent 5e1788884f
commit c463e3b785
31 changed files with 3124 additions and 61 deletions

View File

@@ -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()