别再忍受网抑云欺压了,用起外网IP来搭建自己的私有云音乐吧

作者:V君 发布于:2022-3-14 11:01 Monday 分类:我的应用

TL;DR for 立即想拿来用的人:[ 下载 | 源代码 ]

1)解压,用文本编辑器修改配置文件 config.json
 ◆ListenPrefix 用来配置监听的IP和端口,格式是 http://+:12345
  若要指定监听的网卡,将加号改成对应网卡IP即可
 ◆Libraries 里面每一项作为音乐库定义,Key是显示名称,Value是物理路径
  音乐库目录结构
  $/专辑
    cover.jpg
    01.flac
    02.flac
    03.flac
    /BK
      scan1.png
      scan2.png
      scan3.png
    /AAC_
      01.m4a
      02.m4a
      03.m4a
 ◆MediaFilePattern、BkFilePattern 保持默认即可
2)然后直接双击 FNZCM.ConHost.exe 启动,启动后扫描媒体库获取元数据生成列表
在浏览器打开监听的地址就可以浏览媒体库、专辑、音轨、BK,音轨页面可以在线播放
当文件发生变化时,点击首页底部的 Reload 来刷新媒体库
接着就可以将M3U8链接甩给播放器 APP 在线播放
X)进阶:如果嫌FLAC使用流量太多,肉疼的话还可以批量生成高品质AAC(m4a)
(文件大小缩减到一半以下,音质损失可忽略不计)
只是目前配套的批量转换工具还没有发布直接可用的版本
感兴趣的小伙伴可以阅读源代码了解使用方法,自己编译一个来用)

简单扯一扯缘起

由于无法忍受网抑云肆意下架、移除歌单中的收藏项,而且自己上传一些私有音乐,相似但不同的变异版本它识别得乱七八糟,我决定丢掉它找别的方法听歌。(其实最无法忍受的是吃相太难看)

起初回到原始的下载 FLAC 放到电脑或者手机直接播放,在电脑直接播放本地(局域网共享)文件还行,只是手机端就没这么方便了,还得考虑存储空间,得想办法随时随地直接播放家里的媒体库才行。

简单扯一扯开发感想

碍于爱折腾的个性,首先不使用现成的产品,不管你免费与否、开源与否❌

私有云音乐的本质就是一个流媒体服务器,如果是局域网,直接走共享即可,但是出门在外还想用家里的音乐库,这就得想想办法了。

最开始的步伐迈开的太大,想做一个大而全的网页版,扯蛋不说一直没整出一个像样的东西来

后来想起音乐播放 APP 可以载入 M3U8 格式的列表,这样就不用自己造界面的轮子了,咱可以基于静态目录结构实现随时随地用 VLC 之类的 APP 在线播放。用播放器的好处还有兼容性高,已知一些高规格的FLAC文件无法在浏览器播放,而 VLC 能轻松播放。

于是这个简化版的私有云音乐就出来了,它还有一个接地气的内部名称:“土炮云”

标签: 软件开发 C# HTTP 音频 传输协议 流媒体

评论(1) 引用(0) 浏览(602)

通过WebSocket隧道,尝试将ASP.NET网站空间当作VPS来使用

作者:V君 发布于:2021-1-17 11:50 Sunday 分类:折腾手记

先上 PoC源代码 再开始扯,这次不是着重解决某个问题,而是尝试确定某种可能性。

以前使用过 C9.io 提供的免费在线开发环境来搞各种事情,包括正常上网,无非是利用 Web Sockets 建立隧道,然后配合客户端连接到在上面运行各种应用程序。
现在C9已经被收购且停止免费了,那就公开来说吧w

这次也不例外,只不过花了点钱搞了个支持 ASP.NET 4.5+ 的网站空间,然后在上面搞类似的事情。

基础设施 -- WebSocket 转 TCP 模块

首先要使用 WebSocket 来建立一条隧道,要求网站空间支持且启用 WebSocket,不然没法整。这里有个未经优化,但还能凑合着用的例子,只要挂在 HttpModule 中 HttpApplication 的 PostMapRequestHandler 事件,填好参数就能吃。

折腾1 -- SSH 终端

略去寻找绿色 SSH 服务端的辛酸过程,时间直接转到发现 FxSsh 这个纯托管实现的服务端。这里要分成两个部分来扯,分别是使用基于 ConPTY 的 MiniTerm 和兼容低版本 Windows 的简单兼容实现。由于 FxSsh 主要实现的是 SSH 协议通道,服务端的终端并没有适配,尽管源代码中带了个名为 MiniTerm 的 DEMO 来适配到较新系统的 ConPTY。

