惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

zodream梦想开源/个人编程日记

angular 21 升级使用 signals 方案笔记-zodream梦想开源/个人编程日记 文件解析笔记-zodream梦想开源/个人编程日记 密码本开发笔记之读写与保存-zodream梦想开源/个人编程日记 基于 SkiaSharp 的轮廓获取-zodream梦想开源/个人编程日记 SkiaSharp 把 pixel byte[] 转成 SKBitmap-zodream梦想开源/个人编程日记 nas 使用 Docker 安装 gogs-zodream梦想开源/个人编程日记 复制 android 手机中的文件到电脑-zodream梦想开源/个人编程日记 最新|个人日记-zodream梦想开源/个人编程日记 升级 SiteServer CMS 并迁移到 Linux 服务器-zodream梦想开源/个人编程日记 最新|个人日记-zodream梦想开源/个人编程日记 最新|个人日记-zodream梦想开源/个人编程日记 最新|个人日记-zodream梦想开源/个人编程日记 周报:寻找优质的周刊-zodream梦想开源/个人编程日记 开发日志:对Markdown的代码块新增引用来源支持-zodream梦想开源/个人编程日记 周报:怎么写技术类的教程文章-zodream梦想开源/个人编程日记 css display:flex 布局尺寸超出问题-zodream梦想开源/个人编程日记 周报:SEO优化的思考-zodream梦想开源/个人编程日记 Edge 浏览器不适用 Edge Image Viewer 打开图片 -zodream梦想开源/个人编程日记 SEO 学习笔记(一) 内容来源-zodream梦想开源/个人编程日记 PHP 实现双因素身份认证(2FA)-zodream梦想开源/个人编程日记 winui3 自定义标题栏-zodream梦想开源/个人编程日记 WPF MVVM 获取List 多选数据-zodream梦想开源/个人编程日记 php 接入 WebAuthn 登录-zodream梦想开源/个人编程日记 Burp Suite 抓包-zodream梦想开源/个人编程日记 lnmp php集成环境安装包使用-zodream梦想开源/个人编程日记 js 进行在线编辑器开发-zodream梦想开源/个人编程日记 使用 indexnow 注意事项-zodream梦想开源/个人编程日记 Godot 使用字体图标 例如: Iconfont、FontAwesome-zodream梦想开源/个人编程日记 angular 15 对指定页面进行访问限制-zodream梦想开源/个人编程日记 CSS 使用 column-count 实现瀑布流出现内容分割的解决办法-zodream梦想开源/个人编程日记 angular 15 实现按下确认键,焦点移动到下一个表单或提交表单-zodream梦想开源/个人编程日记 input 确认按键事件在手机端不生效-zodream梦想开源/个人编程日记 C# 使用socket 进行通讯-zodream梦想开源/个人编程日记 Maui开发中Windows应用开启管理员权限-zodream梦想开源/个人编程日记 Maui 中自定义控件-zodream梦想开源/个人编程日记 TencentOS Server 3.1 安装 Nginx 1.23、PHP 8.2、MariaDB 10.11-zodream梦想开源/个人编程日记 angular 14 使用 ng-template 实现tree 结构显示-zodream梦想开源/个人编程日记 angular 14 替换 ComponentFactoryResolver 实现动态创建组件-zodream梦想开源/个人编程日记 c# 动态安装和卸载dll-zodream梦想开源/个人编程日记 慎用 CompositionTarget.Rendering-zodream梦想开源/个人编程日记 c# 重写 c++ 程序笔记:数据初始化-zodream梦想开源/个人编程日记 源码编译 aseprite-zodream梦想开源/个人编程日记 记录一下字符串分隔split各语言之间的不同-zodream梦想开源/个人编程日记 c# Gzip解码无头内容-zodream梦想开源/个人编程日记 Windows 10 查看内存占用-zodream梦想开源/个人编程日记 UWP 使用 win2d:加阴影-zodream梦想开源/个人编程日记 清除 PowerShell 历史记录-zodream梦想开源/个人编程日记 c# 调用 c++ 的dll-zodream梦想开源/个人编程日记 c# 重写 c++ 程序笔记:遍历-zodream梦想开源/个人编程日记 Net Core 与 UWP 共用类开发-zodream梦想开源/个人编程日记 hashcat(二)找回rar解压密码-zodream梦想开源/个人编程日记 Godot 学习笔记(一)-zodream梦想开源/个人编程日记 升级vue3记录-zodream梦想开源/个人编程日记 angular 12 显示数学公式-zodream梦想开源/个人编程日记 js 监听按键事件-zodream梦想开源/个人编程日记 angular 12 ng-deep 使用注意事项-zodream梦想开源/个人编程日记 angular 16 动态生成组件-zodream梦想开源/个人编程日记 angular 12 动画执行完成事件-zodream梦想开源/个人编程日记 angular 12 全局搜索组件-zodream梦想开源/个人编程日记 angular 12 中单例 Service 的使用-zodream梦想开源/个人编程日记 js 实现一个正则替换-zodream梦想开源/个人编程日记 uwp win2d 使用-zodream梦想开源/个人编程日记 UWP Custom Control自定义控件开发-zodream梦想开源/个人编程日记 UWP 读取应用内资源-zodream梦想开源/个人编程日记 gin 使用笔记(二)出错点-zodream梦想开源/个人编程日记 gin 使用笔记(一)基础-zodream梦想开源/个人编程日记 angular 关于自定义组件事件传递-zodream梦想开源/个人编程日记 angular 11 怎么获取 Content-Disposition-zodream梦想开源/个人编程日记 apache 使用gzip 压缩 js、css-zodream梦想开源/个人编程日记 angular 11 返回上一页保留页面数据的思考-zodream梦想开源/个人编程日记 一个简单的HTML音视频播放器-zodream梦想开源/个人编程日记 Net Core 实现一个简单的分页功能-zodream梦想开源/个人编程日记 关于内容中的 @用户 加 话题 的一些想法-zodream梦想开源/个人编程日记 Github Host 更改-zodream梦想开源/个人编程日记 OBS-Studio 等录屏软件录制显示器内容的黑屏的解决方法-zodream梦想开源/个人编程日记 angular 11 FormBuilder 中 FormGroup 和 FormArray 使用-zodream梦想开源/个人编程日记 angular 11 ngrx/effects 使用理解-zodream梦想开源/个人编程日记 angular 11 ngrx/store 使用理解-zodream梦想开源/个人编程日记 angular 10 直接获取表单值-zodream梦想开源/个人编程日记 angular 10 使用 tinymce 编辑器-zodream梦想开源/个人编程日记 htaccess 搭配 angular 10 放在二级目录-zodream梦想开源/个人编程日记 微信小程序跨页面传值-zodream梦想开源/个人编程日记 js 对 FileList 进行文件过滤上传-zodream梦想开源/个人编程日记 angular自定义表单组件支持 formControlName-zodream梦想开源/个人编程日记 基于不同形式的json响应处理-zodream梦想开源/个人编程日记 flutter CupertinoPicker 使用不显示-zodream梦想开源/个人编程日记 CC协议-zodream梦想开源/个人编程日记 flutter margin 负值实现-zodream梦想开源/个人编程日记 win10添加删除开机自启项-zodream梦想开源/个人编程日记 Wallpager Engine 删除记录-zodream梦想开源/个人编程日记 angular10教程之http 拦截器-zodream梦想开源/个人编程日记 微信小程序开发记录(一)真机无法进入页面-zodream梦想开源/个人编程日记 flutter 跳转页面操作上一页-zodream梦想开源/个人编程日记 Regex Generator 使用指南-zodream梦想开源/个人编程日记 go init函数-zodream梦想开源/个人编程日记 angular 9 升级 angular 10-zodream梦想开源/个人编程日记 kotlin AndroidManifest 注意事项-zodream梦想开源/个人编程日记 对于zodream 框架的优化的思考-zodream梦想开源/个人编程日记 flutter 页面滚动条-zodream梦想开源/个人编程日记 flutter swiper 使用-zodream梦想开源/个人编程日记
dpl 文件-zodream梦想开源/个人编程日记
2020-08-01 · via zodream梦想开源/个人编程日记

