Skip to content

Releases: Sv443/BetterYTM

[PREVIEW] 2.1.0 - Release Candidate 2

08 Sep 16:56
Compare
Choose a tag to compare
Pre-release
Click to expand the changes since rc1
  • Changes:
    • Created a prompt dialog to replace the browser's native dialogs, which could accidentally be turned off by the user and would softlock the script
  • Internal Changes:
    • Updated the UserUtils library to v7.2.1
    • Made getThumbnailUrl() and getBestThumbnailUrl() use the domain youtube.com to prevent cross-origin issues
    • Changed the way plugins are registered by making the registerPlugin() function the sole argument passed by the bytm:registerPlugin event. Call this function synchronously to register your plugin.
    • Plugins will now load at an earlier point in BetterYTM's startup sequence. This means that plugins can now be initialized before the script's features are fully initialized and the DOM is ready. Use site events to wait for the right moment to interact with the page.
    • Added new components:
      • showPrompt() to show a styled dialog that replaces the confirm(), alert() and prompt() functions
    • Plugin definition changes:
      • Some intents were added or moved around in their order. See the new values in src/types.ts -> enum PluginIntent
    • Added interface functions:
      • tl() returns the translation for the provided translation key and provided locale
      • tlp() returns the translation for the provided translation key, including pluralization identifier and provided locale
    • Renamed event bytm:initPlugins to bytm:registerPlugin to be more consistent


This version is almost finished but may still contain a few tiny bugs.
It is highly recommended you fully remove the script and reinstall it manually once the update is released.

See pull request for more info

[PREVIEW] 2.1.0 - Release Candidate 1

28 Aug 12:08
Compare
Choose a tag to compare
Pre-release
Click to expand the changelog at the time of 0635e65
  • Added features:
    • Added an experimental feature to like songs and videos of certain channels (on both sites) automatically.
      Since this feature is still experimental, to be able to turn it on, you first need to enable advanced mode in the settings.
      The button to toggle auto-liking will only show up on channel pages until the next update. Please report any issues you encounter.
    • Added the ability to show the approximate amount of likes and dislikes on the currently playing song (powered by ReturnYoutubeDislike)
    • Added support for themes set by the ThemeSong extension
  • Changes:
    • Made song/video time remembering enabled by default on YT too
    • Made reset button in config menu a feature of type button
    • Welcome menu is now shown on YT too
    • Added Ctrl modifier key to every lyrics button to open a lyrics search prompt
    • Added Shift and Ctrl modifier keys to the above-queue buttons that can skip prompts or customize the behavior
    • Arrow key and number key skipping works more reliably and now also in the config menu
    • Changed default settings for some features.
      After updating, if the values were unchanged from their previous default, they will automatically have the new default value:
      • Remember Song Time Sites: if set to YTM only, it changes to both sites
      • Volume Slider Scroll Sensitivity: if set to 10%, it changes to 4%
    • Made some settings require advanced mode that didn't before:
      • Fix spacing/layout issues
      • Fix HDR issues
      • Disable Dark Reader sites
      • Remove share tracking parameter sites
      • Placement of list/queue buttons
    • Removed broken feature "remove upgrade tab"
    • Removed unnecessary experimental feature "advancedLyricsFilter" as the API's native search improved a lot
    • Made all integration features configurable and gave them their own config category
  • Fixes:
    • Adjusted script to UI redesign of playlists
    • Fixed song list buttons disappearing when dragging the row around
    • Fixed song list buttons not always appearing immediately
    • Fixed escape closing all open dialogs instead of one at a time
    • Fixed "added to liked songs" toast not being consistently closed
    • Fixed messed up time restoration feature on YT because of the &t param
    • Fixed broken autoplay queue delete button after a redesign
    • Fixed transparent player bar background in fullscreen being barely readable with thumbnail overlay active
    • Fixed thumbnail overlay not updating in fullscreen mode and in the mini player
    • Fixed video time restoring breaking after pausing for a longer time
    • Fixed "This document requires 'TrustedHTML' assignment" error on Chromium browsers
    • Fixed toasts being shown with a 1000x higher duration than intended
