Skip to content

Instantly share code, notes, and snippets.

@BananaAcid
Last active December 1, 2025 20:18
Show Gist options
  • Select an option

  • Save BananaAcid/a23844d757a41833ea540d73283cecf9 to your computer and use it in GitHub Desktop.

Select an option

Save BananaAcid/a23844d757a41833ea540d73283cecf9 to your computer and use it in GitHub Desktop.
SmartTV / XBOX + PS5 Style YouTube for TV-UI on PC / Steamdeck with Gamepad

SmartTV / XBOX Style YouTube with TV-UI on PC / Steamdeck with Gamepad

image

Short URL to this documentation: https://is.gd/youtube_tv_ui

Info

This is about the "YouTube on TV" interface to the default YouTube website (like SmartTVs use it - LG, Samsung, PS5, ...)

Benefits:

Drawbacks:

  • Max quality is based on screensize and navigator string
  • Playback halts and controler won't work, when the 'YouTube on TV' loses window focus (so don't use it while working on your PC)

Summary

  1. Install a separate browser and needed extensions + configure
  2. Let the browser automatically create a WebApp (Why? see 6.4.2 below)
  3. Add it to Steam to enable controller support
  4. Edit the controller profile

how to

  1. install Chromium / Ungoogled Chromium

    • NOTE: for fullscreen to work, the used browser MUST NOT BE already opened on start with the required arguments, so we install a separate browser (everything here works the same for Google Chrome)
    • Ungoogled Chromium: to be able install or download extensions from the chrome webstore
  2. install extensions

  3. open https://www.youtube.com/tv

    • NOTE: will redirect to the normal youtube page, if the extension "Youtube TV On PC" is missing
  4. click on the browsers app menu (3 vertical dots) > click on "Stream, save and share" > "install page as app"

    • creates a desktop icon, I will reference it as [YT_LINK] below
    • NOTE: Do this before youtube is done redirecting, the url still must be /tv
    • NOTE: Do NOT login yet
    • Windows save location If you need the Link later: C:\Users\%USERNAME%\AppData\Local\Chromium\User Data\Default\Web Applications
  5. right click the desktop icon [YT_LINK]

    1. open the properties, copy the --app-id=... part
  6. open Steam
    Note: Steam is needed to translate Gamepad actions into the required Keyboard button presses and for SteamDeck (open desktop mode to add)

    1. "Add Game" (bottom left)
    2. add Chromium
      • Windows: add C:\Program Files\Chromium\Application\chrome.exe
        • NOTE: we need to use chrome.exe (not chrome_proxy.exe) to make the fullscreen param work
      • Linux / SteamDeck: Chromium (Flatpak) or Ungoogled Chromium (Flatpak)
        • it should look something like flatpak 'run' '--command=/app/bin/chromium' 'com.github.Eloston.UngoogledChromium' '--profile-directory=Default'
        • the params in #4 need to go after these
    3. right click the created game entry, properties
      1. change the link "start arguments"
        • use the [YT_LINK] properties, mainly add the app-id
          • --app-id=<YOUR_[YT_LINK]_APP-ID_HERE>
        • you could use --app=https://youtube.com/tv instead of --app-id, but:
          • the cache would be shared with the chromium browser tabs (and login will be cleared if you clear the browser history / you could use another profile --- but this way, it stays in the app's specific cache and remembers the login)
          • you would not get access to the extensions and options button in the title bar
      2. add other params to look like
        • --profile-directory=Default --start-maximized --start-fullscreen
      3. add optional params
        • to set the startup screen: --window-position=<leftpos>,<toppos> (you need to get the values, not on wayland I think)
          • e.g. --window-position=-1282,0 for a screen left of the primary
          • NOTE: To figure out this value, you can open any browser window, move the window to the right position and maximize it, then open DevTools and enter window.top.screenLeft in the console
        • it is possible to use --user-data-dir=... instead of --profile-directory=Default to have it save all app related data (cache, cookies, ...) to a specific folder (Flatpak: mind the restrictions)
        • There is also --window-size=<width>,<height> for setting the correct resolution on SteamDeck's Gaming Mode due to interface scaling (SteamDeck resolution: 1280 * 800 )
        • --app-launch-url-for-shortcuts-menu-item=<url> can be used to add a pre-launch url to wait for browser extensions to load (delayed extension loading)
          • --app-launch-url-for-shortcuts-menu-item="javascript:setTimeout(_=>location='https://youtube.com/tv',3000)" to delay the loading by 1000ms (1s)
        • --force-device-scale-factor=1.5 -- just as a Note, since YouTube usually scales by itself
    4. select "controller"
      NOTE: Controller must be connected for the config button to show up
      1. add a gamepad profile from vdf below (howto: gamepad config files)

      2. OR add a new profile (XBox Controller style):

        Button action
        A Enter {select}
        B Escape {back, do NOT use numblock STOP because it would NOT close menus and overlays and only leave the current video}
        X PLAY {Numblock - Play button, K would be immediate pause but not resume}
        Y {would be search on XBOX, I don't know the key for it}
        LB H {previous video, you could use numblock NEXT}
        RB [ (german key position: Ü) {next video, you could use numblock PREV}
        Menu left F5 (normal), F11 (long press) {reload, toggle fullscreen}
        Menu right action: Show Keyboard (normal)
        Stick R action
        Left - {minus for "Playback speed control"}
        Right + {plus for "Playback speed control"}
        press action: volume up
        • Stick R to directional cross, Overlap 0
        Stick L action
        up UP {keyboard key} (enable Turbo, repeat rate 250 ms)
        ... ...
        press action: volume down
        • Stick L to directional cross, Overlap 0
        Cross action
        up UP {keyboard key} (enable Turbo, repeat rate 250 ms)
        ... ...
        Trigger action
        LT LEFT {keyboard key} (enable Turbo, repeat rate 100 ms -- to be able to trigger fast forward)
        RT RIGHT {keyboard key} (enable Turbo, repeat rate 100 ms -- to be able to trigger fast forward)
      3. change the artwork

        1. download the image for the YouTube on TV steam tile (I like the one from "YouTube TV" service):
          • https://lh3.googleusercontent.com/n85nSO55t002NCJrOVliTtbkjbwfdCvWdMngVjR3j5aY-og3lcQJR2XDxHslROEnkY15r9ycT5O5RSxj13JrZ3Xjwg=s275-w275-h175
        2. right click the created game entry, select change userdefined artwork (properties), and use the saved image
  7. delete the [YT_LINK] file

    • NOTE: not needed anymore, we needed the WebApp params to configure steam
  8. click the tempermonkey extension in chromium, while on the youtube link

    • click the extensions button in the top bar (SteamDeck: do this in Desktop Mode)
    • NOTE: when the browser opens, the "Youtube TV On PC" extension does not trigger at the right moment (reloading the page quickly will make it kick in, due to delayed extension loading)
    • NOTE: when not in fullscreen when loading the page, the youtube player will not show the max video quality (reloading the page fixes this)
    1. "create new userscript" and save
      // ==UserScript==
      // @name         YouTube/TV reload
      // @namespace    http://tampermonkey.net/
      // @version      2025-05-19
      // @description  reload the Youtube page
      // @author       BananaAcid
      // @match        https://www.youtube.com/tv*
      // @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
      // @grant        none
      // @source       https://gist.github.com/BananaAcid/a23844d757a41833ea540d73283cecf9
      // @run-at       document-end
      // ==/UserScript==
      
      (function() {
          'use strict';
      
          localStorage.YTV_REFRESH_COUNTER = localStorage.YTV_REFRESH_COUNTER ?? 0;
      
          if (document.querySelector('body > .content-container[role=alert]')) {
              document.querySelector('body > .content-container[role=alert] > .header[role=contentinfo]').innerHTML = 'Loading extensions';
              document.querySelector('body > .content-container[role=alert] > .footer[role=contentinfo]').innerHTML = 'Please wait, until the browser extensions are ready. The interface will load automatically.';
      
              localStorage.YTV_REFRESH_COUNTER++;
      
              setTimeout(_ => {
                  document.location.reload();
              }, localStorage.YTV_REFRESH_COUNTER < 3 ? 100: 3000);
          }
          else {
              localStorage.removeItem('YTV_REFRESH_COUNTER');
          }
      
      })();
    2. create a second userscript
      // ==UserScript==
      // @name         Hide Cursor
      // @namespace    http://tampermonkey.net/
      // @version      2025-05-19
      // @description  hides the cursor when not used
      // @author       BananaAcid
      // @match        https://www.youtube.com/tv*
      // @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
      // @grant        none
      // @source       https://gist.github.com/BananaAcid/a23844d757a41833ea540d73283cecf9
      // ==/UserScript==
      
      (function() {
          'use strict';
      
          //console.log('Hide Cursor');
          (function() {
              let inactivityTimeoutId;
              const HIDE_TIMEOUT_MS = 3000; // 3 seconds
      
              function hideCursor() {
                  document.body.style.cursor = 'none';
                  //console.log('Cursor hidden');
              }
      
              function showCursor() {
                  document.body.style.cursor = 'auto';
                  //console.log('Cursor shown');
              }
      
              function resetInactivityTimer() {
                  clearTimeout(inactivityTimeoutId);
                  showCursor();
                  inactivityTimeoutId = setTimeout(hideCursor, HIDE_TIMEOUT_MS);
                  //console.log('Timer reset, will hide in ' + HIDE_TIMEOUT_MS + 'ms');
              }
      
              document.addEventListener('mousemove', resetInactivityTimer);
              document.addEventListener('mousedown', resetInactivityTimer);
              document.addEventListener('touchstart', resetInactivityTimer);
              resetInactivityTimer();
          })();
      })();
      • if it is used on steamdeck, use document.body.style.cursor = 'none'; directly below 'use strict' and remove the rest
    3. click on the tempermonky extension, overview > turn the new userscript ON
  9. Now only start it through steam to have the controller work and LOGIN the first time

    • NOTE: The "Exit Youtube" button will not work due to Chromium 88+ security restrictions

High-Quality playback fix

I am not really sure, this is actually better, but it seems it actually provides 1080p more often.

The video quality selection usually does not show the high quality options. Worse, it not always show 1080p.

To fix this, we can change the user agent string, the very trick that leads the google server to send us the TV website.

We need to change the following file:

Windows: C:\Users\%username%\AppData\Local\Chromium\User Data\Default\Extensions\jldjbkccldgbegjpggphaeikombjmnkh\0.9_0\rules.json

Linux/MacOS: ~/Library/Application Support/chromium/Default/Extensions/jldjbkccldgbegjpggphaeikombjmnkh/0.9_0/rules.json

From (old):

  • "Mozilla/5.0 (Linux; Andr0id 9; BRAVIA 8K UR2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 OPR/46.0.2207.0 OMI/4.21.0.273.DIA6.149 Model/Sony-BRAVIA-8K-UR2"

to (new):

  • "Mozilla/5.0 (PS4; Leanback Shell) Gecko/20100101 Firefox/65.0 LeanbackShell/01.00.01.75 Sony PS4/ (PS4, , no, CH)"

YOU MUST remove the _metadata folder if it exists (it exists next to the rules.json and caches the rules.json).

To see, if it worked, check window.tectonicConfig.deviceInfo in the DevTools (in Console paste this string and press enter) after reenabling the ext and reloading the page.

smarttv xbox style youtube tv-ui on pc steamdeck_0.vdf

howto: gamepad config files

code ...
"controller_mappings"
{
	"version"		"3"
	"revision"		"154"
	"title"		"SmartTV / XBOX Style YouTube TV-UI on PC / Steamdeck"
	"description"		"Gamepad controls - details: https://is.gd/youtube_tv_ui"
	"creator"		"76561197990564823"
	"progenitor"		""
	"url"		"workshop://3486273234"
	"export_type"		"personal_local"
	"controller_type"		"controller_xboxelite"
	"controller_caps"		"5785599"
	"major_revision"		"0"
	"minor_revision"		"0"
	"Timestamp"		"511750144"
	"actions"
	{
		"Default"
		{
			"title"		"Default"
			"legacy_set"		"1"
		}
		"Preset_1000001"
		{
			"title"		"Settings"
			"legacy_set"		"1"
		}
	}
	"action_layers"
	{
	}
	"localization"
	{
		"english"
		{
			"title"		"Gamepad"
			"description"		"This template is for games that already have built-in gamepad support.  Intended for dual stick games such as twin-stick shooters, side-scrollers, etc."
		}
		"czech"
		{
			"title"		"Gamepad"
			"description"		"Tato šablona je pro většinu her podporujících gamepad a byla navržena pro použití ve hrách využívajících dvě páčky, jakými jsou například plošinovky nebo automatové hry."
		}
		"danish"
		{
			"title"		"Gamepad"
			"description"		"Denne skabelon er til spil, der allerede har indbygget gamepad-understøttelse. Beregnet til spil med dobbelte styrepinde såsom twin-stick shooters, side-scrollers osv."
		}
		"dutch"
		{
			"title"		"Gamepad"
			"description"		"Deze template is voor spellen die al ingebouwde gamepadondersteuning hebben. Bedoeld voor dual-stick spellen zoals twin-stick-shooters, side-scrollers, etc."
		}
		"finnish"
		{
			"title"		"Ohjain"
			"description"		"Tämä malli on muita ohjaimia valmiiksi tukeville peleille. Se on tarkoitettu kahta sauvaa käyttäville peleille, kuten twin-stick shooterit, side-scrollerit, jne."
		}
		"french"
		{
			"title"		"Manette"
			"description"		"Ce modèle fonctionne pour les jeux conçus pour manettes à deux sticks tels que les jeux de type twin-stick shooter, à défilement horizontal (side-scrollers), etc."
		}
		"german"
		{
			"title"		"Gamepad"
			"description"		"Diese Vorlage ist für Spiele konzipiert, die bereits volle Unterstützung für Gamepads mit sich bringen. Gedacht für Zwei-Analogstick-Spiele wie Twin-Stick-Shooter, Side-Scrollers usw."
		}
		"hungarian"
		{
			"title"		"Gamepad"
			"description"		"Ez a sablon olyan játékokhoz való, melyek már rendelkeznek beépített gamepad-támogatással. Olyan két karos játékokhoz szánva, mint a kétkaros vagy oldalnézetes lövöldözős játékok stb."
		}
		"italian"
		{
			"title"		"Controller"
			"description"		"Questo modello funziona per la maggior parte dei giochi che supportano i controller in modalità nativa."
		}
		"japanese"
		{
			"title"		"ゲームパッド"
			"description"		"このテンプレートは、標準でゲームパッドをサポートしているツインスティックシューターや横スクロール等といったデュアルスティックゲームを対象としたゲーム向けです。"
		}
		"koreana"
		{
			"title"		"게임패드"
			"description"		"게임 패드를 지원하도록 설계된 게임들을 위한 설정입니다. 이중 스틱 슈팅 게임, 사이드 스크롤 게임 등 스틱을 두 개 쓰는 게임을 염두에 두고 만들어졌습니다."
		}
		"polish"
		{
			"title"		"Kontroler"
			"description"		"Ten szablon jest odpowiedni dla gier, które już mają wbudowane wsparcie dla kontrolerów. Przeznaczony dla gier obsługujących dwie gałki, m.in. twin-stick shootery, side-scrollery itp."
		}
		"portuguese"
		{
			"title"		"Comando"
			"description"		"Este modelo é indicado para jogos que já têm compatibilidade nativa com comando. Foi concebido para jogos de tiros que usam dois sticks, jogos de plataformas, de naves, etc."
		}
		"romanian"
		{
			"title"		"Gamepad"
			"description"		"Șablonul acesta este pentru jocurile care au deja suport pentru gamepad implementat. Destinat pentru jocuri dual stick, precum shooter-e twin-stick, side-scroller, etc."
		}
		"russian"
		{
			"title"		"Геймпад"
			"description"		"Этот шаблон подходит для большинства игр с поддержкой геймпада — например, для шутеров с видом сверху или сбоку."
		}
		"spanish"
		{
			"title"		"Mando"
			"description"		"Esta plantilla es para juegos que ya incluyen de serie compatibilidad con mando. Está destinada a juegos de doble stick como twin-stick shooters, side-scrollers, etc."
		}
		"swedish"
		{
			"title"		"Gamepad"
			"description"		"Denna mall är för spel som redan har inbyggt stöd för spelkontroller. Avsett för spel som använder två styrspakar, som twin-stick shooters och side-scrollers, etc."
		}
		"schinese"
		{
			"title"		"手柄"
			"description"		"该模板适用于已内置手柄支持的游戏。针对双摇杆游戏,如双摇杆射击游戏、横版过关游戏等设计。"
		}
		"thai"
		{
			"title"		"เกมแพด"
		}
		"brazilian"
		{
			"title"		"Controle padrão"
			"description"		"Este modelo é para jogos já compatíveis com controle que usam ambas as alavancas, como jogos de nave, etc."
		}
		"bulgarian"
		{
			"title"		"Геймпад"
			"description"		"Този шаблон е за игри, които вече имат вградена поддръжка на геймпад. Предназначен e за игри ползващи двата стика. Като например, екшъни за два аналогови стика, странични скролери и т.н."
		}
		"greek"
		{
			"title"		"Χειριστήριο"
			"description"		"Αυτό το πρότυπο ορίζεται για παιχνίδια τα οποία έχουν ήδη υποστήριξη χειριστηρίου. Προορίζεται για παιχνίδια dual-stick όπως twin-stick shooters, side-scrollers, κλπ."
		}
		"turkish"
		{
			"title"		"Oyun Kumandası"
			"description"		"Bu şablon hali hazırda oyun içi oyun kumandası desteği ve birincil veya üçüncü kişi kontrollü kameraya sahip oyunlar içindir. Çift çubuk kullanılan oyunlar olan ikiz çubuk nişancılık, side-scroller oyunlar vb. içindir."
		}
		"ukrainian"
		{
			"title"		"Ґеймпад"
			"description"		"Цей шаблон для більшості ігор, в яких вже вбудовано підтримку ґеймпада. Призначено для ігор з керуванням двома стіками."
		}
	}
	"group"
	{
		"id"		"0"
		"mode"		"four_buttons"
		"name"		""
		"description"		""
		"inputs"
		{
			"button_a"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press RETURN, Activate, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"button_b"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press ESCAPE, Close / Back, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"button_x"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press PLAY, Play/Pause, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"button_y"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"controller_action CHANGE_PRESET 2 1 1, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"1"
		"mode"		"dpad"
		"name"		""
		"description"		""
		"inputs"
		{
			"dpad_north"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button dpad_up, , "
						}
						"settings"
						{
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_south"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button dpad_down, , "
						}
						"settings"
						{
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_east"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button dpad_right, , "
						}
						"settings"
						{
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_west"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button dpad_left, , "
						}
						"settings"
						{
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"2"
		"mode"		"joystick_move"
		"name"		""
		"description"		""
		"inputs"
		{
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button JOYSTICK_RIGHT, , "
						}
						"settings"
						{
							"haptic_intensity"		"2"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"3"
		"mode"		"joystick_move"
		"name"		""
		"description"		""
		"inputs"
		{
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button JOYSTICK_LEFT, , "
						}
						"settings"
						{
							"haptic_intensity"		"2"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"4"
		"mode"		"trigger"
		"name"		""
		"description"		""
		"inputs"
		{
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press LEFT_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"haptic_intensity"		"2"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
		"settings"
		{
			"output_trigger"		"1"
		}
	}
	"group"
	{
		"id"		"5"
		"mode"		"trigger"
		"name"		""
		"description"		""
		"inputs"
		{
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press RIGHT_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"haptic_intensity"		"2"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
		"settings"
		{
			"output_trigger"		"2"
		}
	}
	"group"
	{
		"id"		"6"
		"mode"		"joystick_move"
		"name"		""
		"description"		""
		"inputs"
		{
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button JOYSTICK_RIGHT, , "
						}
						"settings"
						{
							"haptic_intensity"		"2"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"8"
		"mode"		"joystick_move"
		"name"		""
		"description"		""
		"inputs"
		{
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"xinput_button JOYSTICK_RIGHT, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"9"
		"mode"		"dpad"
		"name"		""
		"description"		""
		"inputs"
		{
			"dpad_north"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press UP_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_south"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press DOWN_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_east"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press RIGHT_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_west"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press LEFT_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
							"haptic_intensity"		"1"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
		"settings"
		{
			"requires_click"		"0"
			"haptic_intensity_override"		"0"
		}
	}
	"group"
	{
		"id"		"10"
		"mode"		"dpad"
		"name"		""
		"description"		""
		"inputs"
		{
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press KEYPAD_PLUS, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
		"settings"
		{
			"requires_click"		"0"
			"overlap_region"		"2000"
		}
	}
	"group"
	{
		"id"		"11"
		"mode"		"dpad"
		"name"		""
		"description"		""
		"inputs"
		{
			"dpad_north"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press UP_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_south"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press DOWN_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_east"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press RIGHT_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_west"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press LEFT_ARROW, , "
						}
						"settings"
						{
							"hold_repeats"		"1"
							"repeat_rate"		"250"
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"click"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press KEYPAD_DASH, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
		"settings"
		{
			"requires_click"		"0"
			"overlap_region"		"2000"
		}
	}
	"group"
	{
		"id"		"13"
		"mode"		"four_buttons"
		"name"		""
		"description"		""
		"inputs"
		{
			"button_b"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"controller_action CHANGE_PRESET 1 1 1, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"button_x"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press PLAY, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"button_y"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"controller_action CHANGE_PRESET 1 1 1, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"14"
		"mode"		"trigger"
		"name"		""
		"description"		""
		"inputs"
		{
		}
	}
	"group"
	{
		"id"		"15"
		"mode"		"trigger"
		"name"		""
		"description"		""
		"inputs"
		{
		}
	}
	"group"
	{
		"id"		"30"
		"mode"		"dpad"
		"name"		""
		"description"		""
		"inputs"
		{
			"dpad_north"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press VOLUME_UP, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_south"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press VOLUME_DOWN, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_east"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press KEYPAD_PLUS, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"dpad_west"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press KEYPAD_DASH, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
		"settings"
		{
			"requires_click"		"0"
			"layout"		"3"
			"haptic_intensity_override"		"0"
		}
	}
	"group"
	{
		"id"		"31"
		"mode"		"dpad"
		"name"		""
		"description"		""
		"inputs"
		{
		}
		"settings"
		{
			"requires_click"		"0"
		}
	}
	"group"
	{
		"id"		"7"
		"mode"		"switches"
		"name"		""
		"description"		""
		"inputs"
		{
			"button_escape"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"controller_action SHOW_KEYBOARD, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"button_menu"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press F11, Fullscreen / Reload, , "
						}
					}
					"Long_Press"
					{
						"bindings"
						{
							"binding"		"key_press F5, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"left_bumper"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press H, Previous Video, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"right_bumper"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press LEFT_BRACKET, Next Video, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
			"button_capture"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"controller_action SCREENSHOT, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"group"
	{
		"id"		"16"
		"mode"		"switches"
		"name"		""
		"description"		""
		"inputs"
		{
			"button_menu"
			{
				"activators"
				{
					"Full_Press"
					{
						"bindings"
						{
							"binding"		"key_press F11, , "
						}
					}
				}
				"disabled_activators"
				{
				}
			}
		}
	}
	"preset"
	{
		"id"		"0"
		"name"		"Default"
		"group_source_bindings"
		{
			"7"		"switch active"
			"0"		"button_diamond active"
			"3"		"joystick inactive"
			"11"		"joystick active"
			"4"		"left_trigger active"
			"5"		"right_trigger active"
			"8"		"right_joystick inactive"
			"10"		"right_joystick active"
			"9"		"dpad active"
		}
	}
	"preset"
	{
		"id"		"1"
		"name"		"Preset_1000001"
		"group_source_bindings"
		{
			"16"		"switch active"
			"13"		"button_diamond active"
			"31"		"joystick inactive"
			"14"		"left_trigger active"
			"15"		"right_trigger active"
			"30"		"dpad active"
		}
	}
	"settings"
	{
		"left_trackpad_mode"		"0"
		"right_trackpad_mode"		"0"
	}
}
@AXEL257Games
Copy link

Not working

@BananaAcid
Copy link
Author

@AXEL257Games And what exactly doesn’t and what have you tried/ where are you stuck? I am using it daily. I might be able to help.

@AXEL257Games
Copy link

Well, it IS working but only on windows, but on linux it just not starting through steam

@AXEL257Games
Copy link

I'm gonna try again

@BananaAcid
Copy link
Author

@AXEL257Games
On Linux: when it opens and shows the redirecting-to-YouTube screen, try ctrl+r or F5 to reload … if it does work after that, it might be related to delayed plugin loading in the browser. There is a fix for that: use a HTML page that does a redirect to the YouTube-tv url after 10 seconds … I might add a template to the above code at a later date.

@BananaAcid
Copy link
Author

BananaAcid commented Nov 24, 2025

@AXEL257Games about "not opening": I added some info, on how to add it on Linux (if chromium is installed as flatpack) ... and: you might need to enable userscripts (new chrome/chromium browsers): https://www.tampermonkey.net/faq.php#Q209

@AXEL257Games
Copy link

@AXEL257Games about "not opening": I added some info, on how to add it on Linux (if chromium is installed as flatpack) ... and: you might need to enable userscripts (new chrome/chromium browsers): https://www.tampermonkey.net/faq.php#Q209

Hello, I would like to correct a couple of errors in the text: firstly, ungoogled chromium is written with a space; secondly, flatpack does not exist, flatpak does; thirdly, Auto High Quality for YouTubeTM is written instead of Auto Quality for YouTubeTM also im gonna try again in linux

@BananaAcid
Copy link
Author

@AXEL257Games Thanks for the info. I have not tried Auto High Quality for YouTubeTM but I guess it works the same way.

@AXEL257Games
Copy link

AXEL257Games commented Nov 29, 2025

@AXEL257Games Thanks for the info. I have not tried Auto High Quality for YouTubeTM but I guess it works the same way.

Auto High Quality for YouTubeTM is recommended from Google 2nd is not recommended

@BananaAcid
Copy link
Author

@AXEL257Games Good to know it is recommended to you. Please let me know if it works as intended for this use case and if it is as simple to use (ideally check it’s source code as well - I did it for the one above). If you recommend it, I might add it as an alternative.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment