Skip to content

Instantly share code, notes, and snippets.

@atb00ker
Last active June 28, 2026 22:29
Show Gist options
  • Select an option

  • Save atb00ker/33dac2afc54bbda7e85f2c0f053277cc to your computer and use it in GitHub Desktop.

Select an option

Save atb00ker/33dac2afc54bbda7e85f2c0f053277cc to your computer and use it in GitHub Desktop.
homelab
{
"name": "Tube39",
"description": "A plugin that adds PeerTube as a source",
"author": "atb00ker",
"authorUrl": "https://lab39.home.kg",
"platformUrl": "https://peertube.lab39.home.kg/",
"sourceUrl": "https://gist.githubusercontent.com/atb00ker/33dac2afc54bbda7e85f2c0f053277cc/raw/",
"repositoryUrl": "https://gitlab.futo.org/videostreaming/plugins/peertube",
"scriptUrl": "https://plugins.grayjay.app/PeerTube/PeerTubeScript.js",
"version": 27,
"iconUrl": "https://plugins.grayjay.app/PeerTube/peertube.png",
"id": "ea811b45-140e-440b-ad46-f6799a987c32",
"scriptSignature": "UuIZPDuIzFu9aKwkHhscdrsQFUyHx6qGkgCPzvXFV3t70samRb12pWlMFJzq7mWKcFza0lNSBIRccskDoUpnCdsu34d7AhHA4ekOhNW4RxqKAXrkspwxeeVEg/\u002Bmo/lOePJJDGW6LfiVZnl4JH3PhUgruOn3CveAHp43qnZLS6hnSzyC3xyjIJxvvn69Yf8NSIhlUd/v0/rRYRQ0a484xhDDOTVJ/hO3ytTX9Kf45vzciTKnYGMl8fHRN1IOrR7LgWowCW40chCMQPW/VqJewfNBpufsNk/g2S\u002BAywtx22XfU48GkEoKFY\u002BC1mE0HqHGYkg0Zfqwnsv\u002BIadp92DKYA==",
"scriptPublicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsoFJU4AReDyUnSQI9A99UjLCwkY8OH\u002B1o8cdtf2EjSb\u002BfO2qmP8MGMTAvfvgmq5d2QBJE2XHRkRO3JKcTlcc1j0WlOlU8P9W272DYCeX6oYaavpKNqGKoGEuodp9wtiyNwyH46\u002B\u002BJfpU/uIUacZbZKkHv9gIGchmNvpKYZQjFd/8pUqXGpcXZP54tGSC9PLcY\u002B5TozZThK7Oy1\u002B3YEf1bZ44UinRYYATbLk/wNuAfsupvlt6nxZOcJhABhdo9V\u002BgY0FE6Ayg5\u002B1cd1noWhnRtLF\u002BsPdEr3z8Nt15JEK5a/524t25FMhwz8yKxlGW5qW3QLJHSUgLQncL6a1zlZ1s8QIDAQAB",
"packages": [
"Http"
],
"packagesOptional": [
"HttpImp"
],
"allowEval": false,
"allowUrls": [
"everywhere"
],
"constants": {
"baseUrl": "https://tube.lab39.home.kg"
},
"authentication": {
"loginUrl": "https://tube.lab39.home.kg/login",
"completionUrl": "https://tube.lab39.home.kg/api/v1/users/me?*",
"headersToFind": [
"Authorization"
],
"userAgent": "Mozilla/5.0 (Linux; Android 12) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.230 Mobile Safari/537.36"
},
"authenticationDesktop": {
"loginUrl": "https://tube.lab39.home.kg/login",
"completionUrl": "https://tube.lab39.home.kg/api/v1/users/me?*",
"headersToFind": [
"Authorization"
],
"userAgent": null,
"useMobileEmulation": false
},
"captcha": {
"userAgent": "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.6778.200 Mobile Safari/537.36",
"captchaUrl": null,
"cookiesToFind": [
"cf_clearance"
]
},
"captchaDesktop": {
"captchaUrl": null,
"cookiesToFind": [
"cf_clearance"
],
"userAgent": null,
"useMobileEmulation": false
},
"settings": [
{
"variable": "homeHeader",
"name": "Home Feed",
"description": "Source and sorting for the home feed",
"type": "Header"
},
{
"variable": "homeSourceCurrentInstance",
"name": "Current Instance",
"description": "Include videos from your configured PeerTube instance.",
"type": "Boolean",
"default": "true"
},
{
"variable": "homeSourceSepiaSearch",
"name": "Sepia Search",
"description": "Include videos from all indexed PeerTube instances via sepiasearch.org.",
"type": "Boolean",
"default": "false"
},
{
"variable": "homeFeedSortIndex",
"name": "Home Feed Sorting",
"description": "Best, Trending, and Hot require PeerTube v3.1.0\u002B (falls back to Newest on older instances).",
"type": "Dropdown",
"default": "1",
"options": [
"Best (Algorithm)",
"Newest",
"Oldest",
"Most Views",
"Most Likes",
"Trending",
"Hot"
]
},
{
"variable": "homeFiltersHeader",
"name": "Home Filters",
"description": "Filter home feed by category and language. Multiple filters combine with OR logic. Leave empty to disable.",
"type": "Header"
},
{
"variable": "mainCategoryIndex",
"name": "Home Category Filter 1",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"Music",
"Films",
"Vehicles",
"Art",
"Sports",
"Travels",
"Gaming",
"People",
"Comedy",
"Entertainment",
"News \u0026 Politics",
"How To",
"Education",
"Activism",
"Science \u0026 Technology",
"Animals",
"Kids",
"Food"
]
},
{
"variable": "secondCategoryIndex",
"name": "Home Category Filter 2",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"Music",
"Films",
"Vehicles",
"Art",
"Sports",
"Travels",
"Gaming",
"People",
"Comedy",
"Entertainment",
"News \u0026 Politics",
"How To",
"Education",
"Activism",
"Science \u0026 Technology",
"Animals",
"Kids",
"Food"
]
},
{
"variable": "thirdCategoryIndex",
"name": "Home Category Filter 3",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"Music",
"Films",
"Vehicles",
"Art",
"Sports",
"Travels",
"Gaming",
"People",
"Comedy",
"Entertainment",
"News \u0026 Politics",
"How To",
"Education",
"Activism",
"Science \u0026 Technology",
"Animals",
"Kids",
"Food"
]
},
{
"variable": "fourthCategoryIndex",
"name": "Home Category Filter 4",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"Music",
"Films",
"Vehicles",
"Art",
"Sports",
"Travels",
"Gaming",
"People",
"Comedy",
"Entertainment",
"News \u0026 Politics",
"How To",
"Education",
"Activism",
"Science \u0026 Technology",
"Animals",
"Kids",
"Food"
]
},
{
"variable": "fifthCategoryIndex",
"name": "Home Category Filter 5",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"Music",
"Films",
"Vehicles",
"Art",
"Sports",
"Travels",
"Gaming",
"People",
"Comedy",
"Entertainment",
"News \u0026 Politics",
"How To",
"Education",
"Activism",
"Science \u0026 Technology",
"Animals",
"Kids",
"Food"
]
},
{
"variable": "firstLanguageIndex",
"name": "Home Language Filter 1",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"English",
"Fran\u00E7ais",
"\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
"Catal\u00E0",
"\u010Ce\u0161tina",
"Deutsch",
"\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC",
"Esperanto",
"Espa\u00F1ol",
"Euskara",
"\u0641\u0627\u0631\u0633\u06CC",
"Suomi",
"G\u00E0idhlig",
"Galego",
"Hrvatski",
"Magyar",
"\u00CDslenska",
"Italiano",
"\u65E5\u672C\u8A9E",
"Taqbaylit",
"Nederlands",
"Norsk",
"Occitan",
"Polski",
"Portugu\u00EAs (Brasil)",
"Portugu\u00EAs (Portugal)",
"P\u0443\u0441\u0441\u043A\u0438\u0439",
"Sloven\u010Dina",
"Shqip",
"Svenska",
"\u0E44\u0E17\u0E22",
"Toki Pona",
"T\u00FCrk\u00E7e",
"\u0443\u043A\u0440\u0430\u0457\u0301\u043D\u0441\u044C\u043A\u0430 \u043C\u043E\u0301\u0432\u0430",
"Ti\u1EBFng Vi\u1EC7t",
"\u7B80\u4F53\u4E2D\u6587\uFF08\u4E2D\u56FD\uFF09",
"\u7E41\u9AD4\u4E2D\u6587\uFF08\u53F0\u7063\uFF09"
]
},
{
"variable": "secondLanguageIndex",
"name": "Home Language Filter 2",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"English",
"Fran\u00E7ais",
"\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
"Catal\u00E0",
"\u010Ce\u0161tina",
"Deutsch",
"\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC",
"Esperanto",
"Espa\u00F1ol",
"Euskara",
"\u0641\u0627\u0631\u0633\u06CC",
"Suomi",
"G\u00E0idhlig",
"Galego",
"Hrvatski",
"Magyar",
"\u00CDslenska",
"Italiano",
"\u65E5\u672C\u8A9E",
"Taqbaylit",
"Nederlands",
"Norsk",
"Occitan",
"Polski",
"Portugu\u00EAs (Brasil)",
"Portugu\u00EAs (Portugal)",
"P\u0443\u0441\u0441\u043A\u0438\u0439",
"Sloven\u010Dina",
"Shqip",
"Svenska",
"\u0E44\u0E17\u0E22",
"Toki Pona",
"T\u00FCrk\u00E7e",
"\u0443\u043A\u0440\u0430\u0457\u0301\u043D\u0441\u044C\u043A\u0430 \u043C\u043E\u0301\u0432\u0430",
"Ti\u1EBFng Vi\u1EC7t",
"\u7B80\u4F53\u4E2D\u6587\uFF08\u4E2D\u56FD\uFF09",
"\u7E41\u9AD4\u4E2D\u6587\uFF08\u53F0\u7063\uFF09"
]
},
{
"variable": "thirdLanguageIndex",
"name": "Home Language Filter 3",
"description": "",
"type": "Dropdown",
"default": "0",
"options": [
"",
"English",
"Fran\u00E7ais",
"\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
"Catal\u00E0",
"\u010Ce\u0161tina",
"Deutsch",
"\u03B5\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC",
"Esperanto",
"Espa\u00F1ol",
"Euskara",
"\u0641\u0627\u0631\u0633\u06CC",
"Suomi",
"G\u00E0idhlig",
"Galego",
"Hrvatski",
"Magyar",
"\u00CDslenska",
"Italiano",
"\u65E5\u672C\u8A9E",
"Taqbaylit",
"Nederlands",
"Norsk",
"Occitan",
"Polski",
"Portugu\u00EAs (Brasil)",
"Portugu\u00EAs (Portugal)",
"P\u0443\u0441\u0441\u043A\u0438\u0439",
"Sloven\u010Dina",
"Shqip",
"Svenska",
"\u0E44\u0E17\u0E22",
"Toki Pona",
"T\u00FCrk\u00E7e",
"\u0443\u043A\u0440\u0430\u0457\u0301\u043D\u0441\u044C\u043A\u0430 \u043C\u043E\u0301\u0432\u0430",
"Ti\u1EBFng Vi\u1EC7t",
"\u7B80\u4F53\u4E2D\u6587\uFF08\u4E2D\u56FD\uFF09",
"\u7E41\u9AD4\u4E2D\u6587\uFF08\u53F0\u7063\uFF09"
]
},
{
"variable": "searchHeader",
"name": "Search",
"description": "Search engine for finding content.",
"type": "Header"
},
{
"variable": "searchCurrentInstance",
"name": "Current Instance",
"description": "Search your server and its followed instances.",
"type": "Boolean",
"default": "true"
},
{
"variable": "searchSepiaSearch",
"name": "Sepia Search",
"description": "Search all indexed PeerTube instances via sepiasearch.org.",
"type": "Boolean",
"default": "false"
},
{
"variable": "safetyHeader",
"name": "Safety",
"description": "Content safety and filtering options.",
"type": "Header"
},
{
"variable": "nsfwPolicy",
"name": "Policy for sensitive content",
"description": "How to handle NSFW content across all feeds, searches, and recommendations.",
"type": "Dropdown",
"default": "0",
"options": [
"Display all",
"Hide thumbnails",
"Hide all"
]
},
{
"variable": "allowPlayNsfwContent",
"name": "Allow Playing Sensitive Content",
"description": "Allow playback of sensitive content, including deep-linked videos.",
"type": "Boolean",
"default": "true"
},
{
"variable": "AnalyticsHeader",
"name": "Analytics",
"description": "Viewing activity reporting",
"type": "Header"
},
{
"variable": "submitActivity",
"name": "Report Views",
"description": "Send watch activity to instances to count views.",
"type": "Boolean",
"default": "true"
},
{
"variable": "ExperimentalHeader",
"name": "Experimental",
"description": "Features that are still being tested and may not work as expected.",
"type": "Header"
},
{
"variable": "enableBrowserImpersonation",
"name": "Browser Impersonation",
"description": "Impersonate a browser\u0027s TLS fingerprint to bypass bot detection (e.g. Cloudflare).",
"type": "Boolean",
"default": "false"
},
{
"variable": "enableCloudflareCaptcha",
"name": "Cloudflare Captcha Support",
"description": "Prompt for captcha on Cloudflare-protected instances instead of failing silently.",
"type": "Boolean",
"default": "false"
},
{
"variable": "enableSearchSuggestions",
"name": "Search Suggestions",
"description": "Fetch suggestions from the search API as you type. Makes extra API requests which may increase instance load.",
"type": "Boolean",
"default": "false"
},
{
"variable": "showInstanceInfo",
"name": "Show Instance Information",
"description": "Display PeerTube instance details (name, version, stats) in video and channel descriptions. Makes extra API requests.",
"type": "Boolean",
"default": "false"
}
],
"changelog": {
"27": [
"Improvement: Support PeerTube federated video redirect to origin instance;",
"Improvement: Improve error handling for content details;",
"Improvement: Add opt-in setting to show instance info in channel and content descriptions;"
],
"26": [
"Improvement: Sync known instances with SepiaSearch, fediverse.observer and fedidb.org;",
"Improvement: Update plugin configuration authorUrl from https://futo.org to https://futo.tech;"
],
"25": [
"Improvement: Add instance authentication;",
"Improvement: Import user subscriptions;",
"Improvement: Import user playlists;",
"Improvement: Content chapters;",
"Improvement: Add browser impersonation support (experimental, disabled by default in plugin setting);",
"Improvement: Initial Cloudflare captcha support (experimental, disabled by default in plugin setting);",
"Improvement: Add search suggestions support (experimental, disabled by default in plugin settings);",
"Improvement: Add independent source toggles for home feed and search to choose between current instance, Sepia Search, or both;",
"Improvement: Add home feed sorting settings to customize how videos are displayed on the home page (Best, Newest, Oldest, Most Views, Most Likes, Trending, Hot);",
"Improvement: Add plugin settings to filter home feed content by multiple categories and languages;",
"Improvement: Add tag search support - tag search URLs are now handled as playlists;",
"Improvement: Change default home feed sorting from Best to Newest for better compatibility with all PeerTube instances;",
"Improvement: Add NSFW content filter setting to hide NSFW content from home feed (enabled by default, applies to both content sources);",
"Improvement: Add support for live chat window on live videos;",
"Improvement: Add search filters for videos (Category, Language, License, Duration, NSFW, Features, Search Scope);",
"Improvement: Add search for contents within a channel;",
"Improvement: Add channel banner image support for channels on PeerTube v6.0.0\u002B instances;",
"Improvement: Update known instances from https://instances.joinpeertube.org, https://api.fediverse.observer/, and https://api.fedidb.org/;",
"Fix: Handle older instances that truncate video descriptions at 250 characters and need an additional request;",
"Fix: Viewer count for livestreams;"
],
"24": [
"Fix existing subscription not being recognized as subscribed in video details;",
"Sync known instances with https://instances.joinpeertube.org;"
],
"23": [
"Fix commenter avatar in federated videos;",
"Fix comment replies not showing up;",
"Fix channel subscription not being recognized as subscribed;"
],
"22": [
"Add support for channel playlists;",
"Search online playlists on the playlist tab using current instance or Sepia Search;",
"Add subtitles support (when available);",
"Improve handling media sources with audio only, and videos with split audio and video;",
"Improved URL recognition with hints for all content types;",
"Map likes and dislikes display for videos;",
"Sync known instances with https://instances.joinpeertube.org;"
],
"21": [
"Fix resolving instances with ports;",
"Sync known instances with https://instances.joinpeertube.org"
],
"20": [
"Add view reporting to PeerTube instances with a plugin setting to disable it.",
"Sync known instances with https://instances.joinpeertube.org"
],
"19": [
"Sync known instances with https://instances.joinpeertube.org"
],
"18": [
"Fix plugin repositoryUrl and add platformUrl configurations;",
"Sync known instances from https://instances.joinpeertube.org and user requests;",
"Fix playback issues for some videos;",
"Add recommendations support;"
],
"17": [
"Fixed issue when opening federated content or a channel without opening the Home tab first;",
"Fixed issue with deep-linking from an indexed instance while the app is closed;"
],
"16": [
"Use host instances from https://instances.joinpeertube.org/instances to support channels and videos from other peertube instances;",
"Add a setting to switch the content and channels search from an instance to sepiasearch.org;",
"Improve support for older peertube server versions;",
"Fix bugs with channel avatars and video thumbnails in some peertube server versions;"
]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment