Giter VIP home page Giter VIP logo

yuka-friends / windrecorder Goto Github PK

View Code? Open in Web Editor NEW
1.5K 12.0 61.0 112.3 MB

Windrecorder is a memory search app by records everything on your screen in small size, to let you rewind what you have seen, query through OCR text or image description, and get activity statistics.

License: GNU General Public License v2.0

Dockerfile 0.26% Python 98.07% Batchfile 1.67%
ffmpeg streamlit productivity rewind search

windrecorder's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

windrecorder's Issues

feat: 添加时间标注功能,在漫长的记录随时刻舟求剑

1. 需求背景

当想为正在经历的重要会议、突发情况、某场直播、游戏与观影高光时刻……等添加标记、以方便未来回顾时,可以通过托盘菜单为当下添加一个标记——在时间长河中也可以刻舟求剑。

2. 需求范围

涉及托盘的调整、webui 一日之时下时间轴缩略图、左侧栏功能模块的调整,数据将另存为一个 csv 文件;

3. 功能详细说明

从托盘中可以为当下时间添加标记和备注,点击后在 userdata/flag_mark_note.csv 写入当下时间戳与缩略图。之后通过 customtkinter 绘制弹窗,询问是否添加备注信息;

image

添加后的时间标记可以在 webui 一日之时中查询与删除,也会体现在当日的时间轴缩略图上。在一日之时中也可以记录当下选择的时间。

image

bug: 录制的视频文件只剩下左上部分的画面,原因未知

今天检查视频文件,发现最近一段时间的视频文件都只剩下左上部分的画面
image

回去检查了一下这个现象从什么时候开始出现,发现是从自己元旦那会开始玩博德之门3的时候,打开博德之门3之后在游戏内和游戏外切换了数次,随后就这样了,我的电脑是笔记本电脑,N卡,开了独显直连模式,可能和独显处理信号切换有关

该问题在重启start_app.bat后消失

feat: 添加图片的语义化嵌入索引、搜索(like CLIP)

目标:

实现通过自然语言,对图像内容本身进行相似度检索;

Refer:

ArnoFrost:我这里有个昨天写的简单clip用法demo 代码片段, 可以看看的, 我不是算法专业, 所以我也就是本着直接用的方式在看的
https://gist.github.com/ArnoFrost/21c836cf23a99c7872a30a619b97b3a8

Queryable:https://github.com/mazzzystar/Queryable

Milestone:

[ ] 跑通索引流程;
[ ] 调整数据表结构,实现对图像嵌入向量储存与搜索;
[ ] 完成 webui 的搜索与索引选项;支持对用户过去的数据建立索引,通过性能消耗调研自动索引策略为即时索引 or 闲时索引;

bug: 当磁盘上不存在对应视频文件时,“一日之时”无法正确处理异常

File "C:\Users\Anton\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-QcaNLmW7-py3.10\lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 534, in _run_script
    exec(code, module.__dict__)
File "D:\git\Windrecorder\webui.py", line 88, in <module>
    windrecorder.ui.oneday.render()
File "D:\git\Windrecorder\windrecorder\ui\oneday.py", line 398, in render
    show_and_locate_video_timestamp_by_filename_and_time(day_video_file_name, shown_timestamp)
File "D:\git\Windrecorder\windrecorder\ui\oneday.py", line 500, in show_and_locate_video_timestamp_by_filename_and_time
    video_file = open(videofile_path, "rb")

image

feat: 闲时维护中,添加为数据库执行数据去重的选项与操作

1. 需求背景

当用户执行来回滚动或来回切换窗口的操作时,重复的内容数据会分散在不同时间的数据库条目中。如果能提供在闲时维护时自动为数据库条目去重,能够提效搜索筛选效率、降低搜索与录制时可能存在的信息爆炸负担;

2. 需求范围

在闲时维护时增加此步操作,需要注意对数据库的读写安全,闲时操作被打断时能记录与恢复进度;

