Açık sekmeleri DOM öğesine göre sıralamak için chrome uzantısı oluşturma

0

Soru

Bir chrome uzantısı oluşturuyorum. Amaç, youtube'daki tüm açık sekmeleri video süresine göre sıralamaktır (düşükten yükseğe).

Bu kodu bu eğitimde açıklanan bu GitHub projesinden buldum:

popup.js

function byAlphabeticalURLOrder(tab1, tab2) {
  if (tab1.url < tab2.url) {
    return -1;
  } else if (tab1.url > tab2.url) {
    return 1;
  }
  return 0;
}

chrome.tabs.query({windowId: chrome.windows.WINDOW_ID_CURRENT}, (tabs) => {
  tabs.sort(byAlphabeticalURLOrder);
  for (let i = 0; i < tabs.length; i++) {
    chrome.tabs.move(tabs[i].id, {index: i});
  }
});

Bu kod alfabetik sıraya göre sıralama ile mükemmel çalışır. Ancak, video süresine göre sıralamak için ayarlamak istiyorum.

Bu yüzden bu dosyayı tüm açık sekmelerden video süresi almak için yazdım, ancak yine de "sekmeleri sıralama veya taşıma" bölümüne geçemiyorum.

popup.js

chrome.tabs.query({
  windowId: chrome.windows.WINDOW_ID_CURRENT
}, (tabs) => {
  chrome.tabs.query({}, function (tabs) {
    for (var i = 0; i < tabs.length; i++) {
      chrome.tabs.executeScript(tabs[i].id, {
        code: '(' + function () {
          return {
            seconds: document.querySelector("video").duration
          };
        } + ')()'
      }, function (result) {
        document.write(result[0].seconds + '<br>');
      });
    }
  });
});

Çıktı (Saniye cinsinden video süresi) - (Görünür popup.html):

1229.041
187.501
510.581
609.941
1473.821
955.481
5464.281
59.201
1787.701
1523.941
1

En iyi cevabı

1

Ne denediğiniz belli değil, ancak bu değerleri mevcut döngünüzdeki dizideki nesnelere ekleyebilir ve ardından bu diziyi ikinci bir döngüde sıralayabilirsiniz. executeScript eşzamansız olduğundan, ilk döngünün bitmesini beklemeniz gerekir; bu, sözlerin listesini çözmek, ardından listeyi videolength'te sıralamak ve ardından sekmeleri taşımak anlamına gelir.

İşte MV3 için geldiğim şey. Muhtemelen bunu yapmanın daha temiz yolları vardır (bu konuda oldukça yeniyim):

* Düzenlemeler: Kod organizasyonunu temizlemek için küçük düzenlemeler. Eyleme eklenen işlev (yani, Chrome uzantı simgesi düğmesine tıklandığında çalışır).

popup.js


chrome.action.onClicked.addListener(sortTabsbyDuration);

async function sortTabsbyDuration() {
  async function createListEntry(tabId, i) {
    return new Promise((resolve) => {
      if (/\.youtube\.com\/watch\?/.test(tabs[i].url)) {
        chrome.scripting.executeScript(
          { target: { tabId: tabId }, func: getYouTubeLength, args: [tabId] },
          (returnValue) => {
            resolve(returnValue[0].result);
          }
        );
      } else {
        resolve({
          tabId: tabId,
          vidLength: 9999999999,
        });
      }
    });
  }
  function getYouTubeLength(aTab) {
    let vidLength = document.querySelector("video").duration;
    if (!vidLength) {
      vidLength=1;
    }
    return {
      tabId: aTab,
      vidLength: vidLength,
    };
  }
  // MAIN:
  const tabs = await chrome.tabs.query({ currentWindow: true });
  let promiseList = [];
  for (var index = 0; index < tabs.length; index++) {
    promiseList.push(createListEntry(tabs[index].id, index));
  }
  const promisesFinished = Promise.all(promiseList);
  const sortedList = (await promisesFinished).sort((a, b) => {
    return a.vidLength - b.vidLength;
  });
  console.log(sortedList);
  for (let index = 0; index < sortedList.length; index++) {
    await chrome.tabs.move(sortedList[index].tabId, { index: index });
  }
}

manifesto.jsonname

{
    "manifest_version": 3,
    "name": "Sort Your Tubes",
    "version": "0.0.0.2",
    "action": {
        "default_title": "Click to sort YouTube videos by video length."
    },
    "background": {
        "service_worker": "popup.js"
    },
    "permissions": [
        "tabs",
        "scripting"        
    ],
    "host_permissions": [
        "*://www.youtube.com/*"        
    ]
}
2021-11-24 02:59:05

Vay canına, bu yardımcı oldu, harika cevabınız için teşekkür ederim!
iamzeid

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................