Click to expand internal and plugin changes
  • Internal Changes:
    • Updated the UserUtils library to v7.2.1
    • Removed compareVersions() and compareVersionArrays() in favor of including the compare-versions library
    • Now using a single query parameter for lyrics lookup
    • Added license for plugin-related source code, see license-for-plugins.txt
    • Added advanced feature to change the startup timeout (only impacts plugin initialization for now)
    • Now using a blue logo is instead of the red BetterYTM logo when the script was compiled in development (preview) mode
    • Fixed missing configuration keys in development/preview mode instead of potentially breaking the script
    • Added Storybook for easier and faster development of components
    • Removed the @updateURL and @downloadURL directives because their use is controversial and the script has a built-in update check now
    • Migrated to pnpm for faster compilation times
    • Moved NanoEmitter class over to the UserUtils library (it is still re-exported by the plugin interface as before)
  • Plugin Changes:
    See the contributing guide for the latest documentation of the plugin interface
    • Added new components:
      • createLongBtn() to create a button with an icon and text (works either as normal or as a toggle button)
        The design follows that of the subscribe button on YTM's channel pages, but the consistent class names make it easy to style it differently.
      • showToast() to show a custom toast notification with a message string or element and duration
      • showIconToast() to show a custom toast notification with a message string or element, icon and duration
      • createRipple() to create a click ripple animation effect on a given element (experimental)
      • ExImDialog class for creating a BytmDialog instance that is designed for exporting and importing generic data as a string
    • Changed components:
      • BytmDialog now has the option removeListenersOnDestroy (true by default) to configure removing all event listeners when the dialog is destroyed
      • BytmDialog's private members and methods have been changed to protected for easier extension (when using TypeScript)
    • Added interface functions:
      • setInnerHtml() to set the innerHTML property of an element to a sanitized string using the Trusted Types API and the library DOMPurify
      • getAutoLikeData() to return the current auto-like data (authenticated function)
      • saveAutoLikeData() to overwrite the auto-like data (authenticated function)
      • fetchVideoVotes() to fetch the approximate like and dislike count of a video from Return Youtube Dislike
      • getDomain() returns the current domain ("yt" or "ytm")
      • waitVideoElementReady() returns a promise that resolves when the video element is ready
      • getCurrentMediaType() (on YTM only) returns the current media type ("video" or "song")
    • SelectorObserver / addSelectorListener() changes:
      • Added ytMasthead instance for the title bar on YT
      • Renamed all YT-specific instances to have the yt prefix
        • watchFlexy renamed to ytWatchFlexy
        • watchMetadata renamed to ytWatchMetadata
      • Added new SelectorObserver instance browseResponse for pages like /channel/{id}
    • Event changes:
      • Added events
        • bytm:featureInitStarted - emitted when the feature initialization process starts
        • bytm:featureInitialized - emitted every time a feature has been initialized and is passed the feature's identifier string
        • bytm:dialogClosed - emitted when a BytmDialog is closed and gets passed the instance
        • bytm:dialogClosed:id - emitted only when the dialog with the given ID is closed and gets passed the instance
        • bytm:siteEvent:pathChanged - emitted whenever the URL path (location.pathname) changes
      • Now the event bytm:siteEvent:fullscreenToggled is only emitted once per fullscreen change
      • Renamed event bytm:initPlugins to bytm:registerPlugins to be more consistent
      • Changed event property returned by registerPlugin() from nanoevents Emitter to NanoEmitter instance (see the UserUtils docs)
        In practice this changes nothing, but it benefits from plugins having access to the additional methods once() for immediately unsubscribing from an event after it was emitted once and unsubscribeAll() to remove all event listeners.


This version is almost finished but may still contain a few tiny bugs.
It is highly recommended you fully remove the script and reinstall it manually once the update is released.

See pull request for more info

[PREVIEW] 2.1.0 - Prerelease

04 Aug 23:03
Compare
Choose a tag to compare
Pre-release

⚠ This is an experimental version ⚠

Features might still be unstable or unfinished, please check back later for the finished release.
Your userscript extension should automatically update the script to the release version once it's out.
See pull request #76 for updates.


Click to expand the changelog at the time of cb538ab

Features:

  • Added an experimental feature to like songs and videos of certain channels (on both sites) automatically.
    Since this feature is still experimental, to be able to turn it on, you first need to enable advanced mode in the settings.
    The button to toggle auto-liking will only show up on channel pages until the next update. Please report any issues you encounter.
  • Added the ability to show the approximate amount of likes and dislikes on the currently playing song (powered by ReturnYoutubeDislike)

