Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Recall

一个轻量级的屏幕录制和回放工具,自动捕捉屏幕变化并提供时间轴浏览功能。

✨ 特性

  • 🖥️ 多显示器支持 - 自动检测并独立监控所有连接的显示器
  • 🎯 智能检测 - 仅在屏幕内容变化时才保存截图,节省存储空间
  • 📊 时间轴浏览 - 通过滑块轻松回溯历史屏幕状态
  • 🔍 搜索功能 - 按应用名称或窗口标题搜索截图
  • 🎨 深色/浅色主题 - 支持主题切换,界面美观
  • 💾 自动清理 - 自动删除超过3天的旧数据
  • 📱 响应式设计 - 界面适配不同屏幕尺寸

🚀 快速开始

安装依赖

pip install -r requirements.txt

运行

python app.py

程序启动后:

  • 自动开始监控屏幕变化
  • Web界面运行在 http://localhost:8082

命令行参数

# 只监控主显示器
python app.py --primary-monitor-only

# 自定义存储路径
python app.py --storage-path /path/to/storage

📖 使用说明

时间轴模式

  1. 打开 http://localhost:8082
  2. 使用滑块浏览不同时间点的截图
  3. 支持键盘快捷键:
    • 向前(旧)
    • 向后(新)
  4. 点击截图可全屏查看

搜索模式

  1. 点击顶部"搜索"标签
  2. 在搜索框输入应用名或窗口标题
  3. Enter 搜索
  4. 卡片式展示所有匹配的截图

🔧 工作原理

截图逻辑

  1. 启动时:立即保存所有屏幕的初始截图
  2. 每10秒:检测所有屏幕的内容变化
  3. 独立保存:只保存发生变化的屏幕,避免数据冗余
  4. 相似度检测:使用MSSIM算法,相似度 < 0.9 视为变化

数据存储

目录结构:

~/Documents/Programming/recall/  # 可在 config.py 修改
├── screenshots/                 # 截图文件 (.avif格式,读取兼容历史 .webp)
├── logs/                        # 运行日志
└── recall.db                    # SQLite数据库

数据库表:

  • entries - 记录每个屏幕的变化事件(时间戳、应用名、窗口标题)
  • monitor_snapshots - 记录每个时间点的显示器数量

前端渲染

  • 使用二分查找算法,快速定位每个屏幕在指定时间点的最新截图
  • 根据图片实际尺寸动态调整显示比例
  • 支持多显示器配置变化(插拔显示器)

🎨 界面功能

时间轴页面

  • 滑块控制:拖动查看不同时间点
  • 多屏显示:并排显示所有显示器,按实际分辨率比例
  • 窗口信息:显示截图时的前台应用和窗口标题
  • 全屏查看:点击图片进入lightbox模式

搜索页面

  • 实时搜索:按应用名或标题过滤
  • 网格布局:卡片式展示所有匹配结果
  • 屏幕标识:标注截图来自哪个显示器

⚙️ 配置

修改数据存储路径

编辑 config.py

DATA_ROOT_DIR = os.path.join(os.path.expanduser("~"), "your", "custom", "path")

修改检测间隔

编辑 screenshot.py 中的 time.sleep(10) 改为你想要的秒数。

修改数据保留天数

编辑 screenshot.py 中的 cleanup_old_data(days=3) 改为你想要的天数。

调整相似度阈值

编辑 screenshot.py 中的 similarity < 0.9 改为你需要的阈值(0-1之间)。

📊 性能特性

  • 智能截图:只在有变化时保存,大幅减少存储占用
  • AVIF压缩:quality=50、speed=8,压缩率优于 WebP,且读取时自动回退历史 .webp
  • 独立监控:每个屏幕独立检测和保存
  • 自动清理:定期删除旧数据,避免磁盘占满

🛠️ 技术栈

后端:

  • Python 3.x
  • Flask - Web框架
  • mss - 跨平台截图
  • Pillow - 图像处理
  • NumPy - 数值计算(MSSIM)
  • SQLite - 数据存储

前端:

  • Bootstrap 4 - UI框架
  • Vanilla JavaScript - 前端逻辑
  • 自定义CSS - 深色/浅色主题

平台支持:

  • Windows - pywin32, psutil
  • macOS - pyobjc
  • Linux - xprop, xprintidle

🔒 隐私说明

  • 所有数据存储在本地
  • 无网络通信(除非手动配置)
  • Web界面仅监听本地端口
  • 日志文件包含时间戳和基本运行信息

🐛 常见问题

Q: 为什么启动后没有截图?

A: 程序会在10秒后开始检测变化。启动时会保存一张初始截图,但需要屏幕内容实际变化后才会保存新截图。

Q: 副屏截图没有保存?

A: 确保没有使用 --primary-monitor-only 参数。检查日志中是否有"Monitor X changed"的提示。

Q: 日志文件太大?

A: 程序已优化为只在有变化时打印日志。可以手动删除旧的日志文件。

Q: 如何停止监控?

A: 直接关闭程序(Ctrl+C)即可。

Q: 截图质量可以提高吗?

A: 编辑 screenshot.py 中的 quality=50 改为更高的值(1-100)。

📝 开发说明

项目结构

app/
├── app.py             # Flask应用入口,Web路由
├── screenshot.py      # 截图线程,变化检测
├── database.py        # 数据库操作
├── config.py          # 配置管理
├── utils.py           # 工具函数(窗口检测、时间转换)
└── requirements.txt   # Python依赖

核心算法

MSSIM(平均结构相似性指数):

def mean_structured_similarity_index(img1, img2, L=255):
    # 计算两张图片的相似度(0-1之间)
    # 值越接近1表示越相似

二分查找最新截图:

function findLatestEvent(mi, ts) {
  // 找到屏幕mi在时间ts之前的最新一次变化
  // O(log n) 时间复杂度
}

📄 许可证

本项目基于原始 OpenRecall 项目修改,同样以 AGPL-3.0 许可发布。

🙏 致谢

  • 原始项目:OpenRecall
  • 使用的开源库:Flask, mss, Pillow, Bootstrap

🔄 主要改进

  • ✨ 重构截图逻辑,每个屏幕独立检测和保存
  • 🎨 优化前端界面,支持深色/浅色主题
  • 📊 改进时间轴渲染,支持多显示器实际比例显示
  • 🐛 修复启动时重复截图的问题
  • 📝 减少日志输出,只在有变化时打印
  • 🗑️ 启动时清理孤立的数据库记录
  • 💾 大幅减少存储空间占用(按需保存)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages