专辑 - 基础属性
authorList
表演者列表
在星球发行前台用户录入的交互中,使用的是输入框列表。默认情况下,必定 会把 CP 创建的艺人作为默认表演者,且不可编辑或删除;用户可以添加其他表演者。
数据库中存储了数组的 JSON 字符串,如 ["Scott Taylor"]
系统早期使用 python 2.7,UTF-8 支持不好,中文存储前做了 Unicode 转换,写入的是
["\u5d27\u9e64"]
群星
拼盘类专辑的表演者会是虚拟的 群星 概念,入库时统一转换成 ["various artists"]
;且表演者一旦是群星,就不能再添加具体的表演者。
注:DB 同时存在 ["Various Artists"]
和 ["various artists"]
,接口输出时统一转了小写。界面展示时需要做 i18n 转换,显示成 群星
,或者 Various Artists
cover
专辑封面
存储了图片文件在 OSS 上的路径。原图有一定的规格要求:
- 宽高不小于 3000x3000
- 长宽比 1:1
- 体积不大于 10M
- 格式为
jpg
或者jpeg
coverThumb
专辑封面缩略图访问地址
由于 cover
存放在了 OSS 上私有的 bucket 中,所以界面展示需要经由后端签名;且原图尺寸很大,Web 界面展示时一般不需要展示原图,后端输出地址时会附带一些 OSS 的图片处理参数,比如限定长宽。
当前版本,各系统都重复自行处理了签名逻辑,存在优化空间,比如像 Spotify 的专辑调用 API 一样,可以统一输出多份统一规格的图片,界面自己选用。
description
专辑描述
纯文本,会包含 \n
换行符。
disc
盘片数量。很少用到
实体唱片时代的属性。有一些情况下,专辑会包含多张盘片:
- 大制作专辑,受限于 CD 容量,被迫分开灌录到多张盘片
- 艺人生涯末期出的 Box(集锦类套装)
比如:
- Pink Floyd 的 The Wall,2xCD
- Ozzy Osbourne 的 Blizzard of Ozz / Diary of a Madman 30th Anniversary Box: Randy Years,3×CD + DVD-Video
这些专辑,在当今流媒体时代很多当做一本呈现,比如 Guns N' Rose 的 Use Your Illusion (Super Deluxe),包含 77 首歌。
featList
featuring/ft. 列表,格式同 authorList
在音乐领域,"featuring" 是指某位歌手或艺人在一首歌曲中的特别合作表演。这个词通常出现在歌曲的标题或艺人名称中,表示该歌曲是由多位艺人合作演唱或演奏的。
例如,一首名为 "Beautiful" 的歌曲的完整标题可能是 "Beautiful (feat. Christina Aguilera)",这里的 "feat." 就表示该歌曲中特别邀请了 Christina Aguilera 参与表演。
此处 "featList" 即用于描述歌曲中邀请的特别合作表演者。
genre / subGenre
专辑和歌曲的 风格(流派) 信息,由 主风格 genre
和 子风格 subGenre
组成,如
{
genre: 1, // 流行
subGenre: 1001 // 流行舞曲
}
音乐风格没有通行的行业标准。星球发行 有自己的音乐风格选项列表,格式为两层的树结构,参见 中台系统风格选项树 和 SOP 系统风格选项树
用户通过星球发行 Web 系统维护歌曲时,需要通过二级级联菜单录入风格信息,且主次二级都是必选;如果是大客户合作走批量入库,则需要上下游约定数据对标信息,入库写入时以星球发行的风格为准。
前端相关
- 因为有 i18n 的需求,后端返回的数据,只包含数字类型的 ID,不包含展示名,前端需要通过选项树自行格式化
- 存量数据有脏数据,比如 只有一级没有二级,或者 一二级都缺失,展示时需要做兼容
- 不少系统中,前后端约定使用
genreList: [genreId, subGenreId]
的数据格式。这种数据格式和级联菜单天然友好
实际情况中,除了单曲专辑之外,专辑的风格设定,和专辑内歌曲的风格未必一致,所以两者需要分开填写。
isSingle
是否单曲专辑(单曲/单曲专辑行业术语:Single
)
取值:
0
专辑 / EP1
单曲
注意:星球发行中,此字段当前仅代表严格意义上的 专辑中是否只包含一首歌。而在唱片行业中,会有包含多首歌曲的单曲专辑存在,比如 Pink Floyd 的 Money
关联逻辑
如果专辑的 isSingle === 1
,那么专辑下的歌曲有些信息会和专辑信息强关联,分为两种:
强关联
歌曲的 歌曲名、歌曲英文名、语言、音乐风格、表演者 继承自专辑信息,且 不可修改;
逻辑关联
- 如果专辑的
featList
非空,则歌曲的 featList 继承自专辑对应信息,不可修改 - 如果专辑的
featList
为空,则歌曲的 featList 初始化为空,可自由修改,并且递交后,反向写入专辑的 featList
isExplicit
注:当前版本,星球发行前端用户界面没有录入功能,默认设为 0
,只在批量入库场合才有
脏标,欧美系内容年龄分级系统下的产物,代表了是否包含暴力、脏话甚至宗教敏感话题等内容。
可选值:
- 无
- 有
- 纯净版(原本包含不适宜内容的歌曲,顺应发行市场所在地法律要求,过滤掉不合适的内容,独立发行的版本)
早期的产品设计,概念定义为 有无脏标
,系统字段定义为布尔值,取值分别为 0
和 1
。
后来改成选项,取值扩充为 0
、1
、2
,但是 字段名仍旧延续了布尔值的命名
language
歌曲的语言(即歌词语言)
后端存储数字类型的 languageId。界面呈现有 i18n 的需求,前端需要自行格式化语言对应的文本展示。
注:有一个固定 id === 1000
的选项,含义为 "无歌词",会和作词者、歌词等存在逻辑关联,比如选中后,lyricistList
强制重置为 []
参见 SOP 系统歌曲语言选项
关联字段:lyricistList
name
专辑名称,分为 中文名称 和 英文名称两个字段。
不同系统中,名称的展示字段 没有统一,比如
系统 | 中文名字段 | 英文名字段 | 默认名称(一般映射为中文名) |
---|---|---|---|
前台 | name | nameEn | |
SOP | chineseName | englishName | name |
MusicHub | chineseName | englishName | name |
MusicVerse | defaultName |
其中,仅在 MusicVerse 中,使用了 nameList
的数据作为呈现。数据格式为:
{
nameList: [
{ language: 1, name: '高级动物' }, // 国语名称
{ language: 3, name: 'The higher being' } // 英语名称
]
}
展示为:
<p>国语:高级动物 </p>
<p>英语:The higher being<p>
关联字段 language
upc
专辑的唯一识别码。
实际上,星球发行的 upc
字段存储的内容,包含了 UPC 和 EAN 两种商品识别码。这两种识别码都是 条形码(barcode) 的不同规格实现,所以在有些资料性网站(比如 MusicBrainz),会统称为 Barcode
识别码 | 简介 | 格式 |
---|---|---|
UPC | 通用产品代码 (Universal Product Code) | 12 位数字 |
EAN | 欧洲商品编码(European Article Number) | 13 位数字 |
传统唱片工业时代,每一张投放市场的专辑都有物理介质(CD/磁带/黑胶等),本质上是售卖的 拷贝,所有这些专辑都有相同单一的 UPC。
一些容易混淆的点:
- 同一本专辑,视发行国家不同,可能会有不同的 UPC/EAN,比如 Appetite for Destruction
未发行过的专辑,使用星球发行的服务发行上架,我们需要在发行前协助申请并赋予 UPC。
参见 UPC:https://zh.wikipedia.org/zh-cn/通用产品代码 参见 EAN:https://zh.wikipedia.org/zh-cn/欧洲商品编码
version
歌曲版本。包含了固定的选项 通用版本
、Live 现场版
、DEMO
,和用户自定义版本。
最初系统设计时,界面只有文本录入,没有分拆固定选项和自定义文本,所以数据库存了纯字符。
这导致了后续支持选项式交互和 i18n 时出现了格式化问题,比如:
- 用户选择了自定义录入
- 录入内容为
Live 现场版
/Live
/Live 現場版
这样前端无法区分是自定义还是通过固定选项录入,只能强制对标为固定选项。
版本类型 | 版本展示中文 | 展示英文 | 展示繁体 |
---|---|---|---|
0 | 通用版本 | Studio | 通用版本 |
1 | Live 现场版 | Live | Live 現場版 |
2 | DEMO | Demo | DEMO |
3 | 用户自定义内容 | 用户自定义内容 | 用户自定义内容 |
星发前台展示时,分拆了 versionType
和 versionText
两个字段作为辅助信息,走格式化函数完成 i18n 展示。
不同的后台系统中,版本的展示字段则 没有统一
系统 | 版本字段 | 格式 |
---|---|---|
SOP | version | { id: number; name: string; } |
Musichub | version | { id: number; name: string; } |
MusicVerse | originVersion | string |
SOP 系统和 Musichub 系统, version
使用了对标前台 versionType
和 versionText
的键值对,格式:
{
id: 0, // versionType
name: '', // versionText
}
界面上统一视作中文展示,但是保留了 i18n 的能力。而 MusicVerse 没有考虑 i18n 的需求,输出了文本类型的版本信息,前端直接打印。
关联字段:cleanedVersion