Changes:

  • Made song/video time remembering enabled by default on YT too
  • Made reset button in config menu a feature of type button
  • Welcome menu is now shown on YT too
  • Added Ctrl modifier key to every lyrics button to open a lyrics search prompt
  • Added Shift and Ctrl modifier keys to the above-queue buttons that can skip prompts or customize the behavior
  • Arrow key and number key skipping works more reliably and now also in the config menu
  • Changed default settings for some features.
    After updating, if the values were unchanged from their previous default, they will automatically have the new default value:
    • Remember Song Time Sites: if set to YTM only, it changes to both sites
    • Volume Slider Scroll Sensitivity: if set to 10%, it changes to 4%
  • Made some settings require advanced mode that didn't before:
    • Fix spacing/layout issues
    • Fix HDR issues
    • Disable Dark Reader sites
    • Remove share tracking parameter sites
    • Placement of list/queue buttons
  • Removed broken feature "remove upgrade tab"
  • Removed unnecessary experimental feature "advancedLyricsFilter" as the API's native search improved a lot

Fixes:

  • Adjusted script to UI redesign of playlists
  • Fixed song list buttons disappearing when dragging the row around
  • Fixed song list buttons not always appearing immediately
  • Fixed escape closing all open dialogs instead of one at a time
  • Fixed "added to liked songs" toast not being consistently closed
  • Fixed messed up time restoration feature on YT because of the &t param
  • Fixed broken autoplay queue delete button after a redesign
  • Fixed transparent player bar background in fullscreen being barely readable with thumbnail overlay active
  • Fixed thumbnail overlay not updating in fullscreen mode

Internal Changes:

  • Removed compareVersions() and compareVersionArrays() in favor of including the compare-versions library
  • Now using a single query parameter for lyrics lookup
  • Added license for plugin-related source code, see license-for-plugins.txt
  • Added advanced feature to change the startup timeout (only impacts plugin initialization for now)
  • Now using a blue logo is instead of the red BetterYTM logo when the script was compiled in development (preview) mode
  • SelectorObserver changes:
    • Added ytMasthead instance for the title bar on YT
    • Renamed all YT-specific instances to have the yt prefix
      • watchFlexy renamed to ytWatchFlexy
      • watchMetadata renamed to ytWatchMetadata
  • Fixed missing configuration keys in development/preview mode instead of potentially breaking the script
  • Added Storybook for easier and faster development of components
  • Removed the @updateURL and @downloadURL directives because their use is controversial and the script has a built-in update check now
  • Migrated to pnpm for faster compilation times

Plugin Changes:

  • Added new components:
    • createLongBtn() to create a button with an icon and text (works either as normal or as a toggle button)
      The design follows that of the subscribe button on YTM's channel pages, but the consistent class names make it easy to style it differently.
    • showToast() to show a custom toast notification with a message string or element and duration
    • showIconToast() to show a custom toast notification with a message string or element, icon and duration
    • createRipple() to create a click ripple animation effect on a given element (experimental)
    • ExImDialog class for creating a BytmDialog instance that is designed for exporting and importing generic data as a string
  • Changed components:
    • BytmDialog now has the option removeListenersOnDestroy (true by default) to configure removing all event listeners when the dialog is destroyed
    • BytmDialog's private members and methods have been changed to protected for easier extension (when using TypeScript)
  • Added interface functions:
    • getAutoLikeData() to return the current auto-like data (authenticated function)
    • saveAutoLikeData() to overwrite the auto-like data (authenticated function)
    • fetchVideoVotes() to fetch the approximate like and dislike count of a video from Return Youtube Dislike
  • Added new SelectorObserver instance browseResponse for pages like /channel/{id}
  • Renamed event bytm:initPlugins to bytm:registerPlugins to be more consistent
  • Added events
    • bytm:featureInitStarted - emitted when the feature initialization process starts
    • bytm:featureInitialized - emitted every time a feature has been initialized and is passed the feature's identifier string
    • bytm:dialogClosed - emitted when a BytmDialog is closed and gets passed the instance
    • bytm:dialogClosed:id - emitted only when the dialog with the given ID is closed and gets passed the instance
    • bytm:siteEvent:pathChanged - emitted whenever the URL path (location.pathname) changes
  • Now the event bytm:siteEvent:fullscreenToggled is only emitted once per fullscreen change
  • Changed event property returned by registerPlugin() from nanoevents Emitter to NanoEmitter instance (see src/utils/NanoEmitter.ts)
    In practice this changes nothing, but it benefits from plugins having access to the additional methods once() for immediately unsubscribing from an event after it was emitted once and unsubscribeAll() to remove all event listeners.

