Brazen Framework - Item Attributes Resolver

Item attributes resolution for the Brazen user scripts framework

이 스크립트는 직접 설치하는 용도가 아닙니다. 다른 스크립트에서 메타 지시문 // @require https://update.greatest.deepsurf.us/scripts/429587/1847311/Brazen%20Framework%20-%20Item%20Attributes%20Resolver.js을(를) 사용하여 포함하는 라이브러리입니다.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

작성자
brazenvoid
버전
3.0.1
생성일
2021-07-19
갱신일
2026-06-09
크기
4.91KB
라이선스
GPL-3.0-only

Brazen Framework — Item Attributes Resolver (developer guide)

Resolve per-tile metadata for compliance filters when search results do not expose everything on the thumbnail row.

Greasy Fork: Item Attributes Resolver · Requires: Utilities · Used by: Framework core

Class name: BrazenItemAttributesResolver (filename uses singular Attribute).


Constructor config

new BrazenItemAttributesResolver({
  itemLinkSelector: 'a.thumb',           // href for deep fetch
  itemDeepAnalysisSelector: '#metadata', // fragment loaded from detail page
  requestDelay: 200,                     // ms multiplier between deep loads
  onDeepAttributesResolution: (item) => { /* re-run compliance */ },
})

Framework wires onDeepAttributesResolution to _complyItem(item) + _onAfterComplianceRun.


Storage model

Resolved values live on the DOM node: item[0].scriptAttributes — a plain object keyed by normalized attribute names.

Attribute names are formatted: attribute.toLowerCase().replaceAll(' ', '_').


Attribute kinds

Registration When it runs Framework usage
addAttribute(name, extractor) During resolveAttributes(item) on first compliance pass Shallow read from list tile
addAsyncAttribute(name, extractor) Not auto-invoked by framework Register for custom/manual use
addDeepAttribute(name, extractor) Lazy — when get() misses and deep attrs exist Detail-page scrape

Shallow flow

this._itemAttributesResolver.addAttribute('tags', (item) => {
  return item.find('.tag').map((i, el) => $(el).text()).get()
})

resolveAttributes(item) creates scriptAttributes, runs all shallow extractors, does not call async or deep extractors.

Deep flow

When get(item, 'tags') returns undefined and _hasDeepAttributes:

  1. Read href from item.find(itemLinkSelector).first().
  2. Utilities.sleep(_requestIteration * requestDelay) — throttles parallel fetches.
  3. Hidden sandbox #brazen-item-attributes-resolver-sandbox loads url + ' ' + itemDeepAnalysisSelector.
  4. Each deep extractor runs with sandbox jQuery as argument.
  5. onDeepAttributesResolution(item) fires.
  6. Sandbox emptied; _requestIteration incremented.

Manual injection

this._itemAttributesResolver.set(item, 'synthetic_tag', 'value')

Use in _onFirstHitBeforeCompliance when parsing tile DOM before filters run.


Public API

Method Role
addAttribute(name, callback) Shallow extractor (item: JQuery) => *
addAsyncAttribute(name, callback) Stored only; not called by resolveAttributes
addDeepAttribute(name, callback) Deep extractor (sandbox: JQuery) => *
resolveAttributes(item, afterCallback?) First-pass shallow resolution
get(item, attribute) Read value; may trigger deep load
set(item, attribute, value) Write into scriptAttributes
completeResolutionRun() Reset _requestIteration to 1 between compliance passes

Framework calls completeResolutionRun() at end of _validateCompliance.


Built-in framework attributes

Constant Name Source
ITEM_NAME name itemNameSelector text (if selector non-empty)
ITEM_PROCESSED_ONCE processed_once false until first compliance completes

Access in app code via this._get(item, ITEM_NAME) (framework protected helper).


When to use deep attributes

Use when compact search layouts omit tags on tiles, or duration/rating exists only on the detail page.

Cost: extra HTTP work and cumulative delay (requestDelay * iteration). Prefer shallow reads when the DOM already exposes data.

Filter helpers such as _addItemTagAttribute and _addItemDurationRangeFilter register attributes automatically.

Next in stack: Framework core (optional Paginator / Subscriptions Loader before core).