第一部分:基于 MiniTerm 的实现。原版的 MiniTerm 虽然导入了 ResizePseudoConsole 这个 API 但并没有使用。而且由于 NuGet 上的 FxSsh 不是最新版,没有窗口大小变更事件的支持。 因此我把他们全都拷贝到自己的项目中并注明来源了。在此之上再加以修改 MiniTerm 使窗口大小变更事件适配到 MiniTerm 的实现。目前并没有发现太多问题。有点小遗憾的是 MiniTerm 使用的 ConPTY 功能是 Windows 10 近些年的更新才引入的,因此许多网站空间的系统都不支持,会报「在 kernel32 中找不到 CreatePseudoConsole 入口」的错误,因此我准备了另一个方案,见接下来的第二部分。

第二部分:另行实现一个兼容低版本 Windows 的控制台进程适配。在项目中起名为 EasyTerminal。起初简单将控制台进程的标准输入输出还有错误输出重定向到 SSH 通道,然鹅,回车键不起作用,而且不回显。将回车键拦截下来,改成 StandardInput.WriteLine 调用,总算是能满足最基本的需求。尽管还是没有实时回显,得按下回车键之后才显示出来,功能按键和窗口大小什么的更无从说起。目前仍在使用零碎的时间持续摸索(咕XD)…

折腾2 -- 正常上网 将网站空间当作 V2 服务端使用

编译部署这个项目,然后将 V2 的两个 exe 和配置文件丢进 App_Data 目录,然后使用 WS 隧道连接到监听的 URL,最后在 V2 客户端指向 WS 隧道客户端,这时候就能吃了。分配了较大的缓冲区大小,这应该能有效减少损耗,如果网速慢,你需要测一下空间到你的网速。

不水。

标签: 软件开发 个人服务器 C# HTTP Web技术 传输协议 Windows .NET IIS WebSocket

评论(0) 引用(0) 浏览(441)

吐吐苦水: 收集一些老项目中不合理的设计与编码,给后来开发人员添麻烦的例子

作者:V君 发布于:2018-9-9 2:11 Sunday 分类:填坑经验

从17年下半年开始收集,内容不多就先不放出来占条目

 

供引以为戒

 

1) 返回值是集合的方法,查询无结果时返回null

调用者必须繁琐地检查空引用

应参考Linq的ToArray, 在无结果时返回元素个数为0的集合实例

 

2) 对于WEB请求无论报错还是无结果,返回空字符串,尽管把错误写入日志

无法从浏览器前端直接得知是查询无结果还是服务端报错

应当在无查询结果时返回空集合实例, 在服务端报错时返回经过筛选的友好提示

 

3) RouterMapping.config

在一个相当老的项目中, 出现把所有MVC中Controller的Action全都定义到配置文件的现象,

这和早些年Java的SSH一个鸟养哇!

由于发布版本一般会排除配置文件,因为开发环境和正式环境不同,于是经常出现莫名其妙的Action丢失或404的扯蛋现象。或许是那时候使用的技术过于老旧

 

4) 二进制协议解析,变长数据,长度敏感

在协议中已明确变长的数据段中使用特定长度区分报文内容,

若厂商在日后扩充了协议(即长度变更)将会无法正确解析数据。

我们应该严谨的遵循协议文档实现解析,

遍历所有出现的数据段,只捡出需要内容,以便向后兼容。

 

5) (UintFlaggedEnum)int.Parse(dataReader["UintColumn"].ToString())

这真是2008年左右前刚毕业的人写的代码的味道.

在第31个bit被使用之前,这段代码是好用的, 一旦bit31被使用即爆炸.

在不能用ORM的时候我们应该使用一致的数据类型。

现在可以用Dapper之类的轻量级ORM代替手动邦定数据。

标签: 软件开发 C# Web技术 传输协议

评论(0) 引用(0) 浏览(876)

尝试在Windows NT6+上免驱实现FUSE

作者:V君 发布于:2017-9-22 20:18 Friday 分类:折腾手记

■前言  (这次不是解决问题,因此没有TLDR(´∀((☆ミつ)


首先简单解释一下 FUSE 的定义:

在用户空间实现的虚拟文件系统, 能够让标准文件系统API访问,

只是某个路径在应用程序的控制之下, 还没到达虚拟块设备的级别.


FUSE 能够实现许多有趣的功能, 比如挂载压缩包, FTP, MTP, 甚至 Ramdisk 都能实现.

在 linux 实现 FUSE 可以说是相当容易,

由于 linux 可以把 FUSE 功能集成到内核, 随便 mount 就可以了.

然而 Windows 内核并没有这样的功能,

只能以虚拟设备来创建虚拟盘符或挂载到 NTFS 装入点亦或者建立目录符号链接.

 

现状


在 Windows 实现 FUSE 通常需要虚拟驱动器来实现, 这需要驱动程序来支持.

现成的软件有

1)免费的 WinMount(生死未卜)

2)收费的 NetDrive.

它们都是封装好的产品, 用户不能定制自己的功能.

可以自己实现接口的驱动组件有

1)开源的 Dokan(貌似不太稳定)