3. 功能详细说明

  • 在设置选项中,提供一个用户是否可以决定数据去重的checkbox,勾选后将会在闲时进行逐一条目的数据比对去重;
  • 功能规则:
    • 数据去重比对的阈值需要设定在极高的状态,以确保去除的为几乎重复的画面内容;比对的内容为OCR索引到的文本;(此项参数在json中配置,不对用户设置界面透传)
    • 数据去重时,只保留最早的条目结果;
    • 当OCR索引到的文本少于20字时,跳过此条内容的比对;(跳过的字数阈值在json中配置,不对用户设置界面透传)
    • 数据比对的时间范围限制在一天内(或一天内连续的x小时?RFC),比如说在第一天的信息A与第二天的信息B几乎一致,由于跨越了一天、所以不进行去重;同样的,当第一天的信息A与第一天的信息C几乎一致时,移除信息C,只保留时间最早的条目A;(此项规则是否启用的参数在json中配置,不对用户设置界面透传)
    • 高级期望补充:如果条目B包含了大量条目A的内容,几乎为A⊆B,那么只保留B;此项可以去重打字创作等场景中冗余重复内容;

中文OCR准确率很低

我单独调用了Windows.Media.Ocr.Cli.exe来进行OCR测试,但效果非常差。这也导致了分词和搜索的效果较差,在我看来,这是整个软件的一个明显短板。

在源码中,还有第二种OCR方式:OCR文本-chineseOCRlite。我想知道为什么不再使用这个配置?

我希望能够自由切换OCR引擎,并增加一个OCR测试页面,有更好的ocr效果。

如果ocr不准确的话,现在我搜索的效果都很差,后面的LLM等创意都没有意义了

安装时候报错

files: folder existed:./db
dbManager: Initialize the database...
Traceback (most recent call last):
File "C:\D\windrecorder\Windrecorder\onboard_setting.py", line 6, in
import windrecorder.maintainManager as maintainManager
File "C:\D\windrecorder\Windrecorder\windrecorder\maintainManager.py", line 14, in
import windrecorder.db_manager as db_manager
File "C:\D\windrecorder\Windrecorder\windrecorder\db_manager.py", line 34, in
db_main_initialize()
File "C:\D\windrecorder\Windrecorder\windrecorder\db_manager.py", line 27, in db_main_initialize
conn_check = db_check_exist(db_filepath_today)
NameError: name 'db_check_exist' is not defined

bug: 使用第三方锁屏时,仍会处于录制状态

image

录制选项已经设置为1分钟无变化就暂停了,但是锁屏后,有时仍会持续录制
image

这种情况下是判断哪部分仍在变化呢,因为看录制的视频,锁屏界面上的时间是每5分钟才变化一次
image

也尝试过打开一个空白txt,最大化显示,然后再锁屏,也是锁屏后,有时仍会持续录制

不支持python3.12:没有distutils模块

