Greasy Fork is available in English.

Bilibili筛选增强

Bilibili搜索页面筛选增强脚本,增加今年、本月、当日发布筛选,可配合B站原有的综合排序、最多点击、最多弹幕、最多收藏使用。

Dovrai installare un'estensione come Tampermonkey, Greasemonkey o Violentmonkey per installare questo script.

You will need to install an extension such as Tampermonkey to install this script.

Dovrai installare un'estensione come Tampermonkey o Violentmonkey per installare questo script.

Dovrai installare un'estensione come Tampermonkey o Userscripts per installare questo script.

Dovrai installare un'estensione come ad esempio Tampermonkey per installare questo script.

Dovrai installare un gestore di script utente per installare questo script.

(Ho già un gestore di script utente, lasciamelo installare!)

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione come ad esempio Stylus per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

Dovrai installare un'estensione per la gestione degli stili utente per installare questo stile.

(Ho già un gestore di stile utente, lasciamelo installare!)

// ==UserScript==
// @name         Bilibili筛选增强
// @namespace    https://github.com/sylcool
// @version      0.5
// @description  Bilibili搜索页面筛选增强脚本,增加今年、本月、当日发布筛选,可配合B站原有的综合排序、最多点击、最多弹幕、最多收藏使用。
// @author       Super10
// @match        https://search.bilibili.com/*
// @icon         https://www.bilibili.com/favicon.ico?v=1
// @grant        none
// @license      MIT
// ==/UserScript==

;(function () {
  'use strict'

  const currentDate = new Date()
  const month = currentDate.getMonth() + 1

  const reg_PreviousYear = new RegExp('[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}') // 往年格式
  const reg_ThisMonth = new RegExp(`^0?${month}-(0?[1-9]|[12][0-9]|3[01])$`) // 本月格式

  const types = {
    thisYear: '今年发布',
    thisMonth: '本月发布',
    today: '一天之内',
    none: '取消筛选'
  }
  // 0:今年发布,1:本月发布,2:一天之内,3:取消筛选
  let nowTypeIndex = 0

  const btnList = []

  function createToast(text, timeout = 2000) {
    const toast = document.createElement('div')

    toast.style.position = 'fixed'
    toast.style.top = '5%'
    toast.style.left = '50%'
    toast.style.transform = 'translate(-50%, -50%)'
    toast.style.padding = '10px'
    toast.style.background = 'rgba(0, 0, 0, 0.8)'
    toast.style.color = '#fff'
    toast.style.borderRadius = '5px'
    toast.style.zIndex = '9999'
    toast.textContent = text
    document.body.appendChild(toast)

    setTimeout(() => {
      document.body.removeChild(toast)
    }, timeout)
  }

  function mFilter(judgeFunc) {
    const videoList = document.getElementsByClassName('bili-video-card')

    for (const video of videoList) {
      const item = video.parentElement
      item.style.display = 'block'
      const udates = item.getElementsByClassName('bili-video-card__info--date')
      for (let i = 0; i < udates.length; i++) {
        const date = udates[i].textContent.replace('·', '').trim()
        if (judgeFunc(date)) {
          item.style.display = 'none'
          break
        }
      }
    }


    createToast(`Bil筛选成功:${Object.values(types)[nowTypeIndex]}`)
  }

  function createFilterButton(text, fType, callback) {
    const button = document.createElement('button')
    button.style.backgroundColor = 'black'
    button.style.color = 'white'
    button.textContent = text
    button.className = 'bil-filter-btn vui-button mr_sm vui_button--tab'
    button.onclick = function () {
      nowTypeIndex = fType
      btnList.forEach((btn) => {
        btn.style.color = 'white'
      })
      button.style.color = 'red'
      mFilter(callback)
    }
    return button
  }

  btnList.push(createFilterButton(types.thisYear, 0, (date) => reg_PreviousYear.test(date)))
  btnList.push(
    createFilterButton(
      types.thisMonth,
      1,
      (date) =>
        !(reg_ThisMonth.test(date) || date.indexOf('昨天') !== -1 || date.indexOf('小时前') !== -1)
    )
  )
  btnList.push(createFilterButton(types.today, 2, (date) => date.indexOf('小时前') === -1))
  btnList.push(createFilterButton(types.none, 3, (date) => false))

  const nav = document.getElementsByClassName('search-condition-row')[0]
  for (const [idx, btn] of btnList.entries()) {
    if (idx == 3) {
      btn.click()
    }
    nav.appendChild(btn)
  }

  window.addEventListener('click', function (e) {
    if (e.target.className.indexOf('bil-filter-btn') === -1 && ['BUTTON', 'SPAN'].includes(e.target.tagName)) {
      this.setTimeout(() => {
        const navs = document.getElementsByClassName('search-condition-row')
        if (navs.length > 0) {
          if (navs[0].getElementsByClassName('bil-filter-btn').length == 0) {
            for (const [idx, btn] of btnList.entries()) {
              if (idx == nowTypeIndex) {
                btn.click()
              }
              navs[0].appendChild(btn)
            }
          } else {
            btnList[nowTypeIndex].click()
          }
        }
      }, 1000)
    }
  })
})()