├── .gitignore ├── @config ├── app.css ├── app.js └── index.htm └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.code-workspace 2 | *.open-terminal.app -------------------------------------------------------------------------------- /@config/app.css: -------------------------------------------------------------------------------- 1 | /* BOOTSTRAP OVERRIDES */ 2 | 3 | [data-bs-theme=dark] { 4 | --bs-link-color: #198754; 5 | --bs-link-hover-color: #146c43; 6 | } 7 | 8 | [data-bs-theme=dark] .nav-tabs { 9 | --bs-nav-tabs-link-active-bg: #198754; 10 | /* --bs-nav-tabs-link-active-color: #198754; */ 11 | } 12 | 13 | [data-bs-theme=dark] .nav { 14 | --bs-nav-link-color: #fff; 15 | --bs-nav-link-hover-color: #999; 16 | } 17 | 18 | [data-bs-theme=dark] .nav-pills { 19 | --bs-nav-pills-link-active-bg: #198754; 20 | } 21 | 22 | [data-bs-theme=dark] .nav-pills .nav-link:not(.active) { 23 | background-color: #1b1f22; 24 | } 25 | 26 | body { 27 | padding-left: calc(env(safe-area-inset-left) - 10px) !important; 28 | padding-right: calc(env(safe-area-inset-right) - 10px) !important; 29 | } 30 | 31 | a { 32 | text-decoration: underline; 33 | } 34 | 35 | a, 36 | a:hover { 37 | color: inherit; 38 | } 39 | 40 | .accordion { 41 | --bs-accordion-active-color: #fff; 42 | --bs-accordion-active-bg: #198754; 43 | --bs-accordion-btn-color: #fff; 44 | --bs-accordion-btn-bg: #1b1f22; 45 | --bs-accordion-body-padding-y: 2rem; 46 | } 47 | 48 | .nav-pills > .nav-item { 49 | margin-right: 10px; 50 | margin-bottom: 10px; 51 | } 52 | 53 | .form-control { 54 | background-color: #1b1f22; 55 | } 56 | 57 | .form-control::placeholder { 58 | opacity: .33333; 59 | } 60 | 61 | .container, 62 | .container-fluid { 63 | transition: padding 300ms ease; 64 | } 65 | 66 | @media (min-width: 576px) { 67 | .container, 68 | .container-fluid { 69 | padding-right: 30px; 70 | padding-left: 30px; 71 | } 72 | } 73 | 74 | @media (max-width: 575px) { 75 | .row { 76 | margin-right: -7.5px; 77 | margin-left: -7.5px; 78 | } 79 | 80 | .col, .col-1, .col-10, .col-11, .col-12, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-auto, .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-auto, .col-md, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-auto, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-auto, .col-xl, .col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-auto { 81 | padding-left: 7.5px; 82 | padding-right: 7.5px; 83 | } 84 | } 85 | 86 | .img-fluid { 87 | width: 100%; 88 | } 89 | 90 | .page-link { 91 | text-decoration: none; 92 | } 93 | 94 | /* THIRD-PARTY OVERRIDES */ 95 | 96 | [v-cloak] { 97 | display: none; 98 | } 99 | 100 | .fa-inline { 101 | text-decoration: inherit; 102 | } 103 | 104 | /* CUSTOM COMPONENTS */ 105 | 106 | .c-html, 107 | .c-body { 108 | width: 100%; 109 | } 110 | 111 | .c-body { 112 | padding-top: 30px; 113 | padding-bottom: 30px; 114 | padding-left: 0; 115 | padding-right: 0; 116 | } 117 | 118 | @media (min-width: 576px) { 119 | .c-body { 120 | padding-top: 60px; 121 | padding-bottom: 60px; 122 | } 123 | } 124 | 125 | .c-tab-pane .form-label { 126 | font-weight: bold; 127 | } 128 | 129 | .c-tab-pane [class*="pb-"] > :last-child, 130 | .c-tab-pane .accordion-body > :last-child { 131 | margin-bottom: 0!important; 132 | } 133 | 134 | .c-list-inline { 135 | display: inline-block; 136 | padding: 0; 137 | margin: 0; 138 | } 139 | 140 | .c-list-inline li { 141 | display: inline; 142 | } 143 | 144 | .c-list-inline li + li:before { 145 | content: ", "; 146 | } 147 | 148 | .c-package-link { 149 | user-select: text; 150 | } 151 | 152 | .c-donate-links .c-list-inline li + li:before { 153 | content: " | "; 154 | } 155 | 156 | .c-buymeacoffee { 157 | color: #000; 158 | background-color: #FFDD00; 159 | } 160 | 161 | .c-venmo { 162 | background-color: #3D95CE; 163 | } 164 | 165 | .c-paypal { 166 | background-color: #003087; 167 | } 168 | -------------------------------------------------------------------------------- /@config/app.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | const urlParams = new URLSearchParams(window.location.search); 4 | const App = Vue.createApp({ 5 | data() { 6 | return { 7 | express: { 8 | packages: { 9 | 'OpenScrapers': 'https://raw.githubusercontent.com/SynclerScrapers/OpenScrapers/main/express/openscraper.json', 10 | 'Orion - Wako': 'https://wako.orionoid.com/ABCDEFGHIJKLMNOPQRSTUVWXYZ123456', 11 | 'Squizzle - Fast': 'https://raw.githubusercontent.com/providers4syncler/providers/main/fast', 12 | 'Squizzle - Ultimate': 'https://raw.githubusercontent.com/providers4syncler/providers/main/squizzle', 13 | 'Syncler.ml - Providers': 'https://pastebin.com/raw/Rue82khh?source=http://go.syncler.ml/express', 14 | 'Aki07 - Unified': 'https://pastebin.com/raw/jgCnPnwR?source=https://raw.githubusercontent.com/itzAki07/scraper/main/scraper.json', 15 | }, 16 | providers: {}, 17 | blacklist: (urlParams.get('blacklist') || '').split(',').filter(Boolean) 18 | }, 19 | orion: { 20 | apiKey: urlParams.get('orion-api-key') || '', 21 | commonProviders: urlParams.get('common-providers') || 'on' 22 | }, 23 | jackett: { 24 | baseUrl: urlParams.get('jackett-base-url') || '', 25 | apiKey: urlParams.get('jackett-api-key') || '' 26 | }, 27 | kosmos: { 28 | packages: { 29 | /* 30 | 'WeeklyProblem - Bouncy': 'https://raw.githubusercontent.com/WeeklyProblem/Bouncy/main/bouncy.min.js' 31 | */ 32 | } 33 | }, 34 | justwatch: { 35 | mode: 'default', 36 | providers: { 37 | 'netflix': 'Netflix', 38 | 'hulu': 'Hulu', 39 | 'amazon-prime-video': 'Amazon Prime Video', 40 | 'disney': 'Disney', 41 | 'hbo-max': 'HBO Max', 42 | 'showtime-anytime': 'Showtime Anytime', 43 | 'fxnow': 'FX Now', 44 | 'crackle': 'Crackle', 45 | 'tubi': 'Tubi', 46 | 'vudu': 'Vudu', 47 | 'google-tv': 'Google TV', 48 | 'youtube': 'YouTube', 49 | }, 50 | blacklist: [], 51 | whitelist: [] 52 | } 53 | } 54 | }, 55 | computed: { 56 | server() { 57 | const version = urlParams.get('v') == 1 ? 1 : 2; 58 | return { 59 | version: version, 60 | url: version == 2 ? 'https://jakedup.com/syncler' : 'https://syncler-providers.herokuapp.com/syncler' 61 | }; 62 | }, 63 | expressParams() { 64 | const params = {}; 65 | if (this.orion.apiKey) { 66 | params['orion-api-key'] = this.orion.apiKey; 67 | } 68 | if (this.orion.commonProviders === 'off') { 69 | if (this.server.version == 2) { 70 | params['common-providers'] = 'off'; 71 | } else { 72 | params['exclude-orion'] = true; 73 | } 74 | } 75 | if (this.jackett.baseUrl && this.jackett.apiKey) { 76 | params['jackett-base-url'] = this.jackett.baseUrl.replace(/[\/\s]+$/, ''); 77 | params['jackett-api-key'] = this.jackett.apiKey; 78 | } 79 | if (this.express.blacklist.length) { 80 | params['blacklist'] = this.express.blacklist.join(','); 81 | } 82 | return params; 83 | }, 84 | vendorUrl() { 85 | return `${this.server.url}/${this.server.version == 2 ? 'vendor' : 'vendor-hybrid.json'}${this.paramsToQuery(this.expressParams)}`; 86 | }, 87 | expressUrl() { 88 | return `${this.server.url}/${this.server.version == 2 ? 'express' : 'express-hybrid.json'}${this.paramsToQuery(this.expressParams)}`; 89 | }, 90 | justwatchParams() { 91 | const params = {}; 92 | if (this.justwatch.mode == 'whitelist' && this.justwatch.whitelist.length) { 93 | params['whitelist'] = this.justwatch.whitelist.join(','); 94 | } else 95 | if (this.justwatch.mode == 'blacklist' && this.justwatch.blacklist.length) { 96 | params['blacklist'] = this.justwatch.blacklist.join(','); 97 | } 98 | return params; 99 | }, 100 | justwatchUrl() { 101 | return `${this.server.url}/${this.server.version == 2 ? 'justwatch.js' : 'kosmos-justwatch.js'}${this.paramsToQuery(this.justwatchParams)}`; 102 | } 103 | }, 104 | watch: { 105 | 'orion.apiKey': function (newVal, oldVal) { 106 | if (newVal) { 107 | this.orion.apiKey = newVal.replace(/\/+$/, '').replace(/^.*\/+/, '').toUpperCase(); 108 | this.orion.commonProviders = 'on'; 109 | } 110 | } 111 | }, 112 | methods: { 113 | paramsToQuery: function (params) { 114 | const query = new URLSearchParams(params || {}).toString().replace(/%2C/g, ','); 115 | return query ? `?${query}` : ''; 116 | }, 117 | getProviders: function () { 118 | return fetch(this.expressUrl.replace(/\?.*/, '')) 119 | .then(response => response.json()) 120 | .then(json => Object.fromEntries(Object.entries(json).filter(([key, value]) => key !== '_manifest'))); 121 | } 122 | }, 123 | created() { 124 | this.getProviders().then((providers) => { 125 | this.express.providers = providers; 126 | }).catch((error) => console.error('Failed to fetch providers list')) 127 | }, 128 | mounted() { 129 | const $navTabs = $(`#tabs .nav-link`); 130 | if (urlParams.size) { 131 | const id = urlParams.get('id'); 132 | $navTabs.filter(`[data-bs-target="#${id}"]`).click(); 133 | } 134 | $navTabs.on('shown.bs.tab', function (event) { 135 | const id = $(event.target).attr('data-bs-target').replace(/^#/, ''); 136 | urlParams.set('id', id); 137 | const newUrl = window.location.pathname + '?' + urlParams.toString(); 138 | history.replaceState(null, null, newUrl); 139 | }); 140 | if (urlParams.size) { 141 | const newParams = new URLSearchParams(); 142 | urlParams.has('v') && newParams.set('v', urlParams.get('v')); 143 | urlParams.has('id') && newParams.set('id', urlParams.get('id')); 144 | const newUrl = window.location.pathname + '?' + newParams.toString(); 145 | history.replaceState(null, null, newUrl); 146 | } 147 | } 148 | }); 149 | 150 | App.mount('.c-app'); 151 | 152 | window.App = App; 153 | 154 | }()) -------------------------------------------------------------------------------- /@config/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | JakedUp Package Configurator 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 |

JakedUp Package Configurator

28 |
29 |

Available Packages:

30 | 35 |
36 |
37 |
38 |

{{ key == 'vendor' ? 'Vendor Manifest' : 'Express Package' }} — Hybrid

39 |

40 | This intelligently combines all known {{ key == 'express' ? 'Express' : '' }} packages for Syncler on-the-fly into a single hybrid package, de-duping any duplicate providers in the process. 41 |

42 | 47 |

48 | You can copy the package URL as-is, or if you want a customized package, you can use the additional configuration options below... 49 |

50 |
51 |
52 |

Configuration Options:

53 |
54 |
55 |

56 | 59 |

60 |
61 |
62 |
63 |

64 | NOTE: To get an Orion API key, please visit: https://panel.orionoid.com/ and sign up for an account. 65 |

66 |
67 |
68 | 69 | 70 | * This will include the Orion custom search provider as you have configured it in the Orion panel under `Addons` –> `Packages` –> `Wako` 71 |
72 |
73 | 74 | 78 | * Only exclude common providers if you plan on installing Orion's Syncler/Wako packages manually -- otherwise, keep this enabled 79 |
80 |
81 |
82 |
83 |
84 |

85 | 88 |

89 |
90 |
91 |
92 |

93 | NOTE: Jackett is a custom provider that you would host on your own server, and requires an in-depth technical setup. More info 94 |

95 |
96 |
97 | 98 | 99 | * NOTE: This address should be accessible by other devices on your local network, which includes the device with Syncler 100 |
101 |
102 | 103 | 104 | * NOTE: Your private Jackett API key can be found in the upper-right corner of your Jackett web UI admin panel 105 |
106 |
107 |
108 |
109 |
110 |

111 | 114 |

115 |
116 |
117 |
118 | 119 | 124 | * Blacklist providers to be removed from your custom package -- It is NOT RECOMMENDED to use this feature unless you know what you are doing! 125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |

{{ key == 'vendor' ? 'Vendor' : 'Package' }} URL:

133 |

134 | Copy the following URL into Syncler... 135 |

136 |

137 | {{ key == 'vendor' ? vendorUrl : expressUrl }} 138 |

139 |

140 | Tip: Use a URL shortening service such as Bit.ly to easily input the vendor manifest URL into the Syncler app. 141 |

142 |
143 |
144 |
145 |
146 |

Kosmos Package — JustWatch

147 |

148 | 2024/01/23: Do not use! This package is no longer working due to a change in JustWatch's APIs. Needs to be re-coded from the ground up, which is on my to-do list. 149 |

150 |

151 | This is similar to Syncler's WatchNow provider, but with some enhancements. This will search a pre-defined list of streaming service providers (Netflix, Hulu, Amazon, etc), and will return a link to those apps if a result is found and you have that app installed. Upon clicking a JustWatch result, Syncler will launch the respective streaming app and attempt to deep link you directly to the title. If a deep link cannot be established, you will be taken to the main activity of that application. 152 |

153 |

154 | You can copy the package URL as-is, or you can use the additional configuration options below... 155 |

156 |
157 |
158 |

Configuration Options:

159 |
160 |
161 |

162 | 165 |

166 |
167 |
168 |
169 |
170 | 171 | 172 |
173 |
174 | 175 | 176 |
177 |
178 | 179 | 180 |
181 |
182 | 193 |
194 |
195 |
196 |
197 |
198 |
199 |

Package URL:

200 |

201 | Copy the following URL into Syncler... 202 |

203 |

204 | {{ justwatchUrl }} 205 |

206 |
207 |
208 |
209 | 220 |
221 |
222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Configure Your Package: 2 | 3 | The following Syncler v2 vendor manifests are available to be configured: 4 | 5 | ## Syncler v2: 6 | 7 | * [Vendor Manifest — Hybrid](https://jakedup.github.io/Syncler-Packages/@config/?id=vendor-hybrid) 8 | 9 | --- 10 | 11 | # Support The Project: 12 | 13 | If you would like to help subsidize the monthly server costs, please donate a buck or 2 through one of the following links: 14 | 15 | * [https://buymeacoffee.com/JakedUp](https://buymeacoffee.com/JakedUp) 16 | * [https://venmo.com/JustJakedUp](https://venmo.com/JustJakedUp) 17 | * [https://paypal.me/JustJakedUp](https://paypal.me/JustJakedUp) --------------------------------------------------------------------------------