This commit is contained in:
eric
2026-03-29 04:28:16 -05:00
parent 4fee2eb702
commit 4a1c675a60
9 changed files with 51 additions and 58 deletions

View File

@@ -1,39 +1,2 @@
https://live.douyin.com/925673220466,主播: 兜有米麻糍
https://live.douyin.com/745606325880,主播: w、(摆摊日记_)
https://live.douyin.com/675343045974,主播: 张子沐的串串(你的电子榨菜)
https://live.douyin.com/673565298571,主播: 轻舟已撞大冰山(摆摊vlog)
https://live.douyin.com/835571459859,主播: 海绵饱饱
https://live.douyin.com/152358755212,主播: 大美_红烧肉
https://live.douyin.com/990825651731,主播: 王同学摆摊日记(蜜汁烤鸡腿)
https://live.douyin.com/591442402624,主播: 76696515302
https://live.douyin.com/967381081829,主播: 憨憨的摆摊日记
https://live.douyin.com/78012762575,主播: 摆摊儿去划水
https://live.douyin.com/163813589919,主播: 不要熬夜(摆摊中)
https://live.douyin.com/498368994814,主播: 剪头发的小帆帆
https://live.douyin.com/617848099204,主播: 果妈要努力
https://live.douyin.com/821525628944,主播: 李熙雨⭐
https://live.douyin.com/993102287144,主播: 小茗早餐(薪笼记助创官)
https://live.douyin.com/701547125568,主播: 悠悠包
https://live.douyin.com/816130992220,主播: 甜昕冰冰的摆摊日记
https://live.douyin.com/876468215361,主播: 晓晓和凡凡
https://live.douyin.com/511335278313,主播: 秘书(摆摊休息版)
https://live.douyin.com/483160615952,主播: 小胡同学你好(饭团版)
https://live.douyin.com/525514386431,主播: 阿闯烤肉夹馍
https://live.douyin.com/8687122573,主播: 小彤炒粉
https://live.douyin.com/642534242822,主播: (小王_)煎饼果子
https://live.douyin.com/743565594721,主播: 汪汪汪小妞
https://live.douyin.com/249578288248,主播: 思思努力版
https://live.douyin.com/472140253414,主播: 戴盘龙
https://live.douyin.com/700846653732,主播: 三哥大锅菜_炒鸡(国基路店)官方号
https://live.douyin.com/81849868631,主播: 纯儿²¹(休息勿跑空哦)
https://live.douyin.com/690114366322,主播: 卤味鲜(东大)
https://live.douyin.com/469980190666,主播: 茜茜柠檬茶(小米茶档_)
https://live.douyin.com/388066418744,主播: 加速姐的摆摊日记
https://live.douyin.com/661694696687,主播: 小米摆摊记
https://live.douyin.com/228132412943,主播: 00后摆摊小可爱
https://live.douyin.com/876677865786,主播: 牛哄哄
https://live.douyin.com/573735790640,主播: 小董卤串(餐饮)
https://live.douyin.com/260608582882,主播: 阿伟在炒饭(90後炒饭)
https://live.douyin.com/210443559964,主播: 小小诺
https://live.douyin.com/305363702471,主播: 嘉嘉在摆摊
https://live.douyin.com/143239713951,主播: ɞ_大馋丫头的烤肠
# 每行一条源站直播页 URL如抖音直播间由控制台保存或手工编辑
# 部署后请删除本注释并填入实际地址,或仅在 Web 控制台「直播地址列表」中填写

View File

@@ -1,4 +1,4 @@
[录制设置]
[录制设置]
language(zh_cn/en) = zh_cn
是否跳过代理检测(是/否) =
直播保存路径(不填则默认) =
@@ -49,7 +49,7 @@ SMTP邮件服务器端口 =
发件人邮箱 =
发件人显示昵称 =
收件人邮箱 =
ntfy推送地址 = https://ntfy.sh/xxxx
ntfy推送地址 =
ntfy推送标签 = tada
ntfy推送邮箱 =
pushplus推送token =

View File

@@ -1,5 +1,5 @@
{
"networkName": "lr_f976289ba590",
"networkSecret": "5f86ed227e8cfcf7d8b70b287502b682aa8d3ca0b0c560ed",
"networkName": "",
"networkSecret": "",
"peerUrls": []
}
}

View File

