微信音乐小程序开发实践

使用微信小程序实现个人音乐播放平台

一,效果展示

二,实现的功能

1,音乐播放,暂停,切换,歌词同步展示。

2,音乐收藏,根据搜索和播放历史推荐,播放排行榜展示。

三,数据库设计

1,基于功能需求,设计概念模型

2,概念模型向逻辑关系模型转化

转化的一般原则:

1) 一个1:1联系可以转换为一个独立的关系模式,也可以与任意的一端对应的关系模式合并。

2)一个1:n的联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。

3) 一个n:m联系转化为一个关系模式,与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。

4)具有相同码的关系模式合并。

为避免关系模式出现以下问题:数据冗余,更新异常,插入异常,删除异常等。关系模式需要符合一些基本的条件。

1) 每一个分量必须是不可分割的数据项(1NF)

2) 且,每一个非主属性完全依赖于任何一个候选码(2NF)

3) 且每一个决定因素都包含码(BCNF)

转换结果如下:

四,实际开发总结

一)提取音乐信息

后台语言使用nodejs,使用jsmediatags模块提取音乐封面,歌手,专辑等信息。

二)歌词编码类型转换

nodejs读取非utf8编码类型的歌词出现乱码,需要把gb2312的歌词转换成utf8格式。

使用.net core读取音乐文件夹,生成音乐资源脚本文件(sql),并把编码格式gb2312歌词文件转换成utf8格式。

using System;using System.IO;using System.Text;namespace readmysic
{class Program
    {//生成音乐sql脚本static void Main(string[] args)
        {          //  string path = "G:\\ftpmusic";          //  string path2 = "G:\\已上传\\";string path = "G:\\ftpmusic"; //本地音乐文件路径int musicid = 1;//插入数据库表(music)主键开始idstring sql = "";
            DirectoryInfo filepath = new DirectoryInfo(path);
            FileInfo[] files = filepath.GetFiles();foreach(FileInfo f in files){               string tex = f.Extension;string name = f.Name;if(tex == ".mp3"){string temp = name.Split('.')[0];string title = "";string songer = "";if(temp.IndexOf('-') > 0){
                        songer = temp.Split('-')[0];
                        title =  temp.Split('-')[1];
                    }else{
                        title =  temp;
                    }string temsql  = "insert into music(id,name,title,songer,totalPlay) VALUES ({0},'{1}','{2}','{3}',0);\n";
                    temsql = string.Format(temsql,musicid,name,title,songer);
                    sql+=temsql;
                    musicid++;
                }//删除重复文件   /*  string  filetem = path2 + name;
                if(File.Exists(filetem)){
                    Console.WriteLine(name);
                    File.Delete(filetem);
                } *///编码格式转换if(f.Extension == ".lrc"){
                    FileStream fs = new FileStream(f.FullName,FileMode.Open);
                    Encoding tr =  GetType(fs);
                    Console.WriteLine(name+tr.BodyName);if(tr.BodyName == "gb2312"){
                        gb2312toutf8(f.FullName);
                    }
                }

            }
            Console.Write(sql);string sqlname = "G:\\ftpmusic\\temsql.txt";//生成的脚本文件地址            Writesql(sqlname,sql);

        }
    /// <summary> /// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型 /// </summary> /// <param name="FILE_NAME">文件路径</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(string FILE_NAME)
    {
        FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
        Encoding r = GetType(fs);
        fs.Close(); return r;
    }
 /// <summary> /// 通过给定的文件流,判断文件的编码类型 /// </summary> /// <param name="fs">文件流</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(FileStream fs)
    { byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM Encoding reVal = Encoding.Default; 

        BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default); int i; int.TryParse(fs.Length.ToString(), out i); byte[] ss = r.ReadBytes(i); if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
        {
            reVal = Encoding.UTF8;
        } else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
        {
            reVal = Encoding.BigEndianUnicode;
        } else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
        {
            reVal = Encoding.Unicode;
        }else if(ss[0] == 91 && ss[1] == 116 && ss[2] == 105){
            System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
            reVal = Encoding.GetEncoding("GB2312");
        }
        r.Close(); return reVal; 

    }
 /// <summary> /// 判断是否是不带 BOM 的 UTF8 格式 /// </summary> /// <param name="data"></param> /// <returns></returns> private static bool IsUTF8Bytes(byte[] data)
    { int charByteCounter = 1;
          //计算当前正分析的字符应还有的字节数 byte curByte; //当前分析的字节. for (int i = 0; i < data.Length; i++)
        {
            curByte = data[i]; if (charByteCounter == 1)
            { if (curByte >= 0x80)
                { //判断当前 while (((curByte <<= 1) & 0x80) != 0)
                    {
                        charByteCounter++;
                    } //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X  if (charByteCounter == 1 || charByteCounter > 6)
                    { return false;
                    }
                }
            } else
            { //若是UTF-8 此时第一位必须为1 if ((curByte & 0xC0) != 0x80)
                { return false;
                }
                charByteCounter--;
            }
        } if (charByteCounter > 1)
        { throw new Exception("非预期的byte格式");
        } return true;
    }
   /// <summary> /// 实现gb2312歌词转utf8/// </summary> /// <param name="path">歌词路径</param> private static void gb2312toutf8(string path)
    {
    var data = File.ReadAllBytes(path);
        System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance);
        data = Encoding.UTF8.GetBytes(Encoding.GetEncoding("GB2312").GetString(data));

        File.WriteAllBytes(path, data);
    } //生成脚本文件 public static void Writesql(string path,string sql)
        {
            FileStream fs = new FileStream(path, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);//开始写入            sw.Write(sql);//清空缓冲区            sw.Flush();//关闭流            sw.Close();
            fs.Close();
        }

    }

}

View Code

(0)

相关推荐

  • 在VBA中从Base64字符串生成PDF

    I have the following JSON response: { 'status': 'Success', 'label': 'pdf_base64_string', 'order': 'A ...

  • Java清空某文件夹内的所有内容

    转自https://blog.csdn.net/u010112493/article/details/77530833/ public static void main(String[] args) ...

  • 使用Python处理手机通讯录导入与导出文件

    最近遇到一个问题 如何将通讯录信息导出到csv 如何将csv导入到通讯录 网上大多都是在说使用Vcard文件,这种文件是手机自带通讯录app能识别的文件格式. 但是试了网上各种服务,废了很大的劲头儿也 ...

  • 微信小程序开发实践入门教程

    程序IT圈 在去年2017年1月9日,张小龙在2017微信公开课Pro上发布的小程序正式上线 .时至今日,小程序已经有整整一年时间了 .在2017年12月28日,微信更新的 6.6.1 版本开放了小游 ...

  • 小程序开发实践:视图容器 view介绍,使用 view 搞定所有常见的 UI 布局

    目录 1,主要属性 1.1,hover-class 1.2,hover-stop-propagation 1.3,hover-start-time.hover-stay-time 1.4,拒绝300毫 ...

  • 微信小程序开发和APP开发,前期创业者应该选择那个?

    小程序和APP两者本身没有好坏之分,只是适不适合企业和商家. APP,小程序可以说就是工具,需要的是合适选择什么工具,这个非常重要.对于发展到一定阶段的企业或者前期就有想法和有资本的企业创业者来说,有 ...

  • 二手车微信小程序开发解决方案

    随着微信小程序的日活跃量不断增加,小程序的发展趋势无需多言.但是对于企业来说,开发小程序前确认好需求,怎么吸引更多的用户,发挥小程序的效果是最重要的事情.下面和大家谈谈,二手车微信小程序开发解决方案. ...

  • #小程序推荐#音乐站:微信官方出品的音乐小程序!

    喜欢听歌的老铁们,一定用过很多音乐APP,比如酷狗.虾米.网易云.QQ音乐等等. 其实也有很多音乐小程序也做得不错,今日为老铁们推荐的小程序叫--音乐站. 这是一个基于微信朋友圈数据的音乐小程序,开发 ...

  • 在线心理测评系统,心理咨询微信小程序开发定制

    我们都知道互联网的发展带动整个行业的变革,在心理健康领域.突破传统束缚,寻找新的模式和服务姿态成为心理服务者当下需要思考的问题. 作为心理服务机构或公司的员工心理健康管理,有效的工具将大大提高管理水平 ...

  • 微信小程序开发,这三个注意事项一定要注意!

    关于微信小程序开发,如今也是老生常谈了,随便打开个网站,关于小程序开发的广告都是铺天盖地,这也从侧面反映出了小程序开发的热度.不仅如此,相信对于广大商家而言,小程序的功能类别都已经比较清楚了,今天我们 ...

  • 微信点餐支付小程序开发有什么作用?

    小程序使我们能够用更简单的方法实现更方便的消费.例如在甜品店和美食店总是排满了队,而微信点餐支付小程序的出现,使顾客能够直接进入小程序自助点餐,完成支付,不必排队等待,提高用户体验. 微信点餐支付小程 ...

  • 微信小程序开发实战:设计·运营·变现

    内容简介: 本书采用图解+案例的形式,介绍了微信小程序的开发运营技巧,结合不同的场景,以小程序+社交游戏.小程序+工具.小程序+广告.小程序+电商.小程序+新零售.小程序+教育培训.小程序+内容资讯, ...