2)开源的 WinFsp(没用过,无法评论)

3)死贵死贵的 CBFS.

早些年把玩过Dokan, 虽然提供了.NET的接口, 且实现难度还不算高.

假如接口实现得不稳定, 没妥善处理好异常就可能会引发蓝屏, 这也就是本文的初衷.

-- 不使用驱动来实现 FUSE , 就算接口实现得再糟糕也不会把系统搞崩溃.

 

摸索


稍稍有点经验的 Windows 用户都知道,

资源管理器可以直接访问FTP或多媒体设备存储(MTP/PTP)

可以把路径以文件夹的形式图形化呈现, 

然而这些路径并不能够使用标准文件系统 API 来放访问,

不能用 WindirStat 来统计 MTP 上的文件夹占用情况.

尽管资源管理器双击能打开这些路径中的文件,

其实背地里还是先复制到临时文件再调用关联的应用程序去打开.

 

其实 Windows 还是可以不依赖驱动就能实现 FUSE 的.

目前发现了两种方法, 尽管都是利用网络共享绕一圈, 还蛮折腾的:

1)基于 HTTP 的WebDAV 协议

 在一次折腾如何在安桌手机 USB 的 MTP 模式使用 WinDirstat 的过程中

 发现了 WebDAV 共享 APP.

 安装并启动之后, 按照步骤创建映射盘符, 能被 WinDirstat 访问了.

 咕狗了解到是基于 HTTP 的共享协议.

 (这是WebDAV over WIFI, 这已经和 MTP 没关系了, 不过下文还是会和MTP有关系)

 这才发现 Windows 还有这种共享方式, 支持标准文件系统 API, 

 只是实现机制略坑, 性能略糟糕.

2)Samba 局域网共享

 不解释太多也不会被打 (´∀((☆ミつ

 需要实现一个 SMB 服务端, 还要战 445 端口. 战? 不是占? YES, 稍后娓娓道来.

 

尝(zhe)试(teng)


□WebDAV -- 这货是真FUSE, 只是 Windows 实现机制太坑人


知道这货基于 HTTP 之后, 当然就是去找找看有没有人已经做成类库, 而不是先自己啃RFC.

放狗出去找到两个类库, 分别是 SF 上的 WebDAV.NET 服务框架 和 GitHub 上的 WebDAVSharp.

这次选择了后者, 只要按接口做实现, 就可以达到目的, 咋一看还挺完善的, 只是性能有点慢.

即使用内存来实现后端文件存储, 访问速度也和硬盘差不多,

监视性能才发现, 原来 Windows 在背后依然用临时文件的方式暂存 WebDAV 上面的文件, 

只是重定向了一下文件系统. 难怪这么慢, 这 FUSE 虽然是真货, 但却掺了水.

你可以把它的临时目录(↓)链接到 RAMDISK 以提升性能, 此目录必须存在才能正常操作文件.

C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp\TfsStore\Tfs_DAV\

只不过这样就失去了用 WebDAV 实现 RAMDISK 的意义, 只能用作简单 FUSE 玩玩.

顺便再贴一个之前还没了过背后原理, 仍未知性能坑时, 实现MTP2DAV

 

Samba -- 战445端口要不要太折磨人?


非常幸运地找到最近 TalAloni 用 .net 实现且一直在维护的 Samba 服务端的库 SMBLibrary.

看了下介绍, 确实有提到可以实现虚拟文件系统. -- 只是 445 被 Windows 锁死, 需要一战.

除非禁用 Server 服务, 否则全部适配器的 445 端口将不可用...见爆栈.

尝试了许多诸如增加虚拟适配器的 trick 做法, 然而并没有设么卯月...

停止 Server 服务之后还不行, 445 仍然会被 System 占用, 需要重启...

那就只能彻底禁用了.禁用了 Server 服务并重启之后, 445 端口总算可用.

把内置的目录共享跑起来, 效果还挺理想, 性能相当不错, 看了一下接口并不是很复杂.

就简单做了个后端用内存支撑的 RamDisk 实现, 然而并不是很理想.

-- 非常不稳定, 常规操作下会出现各种错误, 看来是接口适配的不太妥哇...

总之, 这种 Samba 的方式是可行的.

只是稍稍麻烦点, 无论是从禁用 Server 服务还是实现接口上来看...


■结论


WebDAV 可以用来实现简单的 FUSE, 无法考虑性能.可以用 RamDisk 稍稍提升一下.

Samba 性能相当好, 接口略复杂, 目前还没啃透 (´∀((☆ミつ

标签: C# Winform NAS HTTP 传输协议 FUSE VFS Windows

评论(0) 引用(0) 浏览(2786)

Powered by emlog 去你妹的备案 sitemap