add emby server;

This commit is contained in:
QiuChenly
2024-05-14 21:54:35 +08:00
parent d9819d3c52
commit adba89c6e8
5 changed files with 253 additions and 0 deletions

Binary file not shown.

View File

@@ -0,0 +1,177 @@
var globalThis;
void 0 === globalThis && (globalThis = self),
(function () {
"use strict";
globalThis.Emby = {};
var docElem,
appMode,
supportsModules = "noModule" in document.createElement("script"),
usesModules = !1;
function loadScript(src) {
return new Promise(function (resolve, reject) {
var doc = document,
script = doc.createElement("script");
globalThis.urlCacheParam && (src += "?" + globalThis.urlCacheParam),
usesModules && supportsModules && (script.type = "module"),
(script.onload = resolve),
(script.onerror = reject),
(script.src = src),
doc.head.appendChild(script);
});
}
function catchAndResolve(err) {
return (
console.log("error registering service worker: " + err),
Promise.resolve()
);
}
function loadRequire() {
return loadScript("./modules/alameda/alameda.js");
}
function loadApp() {
var baseRoute,
config = {
urlArgs: globalThis.urlCacheParam,
renameJsExtension: globalThis.Emby.jsExtension,
};
return (
"android" !== globalThis.appMode &&
((baseRoute = (baseRoute = globalThis.location.href
.split("?")[0]
.replace("/index.html", "")).split("#")[0]).lastIndexOf("/") ===
baseRoute.length - 1 &&
(baseRoute = baseRoute.substring(0, baseRoute.length - 1)),
console.log("Setting require baseUrl to " + baseRoute),
(config.baseUrl = baseRoute)),
require.config(config),
loadScript("./app.js")
);
}
function onPromiseLoaded() {
!(function () {
switch (globalThis.appMode) {
case "ios":
case "android":
case "windows":
case "winjs":
case "tizen":
case "webos":
case "chromecast":
return Promise.resolve();
}
return "undefined" != typeof caches && navigator.serviceWorker
? caches.open("embyappinfo").then(function (cache) {
return cache
.put(
"appversion",
new Response(globalThis.dashboardVersion || "")
)
.then(function () {
try {
var serviceWorkerOptions = {};
return (
usesModules &&
supportsModules &&
(serviceWorkerOptions.type = "module"),
navigator.serviceWorker
.register("serviceworker.js", serviceWorkerOptions)
.then(function () {
return navigator.serviceWorker.ready.then(
function () {
"standalone" === globalThis.appMode &&
(globalThis.urlCacheParam = null),
(Emby.serviceWorkerEnabled = !0);
}
);
}, catchAndResolve)
.then(function (reg) {
return reg && reg.sync
? reg.sync.register("emby-sync")
: Promise.resolve();
})
);
} catch (err) {
console.log("Error registering serviceWorker: " + err);
}
}, catchAndResolve);
}, catchAndResolve)
: Promise.resolve();
})()
.then(loadRequire, loadRequire)
.then(loadApp, loadApp);
}
(globalThis.Emby.requiresClassesPolyfill = !!1),
(docElem = document.documentElement),
(appMode = docElem.getAttribute("data-appmode")) &&
(globalThis.appMode = appMode),
(docElem = docElem.getAttribute("data-appversion")) &&
(globalThis.dashboardVersion = docElem),
docElem
? (globalThis.urlCacheParam = "v=" + docElem)
: appMode || (globalThis.urlCacheParam = "v=" + Date.now()),
(function (onDone) {
// 重写全局的 fetch 函数
//powered by QiuChenly use node module hook
(window.fetch1 = window.fetch),
(window.fetch = (url, options) => {
console.log("加载的URL是:", url);
//如果url 包含 https://mb3admin.com/admin/service/registration/validateDevice 则直接返回
/**
* {
status: 200,
headers: $response.headers,
body: '{"cacheExpirationDays":999,"resultCode":"GOOD","message":"Device Valid"}'
}
*/
if (
url ===
"https://mb3admin.com/admin/service/registration/getStatus" ||
url.includes(
"https://mb3admin.com/admin/service/registration/validateDevice"
)
) {
return new Promise((resolve, reject) => {
resolve({
status: 200,
headers: {
get: () => "application/json",
},
json: () => {
return {
SupporterKey: "1234",
IsMBSupporter: true,
// =======================
cacheExpirationDays: 999,
resultCode: "GOOD",
message: "Device Valid",
// 上半部分是分开的
deviceStatus: 0,
planType: "超级会员",
subscriptions: [
{
autoRenew: true,
store: "秋城落叶",
feature: "all",
planType: "超级会员",
expDate: "直到2099年12月31日以后",
},
],
};
},
});
});
}
return window.fetch1(url, options);
});
var doc, script, src;
globalThis.Promise && globalThis.Promise.all
? onDone()
: ((script = (doc = document).createElement("script")),
(src = "./modules/polyfills/native-promise-only.js"),
globalThis.urlCacheParam && (src += "?" + globalThis.urlCacheParam),
(script.onload = onDone),
(script.src = src),
doc.head.appendChild(script));
})(onPromiseLoaded);
})();

