mirror of
https://github.com/d0zingcat/MoviePilot-Plugins.git
synced 2026-05-13 15:09:12 +00:00
fix 防抖优化媒体库的延迟刷新请求
将多次的延迟请求合并为一次,避免短时间内频繁刷新
This commit is contained in:
@@ -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 版本媒体库服务器刷新插件"
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user