fix 防抖优化媒体库的延迟刷新请求

将多次的延迟请求合并为一次,避免短时间内频繁刷新
This commit is contained in:
景大侠
2025-07-07 21:53:21 +08:00
parent f321484fc1
commit f346efeefb
2 changed files with 56 additions and 16 deletions

View File

@@ -71,11 +71,12 @@
"name": "媒体库服务器刷新",
"description": "入库后自动刷新Emby/Jellyfin/Plex服务器海报墙。",
"labels": "媒体库",
"version": "1.3.2",
"version": "1.3.3",
"icon": "refresh2.png",
"author": "jxxghp",
"level": 1,
"history": {
"v1.3.3": "优化延迟刷新",
"v1.3.2": "适配飞牛媒体库",
"v1.3.1": "修复兼容性问题",
"v1.3": "MoviePilot V2 版本媒体库服务器刷新插件"

View File

@@ -1,3 +1,4 @@
import threading
import time
from pathlib import Path
from typing import Any, List, Dict, Tuple, Optional
@@ -19,7 +20,7 @@ class MediaServerRefresh(_PluginBase):
# 插件图标
plugin_icon = "refresh2.png"
# 插件版本
plugin_version = "1.3.2"
plugin_version = "1.3.3"
# 插件作者
plugin_author = "jxxghp"
# 作者主页
@@ -36,6 +37,12 @@ class MediaServerRefresh(_PluginBase):
_delay = 0
_mediaservers = None
# 延迟相关的属性
_in_delay = False
_pending_items = []
_end_time = 0.0
_lock = threading.Lock()
def init_plugin(self, config: dict = None):
if config:
@@ -181,25 +188,54 @@ class MediaServerRefresh(_PluginBase):
if not self.service_infos:
return
if self._delay:
logger.info(f"延迟 {self._delay} 秒后刷新媒体库... ")
time.sleep(float(self._delay))
# 入库数据
transferinfo: TransferInfo = event_info.get("transferinfo")
if not transferinfo or not transferinfo.target_diritem or not transferinfo.target_diritem.path:
return
def debounce_delay(duration: int):
"""
延迟防抖优化
:return: 延迟是否已结束
"""
with self._lock:
self._end_time = time.time() + float(duration)
if self._in_delay:
return False
self._in_delay = True
def end_time():
with self._lock:
return self._end_time
while time.time() < end_time():
time.sleep(1)
with self._lock:
self._in_delay = False
return True
mediainfo: MediaInfo = event_info.get("mediainfo")
items = [
RefreshMediaItem(
title=mediainfo.title,
year=mediainfo.year,
type=mediainfo.type,
category=mediainfo.category,
target_path=Path(transferinfo.target_diritem.path)
)
]
item = RefreshMediaItem(
title=mediainfo.title,
year=mediainfo.year,
type=mediainfo.type,
category=mediainfo.category,
target_path=Path(transferinfo.target_diritem.path),
)
if self._delay:
logger.info(f"延迟 {self._delay} 秒后刷新媒体库... ")
with self._lock:
self._pending_items.append(item)
if not debounce_delay(self._delay):
# 还在延迟中 忽略本次请求
return
with self._lock:
items = self._pending_items
self._pending_items = []
else:
items = [item]
for name, service in self.service_infos.items():
if hasattr(service.instance, 'refresh_library_by_items'):
@@ -214,4 +250,7 @@ class MediaServerRefresh(_PluginBase):
"""
退出插件
"""
pass
with self._lock:
# 放弃等待,立即刷新
self._end_time = 0.0
# self._pending_items.clear()