标签 go 下的文章

我通过自制的Kodi命令行刮削器申请到了JetBrains的开源许可证

项目地址

Kodi 刮削器命令行版本,使用TMDB数据源
带logo、分类、节目表的北京IPTV单播列表
命令行批量字幕命名工具

更早的起源

2021年的双十一我在京东购买了索尼的X91J 65英寸版本,同时幸运的使用了那个2000的特殊优惠券,感谢京东没有回收这个羊毛。

电视安装完成后,我开始着手构建自己的影音环境,在此之前,我是通过PT下载到NAS,然后电脑+2.0音箱播放,没有刮削,这之后我会转移到电视上来。

索尼电视使用的是和当贝合作的Android系统国内特供版,不过也允许用户随意的安装第三方应用,我进行了大量的尝试,最后只保留了Bilibili、Kodi、SmartTubeNext、Netflix、Aptoide这几个应用。

其中Kodi用来管理我从网络下载的电影和剧集,提供海报墙,观看进度跟踪,因为Kodi自带的刮削器不能满足我的需求,tinyMediaManager等半自动又太麻烦,所以我决定自制刮削器。

申请过程

大约4个月前,我研究了下Kodi自带的刮削器的源码,发现大致的原理是Kodi负责扫描视频文件并提取名称,刮削器只能根据处理好的名称来获取信息,这会有很多问题,我在v2ex发帖求助如何改进这个扫描过程,评估大家给的意见后,我决定自制刮削器。

今年1月份的时候,我提交了第一行代码,两天后整理在Github开源,然后开始后续的维护,并且处理了很多特殊情况,还支持了调用Kodi主动刷新媒体库,后续可能还会支持音乐刮削,不过优先级并不高,毕竟在电视上听音乐的场景不多。

本月1号的时候,我申请了JetBrains的开源许可证,这几天放假只顾着玩,今天才发现已经收到许可了,全家桶有效期1年,一年后项目还在活跃就可以续期。鉴于部署成本比较高,而且我也没有去推广,所以项目并不热,只有9个star,不过这并没有影响我的申请。

其他

申请开源许可证,需要打开Github个人主页的邮箱显示,我是在申请成功后重新隐藏。

根据描述,如果一年后许可过期项目不在活跃不再续期,我还是可以继续使用2021.03版本,只是不能再升级,这和付费版本是一样的授权方式。

这个命令行刮削器的具体情况可以去Github主页了解,这里就不详说了,后续我应该还会继续更新,毕竟自己还要用,只是担心1年后可能没有什么可以加的功能导致项目不再活跃。

除开这个刮削器,为了更好的看电视,我还创建了很多其他的小工具,暂时放出来的只有文首的两个,IPTV列表这个配合Kodi的IPTV插件,观看效果还不错,重命名是解决从网上下载的字幕因为命名不规范导致Kodi识别不到的问题。

[记录]关于新增新字段sqlx报错missing destination name

正常情况下,将数据的字段映射到一个struct的时候,需要使用db这个tag指定关系,典型的使用场景如下:

type News struct {
    Id int64 `json:"id" db:"id"`
    GroupId int64 `json:"group_id" db:"group_id"`
}

news := &News{}
err := db.QueryRowx("select...", x).StructScan(news)

部分类库比如xorm会尝试根据驼峰、下划线去对应,sqlx并不会,而是会报panic级别的错误。

查看源码,发现StructScan内部调用了scanAny这个方法,继续往下看,可以发现这样一段代码:

fields := m.TraversalsByName(v.Type(), columns)
// if we are not unsafe and are missing fields, return an error
if f, err := missingFields(fields); err != nil && !r.unsafe {
    return fmt.Errorf("missing destination name %s in %T", columns[f], dest)
}

这里判断是否有字段缺失,同时有个unsafe开关,如果没有打开,就会报错,unsafe是在初始化db链接的时候指定的,可以通过调用db.Unsafe()方法返回一个打开unsafe开关的db实例,至于是全局使用还是每次调用时指定,看你自己了。

PS: 如果愿意动动手,也可以通过db.Mapper = xx覆盖默认的Mapper方法,其中包括字段名映射逻辑,比如把xorm的逻辑移植过来。

正则表达式阶段性记录

昨天在写一个diff脚本的时候,需要过滤#开头的注释,以及过滤掉过滤#后出现的空行,Google后我的脚本变成了grep -v '^#' | grep -v '^$' 这样,可用但是并太不明白^$的意思,猜测可能是开始即结束?

因为我尝试加上几个空格匹配会失败,且改成 grep -v '^#'|grep -Ev '^\s+$' 是可以的,今天又搜了下想确认猜测,然而并没有找到相关的说明,但是也有其他收获。

首先是梳理了下正则的各种分支和规范,比如POSIX、Perl、RE2等以及包含的子集。

其次是匹配包括换行的写法,以前在写PHP的时候比较习惯使用flag,比如i、s、U这些,现在又多了几种写法:[\s\S]*[\d\D]*[\w\W]*[\v\V]*[\h\H]*

是不是挺迷惑,我一开始也是,那现在再来回顾下语法:

\d    数字,[0-9]
\D    非数字,[^0-9]
\s    白空格,[\t\n\f\r ]
\S    非白空格,[^\t\n\f\r ]
\w    整个单词,[0-9A-Za-z_]
\W    非整个单词,[^0-9A-Za-z_]
\h    水平空格
\H    非水平空格
\v    垂直空格
\V    非垂直空格

- 阅读剩余部分 -

入 Go 坑

已经写一两个月的 Go 了, 也跳过 N 个坑了, 目前还保持着热度...
上上周用 Go 重写了之前的短网址, 已经跑一段时间了 fengqi.tk, 目前还只是测试阶段, 不会清理数据, 但是会有不稳定的情况.