1.8.0
v1.8.0 Update
This release focuses on smarter media detection, better site support, and a more reliable selector & userscript experience across the extension.
Added
-
Automatic video tracking in Watching Mode
- Selector integrations and userscripts can now automatically detect video playback and progress
- Optional auto-detect toggle available when activity mode is set to Watching
-
Added playback status support for casting to selector integrations
-
New supported sites
- animeNexus
- animepahe
- animetsu
- miruro
New userscript helper functions
getText(selector, options?)
Reads the text content (or an attribute) of a DOM element matching the given CSS selector.
Parameters:
| Parameter | Type | Description |
|---|---|---|
selector |
string |
CSS selector (e.g., ".now-playing-title") |
options.attr |
string |
Read an attribute instead of text (e.g., "href", "title") |
options.transform |
function |
A function to modify the result before returning it |
options.root |
Element |
Search within a specific element instead of the whole page |
Returns: string — the extracted text, or "" if nothing was found.
// Basic usage — reads the text inside .now-playing-title
getText(".now-playing-title");
// → "Bohemian Rhapsody"
// Read an attribute instead of text content
getText(".song-link", { attr: "href" });
// → "https://example.com/song/123"
// Transform the result (e.g., remove a leading slash)
getText(".song-link", {
attr: "href",
transform: (v) => v.replace(/^\//, ""),
});
// → "song/123"
// Search inside a specific container
getText(".subtitle", { root: document.querySelector(".player-widget") });Returns
""if the element is not found, the attribute doesn't exist, or the transform function throws an error. Whitespace is trimmed automatically.
getImage(selector, root?)
Extracts an image URL from a DOM element. Works with <img> tags, CSS background-image, or a child <img> inside the matched element.
Parameters:
| Parameter | Type | Description |
|---|---|---|
selector |
string |
CSS selector |
root |
Element (optional) |
Search within a specific element instead of the whole page |
Returns: string \| null — the image URL, or null if not found.
getImage(".album-cover img"); // → "https://example.com/cover.jpg"
getImage(".hero-banner"); // → reads background-image CSS property
getImage(".track-card"); // → finds the first <img> inside .track-cardSearch priority: direct <img> src → CSS background-image → first child <img> src.
getTextAll(selector, options?)
Same as getText, but returns an array of results for all matching elements.
Parameters:
| Parameter | Type | Description |
|---|---|---|
selector |
string |
CSS selector (e.g., ".track-list .title") |
options.attr |
string |
Read an attribute instead of text (e.g., "href", "title") |
options.transform |
function |
A function to modify each result before returning it |
options.root |
Element |
Search within a specific element instead of the whole page |
Returns: string[] — empty strings are automatically filtered out.
getTextAll(".track-list .title");
// → ["Song 1", "Song 2", "Song 3"]
getTextAll(".nav a", { attr: "href", transform: (v) => new URL(v).pathname });
// → ["/home", "/about", "/contact"]getImageAll(selector, root?)
Same as getImage, but returns an array of image URLs for all matching elements.
getImageAll(".playlist-item img");
// → ["cover1.jpg", "cover2.jpg", "cover3.jpg"]Returns: string[] — null values are automatically filtered out.
querySelectorDeep(selector, root?, all?)
Searches for elements matching a CSS selector across the regular DOM and all nested shadow DOMs.
- If
allisfalse(default), returns the first matching element. - If
allistrue, returns all matching elements as an array. - Falls back to partial class matching via
queryWithPartialClassif a direct match fails.
querySelectorDeep(".playlist-item img");
// → <img src="cover1.jpg">
querySelectorDeep(".playlist-item img", document, true);
// → [<img>, <img>, <img>]Parameters:
selector(string) — CSS selector to match.root(Document | Element | ShadowRoot, optional) — Root node to start searching from. Defaults todocument.all(boolean, optional) — Whether to return all matches (true) or just the first (false).
Returns:
Element | nullwhenall = falseElement[]whenall = true
Improved
Selector system upgrades
Partial class matching support added
You don’t need to match class names exactly. The selector will match any class that starts with the given value.
".card" → matches "card-primary", "card-secondary", "card-lg"-
Supports basic CSS combinators
(space) → selects all nested (descendant) elements>→ selects direct children only+→ selects the next sibling element~→ selects all following sibling elements
-
Works with tag + class combinations
"div.card" → matches <div class="card-primary">
Important Notes
-
You must include at least a tag name or a class in your selector
(e.g. only#idor attribute selectors are not supported) -
Class matching is based on prefix:
"btn" matches "btn-primary", "btn-large"
-
This is different from standard CSS behavior
In normal CSS:.btn /* does NOT match .btn-primary */
But here, it does match.
- Improved selector UI for easier element picking
-
iframeParser enhancements
- Better detection logic for embedded players
- Improved multi-frame handling
- More reliable casting detection
Fixed
- Fixed incorrect duration and time tracking in selector integrations
- Fixed issue where hidden overlays on pages blocked selecting elements underneath
- Fixed incorrect duration detection in selector integrations preview
- Fixed casting detection failures in iframe-based players
- Fixed popup breaking when opened too early
- Fixed userscripts not running after import
- Updated broken selectors for supported sites (animeNexus, animepahe, biliBiliTV)
Removed
-
Removed dead websites:
- 9anime
- aniCrush
- aniWatch
Full Changelog: 1.7.0...1.8.0