Skip to content

1.8.0

Choose a tag to compare

@github-actions github-actions released this 30 Apr 01:15
· 62 commits to main since this release

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-card

Search 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 all is false (default), returns the first matching element.
  • If all is true, returns all matching elements as an array.
  • Falls back to partial class matching via queryWithPartialClass if 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 to document.
  • all (boolean, optional) — Whether to return all matches (true) or just the first (false).

Returns:

  • Element | null when all = false
  • Element[] when all = 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 #id or 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