metatube-community / jellyfin-plugin-metatube

MetaTube Plugin for Jellyfin/Emby
https://metatube-community.github.io
MIT License
2.96k stars 261 forks source link

[Bug] 重新整理EMBY数据库以后,还是会生成多个同样的演员,导致无法合并 #393

Open ddddalex opened 1 month ago

ddddalex commented 1 month ago

Verify steps

MetaTube Plugin Version

2024.612.210.0

MetaTube Server Version

2024.612.210.0

What OS are you seeing the problem on?

Linux, Other

Description

我把整个媒体库做了全部重新更新,但是还是偶尔会生成同样的演员,导致同名演员在EMBY内有十几个,影片就分散的分布在这十几个演员的二级菜单内,请问有没有办法对演员数据进行整理或者合并操作 屏幕截图 2024-09-20 114403

MetaTube Server

No response

Jellyfin/Emby Logs

No response

MetaTube Server Logs

No response

How to Reproduce

No response

xjasonlyu commented 1 month ago

你的后端版本是多少?不知道你的重新更新指的是啥

ddddalex commented 1 month ago

后端是dockerhub的最新版,重新更新就是在EMBY里面把所有媒体库移除了重新再加入了一遍,也就是重新刮削了一遍。因为文件太多,所以分了十来个媒体库

xjasonlyu commented 1 month ago

我不确定十来个媒体库会不会是导致有多个演员重复的原因… 这个问题我之前修复过了,至少现在一个媒体库的话是没问题的。

jpsn123 commented 1 month ago

@xjasonlyu 一个媒体库任然会出现,感觉是在插入新媒体时搜索演员那一步导致的,爬取的演员名字代空格然后没有搜索到后新建了一个演员

ddddalex commented 1 month ago

更新到新后端和插件最新版本了,依旧是这样的情况,能否增加一个演员数据库的重新整理功能?

huanggs commented 1 month ago

同样的问题,这个太影响使用了,束手无策。

cyanbees commented 3 weeks ago

同样问题,一个演员重复生成,还无法整合或删除

ddddalex commented 3 weeks ago

各种尝试还是不行,这个数据库问题,还有办法解决吗?或者能否增加一个数据库整理功能,我估计是演员名字空格的问题,导致反复生成相同演员,试过调整metaID也没法合并在一起 @xjasonlyu

xjasonlyu commented 3 weeks ago

感觉是新版emby的问题,暂时好像也没有特别好的解决方案,我用4.8似乎没有这个问题。

huanggs commented 3 weeks ago

感觉是新版emby的问题,暂时好像也没有特别好的解决方案,我用4.8似乎没有这个问题。

我新建了一个docker,版本是4.8.0.80,用3个视频测试(同一个演员),还是有这个问题。 演员的信息不一致,其中一个有详细的身高等。 因此判断可能是从不同的数据源网站重复采集导致了这个问题。 希望作者能关注下。

xjasonlyu commented 3 weeks ago

感觉是新版emby的问题,暂时好像也没有特别好的解决方案,我用4.8似乎没有这个问题。

我新建了一个docker,版本是4.8.0.80,用3个视频测试(同一个演员),还是有这个问题。 演员的信息不一致,其中一个有详细的身高等。 因此判断可能是从不同的数据源网站重复采集导致了这个问题。 希望作者能关注下。

你后端版本是啥,这个问题一直有人提,但我修了两次我自己的没问题了,不知道咋回事。

huanggs commented 3 weeks ago

感觉是新版emby的问题,暂时好像也没有特别好的解决方案,我用4.8似乎没有这个问题。

我新建了一个docker,版本是4.8.0.80,用3个视频测试(同一个演员),还是有这个问题。 演员的信息不一致,其中一个有详细的身高等。 因此判断可能是从不同的数据源网站重复采集导致了这个问题。 希望作者能关注下。

你后端版本是啥,这个问题一直有人提,但我修了两次我自己的没问题了,不知道咋回事。

Metatube:2024.612.210.0 Metatube-Server:v1.2.7-43f17e0

huanggs commented 3 weeks ago

演员左下角的链接不一样: 影视数据库链接:http://10.0.0.102:8080/?redirect=AV-LEAGUE:7113 影视数据库链接:http://10.0.0.102:8080/?redirect=GFriends:%E7%9E%B3%E3%83%AA%E3%83%A7%E3%82%A6

jpsn123 commented 3 weeks ago

提供一个脚本,可以自动清理无效的数据和metadata,清理时服务emby需要停止

set -e

## change me
EMBY_DATA_PATH='/mnt/fast/k8s/pvc-emby-emby-config'

## delete unused actors
sqlite3 $EMBY_DATA_PATH/data/library.db " \
    delete from fts_search9_content where id in (select id from mediaitems where type=23 except select personid from itempeople2); \
    delete from fts_search9_docsize where id in (select id from mediaitems where type=23 except select personid from itempeople2); \
    delete from itemlinks2 where linkedid in (select id from mediaitems where type=23 except select personid from itempeople2); \
    delete from itemlinks2 where itemid in (select id from mediaitems where type=23 except select personid from itempeople2); \
    delete from mediastreams2 where itemid in (select id from mediaitems where type=23 except select personid from itempeople2); \
    delete from userdatas where userdatakeyid in (select userdatakeyid from mediaitems where id in (select id from mediaitems where type=23 except select personid from itempeople2)); \
    delete from mediaitems where id in (select id from mediaitems where type=23 except select personid from itempeople2); \
    "

## cleanup database
sqlite3 $EMBY_DATA_PATH/data/library.db " \
    delete from userdatas where userdatakeyid in (select id from userdatakeys2 except select userdatakeyid from mediaitems); \
    delete from userdatakeys2 where id in (select id from userdatakeys2 except select userdatakeyid from mediaitems); \
    "

## delete unsed actors metadata
rm /tmp/A -rf
rm /tmp/B -rf
rm /tmp/C -rf
sqlite3 $EMBY_DATA_PATH/data/library.db \
    "select images from mediaitems where type=23 and images is not null;" | grep %MetadataPath%/people/ | sed "s#%MetadataPath%/people/##g" | sed "s#/folder.*##g" > /tmp/A
ls -A1 $EMBY_DATA_PATH/metadata/people/ > /tmp/B
cat /tmp/A /tmp/B | sort | uniq -u > /tmp/C
while IFS= read -r line; do
    echo -e "\033[33m   delete actor metadata files: $line  \033[0m"
    rm -rf -- "$EMBY_DATA_PATH/metadata/people/$line"
done < /tmp/C

## delete unsed tags metadata
rm /tmp/A -rf
rm /tmp/B -rf
rm /tmp/C -rf
sqlite3 $EMBY_DATA_PATH/data/library.db \
    "select images from mediaitems where type=34;" | grep tags | sed "s#%MetadataPath%/tags/##g" | sed "s#/auto_poster_.*##g" > /tmp/A
ls -A1 $EMBY_DATA_PATH/metadata/tags/ > /tmp/B
cat /tmp/A /tmp/B | sort | uniq -u > /tmp/C
while IFS= read -r line; do
    echo -e "\033[33m   delete tags metadata files: $line  \033[0m"
    rm -rf -- "$EMBY_DATA_PATH/metadata/tags/$line"
done < /tmp/C

## delete unsed genres metadata
rm /tmp/A -rf
rm /tmp/B -rf
rm /tmp/C -rf
sqlite3 $EMBY_DATA_PATH/data/library.db \
    "select images from mediaitems where type=21;" | grep genres | sed "s#%MetadataPath%/genres/##g" | sed "s#/auto_poster_.*##g" > /tmp/A
ls -A1 $EMBY_DATA_PATH/metadata/genres/ > /tmp/B
cat /tmp/A /tmp/B | sort | uniq -u > /tmp/C
while IFS= read -r line; do
    echo -e "\033[33m   delete genres metadata files: $line  \033[0m"
    rm -rf -- "$EMBY_DATA_PATH/metadata/genres/$line"
done < /tmp/C

## only reserve latest poster
for i in $EMBY_DATA_PATH/metadata/library/*/*; do
    ls -A1t -- "$i" | grep auto_poster |tail +2 > /tmp/D
    while IFS= read -r line; do
        echo -e "\033[33m   delete auto post: $i/$line  \033[0m"
        rm -rf -- "$i/$line"
    done < /tmp/D
done

for i in $EMBY_DATA_PATH/metadata/tags/*; do
    ls -A1t -- "$i" | tail +2 > /tmp/D
    while IFS= read -r line; do
        echo -e "\033[33m   delete auto post: $i/$line  \033[0m"
        rm -rf -- "$i/$line"
    done < /tmp/D
done

for i in $EMBY_DATA_PATH/metadata/genres/*; do
    ls -A1t -- "$i" | tail +2 > /tmp/D
    while IFS= read -r line; do
        echo -e "\033[33m   delete auto post: $i/$line  \033[0m"
        rm -rf -- "$i/$line"
    done < /tmp/D
done

## show duplicate actor 
echo -e "\033[31m   Show duplicate actor  \033[0m"
sqlite3 $EMBY_DATA_PATH/data/library.db "select name from mediaitems where type=23;" | sort | uniq -d
echo -e "\033[31m   --------------------  \033[0m"

## show no actor  video
echo -e "\033[31m   Show video no actor  \033[0m"
sqlite3 $EMBY_DATA_PATH/data/library.db "select name from mediaitems where id in (select id from mediaitems where type=5 except select itemid from itempeople2);" | sort
echo -e "\033[31m   --------------------  \033[0m"
cyanbees commented 2 weeks ago

上面的脚本无效呢,还会导致原有的演员图片全部裂开

cyanbees commented 2 weeks ago

image emby版本是4.8.8,一直有这个问题,不知道是后端原因,还是插件原因

jpsn123 commented 2 weeks ago

上面的脚本无效呢,还会导致原有的演员图片全部裂开

因为你每个演员下面都有媒体条目,只能删除没有被任何媒体引用的冗余演员,你需要刷新元数据,把媒体归类到一个演员ID下

huanggs commented 2 weeks ago

受不了了,感觉整个库都废了。

jpsn123 commented 2 weeks ago

@huanggs 别慌,这个问题发生概率毕竟不大,出现这个问题就手动处理一下。流程: 开始前前最好备份你的库

  1. 正常关闭EMBY,数据目录提取出library.db数据库,确保没有library.db-wal文件
  2. 用你喜欢的方式操作数据库,删除以fts_search9开头的所有表,在把library.db覆盖回去,开启emby,测试搜索是否正常
  3. 再把重复演员的媒体全部重新刷新元数据,确保相同演员的媒体只在一个演员的二级菜单下,其他相同演员的二级菜单都是空
  4. 正常关闭emby,运行上面脚本,运行前修改你的库目录,尽量看一下脚本的意思,其实很简单,就是提示你哪些重复演员,哪些没有演员,然后删除无用元数据(数据库信息和图片)
  5. 开启emby,检查重复是否消失,如果上一步脚本还提示有更多重复演员,继续3步骤

补充一下:我的版本是4.9.0.28,没有测试其他版本

cyanbees commented 1 week ago

万分感谢,楼上说的办法可用

ddddalex commented 1 week ago

难度有点高,还是放弃了,看看作者会不会把这个问题解决了,我再重新更新整个数据库吧。可能有数千部影片,担心整个爆炸了