Helper class for loading account subscriptions
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/424516/1114774/Brazen%20Subscriptions%20Loader.js
// ==UserScript==
// @name Brazen Subscriptions Loader
// @namespace brazenvoid
// @version 1.0.1
// @author brazenvoid
// @license GPL-3.0-only
// @description Helper class for loading account subscriptions
// ==/UserScript==
class BrazenSubscriptionsLoader
{
/**
* @callback SubscriptionLoaderGetPageCountCallback
* @param {JQuery} page
* @return {number}
*/
/**
* @callback SubscriptionLoaderGetPageUrlCallback
* @param {string} baseUrl
* @param {number} pageNo
* @return {string}
*/
/**
* @callback SubscriptionLoaderProgressReportingCallback
* @param {string} status
*/
/**
* @callback SubscriptionLoaderSubscriptionsGatheredCallback
* @param {string[]} subscriptions
*/
/**
* @typedef {{url: string, getPageCount: SubscriptionLoaderGetPageCountCallback, getPageUrl: SubscriptionLoaderGetPageUrlCallback,
* subscriptionNameSelector: string, subscriptionsCountSelector: string}} SubscriptionLoaderConfig
*/
/**
* @param {SubscriptionLoaderProgressReportingCallback} onProgressUpdate
* @param {SubscriptionLoaderSubscriptionsGatheredCallback} onSubscriptionsGathered
*/
constructor (onProgressUpdate, onSubscriptionsGathered)
{
/**
* @type {number}
* @private
*/
this._configIterator = 0
/**
* @type {SubscriptionLoaderConfig[]}
* @private
*/
this._configs = []
/**
* @type {SubscriptionLoaderProgressReportingCallback}
* @private
*/
this._onProgressUpdate = onProgressUpdate
/**
* @type {SubscriptionLoaderSubscriptionsGatheredCallback}
* @private
*/
this._onSubscriptionsGathered = onSubscriptionsGathered
/**
* @type {JQuery}
* @private
*/
this._sandbox = null
/**
* @type {SubscriptionLoaderConfig}
* @private
*/
this._selectedConfig = {}
/**
* @type {*[]}
* @private
*/
this._subscriptions = []
}
/**
* Loads and records subscriptions by page
* @param {number} maxPage
* @param {number} pageNo
* @private
*/
_loadSubscriptionsPage (pageNo, maxPage)
{
this._sandbox.empty().load(this._selectedConfig.getPageUrl(this._selectedConfig.url, pageNo), () => {
this._sandbox.find(this._selectedConfig.subscriptionNameSelector).each((index, element) => {
this._subscriptions.push($(element).text().trim())
})
this._onProgressUpdate('Gathering subscriptions - ' + Math.ceil(((pageNo / maxPage) * 100)) + '% Complete')
pageNo++
if (pageNo <= maxPage) {
this._loadSubscriptionsPage(pageNo, maxPage)
} else {
this._configIterator++
if (this._configIterator < this._configs.length) {
this._processSubscriptions()
} else {
this._sandbox.remove()
this._onProgressUpdate('Loaded ' + this._subscriptions.length + ' subscriptions.')
this._onSubscriptionsGathered(this._subscriptions)
this._configIterator = 0
this._subscriptions = []
}
}
})
}
/**
* @private
*/
_processSubscriptions ()
{
this._selectedConfig = this._configs[this._configIterator]
this._sandbox.empty().load(this._selectedConfig.url + ' ' + this._selectedConfig.subscriptionsCountSelector, () => {
this._loadSubscriptionsPage(1, Math.ceil(this._selectedConfig.getPageCount(this._sandbox)))
})
}
/**
* @param {SubscriptionLoaderConfig} config
* @returns {BrazenSubscriptionsLoader}
*/
addConfig (config)
{
this._configs.push(config)
return this
}
run ()
{
this._onProgressUpdate('Gathering subscriptions - 0% Complete')
this._sandbox = $('<div id="brazen-subscriptions-loader-sandbox" hidden/>').appendTo('body')
this._processSubscriptions()
}
}