diff --git a/electron/electron.js b/electron/electron.js
index 82f6af2f0..e5cff719d 100644
--- a/electron/electron.js
+++ b/electron/electron.js
@@ -54,6 +54,8 @@ let screenshotObj = null,
let childWindow = [],
preloadWindow = null,
+ mediaWindow = null,
+ mediaType = null,
webTabWindow = null,
webTabView = [],
webTabHeight = 38;
@@ -475,36 +477,63 @@ function updateChildWindow(browser, args) {
* @param type
*/
function createMediaWindow(args, type = 'image') {
- const imageWindow = new BrowserWindow({
- width: args.width || 970,
- height: args.height || 700,
- minWidth: 360,
- minHeight: 360,
- autoHideMenuBar: true,
- webPreferences: {
- nodeIntegration: true,
- contextIsolation: false,
- webSecurity: false,
- plugins: true
- },
- show: false
- });
+ if (mediaWindow === null) {
+ mediaWindow = new BrowserWindow({
+ width: args.width || 970,
+ height: args.height || 700,
+ minWidth: 360,
+ minHeight: 360,
+ autoHideMenuBar: true,
+ webPreferences: {
+ nodeIntegration: true,
+ contextIsolation: false,
+ webSecurity: false,
+ plugins: true
+ },
+ show: false
+ });
+
+ // 监听关闭事件
+ mediaWindow.addListener('close', event => {
+ if (!willQuitApp) {
+ event.preventDefault()
+ mediaWindow.webContents.send('on-close');
+ mediaWindow.hide();
+ }
+ })
+
+ // 监听关闭事件
+ mediaWindow.addListener('closed', () => {
+ mediaWindow = null;
+ mediaType = null;
+ })
+
+ // 设置右键菜单
+ electronMenu.webContentsMenu(mediaWindow.webContents)
+ } else {
+ // 直接显示
+ mediaWindow.show();
+ }
// 加载图片浏览器的HTML
- let filePath = './render/viewer/index.html';
- if (type === 'video') {
- filePath = './render/video/index.html';
+ if (mediaType === type) {
+ // 更新窗口
+ mediaWindow.webContents.send('load-media', args);
+ } else {
+ // 重置窗口
+ mediaType = type;
+ let filePath = './render/viewer/index.html';
+ if (type === 'video') {
+ filePath = './render/video/index.html';
+ }
+ mediaWindow.loadFile(filePath, {}).then(_ => { }).catch(_ => { })
}
- imageWindow.loadFile(filePath, {}).then(_ => { }).catch(_ => { })
- // 设置右键菜单
- electronMenu.webContentsMenu(imageWindow.webContents)
-
- // 窗口准备好后显示
- imageWindow.on('ready-to-show', () => {
- imageWindow.show();
- // 发送图片数据到渲染进程
- imageWindow.webContents.send('load-media', args);
+ // 窗口准备好后事件
+ mediaWindow.removeAllListeners("ready-to-show");
+ mediaWindow.addListener('ready-to-show', () => {
+ mediaWindow.show();
+ mediaWindow.webContents.send('load-media', args);
});
}
@@ -840,6 +869,7 @@ function monitorThemeChanges() {
const backgroundColor = utils.getDefaultBackgroundColor()
mainWindow?.setBackgroundColor(backgroundColor);
preloadWindow?.setBackgroundColor(backgroundColor);
+ mediaWindow?.setBackgroundColor(backgroundColor);
childWindow.some(({browser}) => browser.setBackgroundColor(backgroundColor))
webTabWindow?.setBackgroundColor(nativeTheme.shouldUseDarkColors ? '#3B3B3D' : '#EFF0F4')
// 通知所有窗口
@@ -1110,6 +1140,7 @@ ipcMain.on('childWindowCloseAll', (event) => {
browser && browser.close()
})
preloadWindow?.close()
+ mediaWindow?.close()
event.returnValue = "ok"
})
@@ -1121,6 +1152,7 @@ ipcMain.on('childWindowDestroyAll', (event) => {
browser && browser.destroy()
})
preloadWindow?.destroy()
+ mediaWindow?.destroy()
event.returnValue = "ok"
})
@@ -1437,6 +1469,7 @@ ipcMain.on('updateQuitAndInstall', (event, args) => {
browser && browser.destroy()
})
preloadWindow?.destroy()
+ mediaWindow?.destroy()
// 启动更新子窗口
createUpdaterWindow(args.updateTitle)
diff --git a/electron/render/video/index.html b/electron/render/video/index.html
index 5a1c0438f..1a102c675 100644
--- a/electron/render/video/index.html
+++ b/electron/render/video/index.html
@@ -235,7 +235,7 @@
disableCaptions: 'Désactiver les sous-titres',
enterFullscreen: 'Plein écran',
exitFullscreen: 'Quitter le plein écran',
- frameTitle: 'Lecteur vidéo',
+ frameTitle: 'Lecteur Vidéo',
captions: 'Sous-titres',
settings: 'Paramètres',
menuBack: 'Retour au menu précédent',
@@ -310,46 +310,79 @@
ru: 'Видеоплеер'
};
+ // 获取视频MIME类型
+ const getVideoMimeType = (filename) => {
+ const ext = filename.split('.').pop().toLowerCase();
+ const mimeTypes = {
+ 'mp4': 'video/mp4',
+ 'webm': 'video/webm',
+ 'ogg': 'video/ogg',
+ 'mov': 'video/quicktime',
+ 'm4v': 'video/mp4',
+ 'avi': 'video/x-msvideo',
+ 'wmv': 'video/x-ms-wmv',
+ 'flv': 'video/x-flv',
+ 'mkv': 'video/x-matroska',
+ '3gp': 'video/3gpp'
+ };
+ return mimeTypes[ext] || 'video/mp4';
+ };
+
let player = null;
+ // 接收主进程传来的关闭事件
+ ipcRenderer.on('on-close', () => {
+ if (player) {
+ player.stop()
+ }
+ });
+
// 接收主进程传来的视频路径
ipcRenderer.on('load-media', (event, args) => {
- const videoElement = document.querySelector('video');
- videoElement.src = args.video;
-
- // 销毁旧的播放器实例
- if (player) {
- player.destroy();
+ // 检查视频源是否有效
+ if (!args || !args.video) {
+ return;
}
// 设置语言
const currentLang = args.lang || 'en';
- // 创建新的播放器实例
- player = new Plyr('#player', {
- controls: [
- 'play-large', // 大播放按钮
- 'play', // 播放/暂停
- 'progress', // 进度条
- 'current-time', // 当前时间
- 'duration', // 总时长
- 'mute', // 静音
- 'volume', // 音量
- 'settings', // 设置
- 'fullscreen' // 全屏
- ],
- settings: ['captions', 'quality', 'speed', 'loop'], // 设置菜单选项
- speed: {selected: 1, options: [0.5, 0.75, 1, 1.25, 1.5, 2]}, // 播放速度选项
- keyboard: {focused: true, global: true}, // 启用键盘快捷键
- tooltips: {controls: true, seek: true}, // 显示工具提示
- hideControls: true, // 自动隐藏控制栏
- i18n: translations[currentLang] || translations['en'] // 设置语言
- });
+ // 如果播放器不存在,创建新的实例
+ if (!player) {
+ player = new Plyr('#player', {
+ controls: [
+ 'play-large', // 大播放按钮
+ 'play', // 播放/暂停
+ 'progress', // 进度条
+ 'current-time', // 当前时间
+ 'duration', // 总时长
+ 'mute', // 静音
+ 'volume', // 音量
+ 'settings', // 设置
+ 'fullscreen' // 全屏
+ ],
+ settings: ['captions', 'quality', 'speed', 'loop'], // 设置菜单选项
+ speed: {selected: 1, options: [0.5, 0.75, 1, 1.25, 1.5, 2]}, // 播放速度选项
+ keyboard: {focused: true, global: true}, // 启用键盘快捷键
+ tooltips: {controls: true, seek: true}, // 显示工具提示
+ hideControls: true, // 自动隐藏控制栏
+ i18n: translations[currentLang] || translations['en'] // 设置语言
+ });
- // 错误处理
- player.on('error', (event) => {
- console.error('Player error:', event);
- });
+ // 错误处理
+ player.on('error', (event) => {
+ console.error('Player error:', event);
+ });
+ }
+
+ // 直接更新播放器源
+ player.source = {
+ type: 'video',
+ sources: [{
+ src: args.video,
+ type: getVideoMimeType(args.video)
+ }]
+ };
// 更新网页标题
document.title = args.title || titleTranslations[currentLang] || titleTranslations['en'];
diff --git a/electron/render/viewer/index.html b/electron/render/viewer/index.html
index 7ddcbd13d..087fec405 100644
--- a/electron/render/viewer/index.html
+++ b/electron/render/viewer/index.html
@@ -35,7 +35,6 @@