Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

新增一种 v2 model 的流程不清晰 #507

Open
cosven opened this issue Nov 4, 2021 · 2 comments
Open

新增一种 v2 model 的流程不清晰 #507

cosven opened this issue Nov 4, 2021 · 2 comments
Labels
component/library feat request feature or enhancement request

Comments

@cosven
Copy link
Member

cosven commented Nov 4, 2021

当我们在 library 包中支持一种新的 model,我们需要做若干修改,具体要做哪些?目前没有一个清晰的列表,程序很容易出现 bug 和一些非预期现象。

下面是一个持续更新的 checklist

  1. 搜索 V2SupportedModelTypes 关键字,用到这个变量的相关代码一般需要修改或注意。
    1. provider_v2.py
    2. pages/model.py
  2. 找到使用这个 model 的字段的代码(可以通过 grep {model}.{attr} 的方式),这些代码通常需要修改。以 Album 为例,之前会假设每个 album model 都有 artists 属性,但是当支持新的 v2 model 后,只有 normal model 才会有,而 brief model 没有。所以需要 grep album.artists 来搜索看哪些地方有这种调用。
  3. 有些 model 会有类似 create_xx_g 的函数,这类函数也需要消灭。
  4. 由于可能存在 getattr 这样的访问方式,这类访问通过 grep 不太容易发现,目前发现存在这种用法的主要模块有
    • 序列化模块 serializer 也很容易出问题:model_helper.py 里面可能定义了一些 v2model 不存在的字段。
  5. 可能需要更新 library/model.py 的 get_modelcls_by_type 函数。
  6. 调用 cast_model_to_v1 的地方,可能也需要修改。
@cosven
Copy link
Member Author

cosven commented Mar 5, 2022

从 provider 的开发角度,怎样快速的从 v1 迁移到 v2 ?

大局上来看

  1. 最好先支持 SongModel,接着再迁移 AlbumModel/ArtistModel 等。
  2. 在支持 SongModel 的时候,需要至少支持三个 flag:PF.model_v2 | PF.get | PF.multi_quality
  3. 在支持 SongModel 的时候,如果 BriefSongSchema 和 SongSchema 不一样,则需要先实现 Brief{Song/Album/Artist}Model 的 Brief{x}Schema。比如 netease,它的两种 schema 不一样,而 kuwo 则一样。

2023-05-20 更新:强烈推荐

以迁移 feeluown-ytmusic 的 YtmusicAlbumModel 为例

  1. 假设我想用 model v2 来实现 AlbumModel,那么第一步就是做且仅作这三件事情
    1. 把 provider.use_model_v2 实现,或者更新它的实现
    2. 把老的 YtmusicAlbumModel.get 的逻辑迁移到 provider.album_get 函数中
    3. 把老的 YtmusicAlbumModel 类的定义删除
      1. 有的代码逻辑会依赖这个类,对于这些代码,能不动就暂时先不动
  2. 然后(运行 lint 工具)运行一下应用,建议点击一个专辑的详情页来测试

YtmusicArtistModel 同样可以按照上述方式迁移。额外要做的是,对于 aritst model,还要迁移 create_songs_g / artist_create_songs_rd 等接口。这种接口一开始迁移的时候,可以先不实现。要测试代码是否符合预期,只需要打开歌曲详情页,然后进入“简介”页,如果能正常显示,说明成功了一半。随后迁移 create_songs_g 等接口。

@cosven cosven added the severity/major 常用功能失效,比如查看不了歌手详情 label Mar 6, 2022
@cosven cosven pinned this issue Mar 6, 2022
@cosven cosven removed the severity/major 常用功能失效,比如查看不了歌手详情 label Jun 27, 2022
@cosven cosven unpinned this issue Jan 5, 2023
@cosven
Copy link
Member Author

cosven commented May 20, 2023

Before 2023-05-20(注:下面文字有点晦涩难懂,看 2023-05-20 更新的那段更好)

具体到一个,比如以 netease ArtistModel 为例(假设 BriefXModel 都已经实现好了)

  1. 先修改 schema,一般对应 schema.py。
    1. 找到 v1 ArtistModel 对应的 schema, (这里称之为 V1ArtistSchema)拷贝一份,命名为 V2ArtistSchema。添加或删除字段,让它匹配 v2 ArtistModel 的设计。
    2. 找到引用了 V1ArtistSchema 的地方,将它们替换成 V2ArtistSchema 或V2BriefArtistSchema。(注:根据字段的情况,判断使用哪个 Schema)
    3. 把 V1 ArtistSchema 注释掉。
  2. 然后修改 model.py 和 provider.py
    1. 把 ArtistModel 的 get 函数迁移到 provider.artist_get 下去,逻辑基本不需要改动。
    2. 更新 provider 的 flag,把 ArtistModel 这个类全部注释掉。
      ModelType.artist: (PF.model_v2 | PF.get)
      
      p.s. 注释掉之后,不能查看 artists 的歌曲、专辑等。因为这些都是单独的接口。
  3. (可选)这时候,可以启动 FeelUOwn 测试一下,看看有没有明显的 bug。常见的,容易忽略的问题可能有:
    1. Schema 字段和 V2 ArtistModel 字段不匹配。因为 v2 ArtistModel 新增了 aliases 等字段。
  4. 没有问题的话,继续把 create_songs_g/create_albums_g 等接口迁移完。这类接口基本直接挪代码就行了。
  5. 再启动 GUI 测试一遍相关页面就行了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component/library feat request feature or enhancement request
Projects
None yet
Development

No branches or pull requests

1 participant