No copy
Forward
Back
reload
;Message
首页
💼工作
🔧机械 ♑ 液压
✈ 航空相关
📏仪表及电气
⏳ 阀门相关
⛹️♀️生活
📽️影音相关
👀我看...
♪ 我听...
🗑️其他
🚴♀️游记
关于...
友链
统计
更多...
旅游地图
XC'S 图册
xc'音乐
XC'S视频
XS'小工具
单位转换
Search
1
小米11 Ultra 刷机rom、面具magisk、太极.阳折腾记
16,220 阅读
2
Solidworks 2016 激活Activator.GUI.SSQ产生的卡顿 闪退
9,156 阅读
3
Apache & PHP 8.0.X 分享Apache80_2454.8210_arm_64.qpkg
8,783 阅读
4
电液伺服阀特性参数、定义、技术术语,如何测试操作。
7,082 阅读
5
MXplayer,vlc如何访问远程webdav服务器,如何投屏?
6,552 阅读
登录
/
注册
Search
标签搜索
培训学习
软件分享
xc影后感
想说两句
液压经验
心灵感悟
行业知识
液压产品样册
AMESIM
试验台
测试设备
影评
测试内容与方法
生活小技巧
生活感言
仪表产品样册
追忆少年
游记
3D模型
typecho
xc
累计撰写
231
篇文章
累计收到
1,055
条评论
首页
栏目
💼工作
🔧机械 ♑ 液压
✈ 航空相关
📏仪表及电气
⏳ 阀门相关
⛹️♀️生活
📽️影音相关
👀我看...
♪ 我听...
🗑️其他
🚴♀️游记
页面
关于...
友链
统计
旅游地图
XC'S 图册
xc'音乐
XC'S视频
XS'小工具
推荐
单位转换
最新回复
泽泽
2025-08-14
匆匆过客
学习
123
2025-08-11
Level:2
感谢提供办法
天天
2025-08-11
匆匆过客
谢谢
搜索到
231
篇与
xc 发布的文章 -
的结果
2025-08-13
西瓜
一到夏天,我就特别爱吃西瓜,翠绿翠绿的西瓜皮内是饱满红色的汁水,对我真是一种无法抗拒的诱惑。小时候,家里也种西瓜,印象最深的就是爸爸带着草帽要到地里给西瓜上菜籽油,印象中好像是用麦秸秆吸饱菜籽油后,埋在西瓜藤的根系旁边,应该是一种肥料的作用吧,然后就是等西瓜成熟的时候,看上哪个就摘哪个,那种满足感来自随地坐在田地中,徒手砸西瓜的快感。还有就是邻居爷爷不知道是如何保存的西瓜,直到冬天拿出来和我们分享,那时候,农村可没有冰箱,那次印象特别深刻,冬天的西瓜,又凉又甜美。我有个特殊的爱好,就是很喜欢吃西瓜子,吃西瓜从来不吐西瓜子,以至于后期为了适应大多数的西瓜,培育出了无籽西瓜,大概原理就是人工干涉,影响授粉,导致种子无法成型,但我眼里,这是违反自然规律的,所有的动植物,都应该有种子延续下一代才是正常的自然现象。在西游记中,就有猪八戒吃西瓜的桥段,八、九十年代的影音资料中,也随处可见西瓜走进了千家万户,在中国老百姓眼里,可能觉得西瓜是生活中最普通的水果了。小时候记得,农村西瓜的价格就是几毛钱一斤,还有用粮食(小麦)换西瓜的情景,西瓜自由是很容易实现的事情,然而物以稀为贵,在我们相邻的日本或韩国,一个西瓜的价格可能是100多块人民币。一个东西的价值其实并不应该用金钱来衡量,就像我们生活中免费的空气、水、阳光、泥土等 资源,一旦限制或市场化,那价格高的想都不敢想,直接决定着人类的生存。
2025年08月13日
8 阅读
0 评论
0 点赞
2025-08-13
图纸是图片格式的尺寸测量,非矢量图。
概述最近,手里有个产品的外形图,已知一个尺寸和一张图片,如何获取它的其他尺寸呢?两个方案想办法把它转换为矢量图,最终导入到CAD中测量,转换方案有很多,以下是AI的回答: 1.1. AutoCAD的“Image Trace”功能AutoCAD提供了一个称为“Image Trace”(图像追踪)的功能,可以将图像转换为CAD线条。这项功能需要配合图像清晰度进行设置。 1.2 Inkscape是一个免费的矢量图形编辑器,支持将位图图像转换为矢量图。你可以使用这个工具先将图像转换为SVG文件,然后将其导入到AutoCAD或其他CAD软件中。类似软化还有 CorelDRAW。我利用python编写一个小程序,等比例换算,先标记图示校准线的长度,再按照比例计算勾画的其它线条数值。我刚开始没问AI,潜意识的觉得图片转矢量图比较难,方案二应该很简单,稀里哗啦一顿操作,软件编写好了,但总是不满意,尤其是它的平移采用了增量的方式,不好操作,算是一个小BUG吧,但实际测量使用还是可以用的。最佳方案后来经过一顿搜索,我觉得最佳的方案就是直接将图片导入到cad中锁定,手动勾画,设置号尺寸比例,应该是最快捷得到结果的。 当然,这是指熟悉CAD,并且有CAD软件的工程人员。矢量图方案那么,按照AI的指导,转换为可编辑的矢量图呢? 我先用Inkscape装PNG图片转换为SVG的矢量图,然后再保存为CAD可是别的DXF格式的文件,打开后是这样的。放大后是这样的虽然可以在CAD中标记测量了,但图片中的一根粗线,转换为多根无规则的曲线或折线,对于想精确测量,还需要进一步处理,比如合并多线段?但我没进一步研究,觉得挺复杂。直接图片测量那我编写的软件就毫无用处了吗?想了想,也未必,毕竟是一个很小的程序,运行快速就可以直观的看到结果,尤其是没有CAD或不熟悉的CAD的人群来说。 那我还是简单介绍一下吧。 使用方法用法很简单:加载你要测量的图片首先要描绘一条已知实际尺寸的直线。然后输入实际尺寸。剩下的就是勾画你想测量的直线或圆,图片区域,滚轮可放大或缩小。每段直线,勾画马上出结果,并且标记在直线附近可以编辑,平移或再次编辑或换颜色(平移不是很好用,将就用吧,实在不行就删除重画)保存,自动在图片的右下角添加图片的信息:觉得有用就自己下载使用吧附件隐藏内容,请前往内页查看详情
2025年08月13日
3 阅读
0 评论
1 点赞
2025-08-11
群晖Synology nas 中docker套件频繁启动失败,自修复代码
概述目前在NAS中的docker安装的应用越来越多,对我们来说,也越来越重要,但我的群晖是7.0版本,发现经常遇到docker套件启动失败,大多数都是需要手动修复启动。尤其是当反代lucky也是依赖docker时,一旦docker启动失败,环境为外网,那就傻眼了。编写自动检查代码每天定时检查一次docker的运行状态,如果发现启动失败或需要修复时,那就执行修复一次,这个问题就可以很好的解决,如果都修复不好,那就必须人工关涉了。代码如下隐藏内容,请前往内页查看详情使用命名文件为docker_autofix.sh,其中路径自定义给予足够权限:sudo chmod +x docker_autofix.sh在群晖DSM的“控制面板” > “任务计划”中。
2025年08月11日
3 阅读
0 评论
0 点赞
2025-08-08
6T Helicopter jack 直升机千斤顶支腿有限元分析仿真
概述千斤顶是我们学习液压知识的入门器件,虽然很常见,但使用在飞机的顶起机构时,就会显得非常重要,尤其是这种三柱塞伸缩的稳定性和可靠性。以前做的这种直升机千斤顶,这几天闲来无事,就在想,这些原件的强度、选型都合理吗?我们今天对它的支腿强度进行分析。千斤顶总承载是6T,会分布到3个支腿中,那么每个支腿受力是2T,通过脚杯,最终会传递到连接销轴和支腿钣金件上,由于是2个受力销轴,两块钣金,那么单个销轴受力就是1T,单个钣金受力也是1T。装配件分析比较繁琐,这种单个零件分析是最简单快捷的。钣金强度仿真销轴强度仿真可以看出,目前设计的强度都大于承载力,并且保留了一定的余量,可以放心使用。
2025年08月08日
2 阅读
0 评论
0 点赞
2025-07-28
2025.07 若尔盖草原,茂县古羌城
概述趁着年休,走趟四川阿坝州,这个地方一直是我的最爱,景色美的一塌糊涂,这次走的路线是:成都-九寨沟-若尔盖草原-唐克(黄河第一湾)-松潘-茂县(中国古羌城)-成都九寨沟依然很美,2016年我去的时候,写过相关文章 2016.03去了一次传说中的四川九寨沟 ,这次就不写了,不过这次看到犀牛海的水是我喜欢的颜色,就用瓶子收集了一些回来,打算长期保存。常规惯例,先来一张蓝天白云。黄河第一弯我的家乡在陕西和陕北的交界处,我们那边距壶口瀑布还是很近的,所以从小一提到黄河,就会想起壶口瀑布,然而,这次来到草原,听说是黄河的第一个转弯点,顿时来了兴趣,就去查看。面对着悠延漫长黄河,不有的感叹,这样养活了多少生命?若尔盖草原虽然看不到风吹草低见牛羊的状况,但辽阔的草原上,给人一种心胸阔达的意境,骑马自然是少不了的。{video title="草原骑马" aspect="9:16" autoplay loop muted}https://pic.xcshare.site/usr/uploads/2025/07/1285214758.mp4{/video}最让我印象深刻的就是我看到了一块红军过草地纪念碑,虽然现在是7月,成都市热的要死,但在草原上,我们需要增加衣服,加上飘了几滴雨,有的人已经穿上了羽绒服,这里的海拔大约是3600米,我紧跑了几步路,就觉得呼吸困难,所以,以我目前的状态:昨晚上休息良好,早午饭丰盛,身体强壮,身披冲锋衣,走在平坦的木制走廊上,看着这块纪念碑,特别的感慨,脑海里浮现出红军过草地的艰难情况,远处的沼泽地,是否吞没了我们的战士?茂县古羌城返回的路线经过了茂县,茂县在我脑海中的存在感几乎是全无,不返回查看路线,都不知道四川还有个茂县,但进入茂县,明显感觉到,这里是羌族的地盘,中国古羌城是本地的打卡点之一,我们错过了早上9.00的开城仪式,但依然参加了羌王带我们进行游览,很不错,感受羌族人文。
2025年07月28日
15 阅读
0 评论
0 点赞
2025-07-10
燃油喷嘴角度测量软件,Fuel nozzle angle measurement software
概述做了那么多年民航附件的测试台,对于燃油喷嘴测试,角度测量其实很多时候,手册并没有给出详细的测量方法,按照民航喷嘴测试标准 MHT3021-2011 民航喷嘴测试标准 ,一般采用的是顶针测试方法。既然是标准,那咱得尊重。顶针测量方虽然可去,但工装制作比较严格,且判断限定稍微有点宽范围,且不能留下证据,所以,部分场景就采用照片分析对角度进行测量。正文照片分析,当然有很多优势,快速,便捷,还能留下依据,最笨的办法自然是打印出来,手动测绘。这是我第一次开发软件,刚开始是依据视觉对比自动找出圆锥喷雾的边界值,但我发现,软件自动找出后,和我们人工判断,总是有些偏差,调试了很久,还是需要人工手动标定边界。既然是这样,那干脆由人工自己手动找出喷雾边界,也不在乎这点时间,手动标定边界也就几分钟的事情,就像顶针测试工装,还不是要调节测量很久。软件界面:布局如下,左侧是照片或视频的浏览区域,右侧是控制的按钮或调节按钮。摄像功能软件支持摄像头动态查看,当然也支持抓图,然后分析,完整的测试流程。校准功能根据软件自己的算法,根据两条边缘线,自动会计算出夹角和中心线,我自己是验证过的,计算的夹角很准确,但边界线毕竟是一个区域,为了达到每个人对角度的判定值,适用范围更广,我添加了校准功能,至少需要添加3个修正点,然后软件会二次拟合来补偿修正。输出设置当有修正值时,显示模式会有三个选择:1.只显示修正后的角度 2.只显示原始计算的角度 3.两者都显示根据自己需要选择,这些数值会打印到照片的左下角,在右下角显示操作者的信息、日期。保存的时候,也有两个选择,1.将原图复制一份,然后将操作员的标记记录添加到上面,作为结果图。2. 软件支持图片的放大缩小,保存的时候,按照当前窗口的样子进行抓屏保存。保存的文件会以件号命名,生成一个文件夹,一张原图,一张处理分析结果的图片,多次分析保存会以时间进行区分。授权:毕竟还是搞了那么久,请我喝杯咖啡,总还好吧?软件会免费试用10次,如果你确实觉得正好是你的需要再考虑联系我授权。不要去买用不到的东西,我也真心希望这个软件能够帮到你。现在是在测试阶段,如果你能反馈出对改进有价值的意见,可以免费给你激活。软件下载喷雾角度分析系统.zip隐藏内容,请前往内页查看详情
2025年07月10日
9 阅读
0 评论
1 点赞
2025-07-08
ESPhome扩展EDP32 开发板的物联网功能
概述ESP开发板在传感器的采集和系统元件控制上,有很多优势,数模转换可以规避一些纯电气的干扰,更何况那么小巧,还自带局域网功能,以前学的是把数据显示在一块很小的屏幕上,当然利用它的局域网功能,利用Arduino IDE编写一个很简单的网站,也是完全没问题的。最近一直在想,如果我需要一个更加丰富展示数据这块的网站,有大量的动画或Js图表,依靠ESP单片机可能就吃不消的,那么我就只用它来负责上传或下传数据,依靠电脑或服务器 来做网站搭建和渲染,各自发挥自己的长处,那就完美了。通过一番搜索,大概了解到home assistant就是干这个事情的,和ESP开发板连接,就需要安装一个独立的模块:ESPhome,如果是树莓派,那就可以直接在home assistant中安装,就想我是DOCKER的环境,那就需要单独安装,也没啥关系,就多个端口而已。ESPhome我理解的就是厂家自己开发的平台,只是集成到了home assistant,,它也有自己的简易网页,对数据进行参考或开关的控制,只是想表达的更丰富,增加一些联动控制功能,那就需要home assistant进行整合了。正文ESPhome基础安装好ESPhome容器,打开后,首先要添加ESP开发板,首次添加,需要数据线进行连接。等把ESPhome的程序刷进ESP开发板后,后期更新就可以愉快的使用wifi更新了。网页上有说明:添加好设备后,会自动生成一个yaml文件,也就是配置文件。如果这里和Arduino IDE进行对比的话,你会发现yaml文件要简单明了,更高效,不再像Arduino IDE那么繁琐。ESP32-S3 引脚以下是我配置的一份,供参考,基本把ESP32-S3发挥到了极致,该用的协议都用到了,而且这些功能我都是测试过的,可以正常使用,我们先看引脚定义:协议 / 功能实例 (Instance)角色 (Role)分配的GPIO引脚选用原因 / 备注继电器控制Relay 1Digital OutGPIO1通用GPIO,干净无冲突。 Relay 2Digital OutGPIO2通用GPIO,干净无冲突。数字量输入 GPI40 数字量输入 GPI41有人存在检测ADCADC 1Analog InGPIO4 (ADC1_CH3)ADC1通道,通用GPIO。 ADC 2Analog InGPIO5 (ADC1_CH4)ADC1通道,通用GPIO。 I2CI2C_0 (默认)SDAGPIO8Arduino框架下的默认SDA引脚。 SCLGPIO9Arduino框架下的默认SCL引脚。PWMPWM1Analog OutGPIO6通用GPIO,干净无冲突。 PWM2Analog OutGPIO7通用GPIO,干净无冲突。 SPI (共享总线)SPI_BusMOSI--->SDIGPIO11共用,默认FSPI总线引脚。 MISO--->SDOGPIO13共用,默认FSPI总线引脚。 SCK--->CLKGPIO12共用,默认FSPI总线引脚。 SPI_Device_1CS 1--->CEGPIO10独立,用作设备1的片选。 SPI_Device_2CS 2--->CEGPIO21独立,用作设备2的片选。 UARTUART_1-485TXGPIO17默认的UART1发送引脚。 RXGPIO18默认的UART1接收引脚。 UART_2-ttlTXGPIO15通用GPIO,干净无冲突。 RXGPIO16通用GPIO,干净无冲突。说明,其中UART_1 我是通过TTL转RS485 连接MODBUS的通讯设备。YAML文件代码:隐藏内容,请前往内页查看详情安装模块写好YAML后,就需要进行安装,由于我们前面已经将ESP32和ESPhome进行了连接,现在就可以通过wifi进行安装了,另外需要注意的,需要配置https,才可以在线安装,如果是http,那可能需要保存到本机,然后通过数据线进行安装。由于安装的时候,需要远程下载一些必须的模块应用,需要外网,国内下载速度超级慢或无法下载,可以通过VSCODE+插件PlatformIO IDE,在本地配置下载好,毕竟win系统要灵活一些,然后把C:\Users\你的用户名.platformio下的packages和platforms文件夹复制到docker的映射文件夹:esphome(我的映射文件夹).esphome\platformio下面,最好也带上cache文件夹一起复制。上图提示需要:platformio/framework-arduinoespressif32 @~3.20005.0如果你不能外网,就算采用VSCODE+插件PlatformIO IDE也是很难配置的,漫长的等待我是经历过的,所以,ESP32-S3和ESP8266-D1mini所需的文件,我可以通过网盘分享出来,给需要的兄弟们。这是ESP32打来网页功能,自带的网页监控画面,目前我没有连接传感器,所以,没数值。home assistant整合整合到home assistant中比较简单,添加设备,就可以找到你目前配置好的ESP32,在home assistant中,可以完成数据的曲线表达,逻辑控制功能,这里网上的教程比较多,我就不做更多介绍了附件:platformio.zip隐藏内容,请前往内页查看详情
2025年07月08日
5 阅读
0 评论
0 点赞
2025-05-05
ALIST 外调mpv播放器进行在线播放视频
概述:最近对mpv播放器很感兴趣,alist网盘程序虽然下面继承了多个第三方播放器,但是没Mpv,原因就是mpv播放器默认不会将mpv://协议注册到系统中。正文:那我们就自己动手吧,大概原理也很简单,让系统知道mpv://协议应该调用mpv播放器进行播放,另外就是在alist网页中注入相关按钮和生成mpv://协议。我们先完成系统注册,网上都会提到使用 mpv-handler ,但我试了多次,最终也没成功,我很奇怪,它通过注册表启动mpv-handler.exe,然后这个应用查找本地的config文件,在config文件中,我们要修改本地的mpv播放器路径。流程多次尝试,最后总结的成功流程:先系统注册表,告诉系统mpv://协议,就去启动一个mpv-handler.bat或mpv-handler.exe的文件,因为此时的URL真实地址前面多了一个mpv://,MPV播放器正常来说,还是不识别的,当然,有的系统会被识别,为了统一标准,提高运行成功率,我们需要mpv-handler.bat或mpv-handler.exe将mpv://删除,只保留后面的视频地址给Mpv播放器。注册mpv-handler.bat或mpv-handler.exe创建注册表脚本新建一个文本文件,粘贴以下内容,然后另存为 mpv_protocol.reg(确保保存类型选"所有文件"):隐藏内容,请前往内页查看详情{callout color="#f0ad4e"}"D:\mpv\mpv-handler.bat" 要换成你的本地路径{/callout}生成mpv-handler.bat@echo off setlocal :: 去掉前缀并解码 set "raw_url=%~1" set "raw_url=%raw_url:mpv://=%" :: 确保 URL 是有效的(修复 https// 到 https://) set "raw_url=%raw_url:http//=http://%" set "raw_url=%raw_url:https//=https://%" :: 打印 URL 和路径以调试 echo Incoming URL: %~1 echo Decoded URL: %raw_url% echo MPV Path: "D:\mpv\mpv\mpv.exe" :: 启动 mpv start "" "D:\mpv\mpv\mpv.exe" "%raw_url%" :: 检查是否成功启动 if %errorlevel% neq 0 ( echo Failed to start MPV! Error code: %errorlevel% ) else ( echo MPV started successfully! ) 生成mpv-handler.exe首先要安装好python其次安装模块pip install pyinstaller pip install pyinstaller 系统有多个python记得前面加python -mmpv-handler.py( 请根据需要修改D:\mpv\mpv\mpv.exe)import sys import subprocess def fix_url(url): """ 修复 URL 格式,例如将 https// 修正为 https:// """ url = url.replace('mpv://', '') # 去掉前缀 url = url.replace('https//', 'https://') # 修正协议部分 url = url.replace('http//', 'http://') # 修正协议部分 return url if len(sys.argv) > 1: raw_url = sys.argv[1] fixed_url = fix_url(raw_url) # 修复 URL mpv_path = r"D:\mpv\mpv\mpv.exe" # 启动 MPV 播放器并传入修复后的 URL subprocess.Popen([mpv_path, fixed_url])编译pyinstaller --onefile mpv-handler.py出错就强制编译C:\Users\Admin\AppData\Local\Programs\Python\Python312\Scripts\pyinstaller.exe --onefile mpv-handler.py 新生成的exe文件在:dist\mpv-handler.exe修改alist页面大概alist管理页面,在全局的自定义中,添加以下代码。<script> (function() { 'use strict'; // --- Configuration --- const MPV_PROTOCOL = 'mpv://'; const BUTTON_CONTAINER_SELECTOR = 'div.hope-flex[class*="igXrpAn-css"]'; // More flexible selector const EXISTING_BUTTON_SELECTOR = 'a.hope-anchor[href*="://"]'; const MPV_BUTTON_ID = 'alist-external-mpv-button'; // *** IMPORTANT: Make sure this path is correct OR use Base64 *** const MPV_ICON_SRC = 'data:image/png;base64,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'; // Or 'data:image/png;base64,YOUR_BASE64_STRING' const DEBUG_MODE = true; // Set to true for more console logs // --- Logging Function --- function log(...args) { if (DEBUG_MODE) { console.log('[AList MPV Button]', ...args); } } log("Script Initializing..."); // --- Helper Functions --- function extractRawUrl(href) { if (!href) return null; log("Attempting to extract raw URL from:", href); const specificSchemes = [ { prefix: 'iina://weblink?url=', isBase64: false }, { prefix: 'potplayer://', isBase64: false }, { prefix: 'vlc://', isBase64: false }, { prefix: 'nplayer-', isBase64: false }, { prefix: 'omniplayer://weblink?url=', isBase64: false }, { prefix: 'figplayer://weblink?url=', isBase64: false }, { prefix: 'infuse://x-callback-url/play?url=', isBase64: false }, { prefix: 'filebox://play?url=', isBase64: false }, { prefix: 'intent:', isBase64: false }, { prefix: 'iplay://play/any?type=url&url=', isBase64: true } ]; for (const scheme of specificSchemes) { if (href.startsWith(scheme.prefix)) { let urlPart = href.substring(scheme.prefix.length); // Handle intent URLs if (scheme.prefix === 'intent:') { const intentEndIndex = urlPart.indexOf('#Intent'); if (intentEndIndex !== -1) { urlPart = urlPart.substring(0, intentEndIndex); } } // --- 修改开始: 先移除后缀,然后解码 --- urlPart = urlPart.replace(/:0$/, ''); // 移除潜在的 :0 后缀 if (scheme.isBase64) { try { urlPart = atob(urlPart); log("Decoded Base64 URL:", urlPart); } catch (e) { console.error("Error decoding Base64 URL:", e, urlPart); return null; } } else { // 对非 Base64 的 URL 进行 URL 解码 try { urlPart = decodeURIComponent(urlPart); log("URL-decoded part:", urlPart); } catch (e) { console.error("Error URL-decoding part:", e, urlPart); // 如果解码失败(比如 URL 本身有问题),也认为无效 return null; } } // --- 修改结束 --- // 现在检查解码后的 URL if (urlPart.startsWith('http://') || urlPart.startsWith('https://')) { log("Extracted URL:", urlPart); return urlPart; } else { log("Processed part doesn't look like a valid URL:", urlPart); } } } // Fallback (也需要解码) const genericMatch = href.match(/(https?:\/\/.*)/); if (genericMatch && genericMatch[1]) { try { const fallbackUrl = decodeURIComponent(genericMatch[1].replace(/:0$/, '')); log("Extracted URL using fallback (decoded):", fallbackUrl); if (fallbackUrl.startsWith('http://') || fallbackUrl.startsWith('https://')) { return fallbackUrl; } } catch (e) { console.error("Error URL-decoding fallback URL:", e, genericMatch[1]); } } console.warn("Could not extract raw URL from:", href); return null; } function createMpvButton(rawUrl) { if (!rawUrl) return null; log("Creating MPV button for URL:", rawUrl); const mpvUrl = MPV_PROTOCOL + rawUrl; const link = document.createElement('a'); link.id = MPV_BUTTON_ID; // Use specific classes found in the example, be careful if they change link.className = 'hope-anchor hope-c-iHuheP hope-c-PJLV hope-c-PJLV-idrWMwW-css'; link.href = mpvUrl; link.target = "_blank"; link.style.marginLeft = '4px'; // Add a little space const img = document.createElement('img'); // Use specific classes found in the example img.className = 'hope-image hope-c-PJLV hope-c-PJLV-idGrHCo-css'; img.src = MPV_ICON_SRC; img.alt = "MPV"; img.title = "使用 MPV 播放"; // Add basic error handling for the image img.onerror = () => { console.error(`Failed to load MPV icon: ${MPV_ICON_SRC}`); img.alt = "MPV (icon error)"; // Show text if icon fails img.style.width = '20px'; // Give it some size even without icon img.style.height = '20px'; img.style.border = '1px solid red'; // Make it visible }; link.appendChild(img); return link; } function addMpvButtonToContainer(container) { if (!container) { log("addMpvButtonToContainer called with null container"); return; } if (container.querySelector(`#${MPV_BUTTON_ID}`)) { log("MPV button already exists in container:", container); return; // Already added } log("Attempting to add MPV button to container:", container); const existingButton = container.querySelector(EXISTING_BUTTON_SELECTOR); if (!existingButton || !existingButton.href) { log("No existing button with href found in container."); return; } const rawUrl = extractRawUrl(existingButton.href); if (!rawUrl) { log("Failed to extract raw URL from existing button:", existingButton.href); return; } const mpvButton = createMpvButton(rawUrl); if (mpvButton) { // Append the button container.appendChild(mpvButton); log("MPV button added successfully."); } else { log("Failed to create MPV button element."); } } // --- MutationObserver Logic --- const observerCallback = (mutationsList, observer) => { log("MutationObserver detected changes..."); for (const mutation of mutationsList) { if (mutation.type === 'childList') { mutation.addedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE) { // Check if the added node itself is the container if (node.matches && node.matches(BUTTON_CONTAINER_SELECTOR)) { log("Container node added:", node); addMpvButtonToContainer(node); } // Check if the added node contains the container else if (node.querySelectorAll) { const containers = node.querySelectorAll(BUTTON_CONTAINER_SELECTOR); if (containers.length > 0) { log("Container node found within added node:", node); containers.forEach(addMpvButtonToContainer); } } } }); // Also check removed nodes in case the container is re-rendered quickly // This might be overkill, but could help in some frameworks mutation.removedNodes.forEach(node => { if (node.nodeType === Node.ELEMENT_NODE && node.matches && node.matches(BUTTON_CONTAINER_SELECTOR)) { log("Container node removed, will re-check on next addition."); } }); } // Optional: Observe attribute changes if the container exists but buttons are added later // else if (mutation.type === 'attributes' && mutation.target.matches(BUTTON_CONTAINER_SELECTOR)) { // log("Attributes changed on container, re-checking:", mutation.target); // addMpvButtonToContainer(mutation.target); // } } }; // Start observing const observer = new MutationObserver(observerCallback); // Observe body, but consider observing a more specific, stable parent if possible observer.observe(document.body, { childList: true, subtree: true }); log("Observer started."); // --- Initial Check --- log("Performing initial check for existing containers..."); document.querySelectorAll(BUTTON_CONTAINER_SELECTOR).forEach(container => { log("Found existing container on load:", container); addMpvButtonToContainer(container); }); log("Initial check complete."); })(); </script>总结:mpv-handler.bat和mpv-handler.exe二选一就可以了,在win系统中exe文件要比bat文件更可靠一些,但bat文件修改起来更方便一些,按需选择,最后记得更新mpv_protocol.reg的位置信息。我已经打包好了这些文件,确保你的mpv.exe和我一致的话(D:\mpv\mpv\mpv.exe),拿来直接用就可以了。{alert type="info"}mpv-handler.bat或mpv-handler.exe的路径问题,按照我上面的代码,就需要把这两个文件拷贝到D:\mpv的路径下才行,或者根据自己情况修改!{/alert}隐藏内容,请前往内页查看详情
2025年05月05日
107 阅读
3 评论
0 点赞
2025-05-01
Topaz Video AI 任务结束自动关机小程序
概述Topaz Video AI做视频增强,这个时间一般都很长,应该多数人都希望有个执行任务结束后,有个自动关机选项。可是找了半天,也没找到。索性用AI工具编写一个吧,使用 Gemini 2.5 Pro Preview 03-25 编写,调试了几次,就可以了,分享给大家。运行环境:需要 python并且需要安装依赖pip install psutil或者python -m pip install psutil运行执行bat文件即可或者python topaz_shutdown_monitor.py运行原理监控Topaz Video AI.exe在运行,Topaz Video AI的任务主要是启用了ffmpeg.exe 进行编码,我仔细观察了一下,发现ffmpeg.exe 进程占用率很高,所以这个程序就是监测:在Topaz Video AI启动的情况下ffmpeg.exe的进程,当ffmpeg.exe消失后,就代表任务完成,进入关机倒计时。交互设置ffmpeg结束后多久,就认为任务完成。设置关机倒计时时间。探讨:这里我提一个自己的小疑问,电脑有GPU,但我发现ffmpeg.exe运行主要还是用到CPU,我以为是ffmpeg.exe没有带GPU硬件编码驱动,因为我看到Topaz Video AI自动生成的ffmpeg.exe文件很小,但是当我把我电脑上带有GPU驱动的ffmpeg.exe拷贝覆盖后,结果Topaz Video AI根本无法识别。所以,CPU满载运行,GPU空闲,有人解决这个问题吗??附件:Topaz Video AI关机程序隐藏内容,请前往内页查看详情
2025年05月01日
11 阅读
0 评论
0 点赞
2025-04-30
104宿舍的兄弟们,你们还好吗?
概述:想起我很多年前(2008)做的一个网站,里面有最有价值的是大学同宿舍的兄弟们的介绍,我找了很多备份资料,最终在百度网盘中找到了源代码的备份,纯html静态网页,但我关注的内容好好的保存了起来。正文:我尽可能的把这个页面原封不动的保存在本文中:照片104宿舍从左至右王海斌、郭克文、梁远伟、赵三牛、宋大年(下面那个胖子)、陈辉(上面张牙舞爪的那个)、催路松介绍(我当时的记录)郭克文特点:人长得挺帅,但就是个子有点低。一口破嗓子能喊出比较动听的歌曲!梁远伟特点:一个大网虫 ,自从迷上了网络游戏,就再也没有从网吧走出来过!崔露松特点: 多功能人才,啥都会,但都不是很厉害!王海斌特点:就是我啦!呵呵!我对自己不想有任何评价,因为要我说自己,我老是说自己好的不得了,有私人因素在里面,所以嘛!还是交给大家了.....点这里你就能找到我~-~陈辉特点:长的好结实,特别喜欢足球,是我们班的主将! 赵 犇特点 :整天喊着失恋,一失恋就空虚,一空虚就拉我们去喝酒! 宋大年特点:此人虽然长得不怎么样,但是在老师眼里都是好学生,在同学眼里都是好知己,我相信将来在他妻子面前也一定是个好丈夫 !总结大学的我们就是这样,天真、调皮、快乐、无忧无虑,大家开开心心的度过了几年,如今已经毕业参加工作了,我们几个好像从没再见过面,去年回西安的时候,我碰到了宋大年,和他吃了顿饭,这么久了,他依然是那么幽默风趣,人也帅气了很多,身上到处都是名牌,晚上还吵这要挑CS,呵。。。不知道其他几个都还好吗? 说起我们宿舍,我就想笑,我们班是我们学校最差的班,我们宿舍可以说是我们班最差的宿舍,7个人就喜欢喝酒,一喝就是十几瓶,几十瓶,连个菜都没有,就买几袋花生米,玩着文字游戏,喝的不亦乐乎,连平时检查卫生的,安全的都不愿意来,后来毕业考试的时候,我们宿舍7个人,就又5个人同时挂科,剩下的两个,当时还是打算升学考试,才用了点心,否则。。哈哈。。虽然我们的学习不好,但我们并不笨,全校的兵乓球冠军在我们宿舍,校队的足球好手在我们宿舍,各种网络游戏,单机游戏级数比较高的也在我们宿舍,大家毕业考试并不理想,但在社会中,我相信从我们104宿舍走出去的,一定不会很差。 祈福大家!一切都好!
2025年04月30日
18 阅读
0 评论
2 点赞
1
2
...
24
✖
使用
Typecho
建站,并搭配
joe
主题(有修改)
蜀ICP备2022005623号-2
川公网安备 51012202001212号
本站已运行
00
天
00
时
00
分
00
秒
Copyright © 2022.03 ~
Xcshare
All rights reserved.