在python3.12 的环境下,我点击install_update 脚本之后,安装报错,已经排除网络问题,报错如下:
ERROR: Exception:
Traceback (most recent call last):
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\cli\base_command.py", line 180, in exc_logging_wrapper
status = run_func(*args)
^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\cli\req_command.py", line 248, in wrapper
return func(self, options, args)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\commands\install.py", line 377, in run
requirement_set = resolver.resolve(
^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\resolver.py", line 92, in resolve
result = self._result = resolver.resolve(
^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_vendor\resolvelib\resolvers.py", line 546, in resolve
state = resolution.resolve(requirements, max_rounds=max_rounds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_vendor\resolvelib\resolvers.py", line 397, in resolve
self._add_to_criteria(self.state.criteria, r, parent=None)
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_vendor\resolvelib\resolvers.py", line 173, in _add_to_criteria
if not criterion.candidates:
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_vendor\resolvelib\structs.py", line 156, in bool
return bool(self._sequence)
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\found_candidates.py", line 155, in bool
return any(self)
^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\found_candidates.py", line 143, in
return (c for c in iterator if id(c) not in self._incompatible_ids)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\found_candidates.py", line 47, in _iter_built
candidate = func()
^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\factory.py", line 206, in _make_candidate_from_link
self._link_candidate_cache[link] = LinkCandidate(
^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\candidates.py", line 293, in init
super().init(
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\candidates.py", line 156, in init
self.dist = self._prepare()
^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\candidates.py", line 225, in _prepare
dist = self._prepare_distribution()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\resolution\resolvelib\candidates.py", line 304, in _prepare_distribution
return preparer.prepare_linked_requirement(self._ireq, parallel_builds=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\operations\prepare.py", line 538, in prepare_linked_requirement
return self._prepare_linked_requirement(req, parallel_builds)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\operations\prepare.py", line 653, in _prepare_linked_requirement
dist = _get_prepared_distribution(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\operations\prepare.py", line 69, in _get_prepared_distribution
abstract_dist.prepare_distribution_metadata(
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\distributions\sdist.py", line 48, in prepare_distribution_metadata
self._install_build_reqs(finder)
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\distributions\sdist.py", line 118, in _install_build_reqs
build_reqs = self._get_build_requires_wheel()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\distributions\sdist.py", line 95, in _get_build_requires_wheel
return backend.get_requires_for_build_wheel()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_internal\utils\misc.py", line 697, in get_requires_for_build_wheel
return super().get_requires_for_build_wheel(config_settings=cs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_vendor\pyproject_hooks_impl.py", line 166, in get_requires_for_build_wheel
return self._call_hook('get_requires_for_build_wheel', {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_vendor\pyproject_hooks_impl.py", line 321, in _call_hook
raise BackendUnavailable(data.get('traceback', ''))
pip._vendor.pyproject_hooks._impl.BackendUnavailable: Traceback (most recent call last):
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\site-packages\pip_vendor\pyproject_hooks_in_process_in_process.py", line 77, in build_backend
obj = import_module(mod_path)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\qq376\AppData\Local\Programs\Python\Python312\Lib\importlib_init
.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "", line 1381, in _gcd_import
File "", line 1354, in _find_and_load
File "", line 1304, in _find_and_load_unlocked
File "", line 488, in _call_with_frames_removed
File "", line 1381, in _gcd_import
File "", line 1354, in _find_and_load
File "", line 1325, in _find_and_load_unlocked
File "", line 929, in _load_unlocked
File "", line 994, in exec_module
File "", line 488, in call_with_frames_removed
File "C:\Users\qq376\AppData\Local\Temp\pip-build-env-k_6tf2nm\overlay\Lib\site-packages\setuptools_init
.py", line 10, in
import distutils.core
ModuleNotFoundError: No module named 'distutils'

可以打包放进无法联网的电脑用吗

请问
46e9f01607baa98968c110ccb10c4d2
这样怎么办?

另外我想放进我的内网电脑,内网电脑无法联网,请问可以在另一台电脑上安装好,再把文件夹打包传过去使用吗,谢谢。

feat: 添加截图美化工具

1. 需求背景

美化用户从过去记忆中截取的图片,为其塑封到赛博相框中、添加时间戳,增添意义。

2. 需求范围

通过制作一个独立的前端页面,以 iframe 嵌入的方式,在 webui tab 栏中添加一个标签页用于美化剪贴板中的截图;

3. 功能详细说明

  • 最终用户的截图包装效果参考:
    image

具体布局规则、形态详见 figma;

  • 生成器的 UX 链路:
    image

附录

figma:待补充

使用时ffmpeg占用大量内存

图片
如图所示,内存总占用约 10G,请问这是正常现象吗?
主屏幕是4K屏。
顺便请问多屏开发的优先级高么

记忆摘要部分中的词云和光箱无法正确更新

Traceback (most recent call last):
  File "D:\Windrecorder\env\lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 541, in _run_script
    exec(code, module.__dict__)
  File "D:\Windrecorder\webui.py", line 94, in <module>
    windrecorder.ui.state.render()
  File "D:\Windrecorder\windrecorder\ui\state.py", line 102, in render
    state.generate_month_lightbox(
  File "D:\Windrecorder\windrecorder\state.py", line 131, in generate_month_lightbox
    image_thumbnail = Image.open(BytesIO(base64.b64decode(image_data)))
  File "C:\Users\xxx\scoop\apps\miniconda3\current\lib\base64.py", line 80, in b64decode
    s = _bytes_from_decode_data(s)
  File "C:\Users\xxx\scoop\apps\miniconda3\current\lib\base64.py", line 45, in _bytes_from_decode_data
    raise TypeError("argument should be a bytes-like object or ASCII "
TypeError: argument should be a bytes-like object or ASCII string, not 'NoneType'

其中,state.pyimage_list 类型是 list ,而 image_list[0] 的类型是 NoneType

不太懂py开发,这应该是代码间传输数据类型的问题吧?

优化“当前活动”策略

现在捕捉用户当前活动是直接录屏(截图),会造成大量的无关背景内容

manic time的策略是:
1.间隔时间截图
2.当前激活窗口切换时,截图
3.可以只截图当前激活的窗口,也就是只截图活动内容

windrecorder也可以加入当前激活窗口判断、当前激活窗口的标题获取、鼠标移动判断、访问网络读取磁盘的应用程序详情(可以加入黑名单机制:我玩游戏的时候不需要录屏和ocr,很卡顿)、甚至是键盘输入情况判断,现在程序的逻辑和业务都比较简陋,可以完全先把manic time这个产品全抄完。

偶尔 Recording 会停滞不动,webui 显示“当前未在录制屏幕”,疑似 ffmpeg 进程异常退出

偶尔 Recording 会停滞不动,webui 显示当前未在录制屏幕。 请刷新查看最新运行状态。,日志如下,但此时并没有爆内存,长时间不动或正常使用都偶尔会遇到这种情况,需要重启脚本才行。

frame= 1703 fps=1.9 q=0.0 size=    2048kB time=00:14:10.00 bitrate=  19.7[out#0/mp4 @ 000001f18f278dc0] video:2160kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.659762%
frame= 1800 fps=2.0 q=-1.0 Lsize=    2174kB time=00:14:58.50 bitrate=  19.8kbits/s speed=0.998x
[libx264 @ 000001f190dbe180] frame I:4     Avg QP: 1.50  size:293220
[libx264 @ 000001f190dbe180] frame P:205   Avg QP: 0.36  size:  2668
[libx264 @ 000001f190dbe180] frame B:1591  Avg QP: 0.56  size:   309
[libx264 @ 000001f190dbe180] consecutive B-frames:  0.3%  0.2%  0.2%  0.2%  0.3%  0.0%  0.8%  0.0% 98.0%
[libx264 @ 000001f190dbe180] mb I  I16..4: 59.3% 33.9%  6.8%
[libx264 @ 000001f190dbe180] mb P  I16..4:  0.5%  0.0%  0.0%  P16..4:  0.4%  0.0%  0.0%  0.0%  0.0%    skip:99.0%
[libx264 @ 000001f190dbe180] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.0%  0.0%  0.0%  direct: 0.0%  skip:100.0%  L0:40.4% L1:59.5% BI: 0.0%
[libx264 @ 000001f190dbe180] final ratefactor: -12.27
[libx264 @ 000001f190dbe180] 8x8 transform intra:27.2% inter:75.7%
[libx264 @ 000001f190dbe180] coded y,u,v intra: 11.8% 8.2% 6.9% inter: 0.0% 0.0% 0.0%
[libx264 @ 000001f190dbe180] i16 v,h,dc,p: 93%  3%  3%  1%
[libx264 @ 000001f190dbe180] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10%  8% 81%  1%  0%  0%  0%  0%  0%
[libx264 @ 000001f190dbe180] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 18% 15% 18%  4%  3%  3%  5%  3%
[libx264 @ 000001f190dbe180] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 000001f190dbe180] ref P L0: 92.0%  0.4%  3.7%  3.9%
[libx264 @ 000001f190dbe180] ref B L0: 74.4% 24.1%  1.6%
[libx264 @ 000001f190dbe180] ref B L1: 97.4%  2.6%
[libx264 @ 000001f190dbe180] kb/s:19.65

Originally posted by @ASC8384 in #54 (comment)

@ASC8384 hi,当停滞不动时,任务管理器中可以找到 ffmpeg 进程吗?webui 中的检测选项会检测是否有 ffmpeg 进程正在运行,若无,可能是遇到了异常情况导致 ffmpeg 被退出了。

改进:录制过程中检测 ffmpeg 是否仍在正常执行,若无则重启进程。

Bug: 数据库读取保存逻辑

具体表现为无法保存并读取最新的数据

当前目录下共有三份文件welann_2023-11_wind_TEMP_READ.db welann_2023-11_wind_TEMP_READ1.db welann_2023-11_wind.db

其中 welann_2023-11_wind_TEMP_READ.db 为我把原本这个名字的文件命名为 welann_2023-11_wind_TEMP_READ1.db 后,复制welann_2023-11_wind.db 改名后的文件,此时webui上可以正常显示内容

那么为什么原本的 TEMP_READ 数据库得不到更新呢?
我现在使用的代码是最新版本的

球球你们把几百行上千行的代码拆一下吧(

更新:我把 TEMP_READ 删除后也可以正常出现新的 TEMP_READ文件,不知道之前的情况是代码中的哪个部分出错

不如每次都把目录下不合规的文件全删了,然后再生成 TEMP_READ 文件😈

做的太棒了!完美符合我的预期!

做的太棒了!完美符合我的预期!把我潜在的需求都挖出来了。

都可以成为一个独立的商业产品了,增加一些创意工坊和插件,直接可以创业开公司卖软件了!

做的真不错,特此来夸一下作者。

其实市面上基于LLM ChatGPT很多都是无中生有的需求,但是这个和人工智能结合起来,完全可以成为一个智能的贴身管家!

bug: webui 在疑似端口被占用情况下无法正常启动

日志:

Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\__main__.py", line 20, in <module>
    main(prog_name="streamlit")
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\click\core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\click\core.py", line 1078, in main
    rv = self.invoke(ctx)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\click\core.py", line 1688, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\click\core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\click\core.py", line 783, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\web\cli.py", line 233, in main_run
    _main_run(target, args, flag_options=kwargs)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\web\cli.py", line 269, in _main_run
    bootstrap.run(file, command_line, args, flag_options)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\web\bootstrap.py", line 430, in run
    asyncio.run(run_server())
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\asyncio\runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 649, in run_until_complete
    return future.result()
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\web\bootstrap.py", line 418, in run_server
    await server.start()
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\web\server\server.py", line 260, in start
    start_listening(app)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\web\server\server.py", line 128, in start_listening
    start_listening_tcp_socket(http_server)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\streamlit\web\server\server.py", line 187, in start_listening_tcp_socket
    http_server.listen(port, address)
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\tornado\tcpserver.py", line 183, in listen
    sockets = bind_sockets(
  File "C:\Users\Admin\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-mT-QPSca-py3.10\lib\site-packages\tornado\netutil.py", line 162, in bind_sockets
    sock.bind(sockaddr)
PermissionError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions

streamlit 版本:1.29.0

期望改进:

  • 运行前检测可用的端口,或在启动失败后尝试更换端口。

feat: 已有托盘在运行时,阻止托盘重复启动、且提供指引提示

#46

指引弹窗参考实现:

import ctypes

# 定义Windows API函数签名
MessageBox = ctypes.windll.user32.MessageBoxW

# 定义弹窗函数
def show_error_popup(message):
    MessageBox(None, message, "Windrecorder is already running", 0x40)

# 示例用法
show_error_popup("Another Windrecorder is running in system tray.\n\n已有「捕风记录仪」在系统托盘中运行。")

feat: 添加可调整录制画质的选项

现在以小文件体积优先的画质规格对于一比一录制 4k 显示器画面来说有些拉跨也不够用,希望能添加可配置调整预期画质的选项,以覆盖更多用户个性化需求:【低画质-有大概画面瞅瞅就够用】、【高画质-存储容量不是问题,希望有更清晰的素材回忆被记录】

random walk功能失效,且执行搜索时会query三次

全局搜索有个“random walk”随机搜索功能,点击后可以随机填入一个搜索词,但后边它失效了(表现在点击后无法将词填入搜索),于是提了个commit这样修,但似乎又将必须执行两次才能进行搜索的bug带回来了。

这个功能需要config/random_lexicon下有根据已有数据生成好的分词txt后才会触发显示,可以通过执行wordcloud.generate_all_word_lexicon_by_month()来生成

feat: 将工具集成到托盘菜单,替代通过脚本控制录制与启动 webui 的入口方式

1. 需求背景

  • 提供一个更便利直觉的使用入口,降低使用门槛;
  • 为未来集成打包做准备 #11

2. 需求范围

使用一个位于托盘的入口菜单来集成、替代 start_webui.bat 与 start_record.bat 入口的控制;

3. 功能详细说明

  • 当工具启动时,使用通知提醒托盘状态的存在;
    image

  • 具体菜单项:(icon 可用 emoji 实现)

  1. 启动搜索/设置界面
  2. 开始/暂停记录
  3. 更新
  4. 退出

image

附录

文件夹在重新命名后未考虑到原本的文件夹问题

在重命名 catch -> cache 的时候,忘记增加一个把原本的catch文件夹重命名为cache的逻辑了,所以会出现报错
更改文件名之后可以正常运行
[Errno 2] No such file or directory: 'cache\\LAST_IDLE_MAINTAIN.MD'

Starting Recording Screen...
No conda env active, defaulting to base
Traceback (most recent call last):
  File "D:\Windrecorder\recordScreen.py", line 38, in <module>
    with open(config.last_idle_maintain_file_path, "r", encoding="utf-8") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'cache\\LAST_IDLE_MAINTAIN.MD'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\Windrecorder\recordScreen.py", line 42, in <module>
    with open(config.last_idle_maintain_file_path, "w", encoding="utf-8") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'cache\\LAST_IDLE_MAINTAIN.MD'

bug: 当存在跨年的数据,“记忆摘要”tab 下的月份选择器范围约束会失效

我就知道这里肯定会有问题但还是拖到了跨年后才测出来

报错是由于月份控件未能约束选择的有效范围,导致超出定位到了不存在的查询范围,需要针对每年的实际数据限制选择范围。

image

File "C:\Users\Anton\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-QcaNLmW7-py3.10\lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 534, in _run_script
    exec(code, module.__dict__)
File "D:\git\Windrecorder\webui.py", line 94, in <module>
    windrecorder.ui.state.render()
File "D:\git\Windrecorder\windrecorder\ui\state.py", line 65, in render
    get_show_month_data_state(st.session_state.stat_select_month_datetime)  # 显示当月概览
File "D:\Windrecorder\windrecorder\ui\state.py", line 150, in get_show_month_data_state
    st.session_state.df_month_stat = state.get_month_day_overview_scatter(stat_select_month_datetime)
File "D:\Windrecorder\windrecorder\state.py", line 47, in get_month_day_overview_scatter
    result = df.loc[(df["videofile_time"] >= timestamp_start) & (df["videofile_time"] <= timestamp_end)]  # 获取当小时的所有数据
File "C:\Users\Anton\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-QcaNLmW7-py3.10\lib\site-packages\pandas\core\frame.py", line 3893, in __getitem__
    indexer = self.columns.get_loc(key)
File "C:\Users\Anton\AppData\Local\pypoetry\Cache\virtualenvs\windrecorder-QcaNLmW7-py3.10\lib\site-packages\pandas\core\indexes\range.py", line 418, in get_loc
    raise KeyError(key)

拆分 webui.py

webui.py 太长,可读性和可维护性都很差,需要拆分成多个文件

feat: 调整目录结构,使之更加简洁、整齐、易用

预期调整结构至:

- __assets__              # 资源文件
- userdata                # 将用户的持久化数据全部移入其中
  - db
  - result_lightbox
  - result_timeline
  - result_wordcloud
  - videos
  - config_user.json      # 移入其中
- windrecorder            # 程序核心文件
  - ui
  - config_src            # 将原先 config/src 中文件移入其中
  - onboard_setting.py    # 移入其中?
  - record_screen.py      # 移入其中?
  - webui.py              # 移入其中?

带来收益:

  • 可以读取\解耦\管理与备份特定用户数据

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.