解释:.dpl 主要为Potplayer直播源列表文件

文件格式

文件头

DAUMPLAYLIST
playname=
topindex=0
saveplaypos=0

1234

playname 为当前播放的地址

topindex 为当前播放的序号,即在列表中的位置

列表项

1*file*地址
1*title*名称

12

序号从 1 开始

地址行为 序号 + *file* + 地址

标题行为 序号 + *title* + 地址

txt 文件转 dpl

txt 文件每一行格式为

标题,地址

1

  1. 获取文件编码
  2. 移动到正文开始的位置
  3. 写入文件头
  4. 循环取每一行,转换并写入
Converter(saveFile, sourcefile);

1

具体转换代码

        const string HEADER_TAG = "DAUMPLAYLIST";

        const string FILE_TAG = "*file*";
        const string TITLE_TAG = "*title*";

        const string NEW_LINE = "\n";

        public static readonly string[] Headers = new string[3]{
            "playname=", // 当前播放的网址
            "topindex=0", // 当前播放的序号
            "saveplaypos=0"
        };

        /// <summary>
        /// 转换文件
        /// </summary>
        /// <param name="dist"></param>
        /// <param name="source"></param>
        public static void Converter(string dist, string source)
        {
            using (var sourceStream = new FileStream(source, FileMode.Open))
            {
                using (var distStream = new FileStream(dist, FileMode.Create))
                {
                    Converter(distStream, sourceStream);
                }
            }
        }

        /// <summary>
        /// 转换文件
        /// </summary>
        /// <param name="dist"></param>
        /// <param name="source"></param>
        public static void Converter(FileStream dist, FileStream source)
        {
            Reset(source);
            var encoder = new TxtEncoder();
            var encoding = encoder.GetEncoding(source);
            source.Seek(encoder.Position, SeekOrigin.Begin);
            var line = ReadLine(source, encoding);
            if (line.Trim() == HEADER_TAG)
            {
                Reset(source);
                Copy(dist, source);
                return;
            }
            source.Seek(encoder.Position, SeekOrigin.Begin);
            Write(dist, HEADER_TAG);
            Write(dist, NEW_LINE);
            foreach (var item in Headers)
            {
                Write(dist, item);
                Write(dist, NEW_LINE);
            }
            var i = 1;
            while (null != (line = ReadLine(source, encoding)))
            {
                if (string.IsNullOrWhiteSpace(line))
                {
                    continue;
                }
                var args = line.Split(',');
                if (args.Length < 2)
                {
                    continue;
                }
                Write(dist, i.ToString());
                Write(dist, FILE_TAG);
                Write(dist, args[1]);
                Write(dist, NEW_LINE);
                Write(dist, i.ToString());
                Write(dist, TITLE_TAG);
                Write(dist, args[0]);
                Write(dist, NEW_LINE);
                i++;
            }
        }

        /// <summary>
        /// 移动指针到开始位置
        /// </summary>
        /// <param name="source"></param>
        private static void Reset(Stream source)
        {
            source.Seek(0, SeekOrigin.Begin);
        }

        /// <summary>
        /// 复制流
        /// </summary>
        /// <param name="dist"></param>
        /// <param name="source"></param>
        private static void Copy(FileStream dist, FileStream source)
        {
            source.CopyTo(dist);
        }

        /// <summary>
        /// 读取一行
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        private static string ReadLine(FileStream source, Encoding encoding)
        {
            var bytes = new List<byte>();
            int code;
            bool hasByte = false;
            while ((code = source.ReadByte()) != -1)
            {
                hasByte = true;
                if (code == 0x0a/* \n */ || code == 0x0d /* \r */)
                {
                    break;
                }
                bytes.Add(Convert.ToByte(code));
            }
            if (!hasByte)
            {
                return null;
            }
            if (bytes.Count  < 1)
            {
                return "";
            }
            return encoding.GetString(bytes.ToArray());
        }

        /// <summary>
        /// 写入字符
        /// </summary>
        /// <param name="dist"></param>
        /// <param name="line"></param>
        private static void Write(FileStream dist, string line)
        {
            var bytes = Encoding.UTF8.GetBytes(line);
            dist.Write(bytes, 0, bytes.Length);
        }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138

