Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&path=Folder 1/Folder 2&changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&amp;path=Folder 1/Folder 2&amp;changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&amp;path=Folder 1/Folder 2&amp;changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&amp;path=Folder 1/Folder 2&amp;changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&amp;path=Folder 1/Folder 2&amp;changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&amp;path=Folder 1/Folder 2&amp;changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&amp;path=Folder 1/Folder 2&amp;changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

8 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

----chooser.py ----
# The chooser.py script is inspired and heavily based on original script.favourites from Ronie and Black at XBMC.org / kodi.tv
The chooser.py script is run like any other Kodi python script, e.g.
RunScript(special://home/addons/plugin.program.super.favourites/chooser.py,property=CustomSuperFavourite1&amp;path=Folder 1/Folder 2&amp;changetitle=true)
The path (optional) parameter indicates which folder the browse dialog will start in, in the above example this will be the "Super Favourites Root/Folder1/Folder 2" folder. If this parameter is omitted it defaults to the SF root folder.
The changetitle (optional) parameter indicates that once selected the user will be prompted to enter a new name for the Favourite. If this parameter is omitted it defaults to false.
The property (NOT optional) parameter indicates the skin property that will be set when the browse dialog is okayed, the following skin properties will be set:
CustomSuperFavourite1.Path
CustomSuperFavourite1.Label
CustomSuperFavourite1.Icon
CustomSuperFavourite1.IsFolder
The path will be the fully formed action for Kodi and will either trigger the selected Super Favourite, or if it is a Super Folder, it will start Super Favourites in that folder.
It is also possible to start SF using the follow type of command:
ActivateWindow(10025,"plugin://plugin.program.super.favourites/?folder=CustomSuperFavourite1")
In this instance the addon will automatically resolve the Skin setting to the correct folder.
If the folder parameter is replaced with the content parameter and then used in the <content> tag of a list, e.g.
<content target="video">plugin://plugin.program.super.favourites/?content=CustomSuperFavourite1&reload=$INFO[Window(Home).Property(Super_Favourites_Count)]</content>
SF will create the same list but remove the "New Super Favourite", "Explore Kodi Favourites" and Separator items automatically, this is useful when using SF to automatically populate a list/widget in Kodi. The reload section will cause the list to automatically refresh if the contents change
---- Adding items to Super Favourites global menu ----
When the global menu is constructed it nows looks in the following folder for additional python scripts (*.py):
kodi/userdata/addon_data/plugin.program.super.favourites/Plugins
These scripts must implement the following 2 methods:
add(params):
process(option, params):
where option is a zero-based int that indicates which option was selected,
and params is a dictionary containing the following keys:
thumb : xbmc.getInfoLabel('ListItem.Thumb')
icon : xbmc.getInfoLabel('ListItem.ActualIcon') fanart : xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
filename	: xbmc.getInfoLabel('ListItem.FilenameAndPath')
window : xbmcgui.getCurrentWindowId()
file : xbmc.Player().getPlayingFile()
path : xbmc.getInfoLabel('ListItem.FolderPath')
folder : xbmc.getInfoLabel('Container.FolderPath')
label : xbmc.getInfoLabel('ListItem.Label')
isplayable	: xbmc.getInfoLabel('ListItem.Property(IsPlayable)').lower() == 'true'
hasVideo	: xbmc.getCondVisibility('Player.HasVideo') == 1
isfolder	: xbmc.getCondVisibility('ListItem.IsFolder') == 1
isstream	: xbmc.Player().isInternetStream()
description	: depends upon item, and will be set to the first one of the following that contains text
xbmc.getInfoLabel('ListItem.Plot')
xbmc.getInfoLabel('ListItem.Property(Addon.Description)')
xbmc.getInfoLabel('ListItem.Property(Addon.Summary)')
xbmc.getInfoLabel('ListItem.Property(Artist_Description)')
xbmc.getInfoLabel('ListItem.Property(Album_Description)')
xbmc.getInfoLabel('ListItem.Artist')
xbmc.getInfoLabel('ListItem.Comment')
The add method should determine what items to add to the menu (based on the values passed in) and return either None (i.e. nothing is added to menu),
a string, or list of strings that are the display labels for the items to add to the menu.
The process method should then respond to the option passed in, this will be the index of the selected item in the list returned in the add method, the params can be used to recreate the original list if necessary (this will most likely be necessary if the items added are dynamic).
Your addon code should ensure that the script is copied to the correct location (probably best via a service), this location can be obtained using this code:
ADDONID = 'plugin.program.super.favourites'
ADDON = xbmcaddon.Addon(ADDONID)
PROFILE = ADDON.getAddonInfo('profile')
PLUGIN = os.path.join(PROFILE, 'Plugins')
It might also be prudent to provide the option to disable adding to the global menu via your addon settings.

About

Kodi plugin

Resources

Stars

13 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages