Solomon Xie
Solomon Xie
Spoilfy的目标是实现个人音乐的私有云系统。 解决方案: 实现的基础是将互联网各大主流音乐平台的Track/Album/Artist进行匹配映射,并提供一个统一的ID,然后将个人在各个平台上的收藏历史记录导出并与ID挂钩。在实现映射的基础上,对个人的音乐收藏历史进行长期稳定的管理,并能实现个人收藏的自动资源搜索及自动下载。此基础上更能开发为个人音乐云盘,随时随地访问。 实现方法: 首先通过互联网各大主流音乐平台的官方或开源WebAPI将个人账户的收藏历史导出为JSON文档。然后通过后台建立的ORM映射到数据库。再用A平台的每首歌、每个专辑、每个音乐家的信息到B平台进行搜索获取对应的ID及详细信息。这样每个资源都有最少两个平台的ID。随着项目支持的平台增加,每个资源的ID身份也增加。此时个人收藏的每个资源,也都具有了“跨平台”能力,意味着当一个平台失效无法访问后,还有其他的平台支持。Spoilfy的重要功能之一,还有将个人所储存的本地MP3文件与互联网音乐平台对应。MP3的信息对应是通过提取文件Metadata与MusicBrainzAPI进行搜索对应。实现了MP3的对应,Spoilfy就具备了个人音乐云系统的基础。由于已有了多平台映射的能力,也就意味着系统能够直接在后台离线下载所有个人收藏音乐的MP3资源。 技术实现: 数据库设计:Spoilfy的数据库已经过了多次重构,主要难题是多平台资源映射问题。目前的方案是:每个音乐平台都创建5个基础表:Account/Tracks/Albums/Artists/Playlists;然后独立出一个References中间表,专门存放每个资源在各个平台的ID映射关系。另一方面,为了减少数据库表的数量和搜索复杂度,项目使用三段式"URI"替代传统的ID,即:"Platform:Type:ID"。同样为了降低复杂度,数据库还全面取消了数据库级的外键限制,改为由程序控制。 核心功能开发:项目基于Python开发的,分4大子模块:WebAPI/ORM/Ops/Mappers。其中WebAPI模块只负责各个音乐平台的信息获取;ORM模块通过SQLAlchemy建立所有表格的ORM模型,并为了增加代码可维护性、降低复杂性,抛弃了SQLAlchemy的Relationship逻辑,使用原始的SQL语句进行高级查询工作;Ops模块负责所有音乐的导入导出、高级查询、建立关联等功能;Mappers负责所有的跨平台映射功能。 应用部署:项目将采用Nginx+uWSGI+Flask的HTTP服务器架构,以达到轻量化目的。为实现用户便捷安装,程序还将打包至Docker镜像中发布。 Gitissues的目标是以Github Issue为基础建立个人博客系统。 WHY: Github Issues具备个人博客的所有条件,更有Ctrl-V一键上传图片;自带评论区等功能。但它没有真正的编辑历史追踪、信息备份、自定义页面等功能。所以决定开发Gitissues。 SOLUTION: 通过Github API和Github Hooks,实现在Issues文章自动获取,并将更新保存到本地Git repo自动Commit/Push。在此基础上,程序将自动生成Jekyll/Gitbook/Readthedoc等静态网站生成器的"Front Matter"以达到个人网站的自动生成。 DEVELOPMENT: 程序基于Python开发,通过Github API将用户的Issues文章下载为JSON原数据,并提取文章及所有元信息。程序会自动解析Markdown格式文章的标题、标签、分类、目录等信息,并生成Front matters。然后自动commit和push更新。
# IMDb for music Unified ID
> Is your interesting project in pause ? Yes at the moment because of the load of works lately. Would like to continue when got more free time ;)