Code Monkey home page Code Monkey logo

windrecorder's Issues

安装时候报错

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

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

在重命名 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'

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

1. 需求背景

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

2. 需求范围

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

3. 功能详细说明

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

优化“当前活动”策略

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

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

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

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

image

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

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

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

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

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开发,这应该是代码间传输数据类型的问题吧?

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)

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

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

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

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

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

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

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

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

请问
46e9f01607baa98968c110ccb10c4d2
这样怎么办?

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

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

1. 需求背景

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

2. 需求范围

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

3. 功能详细说明

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

image

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

image

feat: 添加截图美化工具

1. 需求背景

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

2. 需求范围

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

3. 功能详细说明

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

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

  • 生成器的 UX 链路:
    image

附录

figma:待补充

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已有「捕风记录仪」在系统托盘中运行。")

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 文件😈

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              # 移入其中?

带来收益:

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

拆分 webui.py

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

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

目标:

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

Refer:

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

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

Milestone:

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

中文OCR准确率很低

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

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

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

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

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

期望改进:

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

不支持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'

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

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

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

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

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

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

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

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: 将工具集成到托盘菜单,替代通过脚本控制录制与启动 webui 的入口方式

1. 需求背景

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

2. 需求范围

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

3. 功能详细说明

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

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

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

image

附录

偶尔 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 是否仍在正常执行,若无则重启进程。

使用时ffmpeg占用大量内存

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

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.