获取编码

/// <summary>   
/// 用于取得一个文本文件的编码方式(Encoding)。   
/// </summary>   
public class TxtEncoder
{
    /// <summary>
    /// 正文开始的位置
    /// </summary>
    public int Position { get; private set; } = 0;
    /// <summary>   
    /// 取得一个文本文件的编码方式。如果无法在文件头部找到有效的前导符,Encoding.Default将被返回。   
    /// </summary>   
    /// <param name="fileName">文件名。</param>   
    /// <returns></returns>   
    public Encoding GetEncoding(string fileName)
    {
        return GetEncoding(fileName, Encoding.Default);
    }
    /// <summary>   
    /// 取得一个文本文件流的编码方式。   
    /// </summary>   
    /// <param name="stream">文本文件流。</param>   
    /// <returns></returns>   
    public Encoding GetEncoding(FileStream stream)
    {
        return GetEncoding(stream, Encoding.Default);
    }
    /// <summary>   
    /// 取得一个文本文件的编码方式。   
    /// </summary>   
    /// <param name="fileName">文件名。</param>   
    /// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param>   
    /// <returns></returns>   
    public Encoding GetEncoding(string fileName, Encoding defaultEncoding)
    {
        var fs = new FileStream(fileName, FileMode.Open);
        var targetEncoding = GetEncoding(fs, defaultEncoding);
        fs.Close();
        return targetEncoding;
    }