@@ -1,8 +1,8 @@
{
"redirect_uri": "http://127.0.0.1:8001/youtube/oauth/callback",
"web": {
"client_id": "305371487651-iuqafultpqp0rvitojr70560k1foet0n.apps.googleusercontent.com",
"client_secret": "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",
"client_id": "",
"client_secret": "",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"redirect_uris": ["http://127.0.0.1:8001/youtube/oauth/callback"]

View File

@@ -1 +0,0 @@
9d0103f49a3fea59311c014b9468e3ad2bd14d4f8334a7ec

View File

@@ -1,7 +1,6 @@
[youtube]
# 必填YouTube 直播推流 key在 YouTube 工作室 → 创建 → 流式传输 获取)
; key = qxvb-r47b-r5ju-6ud3-6k7z
key = x04z-564w-aks7-embw-30y4
key =
# 可选:是否使用 RTMPS 加密推流,填 否 则用 RTMP默认 RTMPS
; rtmps = 否
@@ -10,4 +9,4 @@ key = x04z-564w-aks7-embw-30y4
; bitrate = 2500
# 可选:软编 speed 长期小于 1 时开启——轻量音频链(无 arnndn/长 EQ减轻 CPU。填 1 或 是
fast_audio = 1
; fast_audio = 1

View File

@@ -16,6 +16,8 @@ export type PipelineStep = {
sub?: string;
gradient: string;
target?: PortalNavTarget;
/** 若设置,点击时在新标签打开(优先于 target */
openUrl?: string;
};
type Props = {
@@ -34,10 +36,16 @@ export function LivePipelineStrip({ t, title, subtitle, steps, onNavigate }: Pro
<div className="mt-6 flex flex-col items-center gap-4 sm:flex-row sm:flex-wrap sm:justify-center">
{steps.map((step, i) => (
<div key={step.label} className="flex items-center gap-4">
{step.target && onNavigate ? (
{step.openUrl || (step.target && onNavigate) ? (
<button
type="button"
onClick={() => onNavigate(step.target!)}
onClick={() => {
if (step.openUrl) {
window.open(step.openUrl, "_blank", "noopener,noreferrer");
return;
}
if (step.target && onNavigate) onNavigate(step.target);
}}
className={`flex min-h-[4rem] min-w-[7rem] flex-col items-center justify-center rounded-2xl bg-gradient-to-br px-4 py-2 text-center text-xs font-bold text-white shadow-lg ring-2 ring-white/10 transition hover:ring-violet-400/50 hover:brightness-110 ${step.gradient}`}
>
<span>{step.label}</span>

View File

@@ -48,6 +48,9 @@ const CHECK_KEY = "live-hub-tiktok-hdmi-check-v1";
const NOTES_KEY = "live-hub-tiktok-hdmi-notes-v1";
const SOURCE_MODE_KEY = "live-hub-tiktok-source-mode-v1";
/** UI 仅展示 SRS 选项ffmpeg/replay 的 option 保留 hidden改 false 即可恢复) */
const TIKTOK_SOURCE_UI_SRS_ONLY = true;
export type TiktokSourceMode = "ffmpeg" | "replay" | "srs";
type ReplayFileRow = { name: string; size: number; replay_url: string };
@@ -92,7 +95,9 @@ export function LiveTiktokHdmiView({
}: Props) {
const tkEntries = useMemo(() => entries.filter(isTiktokProcess), [entries]);
const processOptions = tkEntries.length ? tkEntries : entries;
const [sourceMode, setSourceMode] = useState<TiktokSourceMode>("ffmpeg");
const [sourceMode, setSourceMode] = useState<TiktokSourceMode>(
TIKTOK_SOURCE_UI_SRS_ONLY ? "srs" : "ffmpeg",
);
const [replayFiles, setReplayFiles] = useState<ReplayFileRow[]>([]);
const [replayLoading, setReplayLoading] = useState(false);
const [uploadBusy, setUploadBusy] = useState(false);
@@ -120,7 +125,10 @@ export function LiveTiktokHdmiView({
useEffect(() => {
try {
const r = window.localStorage.getItem(SOURCE_MODE_KEY);
if (r === "ffmpeg" || r === "replay" || r === "srs") setSourceMode(r);
if (r === "ffmpeg" || r === "replay" || r === "srs") {
if (TIKTOK_SOURCE_UI_SRS_ONLY && (r === "ffmpeg" || r === "replay")) setSourceMode("srs");
else setSourceMode(r);
}
} catch {
/* ignore */
}
@@ -374,8 +382,12 @@ export function LiveTiktokHdmiView({
value={sourceMode}
onChange={(e) => setSourceModePersist(e.target.value as TiktokSourceMode)}
>
<option value="ffmpeg">FFmpeg / TikTok URL</option>
<option value="replay">{t("录播素材(本地上传)", "VOD upload")}</option>
<option value="ffmpeg" hidden={TIKTOK_SOURCE_UI_SRS_ONLY}>
FFmpeg / TikTok URL
</option>
<option value="replay" hidden={TIKTOK_SOURCE_UI_SRS_ONLY}>
{t("录播素材(本地上传)", "VOD upload")}
</option>
<option value="srs">{t("SRSOBS 推流)", "SRS (OBS)")}</option>
</select>
{sourceMode === "srs" ? (

View File

@@ -35,6 +35,9 @@ function isYoutubeProcess(e: ProcessEntry) {
const MODE_KEY = "live-hub-youtube-mode-v1";
/** UI 暂时隐藏「多频道 Pro」切换DOM 与逻辑保留,改 false 即可恢复) */
const HIDE_YOUTUBE_MULTI_PRO_TOGGLE = true;
type LiveProcRow = { pm2: string; process_status?: string };
function pm2StatusOnline(st?: string) {
@@ -260,6 +263,10 @@ export function LiveYoutubeUnmannedView({
useEffect(() => {
try {
if (HIDE_YOUTUBE_MULTI_PRO_TOGGLE) {
setMode("single");
return;
}
const m = window.localStorage.getItem(MODE_KEY);
if (m === "pro" || m === "single") setMode(m);
} catch {
@@ -643,7 +650,7 @@ export function LiveYoutubeUnmannedView({
label: "Neko",
sub: t("Chromium 工作室", "Chromium"),
gradient: "from-emerald-400 to-teal-500",
target: "services",
openUrl: "http://live.local:9200/",
},
]}
/>
@@ -666,7 +673,12 @@ export function LiveYoutubeUnmannedView({
</p>
</div>
</div>
<div className="flex rounded-xl border border-white/10 bg-black/30 p-1">
<div
className={`flex rounded-xl border border-white/10 bg-black/30 p-1 ${
HIDE_YOUTUBE_MULTI_PRO_TOGGLE ? "hidden" : ""
}`}
aria-hidden={HIDE_YOUTUBE_MULTI_PRO_TOGGLE}
>
<button
type="button"
onClick={() => setModePersist("single")}