Release 2.0.0

22 May 21:04
Compare
Choose a tag to compare
  • Added features:
    • Keep the volume synced between tabs
    • Set an initial volume level once per tab
    • Hide the cursor after a set amount of inactivity while hovering over the video
    • Show a thumbnail overlay over the video element (or open the thumbnail in a new tab) automatically and/or manually, depending on configuration
    • ?si parameter is removed in YT's share menu too now
    • Added an "above-queue" button to clear the currently playing queue / playlist
    • Fix rendering issues when using HDR
    • Disable the Dark Reader extension on both pages (because it messes up the layout)
  • Changes / Fixes:
    • Improved the config menu
      • Created new toggle input (because checkboxes don't come close to looking as good)
      • Added an advanced mode option that reveals a set of hidden settings, and lots of new settings that were previously not configurable
      • Improved styling and layout of menu substantially, especially when using different languages
      • Now an option to open the config menu is shown on YT too
      • Made a bunch of features not require a page reload anymore
    • Fixed tooltip that is set on the wrong element
    • Fixed queue buttons not being shown when navigating with tab key
    • Tons of accessibility improvements for screenreader users (feedback regarding this is strongly welcome!)
Click to expand internal and plugin changes
  • Internal Changes:
    • Improved script performance
      • Implemented new SelectorObserver instances to improve overall performance by quite a lot
        • Implemented rising-edge debounce for SelectorObserver instances to massively improve responsiveness
      • Added a cache to save lyrics in. Up to 1000 of the most listened to songs are saved throughout sessions for 30 days to save time and reduce server load.
    • Implemented new class BytmDialog for less duplicate code, better maintainability, the ability to make more menus easier and for them to have better accessibility
  • Plugin Interface Changes:

See pull request for more info

[PREVIEW] 2.0.0 - Release Candidate 2

22 May 13:26
Compare
Choose a tag to compare
Pre-release

Changes since rc1:

  • fixed "above queue" buttons not showing up when the "scroll to playing" button is disabled
  • better resource url versioning so older versions will still work in the future
  • fixed problems with translations
  • a few refactors
Click to expand the changelog at the time of 8a0a2b7
  • Added features:
    • Keep the volume synced between tabs
    • Set an initial volume level once per tab
    • Hide the cursor after a set amount of inactivity while hovering over the video
    • Show a thumbnail overlay over the video element (or open the thumbnail in a new tab) automatically and/or manually, depending on configuration
    • ?si parameter is removed in YT's share menu too now
    • Added an "above-queue" button to clear the currently playing queue / playlist
    • Fix rendering issues when using HDR
    • Disable the Dark Reader extension on both pages (because it messes up the layout)
  • Changes / Fixes:
    • Improved the config menu
      • Created new toggle input (because checkboxes don't come close to looking as good)
      • Added an advanced mode option that reveals a set of hidden settings, and lots of new settings that were previously not configurable
      • Improved styling and layout of menu substantially, especially when using different languages
      • Now an option to open the config menu is shown on YT too
      • Made a bunch of features not require a page reload anymore
    • Fixed tooltip that is set on the wrong element
    • Fixed queue buttons not being shown when navigating with tab key
    • Tons of accessibility improvements for screenreader users (feedback regarding this is strongly welcome!)
  • Internal Changes:
    • Improved script performance
      • Implemented new SelectorObserver instances to improve overall performance by quite a lot
        • Implemented rising-edge debounce for SelectorObserver instances to massively improve responsiveness
      • Added a cache to save lyrics in. Up to 1000 of the most listened to songs are saved throughout sessions for 30 days to save time and reduce server load.
    • Implemented new class BytmDialog for less duplicate code, better maintainability, the ability to make more menus easier and for them to have better accessibility
    • Expanded plugin interface
    • Added an experimental fuzzy filtering algorithm when fetching lyrics to eventually yield more accurate results (hidden behind advanced mode because it's far from perfect)


This version is almost finished but may still contain a few tiny bugs.
It is highly recommended you fully remove the script and reinstall it manually once the update is released.

See pull request for more info

[PREVIEW] 2.0.0 - Release Candidate 1

21 May 19:56
Compare
Choose a tag to compare
Pre-release
Click to expand the changelog at the time of 4db30e8
  • Added features:
    • Keep the volume synced between tabs
    • Set an initial volume level once per tab
    • Hide the cursor after a set amount of inactivity while hovering over the video
    • Show a thumbnail overlay over the video element (or open the thumbnail in a new tab) automatically and/or manually, depending on configuration
    • ?si parameter is removed in YT's share menu too now
    • Added an "above-queue" button to clear the currently playing queue / playlist
    • Fix rendering issues when using HDR
    • Disable the Dark Reader extension on both pages (because it messes up the layout)
  • Changes / Fixes:
    • Improved the config menu
      • Created new toggle input (because checkboxes don't come close to looking as good)
      • Added an advanced mode option that reveals a set of hidden settings, and lots of new settings that were previously not configurable
      • Improved styling and layout of menu substantially, especially when using different languages
      • Now an option to open the config menu is shown on YT too
      • Made a bunch of features not require a page reload anymore
    • Fixed tooltip that is set on the wrong element
    • Fixed queue buttons not being shown when navigating with tab key
    • Tons of accessibility improvements for screenreader users (feedback regarding this is strongly welcome!)
  • Internal Changes:
    • Improved script performance
      • Implemented new SelectorObserver instances to improve overall performance by quite a lot
        • Implemented rising-edge debounce for SelectorObserver instances to massively improve responsiveness
      • Added a cache to save lyrics in. Up to 1000 of the most listened to songs are saved throughout sessions for 30 days to save time and reduce server load.
    • Implemented new class BytmDialog for less duplicate code, better maintainability, the ability to make more menus easier and for them to have better accessibility
    • Expanded plugin interface
    • Added an experimental fuzzy filtering algorithm when fetching lyrics to eventually yield more accurate results (hidden behind advanced mode because it's far from perfect)


This version is almost finished but may still contain a few tiny bugs.
It is highly recommended you fully remove the script and reinstall it manually once the update is released.

See pull request for more info

Release 1.1.1

19 Feb 20:06
Compare
Choose a tag to compare
  • Features / Changes:
    • A new version notification dialog is now shown with the latest version's changes
    • Menus are now only created when needed
    • Moved dependencies to @require to reduce script size
    • Improved UX of the hotkey input in the config menu
  • Fixes:
    • Fixed fatal error when cookies / session storage was unavailable or disabled
    • Fixed spacing around thumbnails in search results being inconsistent
    • Fixed queue button container alignment
    • Fixed Chinese translations
  • Internal Changes:
    • Removed React JSX support
    • Small utility function refactoring

Release 1.1.0

15 Feb 16:53
Compare
Choose a tag to compare
  • Features / Changes:
    • The userscript is now available in 9 languages! To submit or edit translations, please view this guide
    • Added an interface for user-created plugins (see contributing guide for more info)
    • Made site switch hotkey customizable
    • Userscript will now show a welcome page after first install / update
    • Feature to restore last song's time on page reload
    • Made interval of arrow key skip configurable
    • A hint is now sent to Dark Reader to disable itself (see this)
    • Made volume slider scroll sensitivity configurable
    • Added details / help dialog to menu feature list
    • Added queue buttons to all types of song list
    • Added manual version check (can be disabled in config menu)
  • Fixes:
    • BetterYTM now uses a more reliable way to skip to a certain time
    • Fixed resources not loading in Chrome
    • Fixed album list spacing getting messed up by anchor improvements styling
    • Fixed "Start at" option in share menu making tracking parameter reappear
    • Fixed selector for player queue that was changed by a YTM update
  • Internal Changes:
    • The license of the source code has been changed from MIT to AGPL-3.0
    • Migrated to the Rollup bundler
      • Now multiple versions of the script are compiled for the different hosts (GitHub, GreasyFork, OpenUserJS) with slight compatibility fixes each
      • Target branch can now be specified while compiling instead of being tied to the bundler mode
    • Added support for React JSX
    • Added support for external libraries through @require

Release 1.0.2

19 Sep 22:12
d6beba9
Compare
Choose a tag to compare
  • Changes:
    • Script is now published to OpenUserJS!
    • Added a OpenUserJS link to the configuration menu

Release 1.0.1

19 Sep 14:23
Compare
Choose a tag to compare
  • Changes:
    • Script is now published to GreasyFork!
    • Added a GreasyFork link to the configuration menu