    /// <summary>   
    /// 取得一个文本文件流的编码方式。   
    /// </summary>   
    /// <param name="stream">文本文件流。</param>   
    /// <param name="defaultEncoding">默认编码方式。当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。</param>   
    /// <returns></returns>   
    public Encoding GetEncoding(FileStream stream, Encoding defaultEncoding)
    {
        var targetEncoding = defaultEncoding;
        if (stream == null || stream.Length < 2) return targetEncoding;
        //保存文件流的前4个字节   
        byte byte3 = 0;
        //保存当前Seek位置   
        var origPos = stream.Seek(0, SeekOrigin.Begin);
        stream.Seek(0, SeekOrigin.Begin);

        var nByte = stream.ReadByte();
        var byte1 = Convert.ToByte(nByte);
        var byte2 = Convert.ToByte(stream.ReadByte());
        if (stream.Length >= 3)
        {
            byte3 = Convert.ToByte(stream.ReadByte());
        }
        //根据文件流的前4个字节判断Encoding   
        //Unicode {0xFF, 0xFE};   
        //BE-Unicode {0xFE, 0xFF};   
        //UTF8 = {0xEF, 0xBB, 0xBF};   
        if (byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe   
        {
            targetEncoding = Encoding.BigEndianUnicode;
            Position = 2;
        }
        else if (byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode   
        {
            targetEncoding = Encoding.Unicode;
            Position = 3;
        }
        else if (byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF) //UTF8   
        {
            targetEncoding = Encoding.UTF8;
            Position = 3;
        }
        else
        {
            stream.Seek(0, SeekOrigin.Begin);
            int read;
            while ((read = stream.ReadByte()) != -1)
            {
                if (read >= 0xF0)
                    break;
                if (0x80 <= read && read <= 0xBF)
                    break;
                if (0xC0 <= read && read <= 0xDF)
                {
                    read = stream.ReadByte();
                    if (0x80 <= read && read <= 0xBF)
                        continue;
                    break;
                }
                if (0xE0 > read || read > 0xEF) continue;
                read = stream.ReadByte();
                if (0x80 <= read && read <= 0xBF)
                {
                    read = stream.ReadByte();
                    if (0x80 <= read && read <= 0xBF)
                    {
                        targetEncoding = Encoding.UTF8;
                    }
                }
                break;
            }
        }
        //恢复Seek位置         
        stream.Seek(origPos, SeekOrigin.Begin);
        return targetEncoding;
    }
}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118

转载请保留原文链接: https://zodream.cn/blog/id/177.html