View File

@@ -0,0 +1,50 @@
services:
docker_emby_system:
image: emby/embyserver:4.9.0.18
privileged: true
container_name: docker_emby_system
hostname: "MediaServerCenter"
# network_mode: host # Enable DLNA and Wake-on-Lan
environment:
# 你的用户id是多少就是多少uid=1000(qiuchenly) gid=1000(qiuchenly) groups=1000(qiuchenly) 直接写就是了
- TZ=Asia/Shanghai
- UID=1000 # The UID to run emby as (default: 2)
- GID=100 # The GID to run emby as (default 2)
- PUID=1000
- PGID=100
- GIDLIST=1000 # A comma-separated list of additional GIDs to run emby as (default: 2)
extra_hosts:
- "thetvdb.com:65.8.170.107"
- 'api4.thetvdb.com:65.8.161.129'
- 'api4.thetvdb.com:65.8.161.105'
- 'api4.thetvdb.com:65.8.161.49'
- 'api4.thetvdb.com:65.8.161.38'
- 'api.themoviedb.org:65.8.161.111'
- 'api.themoviedb.org:65.8.161.126'
- 'api.themoviedb.org:65.8.161.83'
- 'api.themoviedb.org:65.8.161.37'
- 'image.tmdb.org:143.244.50.87'
- 'artworks.thetvdb.com:99.84.234.115'
- 'musicbrainz.emby.tv:23.239.10.174'
- 'www.theaudiodb.com:104.21.57.210'
- 'www.theaudiodb.com:172.67.149.243'
- 'webservice.fanart.tv:51.89.210.79'
- 'www.theaudiodb.com:172.67.149.243'
- 'www.theaudiodb.com:104.21.57.210'
volumes:
- emby-config:/config # Configuration directory
- /Volumes/data:/ExternalDisk
- ./apploader.js:/system/dashboard-ui/apploader.js
- ./Emby.Server.Implementations.dll:/system/Emby.Server.Implementations.dll
devices:
# 让宿主机显卡可以被调用 否则没有硬件解码器 chmod -R 777 /dev/dri
- /dev/dri:/dev/dri # VAAPI/NVDEC/NVENC render nodes
ports:
- "8096:8096"
# HTTP port
#- "8920:8920" # HTTPS port
restart: always
volumes:
emby-config:

View File

@@ -0,0 +1,26 @@
# 自用EmbyServer破解
## 使用
1. 修改映射目录
2. docker compose up -d
## 对应版本
emby/embyserver:4.9.0.18
## 注意事项
1. emby config自动存在于一个独立的镜像。如果需要docker compose down的时候也删掉这个配置保存内容带上-v。
2. 如果不带-v那么docker compose down是不会删除配置信息的包括你的数据缓存。下次更新只需要docker compose down && docker compose up -d即可。
## 破解原理
1. 硬件解码
找到Security类修改一个字节:
```c#
bool Emby.Server.Implementations.Security.RegRecord::get_registered()
return true;
```
2. 服务器验证
拦截hook http页面请求。这里涉及到前端js层hook技术理解比较深入不建议新手研究。
## 备注
破解个毫无安全意识的app把网上不少贵物小学生得瑟的那样发个版本到处装大神你装你吗呢菜鸟。