你的音乐,你的网络,你的数据。
Serento 是一款本地优先的应用,浏览你自己的 UPnP 音乐服务器,播放到你网络中的渲染器。我们不运营盯着你听歌的服务器,也不出售数据。Serento 没有账号体系:我们在账户层面保留的唯一记录,是每个 Apple ID 一行数据(一把单向密钥、试用开始的时间、我们最后一次收到这把密钥的时间,以及若干内部记账字段),它只是一个防滥用的锚点,说明不了你是谁或你在播什么。本页列出离开你设备的每一个字节,以及它们的去向。
01 我们是谁
Serento 由注册于罗马尼亚布加勒斯特的 Dusty Enterprise SRL 发行。就欧盟数据保护法(GDPR)而言,对于 Serento 处理的任何与你有关的信息,Dusty Enterprise SRL 是数据控制者。任何隐私问题或请求都可以联系我们:contact@serento.app,你的法定权利见第 11 条。
02 Serento 是什么,不是什么
Serento 是一个 UPnP / OpenHome 控制应用。它运行在你的 iPhone、iPad 或 Mac 上,在本地网络中找到你的音乐服务器和渲染器,向它们索取目录,再告诉渲染器播放什么。音频数据从你的服务器(或你收听的电台)直达渲染器,从不经过 Serento,也不经过任何由我们运营的基础设施。
- 没有账号。 没有注册页面,不要邮箱,不要密码,也没有「用 Apple / Google 登录」。我们的权益服务为每个 Apple ID 只保存一行数据:一把单向密钥、试用开始的时间、我们最后一次收到这把密钥的时间,以及若干内部记账字段。这行数据不含姓名、不含电子邮件地址、不含购买记录,也不含任何与你在播什么有关的内容。它是一个防滥用的锚点,不是用户账号。
- 没有中心化目录。 我们没有你音乐库的副本,不为你的音乐建索引,也不向你推荐曲目。浏览和搜索都是实时读取你自己的 UPnP 服务器。
- 没有第三方追踪 SDK。 我们不集成分析 SDK(没有 Firebase、没有 Google Analytics、没有 Mixpanel、没有 Amplitude、没有 PostHog),不集成归因 SDK(没有 AppsFlyer、没有 Branch、没有 Adjust),也不集成广告 SDK 或社交网络 SDK。但我们确实会收集自家的第一方遥测数据,按下面第 02a 条所述的密钥存放。
- 不追踪你本人。 我们的遥测后端从不记录你的 IP 地址、你音乐库的内容(没有曲目 / 专辑 / 艺人名称,没有文件路径)、你的播放历史,或你的搜索词。它只收到数量与百分比,并按你的账户密钥存放。我们不会跨其他公司的应用或网站追踪你,也绝不出售或共享这些数据。
02a 假名化遥测(我们确实会收集的部分)
为了解哪些设备和系统版本在使用中、大家搭配的是哪些渲染器,以及最重要的一点:实际用户的音乐元数据完整到什么程度(好让我们判断要不要做更好的元数据工具),应用会向我们发送一份很小的报告。它不含姓名、邮箱或 Apple ID,而且那把密钥是单向的,因此不会暴露你是谁或你音乐库里有什么。这是使用 Serento 的条件,已在此处和服务条款中披露;没有按用户关闭的选项。具体包括:
- 你的账户密钥。 你的 iCloud 账户标识符的单向哈希,在你的设备上计算得出。它不是你的 Apple ID,不是你的姓名,不是你的邮箱,我们也无法把它反推回去。你的免费试用和订阅正是存放在同一把密钥之下,因此我们能看出同一个人的各份报告是属于一起的。它是稳定的:重装不会改变它,你登录的每一台设备上都是同一把。
- 一个设备标识符。 这款应用为自己生成、并保存在钥匙串中的随机标识符,用来把你 iPad 的报告和 Mac 的报告区分开。它不是硬件 id,也不是 Apple 的标识符。
- 粗粒度的设备信息与应用使用情况。 平台(iPhone / iPad / Mac)、设备型号标识、系统名称与版本、应用版本与构建号、内存总量 / 可用量、你的两位地区代码(取自设备语言区域设置,绝不取自 IP,我们从不存储 IP),以及应用被使用了多久(会话时长,以秒计)。
- 你正在播放的那台渲染器。 只有你当时所连接的那台播放器,且只有六项信息:它的 UDN 的单向哈希(这样我们就能在多份报告之间认出同一台设备,而不必持有 UDN 本身)、它的名称、它的型号,以及它是否支持 DLNA、OpenHome 和软件音量控制。名称取自设备自己对外报告的名字,所以如果你重命名过它,我们收到的就是你所选的那个名字。当你选择播放到自己的设备而不是网络播放器时,它也会以同样方式上报,名称为「This iPhone」「This iPad」或「This Mac」,并附带你的设备型号。
- 音乐库构成,只有数量。 你的服务器里有多少曲目 / 专辑 / 艺人,多少文件是 DSD、多少是 PCM,按格式(FLAC、ALAC、DSD、MP3 等)和解析度的分布,以及我们最在意的那部分:你的曲目中有多大比例填写了各个标签字段(标题、艺人、专辑、流派、年份等)。只有数量和百分比,绝不包含你音乐的名称或内容。
我们无法据此还原你的音乐库;而且这把密钥是单向的,所以它并不能告诉我们你是谁:没有姓名,没有邮箱,没有 Apple ID。我们绝不出售这些数据。原始报告在 13 个月后删除。
03 留在你设备上的内容
以下内容在你的 iPhone、iPad 或 Mac 上创建并本地存储。除第 02a 条(遥测)、第 04 条(iCloud 同步)或第 06 条(你主动选择发送的诊断日志)明确说明的情况外,它们都不会离开设备:
- 音乐库缓存。 当你连接一台 UPnP 服务器(MinimServer、Plex、Twonky、Asset、JRiver 等)时,我们会取回专辑 / 艺人 / 曲目名称、时长、编码格式、采样率、文件路径和封面,写入位于应用沙盒内的 SwiftData 存储。它们只由设备上的 Serento 读取,且只在应用运行时读取。
- 应用偏好设置。 主题、默认队列方式、无缝播放开关、静默网络延时、字母索引条开关、音量控制开关、专辑版本归并配置,以及上次选择的渲染器 / 服务器 / 音乐库 / 标签页。存放在 UserDefaults 中。
- 设备发现缓存。 Serento 在你本地网络中见过的 UPnP 服务器和渲染器,包括 IP 地址、友好名称、UDN 和支持的服务。用于在选择器中直接列出它们,而不必每次启动都重跑一遍完整的 SSDP 扫描。删除应用即清除。
- 最近搜索。 你在 Search 标签页中输入的最近几条搜索词,用于填充「Recent」板块。可通过 Search 中的 Clear 按钮清除。
- Plex 认证令牌。 如果你用 Plex 账户登录,Plex API 会返回一个访问令牌。Serento 将它存入钥匙串(受设备密码 / Face ID / Touch ID 保护)。令牌只由 Serento 读取,绝不会发送给 Dusty Enterprise SRL。
- 诊断日志文件。 一份滚动记录的日志,涵盖 UPnP 发现过程、播放状态切换、渲染器响应和错误情况,存放在应用沙盒内。除非你自己在设置中点按「Send Logs to Developer」,否则绝不外传(见第 06 条)。
- 删除应用后仍会保留的钥匙串条目。 有少数几项数据存放在钥匙串中,并且在你删除 Serento 时被刻意保留下来:第 02a 条所述的那个设备标识符,它用于把每台设备各自的设置分开,同时也是随遥测一并发送、用来区分你各台设备的标识符;以及一个时间戳,用于界定离线可用的期限,好让重新安装应用无法让免费试用重新开始。
04 通过 Apple iCloud 在你自己设备之间同步的内容
Serento 使用 Apple 的 CloudKit,在登录同一个 Apple ID 的 Apple 设备之间同步一小部分个人整理数据。这些数据存放在你自己的私人 iCloud 容器中,按 Apple 的文档保证,连 Apple 员工也无法读取;Dusty Enterprise SRL 同样没有服务端访问权限(我们只在设备上读写,从不经由任何后端)。同步的内容包括:
- 收藏。 你收藏的曲目、专辑、艺人和电台。
- 播放列表。 你在 Serento 中创建的播放列表名称与曲目清单。
- 标签与书签。 你创建的标签、被标记的条目,以及你保存的书签。
- 稍后聆听清单。 你加入 Listen Later 的条目。
- 自定义电台。 你添加的电台(名称 + 流地址 + 编码格式提示)。
- 专辑与曲目评分。 你打出的 1–5 星。
- 按设备的应用设置。 每台设备保存属于自己的一行设置,因此 iPhone 和 Mac 可以配置得不一样。它们存放在你的私人容器中,以第 02a 条所述的设备标识符加以区分。
05 Serento 产生的网络流量
Serento 从你设备发出的每一条连接。除此之外没有别的。
- 你的本地网络 · UPnP 发现。 用 SSDP 组播探测(UDP 1900)寻找 UPnP 服务器和渲染器,用 Plex 的 GDM(UDP 单播)寻找 Plex Media Server,在发布 Bonjour mDNS 的网络上用它寻找 Plex。全部限于你的局域网内。
- 你的本地网络 · 控制。 向你的 UPnP 服务器(ContentDirectory)和渲染器(AVTransport,OpenHome 的 Playlist / Product / Volume / Info,RenderingControl)发出的 HTTP / SOAP 请求,用于浏览音乐库和驱动播放。
- 你的本地网络 · 音频流。 当你按下播放,Serento 把所选曲目的流地址告诉渲染器,渲染器直接从你的服务器取回音频。数据不经过 Serento,也不经过任何由我们运营的基础设施。
- Apple iCloud / CloudKit。 第 04 条所列数据的同步流量。这些流量发往 Apple 在你 Apple ID 名下的服务器,这一段由 Apple 的隐私政策约束。
- Apple App Store / StoreKit。 用于购买、恢复购买,以及 Apple 签发的已签名收据。购买在设备本地依据 Apple 的签名校验,绝不会发送给我们。由 Apple 的 StoreKit 框架处理,适用 Apple 的隐私政策。每一笔购买还会附带一个应用账户令牌:它是由同一把单向账户密钥派生出的 UUID,这样当 Apple 在数月之后通知我们某个订阅已续订、或某笔退款已批准时,我们才能把那条通知对应到正确的账户。Apple 会收到并保存这个值。它依然是单向的,也依然不是你的 Apple ID。
- Serento 权益服务。 应用启动时会向我们自己的服务器询问你的免费试用是否仍在进行。它只会发送一个账户密钥和你的应用版本,仅此而已。账户密钥是你 iCloud 账户标识符的单向哈希,与遥测已在使用的值相同,无法还原为 Apple ID。服务器保存你试用开始的日期,以及它最后一次收到你这把密钥的日期,因此重新安装应用不会让试用重新开始。它永远不会知道你购买了什么,我们也绝不会收到你的姓名、电子邮件地址、Apple ID 或任何支付信息。
- plex.tv(仅 Plex 用户)。 如果你用 Plex 登录,Serento 会与 plex.tv 通信完成认证并查找你可访问的 Plex 服务器。这一段适用 Plex Inc. 的隐私政策。如果你不用 Plex,就不会有任何 plex.tv 流量。
- 网络电台流。 当你播放某个电台时,你的设备直接从广播方的 URL 取回音频。我们看不到你在播什么。广播方能看到你的 IP。
- serento.app。 三件事。第 02a 节所述的遥测,它携带你的账户密钥和设备标识符。元数据查询:为了补全专辑年份、参与人员、歌词、古典作品或艺术家简介,应用会查询我们自己保存的公共音乐数据库副本,只发送需要获得答案的艺术家、专辑、曲目或作曲家名称。这些查询不携带账户密钥、设备标识符或任何账户,这一点与上文所述的试用校验不同,后者确实会携带你的账户密钥。发送名称的那些查询通过请求正文传输,而不是放在地址中,因此沿途不会被写入任何服务器或代理日志;只发送公开发行标识符的那些查询则使用地址,因为那个标识符并不属于你。我们既不存储它们,也不据此建立任何画像。以及一张托管图片,即选择器中显示在 Plex 服务器旁边的 Plex 标志。我们这一侧不存储任何 IP。
- Resend(仅在你点按「Send Logs」时)。 当你在设置中明确点按「Send Logs to Developer」,诊断日志文件会通过 Resend 的事务性邮件 API 发送到 contact@serento.app。见第 06 条。
- 维基百科。 为获取艺人和专辑简介,应用会查询与应用语言对应的维基百科,并在需要时回退到英文版。它发送所查询的艺人或专辑名称。维基媒体基金会会看到你的 IP 地址,并适用其自身的隐私政策。
- 维基数据。 用于在上述请求之前,将标识符解析为正确的维基百科条目标题。仅发送该标识符,绝不发送你输入的名称。同样由维基媒体基金会运营。
- Last.fm。 用于获取艺人的热门曲目。发送艺人名称。Last.fm(CBS Interactive)会看到你的 IP 地址,并适用其自身的隐私政策。
- Deezer。 用于获取艺人照片和风格图片,仅在你于“设置”中运行图片下载时。发送所搜索的艺人或专辑名称,并从 Deezer 的图片 CDN 获取图片。Deezer 会看到你的 IP 地址,并适用其自身的隐私政策。
- Cover Art Archive。 在你使用“识别专辑”时用于获取专辑封面。发送识别所解析出的发行标识符,绝不发送名称。由 MetaBrainz 与 MusicBrainz 一同运营。
06 诊断日志(何时发送由你决定)
诊断日志帮助我们复现播放问题、发现失败,以及我们无从得知的渲染器怪癖。它以行为方式选择加入:除非你在设置中点按「Send Logs to Developer」按钮,否则不会有任何东西离开你的设备。
- 日志包含什么。 时间戳,以及这些结构化记录:UPnP 发现结果(服务器 / 渲染器名称、IP、UDN、支持的服务)、播放事件(曲目开始、暂停、切换、出错)、渲染器返回的 SOAP 响应(HTTP 状态码、SOAP 故障码)、音量变化、音乐库同步进度、应用版本与构建号、系统名称与版本、设备型号、内存档位、语言区域设置。
- 日志不包含什么。 我们刻意排除:你的 Apple ID、你的邮箱、你的真实姓名、你的位置、你的通讯录、你的音频内容、你的 Plex 令牌(已脱敏)、你的密码,以及任何来自其他应用的内容。
- 它去往哪里。 日志被封装成一封邮件,经 Resend 事务性邮件服务发送到 contact@serento.app。Resend(resend.com)作为欧盟 GDPR 第 28 条下的数据处理者,代表我们处理这封邮件。
- 我们保留多久。 日志在我们的收件箱中保留到该支持案例结束(通常是几天,遇到棘手的渲染器问题偶尔会是几周),随后删除。我们不做长期归档。
- 发送频率限制。 两次发送之间有一段短暂冷却,避免同一台设备意外把我们的收件箱刷爆。
07 崩溃报告
如果 Serento 崩溃,崩溃堆栈完全由 Apple 的系统机制处理。我们不集成任何第三方崩溃 SDK。如果你启用了 Share with App Developers(在 iOS 与 iPadOS 中位于 Settings → Privacy & Security → Analytics & Improvements,在 macOS 中位于 System Settings → Privacy & Security → Analytics & Improvements),我们会经由 App Store Connect 收到一份匿名化的堆栈信息,不附带任何个人数据。如果你关闭了这项设置,我们什么也收不到。
08 我们依赖的第三方服务
交付 Serento 只涉及以下第三方。每一方都有自己的隐私政策,如果你在意它们如何处理各自那一段数据流,建议读一读:
- Apple Inc. App Store 分发、iCloud / CloudKit 同步、StoreKit 计费、崩溃报告。apple.com/legal/privacy
- Plex Inc. 仅在你拥有 Plex 服务器并用 Plex 账户登录时相关。plex.tv/about/privacy-legal/privacy-policy
- Resend。 用于投递你主动选择发送的诊断日志的邮件服务。resend.com/legal/privacy-policy
- 你的 UPnP 服务器厂商。 你在自己网络中运行的任何服务器(MinimServer、Plex、Asset UPnP、Twonky、JRiver Media Center、Kodi UPnP 等)都受其各自的许可与隐私条款约束。Serento 看不到它们做了什么。
- 网络电台广播方。 当你播放某个电台时,你是直接连接到它的服务器。广播方能看到你的 IP,并受其自身条款约束。
- 维基媒体基金会。 维基百科与维基数据,用于简介。foundation.wikimedia.org/wiki/Policy:Privacy_policy
- Last.fm。 艺人的热门曲目。last.fm/legal/privacy
- Deezer。 艺人照片与风格图片,仅在你运行图片下载时。deezer.com/legal/personal-datas
- MetaBrainz 基金会。 Cover Art Archive,通过“识别专辑”获取专辑封面。metabrainz.org/privacy
09 我们没有的东西
与上面的清单对称,因为「没有什么」和「有什么」同样重要:
- 没有用户画像。 我们的权益服务为每个 Apple ID 只保存一行数据:一把单向密钥、试用开始的时间、我们最后一次收到这把密钥的时间,以及若干内部记账字段。这行数据不含姓名、不含电子邮件地址、不含购买记录,也不含任何与你在播什么有关的内容。它是一个防滥用的锚点,不是用户账号。我们保留的是以单向账户密钥和第 02a 条所述设备标识符为索引的假名化记录。它们能让我们看出同一个人用着三台设备;却看不出这个人是谁:没有姓名,没有邮箱,没有 Apple ID,没有任何联系方式。
- 没有 IP 地址日志。 我们没有任何会记录你 IP 地址的后端。当你的流量触及 iCloud 或 App Store 时 Apple 会看到,但那是 Apple 与你之间的关系,与我们无关。
- 没有收听历史。 你播了什么、什么时候播、播了多少次,这些都不会传到我们这里。它们只存在于你的设备上,以及(对于第 04 条中的整理数据)你的私人 iCloud 容器中。
- 无法访问内容。 我们看不到你音乐库中的专辑名、艺人名或任何其他元数据。你的服务器是直接把它们发给你的设备的。
- 没有位置数据。 我们不索取、不请求、也不使用你的设备位置。
- 不碰通讯录、日历、照片和麦克风。 Serento 从不请求这些权限。完整权限清单在 iOS 与 iPadOS 中位于 Settings → Serento,在 macOS 中位于 System Settings → Privacy & Security。
10 儿童
Serento 并非面向 13 周岁以下儿童,我们也不会在知情的情况下处理 13 周岁以下未成年人的个人数据。如果你认为有儿童以某种方式向我们提供了个人数据,请联系 contact@serento.app,我们会删除。
11 你在 GDPR 下的权利
由于 Dusty Enterprise SRL 设立于欧盟境内,欧盟《通用数据保护条例》(2016/679 号条例)适用于我们处理的任何与你有关的个人数据。你的法定权利包括:
- 访问权(第 15 条)。 询问我们持有你哪些个人数据,并索取一份副本。
- 更正权(第 16 条)。 要求我们更正不准确的个人数据。
- 删除权(第 17 条)。 要求我们删除你的个人数据。它可能存在于三个地方:你此前发送过的诊断日志、与你账户对应的那行权益数据,以及带有同一把单向密钥的遥测报告。删除那行数据,同时也会抹掉「这个账户已经用过试用」这条记录。那些遥测报告就是按同一把单向账户密钥存放的,因此我们能找到并删除属于你的那些。它们无论如何都会在 13 个月后自动删除;如果你把这把密钥发给我们,我们可以提前删掉带有它的那些报告。
- 限制处理权(第 18 条)。 在特定情形下要求我们限制对你数据的处理。
- 数据可携权(第 20 条)。 以结构化、机器可读的格式取得你的数据。
- 反对权(第 21 条)。 就基于正当利益的处理提出反对。
- 投诉权。 向你所在国的监管机构投诉,在罗马尼亚是 ANSPDCP(dataprotection.ro)。你也可以向你居住国的监管机构投诉。
12 数据保留
因为我们持有的东西极少,保留期也很短:
- 设备本地数据。 只要应用还装着就一直存在。卸载应用即全部抹除(见第 03 条)。
- 经 iCloud 同步的数据。 只要你的 Apple ID 还保有这些数据就一直存在,适用 Apple 的标准 iCloud 保留规则。你可以在应用内删除条目,或退出 iCloud 来清除。
- 你发送过的诊断日志。 在我们的收件箱中保留到该支持案例结束,随后删除(通常是几天,偶尔几周)。
- 那行权益数据。 第 02 条所说的、每个 Apple ID 只保存一行的那份数据。它是「保留期很短」的唯一例外:这一项我们会长期保留,因为一旦删掉它,同一个账户就能重新开始一次试用。你依然可以要求我们删除它(见第 11 条)。
- 订阅与账务记录。 付款由 Apple 处理,我们从不会看到银行卡、姓名或地址。但 Serento 确实会从你的设备发送一份订阅快照,内容包括你的套餐、它的状态(有效、试用中、处于账单宽限期或重试期、已过期或已撤销)、当时是否有效、是否在试用中、是否自动续订、App Store 所在国家地区、这笔购买来自 App Store 还是测试环境,以及购买、到期和试用日期;这份快照与其余遥测数据使用同一把单向账户密钥和同一个设备标识符关联,保留 13 个月。这份快照与遥测数据存放在一起,绝不会进入权益记录那一行:其中不含姓名、邮箱或 Apple ID;它按单向账户密钥存放,而我们无法把该密钥反推回去。
13 跨境传输
Dusty Enterprise SRL 在罗马尼亚(欧盟)运营。第 08 条列出的第三方会在欧盟境外处理部分数据(Apple 使用全球基础设施,Plex 位于加利福尼亚,Resend 在美国运营,维基媒体基金会、Last.fm 与 MetaBrainz 位于美国,Deezer 位于法国、属于欧盟境内)。这些供应商均按 GDPR 的要求,为欧盟向第三国的传输实施了标准合同条款或同等机制。如果你想了解其中某一方的具体情况,请联系我们。
14 安全
你设备上的本地数据受操作系统的应用沙盒保护,钥匙串中的条目(尤其是你的 Plex 令牌)另受设备密码与生物识别保护。CloudKit 数据由 Apple 加密传输,并存放在你的私人容器中。诊断日志经 HTTPS 传输至 Resend。我们的权益服务为每个账户只保存一行:一把单向账户密钥、你试用开始的日期、我们最后一次收到这把密钥的日期,以及若干内部记账字段。它不含任何购买记录,不含姓名、电子邮件地址,也不含任何支付信息,且该密钥无法还原为 Apple ID。
15 本政策的变更
当法律文本发生实质变化时,我们会更新本页顶部的生效日期;如果变化影响到我们收集哪些数据或数据流向何处,还会在应用内给出提示。最新版本始终是你在 Settings → About Serento → Privacy Policy 中看到的那一版。
16 联系我们
任何问题、请求、投诉或权利行使:contact@serento.app。我们会按 GDPR 的要求在 30 天内答复,通常快得多。