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

Баг функции "Переводить при открытии" с picture-in-picture #1014

Open
needcoder opened this issue Jan 3, 2025 · 1 comment

Comments

@needcoder
Copy link

needcoder commented Jan 3, 2025

Operating system / Операционная система

No response

Browser / Браузер

Edge

Userscript manager / Скриптовый движок

Tampermonkey

Script version / Версия скрипта

1.8.4

Describe the bug / Опишите ошибку

Если режим "Переводить при открытии" включен, то когда я возвращаюсь во вкладку после picture-in-picture (с контролами, например через расширение adnielbhikcbmegcfampbclagcacboff), то видео переводится ещё раз и звук перевода накладывается повторно. Актуально только для pip с контролами, с обычным работает правильно

Additional information / Дополнительная информация

No response

@needcoder
Copy link
Author

needcoder commented Jan 4, 2025

Временное решение:

  videoObserver.onVideoAdded.addListener((video) => {
    for (const site of getService()) {
      if (!site) continue;

      let container = findContainer(site, video);
      if (!container) continue;

      if (site.host === "rumble" && !video.style.display) {
        continue; // fix multiply translation buttons in rumble.com
      }

      if (["peertube", "directlink"].includes(site.host)) {
        site.url = window.location.origin; // set the url of the current site for peertube and directlink
      }

      if (!videosWrappers.has(video)) {
        videosWrappers.set(video, new VideoHandler(video, container, site));
        break;
      }
    }
  });

заменить на

let lastUrl = null;

videoObserver.onVideoAdded.addListener(video => {
   const currentUrl = window.location.href;

   for (const site of getService()) {
       if (!site) continue;

       let container = findContainer(site, video);
       if (!container) continue;

       if (site.host === 'rumble' && !video.style.display) {
           continue;
       }

       if (['peertube', 'directlink'].includes(site.host)) {
           site.url = window.location.origin;
       }

       // Проверяем наличие видео в обработчиках
       const hasVideo = Object.values(videosWrappers).some(wrapper => wrapper.video === video);
       
       if (!hasVideo) {
           // Если это новое видео (изменился URL), сбрасываем состояние
           if (currentUrl !== lastUrl) {
               // Останавливаем все существующие обработчики
               Object.values(videosWrappers).forEach(wrapper => {
                   if (wrapper && typeof wrapper.stopTranslation === 'function') {
                       wrapper.stopTranslation();
                   }
               });
               
               // Очищаем объект обработчиков
               for (const key in videosWrappers) {
                   delete videosWrappers[key];
               }
           }

           const handler = new VideoHandler(video, container, site);
           videosWrappers[video.src] = handler;
           
           // Если URL не изменился, значит это PiP или перезагрузка того же видео
           if (currentUrl === lastUrl) {
               handler.firstPlay = false;
               handler.videoData = "translated";
           }
           
           lastUrl = currentUrl;
           break;
       }
   }
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant