Compare commits

...

26 Commits

Author SHA1 Message Date
y2hlbg ab67f6b409 docs: remove commercial entrypoints
Deploy MediaGo Docs / Build Docs (push) Failing after 1s
2026-04-28 19:14:58 +08:00
y2hlbg 3eb7f13eca docs(readme): update 52pojie credit note 2026-04-28 15:03:57 +08:00
y2hlbg 3b279e4a05 docs(readme): add 52pojie credit note 2026-04-28 15:03:57 +08:00
caorushizi ed03781692 fix: package.json name 2026-04-28 00:28:27 +08:00
y2hlbg fb9dd15186 fix(docs): restore canonical site url 2026-04-26 20:52:58 +08:00
y2hlbg 115572c513 feat(docs): add seo blog pillar pages 2026-04-26 20:24:22 +08:00
y2hlbg 1aa2bcd511 docs: add community links to readme 2026-04-23 10:08:23 +08:00
Charlie 248237d593 feat(i18n): add Italian localization (#646) 2026-04-23 09:04:18 +08:00
caorushizi 99281d89f9 docs: refresh VitePress homepages and add download API reference
A batch of VitePress site updates around the v3.5.0 release:

- Refresh the zh / en / jp homepages into a 3x3 feature grid aligned
  with README v3.5.0: keep the foundational "no packet capture /
  batch download / mobile playback" cards, add v3.5.0 pillars
  (browser extension / broad video source coverage / OpenClaw Skill /
  HTTP API / built-in format conversion / one-line Docker). Rewrite
  the hero with a tighter "cross-platform video downloader + built-in
  sniffing" tagline and point the English hero at the
  English-localized `home_en.png`.
- Fix en / jp hero action links that previously routed to the Chinese
  root pages (`/guides` → `/en/guides`, `/jp/guides` etc.).
- Add the macOS usage block to the en / jp quick-start guides
  (Intel vs Apple Silicon + `sudo xattr -dr com.apple.quarantine`
  unblock command), and drop the QQ feedback group tip from those
  locales — QQ is China-only, not useful for en / jp audiences.
- Add a new Download API reference page (`/api`) for all three locales,
  registered in the sidebar under "开始 / Quick start / 始める".
  Covers Base URL (desktop `39719`, Docker `9900`), auth (API key from
  Settings page), curl quick-start, download SSE events, and the full
  `/api/downloads/*` endpoint reference.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 01:12:17 +08:00
caorushizi aa24ef5966 docs(readme): use English-localized screenshots in English README
The English README was reusing the Chinese-localized screenshots
(`home.png`, `home-dark.png`, `settings.png`, `browser.png`), which
left English readers staring at a UI they could not read. Ship a
parallel set of English screenshots under the `_en` suffix and point
`README.md` at them; `README.zh.md` / `README.jp.md` keep their own
assets untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 00:29:58 +08:00
caorushizi e94b91f2f7 docs(i18n): add TRANSLATION.md contribution guide
Addresses #638, where a prospective Italian translator asked for clearer
translator onboarding and a way to preview translations in place. The new
guide documents where strings live, the four-file registration path for a
new language, and the Vite HMR dev workflow that already solves the live
preview need. Linked from all three READMEs alongside CONTRIBUTING.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 00:13:22 +08:00
Charlie fc99be56df Merge pull request #640 from caorushizi/fix/installer-metadata
fix(installer): show version in title bar, set installer FileDescription (#637)
2026-04-22 23:40:23 +08:00
Charlie 34bbe42600 Merge pull request #639 from bovirus/master
Add Italian langauge
2026-04-22 23:36:50 +08:00
caorushizi dfcdf6a6a5 fix(installer): show version in title bar, set installer FileDescription (#637)
- `installer/installer.nsh`: customHeader macro sets Caption to
  "Setup - ${PRODUCT_NAME} ${VERSION}" so users can see which release
  they're installing from the window title (the default $(^SetupCaption)
  omits the version, and re-setting Name trips NSIS warning 6029 which
  electron-builder's -WX flag treats as a hard error).
- `scripts/build.ts`: afterAllArtifactBuild hook runs the app-builder
  rcedit helper on the generated NSIS installer to rewrite its
  FileDescription to "${APP_NAME} installer". electron-builder's
  NsisTarget.computeVersionKey() hardcodes VIAddVersionKey /LANG=1033
  "FileDescription" "${appInfo.description}", binding the installer's
  FileDescription to the app binary's (both drawn from package.json
  description); any in-NSIS override collides on the same LANG+key
  with a hard "already defined!" error that -WX does not gate.
  Post-processing with rcedit sidesteps this and lets installer and
  app binary carry distinct descriptions — same approach VS Code's
  Inno Setup pipeline uses (where "{AppName} Setup" is the default).

Closes #637

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:23:51 +08:00
bovirus f395d49a10 GUI - Add Italian language 2026-04-22 17:17:10 +02:00
bovirus f6a228f318 Browser extension - Add italian language 2026-04-22 16:41:46 +02:00
caorushizi ba958b9f44 docs: flatten Docker feature-section command to a single line
Collapses the line-continuation form (`docker run ... \\n -v ... \\n caorushizi/mediago:3.5.0`)
into one line across README.md / README.jp.md so all three language
READMEs match (zh was already single-line). Makes the command easier
to copy-paste — readers don't have to deal with trailing backslashes
that some terminals / browsers mangle when highlighting.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:15:15 +08:00
caorushizi 19e49e89b9 docs: list Docker Hub alongside GHCR in README and docs
The CI workflow mirrors every built image to Docker Hub
(`caorushizi/mediago`), but the install lists in README (zh/en/jp)
and docs (guides / changelog for all three languages) only mentioned
GHCR. Most users default to Docker Hub, so they would miss the
simpler pull path.

Switch every Docker row into a two-line form showing both registries
explicitly:

    - [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago): docker run ... caorushizi/mediago:3.5.0
    - **GHCR**: docker run ... ghcr.io/caorushizi/mediago:3.5.0

Docker Hub appears first (shorter image name, more familiar to most
users) and its label is a link to the Hub page. GHCR is kept as a
second bullet for users who prefer it or are already authenticated.

The README feature-section (`🐳 Docker deployment`) code block was
also switched to the unqualified `caorushizi/mediago:3.5.0` form so
the showcase command defaults to Docker Hub, with a prose note that
the same image lives on GHCR too.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 17:09:57 +08:00
caorushizi 3f889da389 fix(ci): move secrets check off if: to dodge Unrecognized named-value: 'secrets'
The Docker Hub mirror workflow used `secrets.DOCKERHUB_USERNAME != ''`
directly inside step `if:` conditions and step-level `env:`
expressions. GitHub's expression parser now rejects that with
`Unrecognized named-value: 'secrets'` — the `secrets` context is only
allowed in a narrow set of positions (mostly `with:` inputs and step
`env:` values, not inside `if:` expressions).

Route the check through a dedicated detection step whose `env:` reads
the secrets (the one permitted way to surface them) and writes a
plain boolean to step outputs. Every downstream conditional then
guards on `steps.dockerhub.outputs.enabled == 'true'` instead.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:46:52 +08:00
caorushizi ab669f2e74 ci(docker): mirror image to Docker Hub alongside GHCR
Every image published to `ghcr.io/caorushizi/mediago` now also gets
pushed to `docker.io/caorushizi/mediago` under the same tags, so users
can `docker pull caorushizi/mediago:3.5.0` without setting up GHCR
auth.

- New `DOCKERHUB_IMAGE` env var pinning the Docker Hub slug.
- New `Login to Docker Hub` step guarded by
  `secrets.DOCKERHUB_USERNAME != '' && secrets.DOCKERHUB_TOKEN != ''`
  so forks without Docker Hub credentials can still build + push to
  GHCR without failing the login.
- New `Resolve image targets` step that composes the metadata-action
  `images:` list at runtime — only adds the Docker Hub target when
  both secrets are present. Without this, metadata-action would keep
  emitting Docker Hub tags that build-push-action would then 401 on.
- Build Summary shows both `docker pull` hints when Docker Hub is
  enabled.

Setup (one-time, in repo Settings → Secrets and variables → Actions):
- `DOCKERHUB_USERNAME`: Docker Hub account name
- `DOCKERHUB_TOKEN`:    PAT from https://hub.docker.com/settings/security
                        with Read+Write scope on caorushizi/mediago

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:10:33 +08:00
caorushizi 5386bfc8a2 docs: bump guides / changelog to v3.5.0 across zh / en / jp
`docs/guides.md` still linked to v3.5.0-beta.0 assets under a stale
v3.0.1 heading; the English and Japanese versions lagged further
behind at v3.0.0. Update the "Download and install" block on each
guide to point at v3.5.0 (installer / portable / macOS arm64 + x64 /
Linux / Docker) with a link back to the GitHub Releases page for
older builds.

Prepend a v3.5.0 entry to each `changelog.md` using the same
user-facing highlights the README now uses (browser extension /
YouTube + 1000+ sites / OpenClaw Skill / HTTP API / in-app format
conversion / Docker simplification / Go backend). Older entries
(v3.0.0 and earlier) are left untouched — changelog is append-only.

`docs/history.md` intentionally left alone: it's the "old permalinks"
archive and doesn't track the current release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 16:10:13 +08:00
caorushizi aa998d9a3a chore: add build:docker npm script for local image builds
Wraps `docker build -t mediago:local .` so contributors don't have to
remember the tag convention, and keeps local Docker builds discoverable
alongside pack:electron / release:electron in `pnpm run`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 15:11:37 +08:00
caorushizi dde75321a7 fix(docker): copy extra/ into build context so aria2 ships in the image
`scripts/download-deps.ts` treats the aria2 entry as `source: "local"`
and copies from `extra/aria2/<os>/<arch>/aria2c` into `.deps/`. Every
other downloader (ffmpeg / N_m3u8DL-RE / BBDown / yt-dlp / mediago) is
`source: "github"` and fetched over the network, so they reach the
image fine — but the Docker build context never included `extra/`,
which made `copyLocalTool()` hit its "source missing" branch and
silently skip aria2. Resulting image had no `aria2c`, any direct
download inside the container failed with a binary-not-found error
the moment a task was dispatched.

Add a `COPY extra/ extra/` in the node-builder stage, right before
`pnpm deps:download` runs, so the vendored binary is actually visible
to the script.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 15:11:23 +08:00
caorushizi d23f594b88 ci(docker): allow rebuilding an existing tag via workflow_dispatch
When a released image has to be re-cut (e.g. the broken 3.5.0 that
shipped with the stale per-downloader flags), there was no clean way
to re-publish under the same tag from the workflow — only a fresh
git tag push would trigger a build.

Extend `workflow_dispatch` with two inputs:

- `tag`        — image tag to publish under (e.g. `3.5.0` to overwrite
                 the existing one, or `3.5.0-fix.1` for a side-by-side).
                 Empty value falls back to the pre-existing
                 `dev-<run_id>` behaviour.
- `push_latest` — when rebuilding a stable release manually, optionally
                  re-stamp the `latest` tag at the same time.

`docker/metadata-action` already emits the standard OCI labels,
including `org.opencontainers.image.revision` sourced from `github.sha`.
That field alone is enough to tell two same-tag builds apart via
`docker inspect` — no Dockerfile changes needed, no manually-computed
build args. Summary step now reads version / commit from metadata-action's
own outputs (`steps.meta.outputs.version`) and `github.sha`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 14:36:30 +08:00
caorushizi b1cbb74f32 fix(docker): use --deps-dir and move CMD flags into entrypoint script
The image was failing at startup with:

    flag provided but not defined: -m3u8-bin

mediago-core consolidated the per-downloader `--*-bin` flags into a
single `--deps-dir` in 3.5.0-beta.1, but the Dockerfile was still
passing the old five flags (`--m3u8-bin`, `--bilibili-bin`,
`--direct-bin`, `--mediago-bin`, `--ffmpeg-bin`). Go flag parsing
rejects unknown flags, so the container exited immediately.

While fixing, extracted the invocation into
`scripts/docker-entrypoint.sh` rather than leaving a nine-line
quoted-array `CMD` at the bottom of the Dockerfile:

- `exec mediago-core …` replaces the shell so SIGTERM from
  `docker stop` reaches the Go process directly — no shell parent to
  swallow signals.
- `"$@"` forwards any extra flags from `docker run image … --foo=bar`
  so callers can override individual options without replacing the
  whole command.
- Switching from `CMD` to `ENTRYPOINT` makes the script the fixed
  launch path; runtime overrides still work via the forwarded `"$@"`.
- Editing default args no longer touches the Dockerfile (and thus
  doesn't invalidate the full image layer).

New `.gitattributes` pins `*.sh` to LF line endings so a Windows
checkout doesn't turn the entrypoint into a `/bin/sh^M: bad interpreter`
error inside the Linux container.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 14:24:50 +08:00
caorushizi f01cae6554 docs: rewrite README (zh/en/jp) around user-facing features, extract dev setup
The three READMEs had drifted into a dev-first shape — the first screen
of each started with pnpm / install commands before telling end users
what the product actually does — and the Japanese version had fallen
behind (outdated commands, no v3.5.x downloads, screenshots pointing
at an external CDN rather than the in-repo images).

Rework all three around the v3.5.0 user-friendly feature story and
move the developer setup into its own file:

- Unified skeleton across zh/en/jp: header badges → one-sentence pitch →
  six feature sections (browser extension · YouTube / 1000+ sites ·
  OpenClaw Skill · HTTP API · in-app format conversion · Docker +
  LAN) → screenshots → v3.5.0 downloads (+ BT Panel one-click) →
  v3.5.0 highlights → tech-stack badge row → acknowledgements →
  disclaimer → link to CONTRIBUTING.
- Header elements preserved verbatim: nav links, language switcher,
  MediaGo Pro / Try Now banners, downloads / stars / forks / GitCode /
  Trendshift badges, 4 screenshots, BT Panel one-click deployment,
  the full 5-point disclaimer.
- Tech-stack prose list compressed to a single row of shields.io
  badges (React / Electron / Vite / TypeScript / Tailwind / shadcn/ui /
  Go / Ant Design).
- Acknowledgements gain aria2 (now powering direct downloads after the
  gopeed swap).
- README.jp.md specifically: fixed four `static.ziying.site/images/*`
  references to use the in-repo `./images/*` (matching zh/en); replaced
  the outdated v3.0.0-only download block with v3.5.0; added the
  English-language switcher link that was missing from the header.
- README.md/zh.md: dropped the v3.0.0 changelog block (history lives
  on GitHub Releases) and the "Quick Start" / "Running locally" pnpm
  command blocks.

New file: `CONTRIBUTING.md`. English only — prerequisites, repo layout,
a short list of the commands contributors actually type (deps:download
/ dev:electron / dev:server / pack:electron / release:electron / check),
Conventional Commits note, PR guidance. Each README ends with a one-
line pointer to it in the local language.

No product behaviour change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 14:14:28 +08:00
105 changed files with 8117 additions and 854 deletions
+3
View File
@@ -0,0 +1,3 @@
# Shell scripts MUST keep LF endings — CRLF from Windows checkouts breaks
# /bin/sh inside Linux containers (`/bin/sh^M: bad interpreter`).
*.sh text eol=lf
+84 -7
View File
@@ -2,6 +2,16 @@ name: Build & Push Docker Image
on:
workflow_dispatch:
inputs:
tag:
description: "Image tag to publish under (e.g. 3.5.0 to rebuild a released version, or 3.5.0-fix.1 for a side-by-side). Leave blank for dev-<run_id>."
required: false
type: string
push_latest:
description: "Also tag the resulting image as `latest` (use when rebuilding a stable release)."
required: false
type: boolean
default: false
push:
tags:
- "v*"
@@ -9,6 +19,11 @@ on:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
# Docker Hub mirror — same image, different registry. Credentials
# come from the DOCKERHUB_USERNAME / DOCKERHUB_TOKEN secrets (token,
# not account password). If either secret is empty, the Docker Hub
# login step is skipped and only GHCR gets pushed.
DOCKERHUB_IMAGE: caorushizi/mediago
jobs:
docker:
@@ -35,17 +50,65 @@ jobs:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# GitHub Actions forbids `secrets.*` inside `if:` expressions
# directly — it fails with `Unrecognized named-value: 'secrets'`.
# The blessed workaround: pull the secret through `env:` (which
# IS allowed) inside a single check step, write a boolean to
# step outputs, and have every downstream step guard on the
# output instead of the raw secret.
- name: Detect Docker Hub credentials
id: dockerhub
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
run: |
if [ -n "$DOCKERHUB_USERNAME" ] && [ -n "$DOCKERHUB_TOKEN" ]; then
echo "enabled=true" >> "$GITHUB_OUTPUT"
else
echo "enabled=false" >> "$GITHUB_OUTPUT"
fi
# Only log in (and later push) to Docker Hub when both secrets are
# configured. Lets forks / trial runs without Docker Hub
# credentials still build-and-push to GHCR.
- name: Login to Docker Hub
if: steps.dockerhub.outputs.enabled == 'true'
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# Compose the list of target images based on which registries we
# actually have credentials for. Without this, metadata-action
# would always generate Docker Hub tags and build-push-action
# would then fail with 401 on forks that haven't set the secrets.
- name: Resolve image targets
id: targets
run: |
{
echo "images<<EOF"
echo "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}"
if [ "${{ steps.dockerhub.outputs.enabled }}" = "true" ]; then
echo "${{ env.DOCKERHUB_IMAGE }}"
fi
echo "EOF"
} >> "$GITHUB_OUTPUT"
- name: Docker meta
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
images: ${{ steps.targets.outputs.images }}
tags: |
# For version tags: v1.0.0 → 1.0.0 + latest (non-beta only)
# 1. Manual rebuild with an explicit tag (e.g. `3.5.0`, `3.5.0-fix.1`)
type=raw,value=${{ inputs.tag }},enable=${{ inputs.tag != '' }}
# 2. Tag push: v1.0.0 → 1.0.0
type=semver,pattern={{version}}
type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, 'beta') }}
# For manual triggers: dev-{run_id}
type=raw,value=dev-${{ github.run_id }},enable=${{ !startsWith(github.ref, 'refs/tags/') }}
# 3. `latest`: on stable semver tag pushes, or when the manual
# rebuild explicitly asks for it
type=raw,value=latest,enable=${{ (startsWith(github.ref, 'refs/tags/v') && !contains(github.ref, 'beta')) || inputs.push_latest }}
# 4. Fallback for manual triggers with no custom tag
type=raw,value=dev-${{ github.run_id }},enable=${{ !startsWith(github.ref, 'refs/tags/') && inputs.tag == '' }}
- name: Build and push
uses: docker/build-push-action@v7
@@ -54,6 +117,11 @@ jobs:
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
# `metadata-action` already emits the standard OCI labels
# (image.title / description / source / licenses / version /
# revision / created). `revision` uses github.sha, so two
# builds that re-use a tag are distinguishable via
# `docker inspect`.
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
@@ -62,8 +130,14 @@ jobs:
run: |
echo "### 🎉 Docker Image Published" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Image:** \`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Registries:**" >> $GITHUB_STEP_SUMMARY
echo "- \`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\`" >> $GITHUB_STEP_SUMMARY
if [ "${{ steps.dockerhub.outputs.enabled }}" = "true" ]; then
echo "- \`docker.io/${{ env.DOCKERHUB_IMAGE }}\`" >> $GITHUB_STEP_SUMMARY
fi
echo "**Platforms:** linux/amd64, linux/arm64" >> $GITHUB_STEP_SUMMARY
echo "**Version:** \`${{ steps.meta.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Commit:** \`${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Tags:**" >> $GITHUB_STEP_SUMMARY
echo "${{ steps.meta.outputs.tags }}" | while read tag; do
@@ -72,5 +146,8 @@ jobs:
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Pull:**" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY
echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
if [ "${{ steps.dockerhub.outputs.enabled }}" = "true" ]; then
echo "docker pull ${{ env.DOCKERHUB_IMAGE }}:${{ steps.meta.outputs.version }}" >> $GITHUB_STEP_SUMMARY
fi
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
+4
View File
@@ -16,3 +16,7 @@ apps/main/bin/
.deps/
tmp/
# Local planning notes that should not be published with the open-source repo.
docs/.vitepress/seo-keyword-map*.md
docs/.vitepress/private/
+96
View File
@@ -0,0 +1,96 @@
# Contributing to MediaGo
Thanks for your interest in hacking on MediaGo! This doc covers everything
you need to get a local dev build running. For user-facing usage, see the
main [README](./README.md).
## Prerequisites
- **Node.js** ≥ 20 — install from [nodejs.org](https://nodejs.org/)
- **pnpm** ≥ 10 — `npm i -g pnpm`
- **Go** ≥ 1.22 — only needed if you're working on the Go Core backend
(`apps/core/`). Install from [go.dev](https://go.dev/dl/).
## Clone & install
```shell
git clone https://github.com/caorushizi/mediago.git
cd mediago
pnpm install
```
## Repository layout
MediaGo is a pnpm + Turborepo monorepo with three products that share the
same Go Core backend:
```
apps/
core/ Go backend (download orchestration, SSE, REST API)
electron/ Electron desktop main process
server/ Node.js launcher for the self-hosted web build
ui/ Shared React 19 frontend (Electron + Web)
player-ui/ React frontend embedded inside Go Core for playback
packages/
shared/common/ Cross-platform types, constants, i18n resources
core-sdk/ TypeScript SDK for the Go Core REST API
electron-preload/
mediago-extension/ Browser extension (Chrome / Edge)
docs/ VitePress site (zh / en / jp)
extra/ Vendored binaries (e.g. aria2)
scripts/ Dep downloaders, extension packager, etc.
```
Deeper architecture notes live in [`CLAUDE.md`](./CLAUDE.md).
## Everyday commands
```shell
# Download third-party binaries (ffmpeg, yt-dlp, N_m3u8DL-RE, BBDown,
# aria2, mediago-core) for the current platform — run once per clone
pnpm deps:download
# Run the Electron desktop app in dev mode (HMR)
pnpm dev:electron
# Run the self-hosted web server in dev mode
pnpm dev:server
# Build an unpacked Electron directory (fast, for smoke-testing layout)
pnpm pack:electron
# Build full Electron installers for distribution (.exe / .dmg / .deb)
pnpm release:electron
# Lint + format + type-check (what CI runs)
pnpm check
```
The self-hosted web server doesn't have a dedicated packaging script — it
ships via the Docker image published to GHCR, or you can run the build
output (`pnpm -F @mediago/server build`) directly under Node.
## Commit style
This repo uses [Conventional Commits](https://www.conventionalcommits.org/).
Typical shapes:
```
feat(ui): add dark-mode toggle to settings page
fix(core): resume m3u8 downloads after process restart
refactor(extension): split options hook per card
chore(deps): bump axios from 1.14.0 to 1.15.0
```
Commits are lint-staged on commit (oxlint --fix + oxfmt --write on
staged files). Type checks run via `turbo type:check`.
## Pull requests
- Open PRs against the `master` branch.
- Keep each PR focused — one feature / fix per PR if possible.
- Include a short "why" in the description; the "what" is in the diff.
- If the change is user-visible, a line in the PR description that would
fit in a release note is appreciated.
Thanks for contributing! 🚀
+13 -13
View File
@@ -34,6 +34,12 @@ COPY apps/player-ui/ apps/player-ui/
COPY apps/electron/app/package.json apps/electron/app/package.json
COPY scripts/ scripts/
# Vendored binaries (aria2 in particular). `scripts/download-deps.ts`
# treats `source: "local"` entries by copying from `extra/<tool>/<os>/<arch>/`
# into `.deps/`; without this COPY they silently get skipped and the
# resulting image ships with no aria2c.
COPY extra/ extra/
# Build player-ui (will be embedded in Go core binary)
RUN pnpm --filter @mediago/player-ui run build
@@ -98,20 +104,14 @@ RUN mkdir -p /app/deps && \
RUN mkdir -p /app/mediago/data /app/mediago/logs /app/mediago/downloads
# Entrypoint script — isolates the invocation flags from the Dockerfile
# so editing the default args doesn't require rebuilding the full image
# layer and so callers can still append overrides via `docker run`.
COPY scripts/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
EXPOSE 8899
VOLUME ["/app/mediago"]
CMD ["mediago-core", \
"--port=8899", \
"--static-dir=/app/static", \
"--enable-auth", \
"--db-path=/app/mediago/data/mediago.db", \
"--config-dir=/app/mediago/data", \
"--log-dir=/app/mediago/logs", \
"--local-dir=/app/mediago/downloads", \
"--m3u8-bin=/app/deps/N_m3u8DL-RE", \
"--bilibili-bin=/app/deps/BBDown", \
"--direct-bin=/app/deps/aria2c", \
"--mediago-bin=/app/deps/mediago", \
"--ffmpeg-bin=/app/deps/ffmpeg"]
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
+177
View File
@@ -0,0 +1,177 @@
<div align="center">
<h1>MediaGo</h1>
<a href="https://downloader.caorushizi.cn/it/guides.html?form=github">Avvio rapido</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://downloader.caorushizi.cn/it?form=github">Sito web</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://downloader.caorushizi.cn/it/documents.html?form=github">Documentazione</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/discussions">Discussioni</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://discord.gg/yxWBVRWGqM">Discord</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://www.reddit.com/r/MediaGo_Studio/">Reddit</a>
<br>
<a href="https://github.com/caorushizi/mediago/blob/master/README.md">English</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.zh.md">中文</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.jp.md">日本語</a>
<br>
<img alt="GitHub Downloads (all assets, all releases)" src="https://img.shields.io/github/downloads/caorushizi/mediago/total">
<img alt="GitHub Downloads (all assets, latest release)" src="https://img.shields.io/github/downloads/caorushizi/mediago/latest/total">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/caorushizi/mediago">
<img alt="GitHub forks" src="https://img.shields.io/github/forks/caorushizi/mediago">
<img alt="GitCode" src="https://gitcode.com/caorushizi/mediago/star/badge.svg">
<br>
<a href="https://trendshift.io/repositories/11083" target="_blank">
<img src="https://trendshift.io/api/badge/repositories/11083" alt="caorushizi%2Fmediago | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/>
</a>
<hr />
</div>
Un downloader video multipiattaforma con sniffing integrato: apri una
pagina, scegli la risorsa che ti interessa e salvala. Nessuna cattura dei
pacchetti, nessuna configurazione complicata di estensioni browser, nessuno
strumento da riga di comando da gestire.
L'interfaccia dell'app include attualmente inglese, cinese semplificato e
italiano.
## ✨ Cosa include
### 🌐 Estensione browser per Chrome / Edge
Trovi un video interessante su un sito qualsiasi → clicchi l'estensione →
lo invii a MediaGo con un clic. Rileva automaticamente le risorse video,
mostra il numero di elementi trovati nel badge della toolbar e funziona con
le principali piattaforme video, incluse YouTube, Bilibili e molte altre.
L'estensione è inclusa nell'app desktop: apri **Impostazioni → Altre
impostazioni → Directory estensione browser** per trovare la cartella di
installazione.
### 🎬 YouTube e oltre 1000 siti
Basato su yt-dlp. Supporta YouTube, Twitter/X, Instagram, Reddit e
[oltre mille altri siti video](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md).
### 🦞 Gli assistenti AI possono scaricare per te — OpenClaw Skill
Usi Claude Code, Cursor o un altro assistente AI per programmare? Installa
la skill MediaGo e scrivi semplicemente _"please download this video:
&lt;url&gt;"_. L'assistente gestisce il resto.
```shell
npx clawhub@latest install mediago
```
### 🔌 Funziona con altri strumenti
MediaGo espone una API HTTP completa: script, automazioni e app di terze
parti possono creare attività di download, consultare l'avanzamento e
gestire la lista. L'estensione browser usa la stessa API per parlare con
l'app desktop, e puoi integrarla anche nei tuoi workflow.
### 🎞️ Conversione formato integrata
Dopo il download puoi convertire il file in un altro formato o qualità
direttamente da MediaGo. Non serve aprire uno strumento ffmpeg separato.
### 🐳 Deploy Docker con un solo comando
Installazione headless sul tuo server, poi accesso alla UI web da qualsiasi
dispositivo nella stessa rete:
```shell
docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0
```
Disponibile su [Docker Hub](https://hub.docker.com/r/caorushizi/mediago)
e GHCR (`ghcr.io/caorushizi/mediago`): la stessa immagine, scegli il
registry più veloce per te. Supporta Intel / AMD (amd64) e ARM (arm64).
Nella build desktop, MediaGo ascolta sia su `127.0.0.1` sia sull'IP LAN,
così telefoni e tablet sulla stessa rete Wi-Fi possono aprire direttamente
la UI web.
## 📷 Screenshot
![Home](./images/home_en.png)
![Home — modalità scura](./images/home-dark_en.png)
![Impostazioni](./images/settings_en.png)
![Estrazione risorse](./images/browser_en.png)
## 📥 Download
### v3.5.0 (stabile)
- [Windows — installer](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [Windows — portable](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [macOS — Apple Silicon (arm64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [macOS — Intel (x64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [Linux (deb)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago): `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
Per le versioni precedenti, consulta la [pagina GitHub Releases](https://github.com/caorushizi/mediago/releases).
### 🪄 Deploy Docker con un clic tramite BT Panel
1. Installa [BT Panel](https://www.bt.cn/new/download.html?r=dk_mediago)
usando lo script ufficiale.
2. Accedi al pannello, clicca **Docker** nella barra laterale e completa la
configurazione del servizio Docker seguendo le istruzioni.
3. Trova **MediaGo** nello store delle app, clicca **Install**, configura il
dominio e hai finito.
## 📝 Novità in v3.5.0
- **🌐 Estensione browser** — sniffing video su qualsiasi sito e invio a
MediaGo con un clic
- **🎬 YouTube + 1000+ siti** — integrazione con yt-dlp
- **🦞 OpenClaw Skill** — scarica video tramite assistenti AI per programmare
- **🔌 API HTTP** — integrazione con script, automazioni e strumenti di terze parti
- **🎞️ Conversione formato in app** — scegli formato e qualità di output
- **🐳 Deploy Docker più semplice** — monta una sola cartella, immagini multi-arch su GHCR
- **⚡ Avvio più rapido** — backend riscritto, minore consumo di memoria, player video integrato
## 🛠️ Tecnologie
[![React](https://img.shields.io/badge/React-20232A?logo=react&logoColor=61DAFB)](https://react.dev/)
[![Electron](https://img.shields.io/badge/Electron-191970?logo=electron&logoColor=white)](https://www.electronjs.org)
[![Vite](https://img.shields.io/badge/Vite-646CFF?logo=vite&logoColor=white)](https://vitejs.dev)
[![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-06B6D4?logo=tailwindcss&logoColor=white)](https://tailwindcss.com)
[![shadcn/ui](https://img.shields.io/badge/shadcn%2Fui-000?logo=shadcnui&logoColor=white)](https://ui.shadcn.com/)
[![Go](https://img.shields.io/badge/Go-00ADD8?logo=go&logoColor=white)](https://go.dev/)
[![Ant Design](https://img.shields.io/badge/Ant_Design-0170FE?logo=antdesign&logoColor=white)](https://ant.design)
## 🙏 Ringraziamenti
- [N_m3u8DL-RE](https://github.com/nilaoda/N_m3u8DL-RE)
- [BBDown](https://github.com/nilaoda/BBDown)
- [yt-dlp](https://github.com/yt-dlp/yt-dlp)
- [aria2](https://aria2.github.io/)
- [mediago-core](https://github.com/caorushizi/mediago-core)
## ⚖️ Disclaimer
> **Questo progetto è destinato esclusivamente a scopi educativi e di ricerca. Non usarlo per finalità commerciali o illegali.**
>
> 1. Tutto il codice e tutte le funzionalità fornite da questo progetto sono pensati solo come riferimento per lo studio delle tecnologie di streaming. Gli utenti devono rispettare le leggi e i regolamenti della propria giurisdizione.
> 2. Qualsiasi contenuto scaricato tramite questo progetto resta di proprietà dei rispettivi titolari dei diritti. Gli utenti devono eliminare i contenuti scaricati entro 24 ore o ottenere un'autorizzazione adeguata.
> 3. Gli sviluppatori del progetto non sono responsabili delle azioni degli utenti, incluso il download di contenuti protetti da copyright o l'impatto su piattaforme di terze parti.
> 4. È vietato usare questo progetto per scraping massivo, interruzione dei servizi delle piattaforme o qualsiasi attività che violi diritti legittimi altrui.
> 5. Usando questo progetto confermi di aver letto e accettato questo disclaimer. Se non lo accetti, interrompi subito l'uso del progetto ed eliminalo.
---
> Vuoi compilare da sorgente? Consulta [CONTRIBUTING.md](./CONTRIBUTING.md).
>
> Vuoi tradurre MediaGo? Consulta [TRANSLATION.md](./TRANSLATION.md).
+97 -98
View File
@@ -1,30 +1,32 @@
<div align="center">
<h1>MediaGo</h1>
<a href="https://downloader.caorushizi.cn/jp/guides.html?form=github">早く始めます</a>
<a href="https://downloader.caorushizi.cn/jp/guides.html?form=github">クイックスタート</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://downloader.caorushizi.cn/jp?form=github">公式サイトです</a>
<a href="https://downloader.caorushizi.cn/jp?form=github">公式サイト</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://downloader.caorushizi.cn/jp/documents.html?form=github">にやすりをかける</a>
<a href="https://downloader.caorushizi.cn/jp/documents.html?form=github">ドキュメント</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/discussions">Discussions</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://discord.gg/yxWBVRWGqM">Discord</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://www.reddit.com/r/MediaGo_Studio/">Reddit</a>
<br>
<!-- MediaGo Pro -->
<a href="https://mediago.torchstellar.com/?from=github">
<img src="https://img.shields.io/badge/✨_新登場-MediaGo_Pro-ff6b6b?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAyTDMgN2wzIDMgNi00IDYgNCAzLTMtOS01eiIvPjxwYXRoIGQ9Ik0zIDE3bDkgNSA5LTUtMy0zLTYgNC02LTQtMyAzeiIvPjwvc3ZnPg==" alt="MediaGo Pro" />
</a>
<a href="https://mediago.torchstellar.com/?from=github">
<img src="https://img.shields.io/badge/🚀_今すぐ試す-オンライン版_インストール不要-2a82f6?style=for-the-badge" alt="Try Now" />
</a>
<br>
<br>
<a href="https://github.com/caorushizi/mediago/blob/master/README.md">English</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.zh.md">中文</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.it.md">Italiano</a>
<br>
<img alt="GitHub Downloads (all assets, all releases)" src="https://img.shields.io/github/downloads/caorushizi/mediago/total">
<img alt="GitHub Downloads (all assets, latest release)" src="https://img.shields.io/github/downloads/caorushizi/mediago/latest/total">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/caorushizi/mediago">
<img alt="GitHub forks" src="https://img.shields.io/github/forks/caorushizi/mediago">
<img alt="GitCode" src="https://gitcode.com/caorushizi/mediago/star/badge.svg">
<br>
<br>
<a href="https://trendshift.io/repositories/11083" target="_blank">
<img src="https://trendshift.io/api/badge/repositories/11083" alt="caorushizi%2Fmediago | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/>
</a>
@@ -32,120 +34,117 @@
<hr />
</div>
## Intro
ビルトインのスニッフィング機能を備えたクロスプラットフォームの動画ダウンローダー —— ページを開いて、欲しいリソースを選んで、保存するだけ。パケットキャプチャ不要、ブラウザ拡張の設定不要、コマンドラインの操作も不要です。
本プロジェクトはm3u8ビデオ抽出ツール、ストリーミングダウンロード、m3u8ダウンロードをサポートしています。
アプリ UI は現在、英語・簡体中国語・イタリア語に対応しています。
- **✅&nbsp; パケットキャプチャ不要**: ソフトウェアに内蔵されたブラウザを使用して、ウェブページ内のビデオリソースを簡単に検出し、検出したリソースリストからダウンロードしたいリソースを選択することで、シンプルかつ迅速にダウンロードできます。
- **📱&nbsp; モバイル再生**: PCとモバイルデバイス間で簡単にシームレスに切り替えが可能で、ダウンロードが完了した後はスマートフォンでビデオを視聴できます。
- **⚡️&nbsp; バッチダウンロード**: 複数のビデオやライブストリームリソースを同時にダウンロードでき、高速帯域幅を無駄にしません。
- **🎉&nbsp; Dockerデプロイメントサポート**: WebエンドをDockerでデプロイすることができ、簡単かつ便利です。
## ✨ 主な機能
## Quickstart
### 🌐 ブラウザ拡張機能(Chrome / Edge
コードを実行するには、Node.jsとpnpmが必要です。Node.jsは公式ウェブサイトからダウンロードしてインストールし、pnpmは`npm i -g pnpm`コマンドでインストールできます。
ウェブを閲覧中に気になる動画を見つけたら → 拡張機能のアイコンをクリック → ワンクリックで MediaGo に送信。ページ内のダウンロード可能なリソースを自動検出し、ツールバーアイコンのバッジに件数を表示します。YouTube、Bilibili をはじめ主要な動画サイトに対応。拡張機能はデスクトップ版インストーラーに同梱されているので、**設定 → その他の設定 → ブラウザ拡張ディレクトリ** から直接インストールフォルダを開けます。
## コードの実行
### 🎬 YouTube と 1000+ サイト対応
内部では yt-dlp を使用。YouTube、Twitter/X、Instagram、Reddit など [1000 以上の動画サイト](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md) をサポートします。
### 🦞 AI アシスタントで動画をダウンロード — OpenClaw Skill
Claude Code や Cursor などの AI コーディングアシスタントを使っていますか?MediaGo Skill をインストールすれば、AI に「この動画をダウンロードして:&lt;URL&gt;」と言うだけでダウンロードが始まります。
```shell
# コードのダウンロードです
git clone https://github.com/caorushizi/mediago.git
# インストール依存症です
pnpm i
# 開発環境です
pnpm dev
# 梱包して運行します
pnpm release
# dockerミラーリングを構築します
docker buildx build -t caorushizi/mediago:latest .
# docker启动
docker run -d --name mediago -p 8899:8899 -v /root/mediago:/root/mediago registry.cn-beijing.aliyuncs.com/caorushizi/mediago
npx clawhub@latest install mediago
```
## Releases
### 🔌 他のツールと連携
### v3.0.0 (2024.10.7 発売)
MediaGo は完全な HTTP API を提供します。スクリプト、自動化ツール、他のアプリから直接ダウンロードタスクの作成、進捗の取得、リスト管理が可能です。ブラウザ拡張機能はこの API を介してデスクトップアプリと通信しており、自分のワークフローに組み込むこともできます。
#### ソフトウェアダウンロード
### 🎞️ 内蔵フォーマット変換
- [【mediago】 windows(インストーラー版) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-win32-x64-3.0.0.exe)
- [【mediago】 windows(ポータブル版) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-portable-win32-x64-3.0.0.exe)
- [【mediago】 macos arm64Appleチップ) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-arm64-3.0.0.dmg)
- [【mediago】 macos x64Intelチップ) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-x64-3.0.0.dmg)
- [【mediago】 linux v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-linux-amd64-3.0.0.deb)
- 【mediago】 docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /root/mediago:/root/mediago registry.cn-beijing.aliyuncs.com/caorushizi/mediago:v3.0.0`
ダウンロード完了後、MediaGo 内で他のフォーマットや画質に変換できます。ffmpeg を別途起動する必要はありません。
#### 国内ダウンロード
### 🐳 Docker でワンライン展開
- [【mediago】 windows(インストーラー版) v3.0.0](https://static.ziying.site/mediago/mediago-setup-win32-x64-3.0.0.exe)
- [【mediago】 windows(ポータブル版) v3.0.0](https://static.ziying.site/mediago/mediago-portable-win32-x64-3.0.0.exe)
- [【mediago】 macos arm64Appleチップ) v3.0.0](https://static.ziying.site/mediago/mediago-setup-darwin-arm64-3.0.0.dmg)
- [【mediago】 macos x64Intelチップ) v3.0.0](https://static.ziying.site/mediago/mediago-setup-darwin-x64-3.0.0-beta.5.dmg)
- [【mediago】 linux v3.0.0](https://static.ziying.site/mediago/mediago-setup-linux-amd64-3.0.0.deb)
- 【mediago】 docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /root/mediago:/root/mediago registry.cn-beijing.aliyuncs.com/caorushizi/mediago:v3.0.0`
サーバーにヘッドレスでインストールし、同じネットワーク内のどこからでも Web UI にアクセスできます:
### docker 宝塔パネルワンクリックデプロイ(推奨)
```shell
docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0
```
1. 宝塔パネルをインストールし、[宝塔パネル](https://www.bt.cn/new/download.html?r=dk_mediago) の公式サイトから正式版のスクリプトを選択してインストールします。
[Docker Hub](https://hub.docker.com/r/caorushizi/mediago) と GHCR`ghcr.io/caorushizi/mediago`)の両方で配信しています。同じイメージなのでお好みのレジストリを。Intel / AMD (amd64) と ARM (arm64) の両方に対応。デスクトップ版は `127.0.0.1` と LAN IP の両方で待ち受けるため、同じ Wi-Fi のスマートフォンやタブレットからも Web UI を開けます。
2. インストール後、宝塔パネルにログインし、メニューから `Docker` をクリックします。初めてアクセスすると、`Docker` サービスをインストールするように指示されるので、「今すぐインストール」をクリックし、指示に従ってインストールを完了します。
## 📷 スクリーンショット
3. インストールが完了したら、アプリストアで「MediaGo」を見つけ、インストールをクリックし、ドメイン名などの基本情報を設定してインストールを完了します。
![ホームページ](./images/home.png)
### ソフトウェアスクリーンショット
![ホームページ — ダークモード](./images/home-dark.png)
![ホームページ](https://static.ziying.site/images/home.png)
![設定](./images/settings.png)
### 重要な更新
![リソース抽出](./images/browser.png)
- Web端のdockerデプロイをサポート
- デスクトップ端のUIを更新
## 📥 ダウンロード
### 更新ログ
### v3.5.0(安定版)
- デスクトップ端のUIを更新
- Web端のdockerデプロイをサポート
- 新たにビデオ再生機能を追加、デスクトップとモバイル端両方で再生可能
- Macでの画面表示ができない問題を修正
- バッチダウンロードのインタラクションを最適化
- Windowsのポータブル版(インストール不要)を追加
- ダウンロードリストの最適化、ページ内の複数のビデオリソースを嗅ぎ取る機能を追加
- 手動でお気に入りリストのインポートとエクスポートをサポート
- ホームページのダウンロードリストエクスポートをサポート
- 「新規ダウンロード」フォームのインタラクションロジックを最適化
- UrlSchemeでアプリを開き、ダウンロードタスクを追加する機能をサポート
- バグの修正とユーザー体験の向上
- [Windows — インストーラー版](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [Windows — ポータブル版](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [macOS — Apple Silicon (arm64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [macOS — Intel (x64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [Linux (deb)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago)`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
## ソフトウェアスクリーンショット
過去のバージョンは [GitHub Releases ページ](https://github.com/caorushizi/mediago/releases) をご覧ください。
![ホームページ](https://static.ziying.site/images/home.png)
### 🪄 宝塔パネルでワンクリック Docker デプロイ
![ホームページ(ダークモード)](https://static.ziying.site/images/home-dark.png)
1. [宝塔パネル公式サイト](https://www.bt.cn/new/download.html?r=dk_mediago) から正式版のスクリプトをダウンロードしてインストール
2. 宝塔パネルにログイン、メニューから **Docker** をクリック。初回アクセス時に Docker サービスのインストールを求められるので、「今すぐインストール」をクリックして完了
3. アプリストアで **MediaGo** を見つけて、インストールをクリック、ドメインなどの基本情報を設定すれば完了
![設定ページ](https://static.ziying.site/images/settings.png)
## 📝 v3.5.0 の新機能
![リソース抽出](https://static.ziying.site/images/browser.png)
- **🌐 ブラウザ拡張機能** — 任意のサイトで動画をスニッフィング、ワンクリックで MediaGo に送信
- **🎬 YouTube + 1000+ サイト** — yt-dlp による対応
- **🦞 OpenClaw Skill** — AI コーディングアシスタント経由でダウンロード
- **🔌 HTTP API** — スクリプト、自動化、サードパーティツールとの統合
- **🎞️ アプリ内フォーマット変換** — 出力形式と画質を選択
- **🐳 Docker デプロイの簡素化** — 単一ディレクトリをマウント、GHCR のマルチアーキテクチャイメージ
- **⚡ 起動の高速化** — バックエンド書き換え、メモリ使用量の削減、内蔵動画プレーヤー
## 技術スタック
## 🛠️ 技術スタック
- react <https://react.dev/>
- electron <https://www.electronjs.org>
- koa <https://koajs.com>
- vite <https://cn.vitejs.dev>
- antd <https://ant.design>
- tailwindcss <https://tailwindcss.com>
- shadcn <https://ui.shadcn.com/>
- inversify <https://inversify.io>
- typeorm <https://typeorm.io>
[![React](https://img.shields.io/badge/React-20232A?logo=react&logoColor=61DAFB)](https://react.dev/)
[![Electron](https://img.shields.io/badge/Electron-191970?logo=electron&logoColor=white)](https://www.electronjs.org)
[![Vite](https://img.shields.io/badge/Vite-646CFF?logo=vite&logoColor=white)](https://vitejs.dev)
[![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-06B6D4?logo=tailwindcss&logoColor=white)](https://tailwindcss.com)
[![shadcn/ui](https://img.shields.io/badge/shadcn%2Fui-000?logo=shadcnui&logoColor=white)](https://ui.shadcn.com/)
[![Go](https://img.shields.io/badge/Go-00ADD8?logo=go&logoColor=white)](https://go.dev/)
[![Ant Design](https://img.shields.io/badge/Ant_Design-0170FE?logo=antdesign&logoColor=white)](https://ant.design)
## 感謝
## 🙏 謝辞
- N_m2u8DL-CLI は <https://github.com/nilaoda/N_m3u8DL-CLI> から来ています
- N_m3u8DL-RE は <https://github.com/nilaoda/N_m3u8DL-RE> から来ています
- mediago は <https://github.com/caorushizi/hls-downloader> から来ています
- [N_m3u8DL-RE](https://github.com/nilaoda/N_m3u8DL-RE)
- [BBDown](https://github.com/nilaoda/BBDown)
- [yt-dlp](https://github.com/yt-dlp/yt-dlp)
- [aria2](https://aria2.github.io/)
- [mediago-core](https://github.com/caorushizi/mediago-core)
## ⚖️ 免責事項
> **本プロジェクトは学習および研究目的にのみ提供されるものであり、商用または違法な目的での使用はご遠慮ください。**
>
> 1. 本プロジェクトが提供するすべてのコードおよび機能は、ストリーミング技術の学習のための参考資料としてのみ使用されます。利用者は所在地域の法令を遵守してください。
> 2. 本プロジェクトを使用してダウンロードされたコンテンツの著作権は、原コンテンツの所有者に帰属します。利用者はダウンロード後 24 時間以内にコンテンツを削除するか、著作権者の許可を取得する必要があります。
> 3. 本プロジェクトの開発者は、著作権で保護されたコンテンツのダウンロードや第三者プラットフォームへの影響を含め、利用者の行動に対して一切の責任を負いません。
> 4. 大規模なスクレイピング、プラットフォームサービスの妨害、その他他者の合法的権利を侵害する行為に本プロジェクトを使用することは禁止されています。
> 5. 本プロジェクトを使用することにより、あなたはこの免責事項を読み、同意したものとみなされます。同意しない場合は、直ちに本プロジェクトの使用を停止し、削除してください。
---
> ソースからビルドする場合は [CONTRIBUTING.md](./CONTRIBUTING.md)(英語)を参照してください。
>
> MediaGo の翻訳をご検討中の方は [TRANSLATION.md](./TRANSLATION.md)(英語)をご参照ください。
+100 -91
View File
@@ -7,22 +7,19 @@
<a href="https://downloader.caorushizi.cn/en/documents.html?form=github">Docs</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/discussions">Discussions</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://discord.gg/yxWBVRWGqM">Discord</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://www.reddit.com/r/MediaGo_Studio/">Reddit</a>
<br>
<a href="https://github.com/caorushizi/mediago/blob/master/README.zh.md">中文</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.jp.md">日本語</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.it.md">Italiano</a>
<br>
<!-- MediaGo Pro -->
<a href="https://mediago.torchstellar.com/?from=github">
<img src="https://img.shields.io/badge/✨_New_Release-MediaGo_Pro-ff6b6b?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAyTDMgN2wzIDMgNi00IDYgNCAzLTMtOS01eiIvPjxwYXRoIGQ9Ik0zIDE3bDkgNSA5LTUtMy0zLTYgNC02LTQtMyAzeiIvPjwvc3ZnPg==" alt="MediaGo Pro" />
</a>
<a href="https://mediago.torchstellar.com/?from=github">
<img src="https://img.shields.io/badge/🚀_Try_Now-Online_Version_No_Install-2a82f6?style=for-the-badge" alt="Try Now" />
</a>
<br>
<img alt="GitHub Downloads (all assets, all releases)" src="https://img.shields.io/github/downloads/caorushizi/mediago/total">
<img alt="GitHub Downloads (all assets, latest release)" src="https://img.shields.io/github/downloads/caorushizi/mediago/latest/total">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/caorushizi/mediago">
@@ -37,120 +34,126 @@
<hr />
</div>
## What is MediaGo?
A cross-platform video downloader with built-in sniffing — point it at a
page, pick what you want, and save. No packet capture, no browser
extensions to configure, no fiddling with command-line tools.
A cross-platform streaming media downloader with built-in browser sniffing — grab m3u8, HLS, and more with zero packet-capture hassle.
The app UI currently ships with English, Simplified Chinese, and Italian.
- **✅&nbsp; No packet capture needed** — The built-in browser automatically detects video resources on any page. Just pick what you want from the detected list and download.
- **📱&nbsp; Watch on mobile** — Seamlessly switch between PC and mobile. Once a video is downloaded, scan a QR code to watch it on your phone.
- **⚡️&nbsp; Batch downloads** — Download multiple videos and live streams at the same time — no wasted bandwidth.
- **🎉&nbsp; Docker support** — Deploy the web UI via Docker for quick, headless operation.
- **🦞&nbsp; OpenClaw Skill** — Download videos with natural language through AI coding assistants (OpenClaw, Claude Code, etc.). Install with `npx clawhub@latest install mediago`.
## ✨ What's inside
## Quick Start
### 🌐 Browser extension for Chrome / Edge
You need **Node.js** and **pnpm**. Install Node.js from the [official site](https://nodejs.org/), then install pnpm:
See something you want on any site → click the extension → send it to
MediaGo. Detects video resources automatically, shows the count on the
toolbar badge, works with most mainstream video platforms including
YouTube, Bilibili and more. Ships bundled with the Desktop app — open
**Settings → More Settings → Browser extension directory** to find the
install folder.
### 🎬 YouTube and 1000+ sites
Powered by yt-dlp under the hood. Supports YouTube, Twitter/X, Instagram,
Reddit and [over a thousand more video sites](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md).
### 🦞 AI assistants can download for you — OpenClaw Skill
Using Claude Code, Cursor or another AI coding assistant? Install the
MediaGo skill and just say _"please download this video: &lt;url&gt;"_.
The AI handles the rest.
```shell
npm i -g pnpm
npx clawhub@latest install mediago
```
## Running locally
### 🔌 Works with other tools
MediaGo exposes a full HTTP API — scripts, automation tools and other
apps can create download tasks, query progress and manage the list
directly. The browser extension uses this same API to talk to the desktop
app; anyone else can tap in too.
### 🎞️ Built-in format conversion
After a download finishes, convert it to another format or quality
without leaving MediaGo. No more opening a separate tool for ffmpeg.
### 🐳 One-line Docker deployment
Headless install on your server, then access the web UI from anywhere on
the same network:
```shell
# Clone the repo
git clone https://github.com/caorushizi/mediago.git
# Install dependencies
pnpm install
# Start the Electron desktop app (dev mode)
pnpm dev:electron
# — or — start the web server (dev mode)
pnpm dev:server
# Package the Electron app for distribution
pnpm pack:electron
# Package the web server for distribution
pnpm pack:server
docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0
```
## Releases
Available on [Docker Hub](https://hub.docker.com/r/caorushizi/mediago) and GHCR (`ghcr.io/caorushizi/mediago`) — same image, pick whichever registry is faster for you. Supports both Intel / AMD (amd64) and ARM (arm64). On the desktop build,
MediaGo listens on both `127.0.0.1` and your LAN IP out of the box, so
phones and tablets on the same Wi-Fi can open the web UI too.
### v3.5.0-beta.0 (Apr 3, 2026)
## 📷 Screenshots
#### Downloads
![Home](./images/home_en.png)
- [Windows (installer) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-win32-x64-3.5.0-beta.0.exe)
- [Windows (portable) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-portable-win32-x64-3.5.0-beta.0.exe)
- [macOS ARM64 (Apple Silicon) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-darwin-arm64-3.5.0-beta.0.dmg)
- [macOS x64 (Intel) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-darwin-x64-3.5.0-beta.0.dmg)
- [Linux v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-linux-amd64-3.5.0-beta.0.deb)
- Docker v3.5.0-beta.0: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0-beta.0`
![Home — dark mode](./images/home-dark_en.png)
### v3.0.0 (Oct 7, 2024)
![Settings](./images/settings_en.png)
#### Downloads
![Resource extraction](./images/browser_en.png)
- [Windows (installer) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-win32-x64-3.0.0.exe)
- [Windows (portable) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-portable-win32-x64-3.0.0.exe)
- [macOS ARM64 (Apple Silicon) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-arm64-3.0.0.dmg)
- [macOS x64 (Intel) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-x64-3.0.0.dmg)
- [Linux v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-linux-amd64-3.0.0.deb)
- Docker: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:latest`
## 📥 Download
### One-click Docker deployment via BT Panel
### v3.5.0 (stable)
- [Windows — installer](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [Windows — portable](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [macOS — Apple Silicon (arm64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [macOS — Intel (x64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [Linux (deb)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago): `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
Browsing older releases? See the [GitHub Releases page](https://github.com/caorushizi/mediago/releases).
### 🪄 One-click Docker deployment via BT Panel
1. Install [BT Panel](https://www.bt.cn/new/download.html?r=dk_mediago) using the official script.
2. Log in to the panel, click **Docker** in the sidebar, and follow the prompts to install the Docker service.
3. Find **MediaGo** in the app store, click **Install**, configure your domain, and you're done.
2. Log in to the panel, click **Docker** in the sidebar and finish the
Docker service setup (just follow the prompts).
3. Find **MediaGo** in the app store, click **Install**, configure your
domain, and you're done.
## Screenshots
## 📝 What's new in v3.5.0
![Home](./images/home.png)
- **🌐 Browser extension** — sniff videos on any site, send to MediaGo
in one click
- **🎬 YouTube + 1000+ sites** — powered by yt-dlp
- **🦞 OpenClaw Skill** — download videos via AI coding assistants
- **🔌 HTTP API** — integrate with scripts, automation and third-party tools
- **🎞️ In-app format conversion** — choose output format and quality
- **🐳 Simpler Docker deployment** — mount a single folder, multi-arch images on GHCR
- **⚡ Faster startup** — backend rewrite, lower memory footprint, built-in video player
![Home — dark mode](./images/home-dark.png)
## 🛠️ Built with
![Settings](./images/settings.png)
[![React](https://img.shields.io/badge/React-20232A?logo=react&logoColor=61DAFB)](https://react.dev/)
[![Electron](https://img.shields.io/badge/Electron-191970?logo=electron&logoColor=white)](https://www.electronjs.org)
[![Vite](https://img.shields.io/badge/Vite-646CFF?logo=vite&logoColor=white)](https://vitejs.dev)
[![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-06B6D4?logo=tailwindcss&logoColor=white)](https://tailwindcss.com)
[![shadcn/ui](https://img.shields.io/badge/shadcn%2Fui-000?logo=shadcnui&logoColor=white)](https://ui.shadcn.com/)
[![Go](https://img.shields.io/badge/Go-00ADD8?logo=go&logoColor=white)](https://go.dev/)
[![Ant Design](https://img.shields.io/badge/Ant_Design-0170FE?logo=antdesign&logoColor=white)](https://ant.design)
![Resource extraction](./images/browser.png)
## Changelog (v3.0.0)
- Docker deployment for the web UI
- Redesigned desktop UI
- Video playback on desktop and mobile
- Fixed blank window on macOS launch
- Improved batch download UX
- Added Windows portable build (no install required)
- Enhanced resource sniffing — detect multiple videos per page
- Import / export favorites
- Export the download list from the home page
- Improved "New download" form flow
- Open the app and add downloads via URL scheme
- Various bug fixes and UX improvements
## Tech Stack
- [React](https://react.dev/)
- [Electron](https://www.electronjs.org)
- [Koa](https://koajs.com)
- [Vite](https://vitejs.dev)
- [Ant Design](https://ant.design)
- [Tailwind CSS](https://tailwindcss.com)
- [shadcn/ui](https://ui.shadcn.com/)
- [Inversify](https://inversify.io)
## Acknowledgements
## 🙏 Acknowledgements
- [N_m3u8DL-RE](https://github.com/nilaoda/N_m3u8DL-RE)
- [BBDown](https://github.com/nilaoda/BBDown)
- [yt-dlp](https://github.com/yt-dlp/yt-dlp)
- [aria2](https://aria2.github.io/)
- [mediago-core](https://github.com/caorushizi/mediago-core)
## Disclaimer
## ⚖️ Disclaimer
> **This project is for educational and research purposes only. Do not use it for any commercial or illegal purposes.**
>
@@ -159,3 +162,9 @@ pnpm pack:server
> 3. The developers of this project are not responsible for any actions taken by users, including but not limited to downloading copyrighted content or impacting third-party platforms.
> 4. Using this project for mass scraping, disrupting platform services, or any activity that infringes upon the legitimate rights of others is strictly prohibited.
> 5. By using this project you acknowledge that you have read and agree to this disclaimer. If you do not agree, stop using the project and delete it immediately.
---
> Building from source? See [CONTRIBUTING.md](./CONTRIBUTING.md).
>
> Translating MediaGo? See [TRANSLATION.md](./TRANSLATION.md).
+87 -106
View File
@@ -7,22 +7,19 @@
<a href="https://downloader.caorushizi.cn/documents.html?form=github">文档</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/discussions">Discussions</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://discord.gg/yxWBVRWGqM">Discord</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://www.reddit.com/r/MediaGo_Studio/">Reddit</a>
<br>
<a href="https://github.com/caorushizi/mediago/blob/master/README.md">English</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.jp.md">日本語</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://github.com/caorushizi/mediago/blob/master/README.it.md">Italiano</a>
<br>
<!-- MediaGo Pro 推广 -->
<a href="https://mediago.torchstellar.com/?from=github">
<img src="https://img.shields.io/badge/✨_全新发布-MediaGo_Pro-ff6b6b?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAyTDMgN2wzIDMgNi00IDYgNCAzLTMtOS01eiIvPjxwYXRoIGQ9Ik0zIDE3bDkgNSA5LTUtMy0zLTYgNC02LTQtMyAzeiIvPjwvc3ZnPg==" alt="MediaGo Pro" />
</a>
<a href="https://mediago.torchstellar.com/?from=github">
<img src="https://img.shields.io/badge/🚀_立即体验-在线版本_无需安装-2a82f6?style=for-the-badge" alt="Try Now" />
</a>
<br>
<img alt="GitHub Downloads (all assets, all releases)" src="https://img.shields.io/github/downloads/caorushizi/mediago/total">
<img alt="GitHub Downloads (all assets, latest release)" src="https://img.shields.io/github/downloads/caorushizi/mediago/latest/total">
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/caorushizi/mediago">
@@ -37,131 +34,106 @@
<hr />
</div>
## Intro
跨平台视频下载器,内置嗅探 —— 打开网页、选一下想要的资源、保存完事。不用抓包、不用折腾浏览器插件、不用面对命令行。
本项目支持 m3u8 视频在线提取工具 流媒体下载 m3u8 下载
应用界面目前内置中文、英文和意大利语
- **✅&nbsp; 无需抓包**: 使用软件自带浏览器可以轻松嗅探网页中的视频资源,通过嗅探到的资源列表选择自己想要下载的资源,简单快速。
- **📱&nbsp; 移动播放**: 可以轻松无缝的在 PC 和移动设备之前切换,下载完成后即可使用手机观看视频。
- **⚡️&nbsp; 批量下载**: 支持同时下载多个视频和直播资源,高速带宽不闲置。
- **🎉&nbsp; 支持 docker 部署** 支持 docker 部署 web 端,方便快捷。
- **🦞&nbsp; OpenClaw Skill** 支持通过 AI 编程助手(Openclaw、Claude Code 等)用自然语言下载视频,`npx clawhub@latest install mediago` 一键安装。
## ✨ 主打功能
## Quickstart
### 🌐 浏览器扩展(Chrome / Edge
运行代码需要 node 和 pnpm,node 需要在官网下载安装,pnpm 可以通过`npm i -g pnpm`安装
浏览网页时遇到想下的视频 → 点扩展图标 → 一键发到 MediaGo。自动识别页面里的可下载资源,工具栏图标显示检测到的数量,主流视频网站(包括 YouTube、Bilibili 等)都能覆盖。扩展随桌面端安装包一起打包,在 **设置 → 更多设置 → 浏览器扩展目录** 就能找到安装文件夹
## 运行代码
### 🎬 支持 YouTube 和 1000+ 站点
底层用的是 yt-dlp。支持 YouTube、Twitter/X、Instagram、Reddit 等 [一千多个视频站点](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md)。
### 🦞 让 AI 助手帮你下载 —— OpenClaw Skill
在用 Claude Code、Cursor 等 AI 编程助手?装上 MediaGo Skill 后直接跟 AI 说"帮我下载这个视频:&lt;链接&gt;"就行,剩下的交给 AI。
```shell
# 代码下载
git clone https://github.com/caorushizi/mediago.git
# 安装依赖
pnpm install
# 首次安装需要 rebuild 一下
pnpm rebuild:workspace
# electron 开发环境
pnpm dev:electron
# electron 打包运行
pnpm release:electron
# server 开发环境
pnpm dev:server
# server 打包运行
pnpm release:server
npx clawhub@latest install mediago
```
## Releases
### 🔌 可以和其他工具联动
### v3.5.0-beta.0 (2026.4.3 发布)
MediaGo 提供一整套 HTTP 接口 —— 脚本、自动化工具、其他 App 都能直接调用 MediaGo 创建下载任务、查询进度、管理列表。浏览器扩展就是通过这套接口和桌面端对话的,你也可以接入自己的工作流。
### 软件下载
### 🎞️ 内置格式转换
- [【mediago】 windows(安装版) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-win32-x64-3.5.0-beta.0.exe)
- [【mediago】 windows(便携版) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-portable-win32-x64-3.5.0-beta.0.exe)
- [【mediago】 macos arm64apple 芯片) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-darwin-arm64-3.5.0-beta.0.dmg)
- [【mediago】 macos x64intel 芯片) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-darwin-x64-3.5.0-beta.0.dmg)
- [【mediago】 linux v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-linux-amd64-3.5.0-beta.0.deb)
- 【mediago】 docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0-beta.0`
下载完成后可以直接在 MediaGo 里转换格式、选画质,不用再打开别的软件。
### v3.0.0 (2024.10.7 发布)
### 🐳 Docker 一键部署
#### 软件下载
服务器端一条命令部署,局域网内任意设备都能打开 Web 界面:
- [【mediago】 windows(安装版) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-win32-x64-3.0.0.exe)
- [【mediago】 windows(便携版) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-portable-win32-x64-3.0.0.exe)
- [【mediago】 macos arm64apple 芯片) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-arm64-3.0.0.dmg)
- [【mediago】 macos x64intel 芯片) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-x64-3.0.0.dmg)
- [【mediago】 linux v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-linux-amd64-3.0.0.deb)
- 【mediago】 docker `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:latest`
```shell
docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0
```
### docker 宝塔面板一键部署(推荐)
在 [Docker Hub](https://hub.docker.com/r/caorushizi/mediago) 和 GHCR`ghcr.io/caorushizi/mediago`)上同步发布 —— 同一份镜像,哪个源更快用哪个。支持 Intel / AMD (amd64) 和 ARM (arm64) 两种架构。桌面版同时监听 `127.0.0.1` 和局域网 IP,同一个 Wi-Fi 下的手机、平板可以直接打开 Web 界面。
1. 安装宝塔面板,前往 [宝塔面板](https://www.bt.cn/new/download.html?r=dk_mediago) 官网,选择正式版的脚本下载安装
2. 安装后登录宝塔面板,在菜单栏中点击 `Docker`,首次进入会提示安装`Docker`服务,点击立即安装,按提示完成安装
3. 安装完成后在应用商店中找到`MediaGo`,点击安装,配置域名等基本信息即可完成安装
### 软件截图
## 📷 软件截图
![首页](./images/home.png)
### 重要更新
![首页 — 深色模式](./images/home-dark.png)
- 支持 docker 部署 web 端
- 更新桌面端 UI
### 更新日志
- 更新桌面端 UI
- 支持 docker 部署 web 端
- 新增视频播放,支持桌面端和移动端播放
- 修复 mac 打开无法展示界面的问题
- 优化了批量下载的交互
- 添加了 windows 的便携版(免安装哦)
- 优化了下载列表,支持页面中多个视频的嗅探
- 支持收藏列表手动导入导出
- 支持首页下载列表导出
- 优化了【新建下载】表单的交互逻辑
- 支持 UrlScheme 打开应用,并添加下载任务
- 修复了一些 bug 并提升用户体验
## 软件截图
![首页](./images/home.png)
![首页-dark](./images/home-dark.png)
![设置页面](./images/settings.png)
![设置](./images/settings.png)
![资源提取](./images/browser.png)
## 技术栈
## 📥 下载
- react <https://react.dev/>
- electron <https://www.electronjs.org>
- koa <https://koajs.com>
- vite <https://cn.vitejs.dev>
- antd <https://ant.design>
- tailwindcss <https://tailwindcss.com>
- shadcn <https://ui.shadcn.com/>
- inversify <https://inversify.io>
- typeorm <https://typeorm.io>
### v3.5.0(正式版)
## 鸣谢
- [Windows — 安装版](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [Windows — 便携版](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [macOS — Apple Silicon (arm64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [macOS — Intel (x64)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [Linux (deb)](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago)`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
- N_m3u8DL-RE 来自于 <https://github.com/nilaoda/N_m3u8DL-RE>
- BBDown 来自于 <https://github.com/nilaoda/BBDown>
- mediago 来自于 <https://github.com/caorushizi/mediago-core>
查看历史版本请移步 [GitHub Releases](https://github.com/caorushizi/mediago/releases)。
## 免责声明
### 🪄 宝塔面板一键部署 Docker
1. 安装宝塔面板,前往 [宝塔面板官网](https://www.bt.cn/new/download.html?r=dk_mediago) 选择正式版的脚本下载安装
2. 登录宝塔面板,在菜单栏中点击 **Docker**,首次进入会提示安装 Docker 服务,点击立即安装并按提示完成
3. 在应用商店中找到 **MediaGo**,点击安装,配置域名等基本信息即可
## 📝 v3.5.0 更新要点
- **🌐 浏览器扩展**:任意网站一键嗅探视频、一键发到 MediaGo
- **🎬 YouTube + 1000+ 站点**:集成 yt-dlp
- **🦞 OpenClaw Skill**:通过 AI 编程助手下载视频
- **🔌 开放 HTTP 接口**:接入脚本、自动化工具和其他应用
- **🎞️ 内置格式转换**:选输出格式和画质
- **🐳 Docker 部署简化**:挂载一个目录即可,多架构镜像已迁至 GHCR
- **⚡ 启动更快**:后端重写,资源占用更低,内置视频播放器
## 🛠️ 技术栈
[![React](https://img.shields.io/badge/React-20232A?logo=react&logoColor=61DAFB)](https://react.dev/)
[![Electron](https://img.shields.io/badge/Electron-191970?logo=electron&logoColor=white)](https://www.electronjs.org)
[![Vite](https://img.shields.io/badge/Vite-646CFF?logo=vite&logoColor=white)](https://vitejs.dev)
[![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
[![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-06B6D4?logo=tailwindcss&logoColor=white)](https://tailwindcss.com)
[![shadcn/ui](https://img.shields.io/badge/shadcn%2Fui-000?logo=shadcnui&logoColor=white)](https://ui.shadcn.com/)
[![Go](https://img.shields.io/badge/Go-00ADD8?logo=go&logoColor=white)](https://go.dev/)
[![Ant Design](https://img.shields.io/badge/Ant_Design-0170FE?logo=antdesign&logoColor=white)](https://ant.design)
## 🙏 鸣谢
- [N_m3u8DL-RE](https://github.com/nilaoda/N_m3u8DL-RE)
- [BBDown](https://github.com/nilaoda/BBDown)
- [yt-dlp](https://github.com/yt-dlp/yt-dlp)
- [aria2](https://aria2.github.io/)
- [mediago-core](https://github.com/caorushizi/mediago-core)
## ⚖️ 免责声明
> **本项目仅供学习和研究使用,请勿用于任何商业或非法用途。**
>
@@ -170,3 +142,12 @@ pnpm release:server
> 3. 本项目开发者不对使用者的任何行为承担责任,包括但不限于:下载受版权保护的内容、对第三方平台造成的影响等。
> 4. 禁止将本项目用于大规模抓取、破坏平台服务或任何侵犯他人合法权益的行为。
> 5. 使用本项目即表示您已阅读并同意本免责声明。如不同意,请立即停止使用并删除本项目。
---
> 想从源码构建?见 [CONTRIBUTING.md](./CONTRIBUTING.md)(英文)。
>
> 想为 MediaGo 做翻译?见 [TRANSLATION.md](./TRANSLATION.md)(英文)。
尾注: 感谢[吾爱破解论坛](https://www.52pojie.cn/)
lp_Zain@www.52pojie.cn
+185
View File
@@ -0,0 +1,185 @@
# Contributing translations
Thanks for helping translate MediaGo! This guide walks you through adding a
new language from scratch, with a live-preview workflow so you can iterate
without rebuilding the app.
## TL;DR
```shell
git clone https://github.com/caorushizi/mediago.git
cd mediago
pnpm install
pnpm deps:download
pnpm dev:electron
```
1. Copy `packages/shared/common/src/i18n/resources/en.ts` to `<lang>.ts`,
translate every value.
2. Register the new locale in the shared resources, resolver, UI dropdown,
and browser extension (see below).
3. Open **Settings → Language**, pick your locale, and iterate. Vite HMR
reflects edits in the running app within a second.
4. Open a PR — we review and merge.
## Where strings live
- **Main app UI** (desktop + self-hosted web):
`packages/shared/common/src/i18n/resources/{en,it,zh}.ts`
- **Browser extension** (separate, smaller catalog):
`packages/mediago-extension/src/i18n/resources/{en,it,zh}.ts`
Resources are plain TypeScript modules — each file exports a flat object of
`key: "translation"` pairs. Keys are shared across languages; only values
change.
## Adding a new language end-to-end
Example: French (`fr`). Adjust the code to whichever language you're adding.
### 1. Create the resource file
Copy `en.ts` to `fr.ts` in the same directory and translate every **value**.
Leave all keys untouched:
```ts
// packages/shared/common/src/i18n/resources/fr.ts
export const fr = {
// ...translated values...
followSystem: "Système",
chinese: "中文",
english: "English",
french: "Français", // add your language's own name
displayLanguage: "Langue",
// ...
} as const;
```
Don't forget to add the new `french: "Français"` key to **every** resource
file (`en.ts`, `it.ts`, `zh.ts`, and your new `fr.ts`) so the Settings
dropdown can render it in each language.
### 2. Register the resource
Core app registration:
**`packages/shared/common/src/i18n/resources/index.ts`** — import the new
locale and add it to both exports:
```ts
import { fr } from "./fr";
// ...
export const i18nResources = { en, it, zh, fr } as const;
export const SUPPORTED_LANGUAGES = ["en", "it", "zh", "fr"] as const;
export { en, it, zh, fr };
```
**`packages/shared/common/src/i18n/config.ts`** — widen the
`resolveAppLanguage` return type and the check inside:
```ts
export type ResolvedAppLanguage = "zh" | "en" | "it" | "fr";
export function resolveAppLanguage(
language: string | undefined,
systemLocale: string | undefined,
): ResolvedAppLanguage {
if (
language === "zh" ||
language === "en" ||
language === "it" ||
language === "fr"
) {
return language;
}
// ...existing fallback...
}
```
If the new locale should follow the OS/browser locale automatically, add the
matching `systemLocale` prefix check in the same function.
**`packages/shared/common/src/types/index.ts`** — extend the `AppLanguage`
enum:
```ts
export enum AppLanguage {
System = "system",
ZH = "zh",
EN = "en",
FR = "fr",
}
```
**`apps/ui/src/App.tsx`** — if Ant Design ships a locale for your language,
import it and include it in `getAntdLocale`. Otherwise, explicitly fall back
to `enUS` for Ant Design components while your app strings still use your
translated resource file.
### 3. Add the Settings dropdown option
**`apps/ui/src/pages/setting-page/index.tsx`** — inside the **Language**
`<Select>`, add one line:
```tsx
options={[
{ label: t("followSystem"), value: AppLanguage.System },
{ label: t("chinese"), value: AppLanguage.ZH },
{ label: t("english"), value: AppLanguage.EN },
{ label: t("french"), value: AppLanguage.FR }, // new
]}
```
### 4. (Optional) Translate the browser extension
Same pattern, under `packages/mediago-extension/src/i18n/resources/`. It's a
much smaller catalog and lives in its own `index.ts`. Also update:
- `packages/mediago-extension/src/i18n/index.ts` for language resolution.
- `packages/mediago-extension/src/shared/types.ts` for the persisted language
union.
- `packages/mediago-extension/src/options/components/LanguageCard.tsx` for
the options-page selector.
- `packages/mediago-extension/public/_locales/<lang>/messages.json` for the
Chrome extension name, description, and action tooltip.
## Live preview workflow
The dev server uses **Vite HMR** — edits to any resource file are reflected
in the running app almost instantly, no restart required.
```shell
pnpm install
pnpm deps:download # fetch ffmpeg / BBDown (first clone only)
pnpm dev:electron # starts Electron with HMR
```
Once the window is up, open **Settings → Language** and switch to your new
locale. Then edit `fr.ts` in your editor — save, and the UI updates live.
Use this to catch overflowing strings, awkward wrapping, and untranslated
values before opening the PR.
## Submitting the PR
- **Branch**: `i18n/add-<lang>` — e.g. `i18n/add-fr`.
- **Commit**: follow [Conventional Commits](https://www.conventionalcommits.org/),
e.g. `feat(i18n): add French translation`.
- In the PR description, please include:
- A screenshot of **Settings → Language** with your new locale selected.
- A screenshot of at least one main screen (e.g. the download list) in
the new language.
- Confirmation that `pnpm check` passes locally.
## Tips
- **Keep placeholders intact.** Tokens like `{{count}}` or `{name}` are
interpolated at runtime — copy them verbatim into your translation.
- **Natural phrasing beats literal translation.** The English source is a
guide, not a cage. Idiomatic phrasing in your language is always better.
- **Unsure how a string is used?** Grep the key across the repo (e.g.
`rg '"displayLanguage"'`) — you'll find the component that renders it,
which gives you the UI context.
Questions? Comment on [issue #638](https://github.com/caorushizi/mediago/issues/638)
or open a new discussion. Thanks for contributing! 🌍
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "mediago",
"name": "mediago-community",
"version": "3.5.0",
"description": "A powerful and easy-to-use online video downloader",
"main": "main/index.js",
+56
View File
@@ -0,0 +1,56 @@
; ============================================================================
; Custom NSIS overrides injected by electron-builder.
;
; electron-builder splices `!insertmacro customHeader` into the top of its
; generated installer script (see
; node_modules/app-builder-lib/templates/nsis/installer.nsi around line 45),
; which is AFTER `common.nsh` is included. That makes this macro the right
; place to override directives like `Name`, `Caption`, `BrandingText`.
;
; Note on FileDescription: we intentionally do NOT override it here.
; electron-builder's `NsisTarget.computeVersionKey()` (app-builder-lib ->
; out/targets/nsis/NsisTarget.js) unconditionally emits
; VIAddVersionKey /LANG=1033 "FileDescription" "${appInfo.description}"
; from `apps/electron/app/package.json`'s `description`. Any customHeader
; VIAddVersionKey targeting the same LANG+key triggers a hard NSIS error
; ("already defined!") that `-WX` does not gate. Different LANG (e.g. 0)
; produces a `warning 9100: without standard key FileVersion` which IS
; gated by -WX and still fails the build.
;
; The installer's FileDescription is rewritten post-build via `app-builder
; rcedit` in `afterAllArtifactBuild` (see apps/electron/scripts/build.ts).
; That sidesteps the NSIS constraint and lets the installer and app
; binary carry distinct descriptions (like VS Code / Chrome's Inno Setup
; default of "{AppName} Setup").
;
; Wired up through `nsis.include` in apps/electron/scripts/build.ts.
; ============================================================================
!macro customHeader
; ---------------------------------------------------------------------
; Surface the version in the installer's title bar.
;
; electron-builder's common.nsh sets `Name "${PRODUCT_NAME}"`, from
; which NSIS derives the default `$(^SetupCaption)` (e.g. "Setup -
; mediago-community"). That caption omits the version — users had to
; look at the gray BrandingText at the bottom-left to see which
; release they were installing.
;
; Why `Caption` and not `Name`: re-setting `Name` emits
; `warning 6029: Name: specified multiple times`, and electron-builder
; compiles NSIS with `-WX` (warnings-as-errors), so the build fails.
;
; Why a plain literal and not `$(^SetupCaption)`: the localized lang
; string is evaluated at runtime via the MUI plugin. electron-builder
; compiles an intermediate installer with `-DBUILD_UNINSTALLER` and
; executes it silently (NsisTarget.js line ~370, `execWine(installerPath,
; ..., __COMPAT_LAYER=RunAsInvoker)`) just to extract the uninstaller.
; Evaluating a language string in the `Caption` directive during that
; silent pass crashes with STATUS_STACK_BUFFER_OVERRUN (exit 3221225725)
; and aborts the whole packaging. A plain literal sidesteps the MUI
; runtime call entirely, so the intermediate pass finishes cleanly.
; Trade-off: title bar reads "Setup - mediago-community 3.5.0" in every
; locale instead of the translated "Installazione di ..." — acceptable.
; ---------------------------------------------------------------------
Caption "Setup - ${PRODUCT_NAME} ${VERSION}"
!macroend
+65
View File
@@ -1,7 +1,10 @@
import { execFile } from "node:child_process";
import fs from "node:fs/promises";
import { createRequire } from "node:module";
import os from "node:os";
import path, { dirname } from "node:path";
import { fileURLToPath } from "node:url";
import { promisify } from "node:util";
import dotenvFlow from "dotenv-flow";
import { type Configuration, build } from "electron-builder";
@@ -14,6 +17,22 @@ const projectRoot = path.resolve(__dirname, "../../..");
const appRoot = path.resolve(__dirname, "..");
const arch = process.arch === "arm64" ? "arm64" : "x64";
// Resolve electron-builder's bundled `app-builder` native helper
// (wraps rcedit, ships inside `app-builder-bin`). We use it from
// `afterAllArtifactBuild` below to rewrite the NSIS installer's
// FileDescription — see the hook for why. `app-builder-bin` is
// a transitive dep of electron-builder, not a direct one, so we
// resolve it via nested `createRequire` scoped to electron-builder's
// own location.
const execFileAsync = promisify(execFile);
const localRequire = createRequire(import.meta.url);
const electronBuilderRequire = createRequire(
localRequire.resolve("electron-builder/package.json"),
);
const { appBuilderPath } = electronBuilderRequire("app-builder-bin") as {
appBuilderPath: string;
};
dotenvFlow.config({
path: projectRoot,
});
@@ -156,6 +175,52 @@ function getReleaseConfig(): Configuration {
allowToChangeInstallationDirectory: true,
createDesktopShortcut: true,
createStartMenuShortcut: true,
// Inject our customHeader macro to add the version to the
// installer title bar. See comments in
// `apps/electron/installer/installer.nsh`.
include: "./installer/installer.nsh",
},
// Rewrite the NSIS installer's `FileDescription` after the fact.
//
// Why this isn't done in the .nsh header: electron-builder's
// `NsisTarget.computeVersionKey()` unconditionally emits
// VIAddVersionKey /LANG=1033 "FileDescription" "${appInfo.description}"
// into the generated .nsi — binding the installer's FileDescription
// to the app binary's (both drawn from `app/package.json:description`).
// Any customHeader `VIAddVersionKey` with the same LANG+key triggers
// a hard NSIS "already defined!" error that `-WX` does not gate, and
// a different LANG (e.g. 0) triggers `warning 9100: without standard
// key FileVersion` which IS gated by `-WX`. There is no in-NSIS way
// to override this cleanly.
//
// Inno Setup (used by VS Code, Chrome) gets this for free via a
// default `VersionInfoDescription = "{AppName} Setup"`. NSIS has no
// such default, so we post-process the artifact with the same
// `app-builder rcedit` call electron-builder itself uses on
// `mediago.exe` (see winPackager.js around line 185).
afterAllArtifactBuild: async ({ artifactPaths }) => {
// rcedit crashes when executed through Wine (per electron-builder's
// own note in winPackager.js:183); skip on Linux. Windows installer
// artifacts aren't produced on Linux builds anyway.
if (process.platform !== "win32" && process.platform !== "darwin") {
return [];
}
const installers = artifactPaths.filter((p) =>
/-setup-win32-.*\.exe$/i.test(path.basename(p)),
);
for (const installer of installers) {
await execFileAsync(appBuilderPath, [
"rcedit",
"--args",
JSON.stringify([
installer,
"--set-version-string",
"FileDescription",
`${process.env.APP_NAME} installer`,
]),
]);
}
return [];
},
};
}
+12 -5
View File
@@ -1,10 +1,17 @@
import i18n, { type InitOptions, type Resource } from "i18next";
import { BASE_I18N_OPTIONS, i18nResources } from "@mediago/shared-common";
import {
BASE_I18N_OPTIONS,
i18nResources,
SUPPORTED_LANGUAGES,
} from "@mediago/shared-common";
const nodeResources: Resource = {
en: { translation: i18nResources.en },
zh: { translation: i18nResources.zh },
};
const nodeResources: Resource = SUPPORTED_LANGUAGES.reduce<Resource>(
(resources, language) => {
resources[language] = { translation: i18nResources[language] };
return resources;
},
{},
);
const nodeI18nOptions: InitOptions = {
...BASE_I18N_OPTIONS,
+18 -2
View File
@@ -2,9 +2,11 @@ import { App as AntdApp, ConfigProvider, theme as antdTheme } from "antd";
import { type FC, lazy, Suspense, useEffect, useState } from "react";
import { Route, Routes } from "react-router-dom";
import "dayjs/locale/zh-cn";
import "dayjs/locale/it";
import { useAsyncEffect, useMemoizedFn } from "ahooks";
import zhCN from "antd/es/locale/zh_CN";
import enUS from "antd/es/locale/en_US";
import itIT from "antd/es/locale/it_IT";
import { useShallow } from "zustand/react/shallow";
import Loading from "./components/loading";
import { PAGE_LOAD } from "./const";
@@ -26,7 +28,7 @@ import { getConfig } from "./api/config";
import { initGoEvents, onConfigChanged } from "./api/events";
import { DownloadFilter } from "@mediago/shared-common";
import { useAuth } from "./hooks/use-auth";
import { Locale } from "antd/es/locale";
import type { Locale } from "antd/es/locale";
const AppLayout = lazy(() => import("./layout/app-layout"));
const HomePage = lazy(() => import("./pages/home-page"));
@@ -42,6 +44,20 @@ function getAlgorithm(appTheme: "dark" | "light") {
: antdTheme.defaultAlgorithm;
}
function getAntdLocale(
language: ReturnType<typeof resolveAppLanguage>,
): Locale {
switch (language) {
case "zh":
return zhCN;
case "it":
return itIT;
case "en":
default:
return enUS;
}
}
const App: FC = () => {
useAuth();
const { on, off } = usePlatform();
@@ -56,7 +72,7 @@ const App: FC = () => {
const [adapterReady, setAdapterReady] = useState(false);
useEffect(() => {
setAppLocale(resolveAppLanguage(language) === "zh" ? zhCN : enUS);
setAppLocale(getAntdLocale(resolveAppLanguage(language)));
}, [language]);
const themeChange = useMemoizedFn((event: MediaQueryListEvent) => {
+1
View File
@@ -250,6 +250,7 @@ const SettingPage: React.FC = () => {
{ label: t("followSystem"), value: AppLanguage.System },
{ label: t("chinese"), value: AppLanguage.ZH },
{ label: t("english"), value: AppLanguage.EN },
{ label: t("italian"), value: AppLanguage.IT },
]}
placeholder={t("pleaseSelectLanguage")}
allowClear={false}
+3 -1
View File
@@ -111,6 +111,8 @@ export function getBrowserLang(): string {
return lang.toLowerCase();
}
export function resolveAppLanguage(language: string | undefined): "zh" | "en" {
export function resolveAppLanguage(
language: string | undefined,
): ReturnType<typeof sharedResolveAppLanguage> {
return sharedResolveAppLanguage(language, getBrowserLang());
}
+371 -44
View File
@@ -4,6 +4,7 @@ import { defineConfig, type HeadConfig } from "vitepress";
import { baiduAnalytics, googleAnalytics } from "./plugins";
const isDev = process.env.NODE_ENV === "development";
const siteUrl = "https://downloader.caorushizi.cn";
const head: HeadConfig[] = [
["link", { rel: "shortcut icon", href: "/favicon.svg" }],
@@ -12,12 +13,243 @@ if (!isDev) {
head.push(...baiduAnalytics(), ...googleAnalytics());
}
const translatedBlogAlternates: Record<string, Record<string, string>> = {
"blog/video-downloader-review/index": {
"zh-CN": `${siteUrl}/blog/video-downloader-review/`,
en: `${siteUrl}/en/blog/video-downloader-review/`,
"x-default": `${siteUrl}/blog/video-downloader-review/`,
},
"en/blog/video-downloader-review/index": {
"zh-CN": `${siteUrl}/blog/video-downloader-review/`,
en: `${siteUrl}/en/blog/video-downloader-review/`,
"x-default": `${siteUrl}/blog/video-downloader-review/`,
},
};
function getPageUrl(page: string) {
const normalized = page.replace(/\.md$/, "");
if (normalized === "index") {
return `${siteUrl}/`;
}
if (normalized.endsWith("/index")) {
return `${siteUrl}/${normalized.slice(0, -"/index".length)}/`;
}
return `${siteUrl}/${normalized}.html`;
}
function getPageLanguage(page: string) {
if (page.startsWith("en/")) {
return "en";
}
if (page.startsWith("jp/")) {
return "ja";
}
if (page.startsWith("it/")) {
return "it";
}
return "zh-CN";
}
function isBlogPagePath(page: string) {
return page.startsWith("blog/") || /^[a-z]{2}\/blog\//.test(page);
}
function isBlogIndexPage(page: string) {
return page === "blog/index.md" || /^[a-z]{2}\/blog\/index\.md$/.test(page);
}
function getAbsoluteUrl(url: string) {
if (/^https?:\/\//.test(url)) {
return url;
}
return `${siteUrl}${url.startsWith("/") ? "" : "/"}${url}`;
}
function getStringArray(value: unknown) {
if (Array.isArray(value)) {
return value.map(String);
}
if (typeof value === "string") {
return value
.split(",")
.map((item) => item.trim())
.filter(Boolean);
}
return [];
}
function getBreadcrumbItems(
pageUrl: string,
pageTitle: string,
isBlogPage: boolean,
language: string,
) {
const isEnglish = language === "en";
const localePrefix = isEnglish ? "/en" : "";
const items = [
{
"@type": "ListItem",
position: 1,
name: isEnglish ? "Home" : "首页",
item: `${siteUrl}${localePrefix}/`,
},
];
if (isBlogPage) {
items.push({
"@type": "ListItem",
position: 2,
name: isEnglish ? "Blog" : "博客",
item: `${siteUrl}${localePrefix}/blog/`,
});
if (pageUrl !== `${siteUrl}${localePrefix}/blog/`) {
items.push({
"@type": "ListItem",
position: 3,
name: pageTitle,
item: pageUrl,
});
}
}
return items;
}
// https://vitepress.dev/reference/site-config
export default defineConfig({
title: "MediaGo",
description: "简单易用,快速下载",
lastUpdated: true,
head,
sitemap: {
hostname: siteUrl,
},
transformHead({ page, pageData, title, description }) {
const normalizedPage = page.replace(/\.md$/, "");
const pageUrl = getPageUrl(page);
const frontmatter = pageData.frontmatter;
const language = getPageLanguage(page);
const isBlogPage = isBlogPagePath(page);
const pageTitle = String(frontmatter.title || title || "MediaGo");
const pageDescription = String(
frontmatter.description || description || "简单易用,快速下载",
);
const pageTags = getStringArray(frontmatter.tags);
const pageImage =
typeof frontmatter.image === "string"
? getAbsoluteUrl(frontmatter.image)
: undefined;
const entries: HeadConfig[] = [
["link", { rel: "canonical", href: pageUrl }],
["meta", { property: "og:url", content: pageUrl }],
["meta", { property: "og:title", content: pageTitle }],
["meta", { property: "og:description", content: pageDescription }],
["meta", { property: "og:site_name", content: "MediaGo" }],
[
"meta",
{ property: "og:type", content: isBlogPage ? "article" : "website" },
],
["meta", { name: "twitter:card", content: "summary_large_image" }],
["meta", { name: "twitter:title", content: pageTitle }],
["meta", { name: "twitter:description", content: pageDescription }],
[
"script",
{ type: "application/ld+json" },
JSON.stringify({
"@context": "https://schema.org",
"@type": "BreadcrumbList",
itemListElement: getBreadcrumbItems(
pageUrl,
pageTitle,
isBlogPage,
language,
),
}),
],
];
const alternates = translatedBlogAlternates[normalizedPage];
if (alternates) {
for (const [hreflang, href] of Object.entries(alternates)) {
entries.push(["link", { rel: "alternate", hreflang, href }]);
}
}
if (pageTags.length > 0) {
entries.push(["meta", { name: "keywords", content: pageTags.join(",") }]);
}
if (pageImage) {
entries.push(
["meta", { property: "og:image", content: pageImage }],
["meta", { name: "twitter:image", content: pageImage }],
);
}
if (isBlogPage && !isBlogIndexPage(page)) {
const article: Record<string, unknown> = {
"@context": "https://schema.org",
"@type": "BlogPosting",
headline: pageTitle,
description: pageDescription,
author: {
"@type": "Organization",
name: String(frontmatter.author || "MediaGo"),
url: siteUrl,
},
publisher: {
"@type": "Organization",
name: "MediaGo",
url: siteUrl,
},
datePublished: frontmatter.date,
dateModified: frontmatter.updated || frontmatter.date,
mainEntityOfPage: pageUrl,
inLanguage: language,
};
if (pageTags.length > 0) {
article.keywords = pageTags;
}
if (pageImage) {
article.image = [pageImage];
}
entries.push([
"script",
{ type: "application/ld+json" },
JSON.stringify(article),
]);
if (frontmatter.date) {
entries.push([
"meta",
{
property: "article:published_time",
content: String(frontmatter.date),
},
]);
}
if (frontmatter.updated || frontmatter.date) {
entries.push([
"meta",
{
property: "article:modified_time",
content: String(frontmatter.updated || frontmatter.date),
},
]);
}
for (const tag of pageTags) {
entries.push(["meta", { property: "article:tag", content: tag }]);
}
}
return entries;
},
themeConfig: {
nav: [
{ text: "Home", link: "/" },
@@ -25,29 +257,57 @@ export default defineConfig({
{ text: "更新日志", link: "/changelog" },
],
sidebar: [
{
text: "开始",
items: [
{ text: "快速开始", link: "/guides" },
{ text: "使用说明", link: "/documents" },
{ text: "更新日志", link: "/changelog" },
{ text: "通过宝塔面板部署", link: "/bt-install" },
{ text: "浏览器扩展", link: "/extension" },
{ text: "配合猫爪下载视频", link: "/catcatch" },
{ text: "🦞 OpenClaw Skill", link: "/skills" },
],
},
{
text: "Q&A",
items: [
{ text: "常见问题", link: "/qa" },
{ text: "windows7支持(64位)", link: "/history" },
{ text: "意见收集", link: "/proposal" },
{ text: "支持列表", link: "/list" },
],
},
],
sidebar: {
"/blog/": [
{
text: "博客",
items: [
{ text: "博客首页", link: "/blog/" },
{
text: "视频下载器推荐",
link: "/blog/video-downloader-recommendation/",
},
{ text: "视频下载器评测", link: "/blog/video-downloader-review/" },
{ text: "网页视频下载指南", link: "/blog/video-download/" },
{ text: "M3U8 / HLS 下载指南", link: "/blog/m3u8-hls-download/" },
{ text: "网页视频嗅探指南", link: "/blog/video-sniffer/" },
],
},
{
text: "产品文档",
items: [
{ text: "快速开始", link: "/guides" },
{ text: "使用说明", link: "/documents" },
{ text: "浏览器扩展", link: "/extension" },
{ text: "下载接口", link: "/api" },
],
},
],
"/": [
{
text: "开始",
items: [
{ text: "快速开始", link: "/guides" },
{ text: "使用说明", link: "/documents" },
{ text: "下载接口", link: "/api" },
{ text: "更新日志", link: "/changelog" },
{ text: "通过宝塔面板部署", link: "/bt-install" },
{ text: "浏览器扩展", link: "/extension" },
{ text: "配合猫爪下载视频", link: "/catcatch" },
{ text: "🦞 OpenClaw Skill", link: "/skills" },
],
},
{
text: "Q&A",
items: [
{ text: "常见问题", link: "/qa" },
{ text: "windows7支持(64位)", link: "/history" },
{ text: "意见收集", link: "/proposal" },
{ text: "支持列表", link: "/list" },
],
},
],
},
socialLinks: [
{ icon: "github", link: "https://github.com/caorushizi/m3u8-downloader" },
@@ -66,30 +326,55 @@ export default defineConfig({
nav: [
{ text: "Home", link: "/en" },
{ text: "Guides", link: "/en/guides" },
{ text: "Blog", link: "/en/blog/" },
{ text: "Changelog", link: "/en/changelog" },
],
sidebar: [
{
text: "Quick start",
items: [
{ text: "Quick start", link: "/en/guides" },
{ text: "Baota Panel", link: "/en/bt-install" },
{ text: "Documents", link: "/en/documents" },
{ text: "Changelog", link: "/en/changelog" },
{ text: "Browser extension", link: "/en/extension" },
{ text: "🦞 OpenClaw Skill", link: "/en/skills" },
],
},
{
text: "Q&A",
items: [
{ text: "History", link: "/en/history" },
{ text: "Proposal", link: "/en/proposal" },
{ text: "Support list", link: "/en/list" },
],
},
],
sidebar: {
"/en/blog/": [
{
text: "Blog",
items: [
{ text: "Blog Home", link: "/en/blog/" },
{
text: "Video Downloader Review",
link: "/en/blog/video-downloader-review/",
},
],
},
{
text: "Product Docs",
items: [
{ text: "Quick Start", link: "/en/guides" },
{ text: "User Guide", link: "/en/documents" },
{ text: "Browser Extension", link: "/en/extension" },
{ text: "Download API", link: "/en/api" },
],
},
],
"/en/": [
{
text: "Quick start",
items: [
{ text: "Quick start", link: "/en/guides" },
{ text: "Baota Panel", link: "/en/bt-install" },
{ text: "Documents", link: "/en/documents" },
{ text: "Download API", link: "/en/api" },
{ text: "Changelog", link: "/en/changelog" },
{ text: "Browser extension", link: "/en/extension" },
{ text: "🦞 OpenClaw Skill", link: "/en/skills" },
],
},
{
text: "Q&A",
items: [
{ text: "History", link: "/en/history" },
{ text: "Proposal", link: "/en/proposal" },
{ text: "Support list", link: "/en/list" },
],
},
],
},
socialLinks: [
{
@@ -116,6 +401,7 @@ export default defineConfig({
{ text: "早く始めます", link: "/jp/guides" },
{ text: "塔のパネル配置です", link: "/jp/bt-install" },
{ text: "使用説明書です", link: "/jp/documents" },
{ text: "ダウンロード API", link: "/jp/api" },
{ text: "ログを更新します。", link: "/jp/changelog" },
{ text: "ブラウザ拡張機能", link: "/jp/extension" },
{ text: "🦞 OpenClaw Skill", link: "/jp/skills" },
@@ -131,6 +417,47 @@ export default defineConfig({
},
],
socialLinks: [
{
icon: "github",
link: "https://github.com/caorushizi/mediago",
},
],
},
},
it: {
label: "Italiano",
lang: "it",
themeConfig: {
nav: [
{ text: "Home", link: "/it" },
{ text: "Guide", link: "/it/guides" },
{ text: "Changelog", link: "/it/changelog" },
],
sidebar: [
{
text: "Avvio rapido",
items: [
{ text: "Avvio rapido", link: "/it/guides" },
{ text: "BT Panel", link: "/it/bt-install" },
{ text: "Guida utente", link: "/it/documents" },
{ text: "API di download", link: "/it/api" },
{ text: "Changelog", link: "/it/changelog" },
{ text: "Estensione browser", link: "/it/extension" },
{ text: "🦞 OpenClaw Skill", link: "/it/skills" },
],
},
{
text: "Q&A",
items: [
{ text: "Versioni precedenti", link: "/it/history" },
{ text: "Feedback", link: "/it/proposal" },
{ text: "Siti supportati", link: "/it/list" },
],
},
],
socialLinks: [
{
icon: "github",
+55 -14
View File
@@ -1,21 +1,61 @@
<script setup lang="ts">
import DefaultTheme from "vitepress/theme";
import { useData, inBrowser } from "vitepress";
import { watchEffect } from "vue";
import { useData, inBrowser, useRoute } from "vitepress";
import { computed, watchEffect } from "vue";
import Comments from "./components/Comments.vue";
import Footer from "./components/Footer.vue";
import QrCode from "./components/QrCode.vue";
import TopBanner from "./components/TopBanner.vue";
import { useI18n } from "vue-i18n";
import AdBanner from "./components/AdBanner.vue";
const { lang } = useData();
const route = useRoute();
const { locale } = useI18n();
const translatedBlogPaths = new Set([
"/blog/video-downloader-review/",
"/en/blog/video-downloader-review/",
]);
const translatedBlogLinks: Record<
string,
{ href: string; label: string; note: string }
> = {
"/blog/video-downloader-review/": {
href: "/en/blog/video-downloader-review/",
label: "English",
note: "这篇文章已有英文版",
},
"/en/blog/video-downloader-review/": {
href: "/blog/video-downloader-review/",
label: "简体中文",
note: "This article is also available in Chinese",
},
};
function normalizeRoutePath(path: string) {
return path.replace(/index\.html$/, "").replace(/\.html$/, "/");
}
const normalizedPath = computed(() => normalizeRoutePath(route.path));
const blogTranslationLink = computed(
() => translatedBlogLinks[normalizedPath.value],
);
watchEffect(() => {
locale.value = lang.value;
if (inBrowser) {
locale.value = lang.value;
const isBlogPage =
normalizedPath.value.startsWith("/blog/") ||
normalizedPath.value.startsWith("/en/blog/") ||
normalizedPath.value.startsWith("/jp/blog/") ||
normalizedPath.value.startsWith("/it/blog/");
document.cookie = `nf_lang=${lang.value}; expires=Mon, 1 Jan 2030 00:00:00 UTC; path=/`;
document.documentElement.classList.toggle("is-blog-page", isBlogPage);
document.documentElement.classList.toggle(
"has-blog-translation",
translatedBlogPaths.has(normalizedPath.value),
);
}
});
@@ -24,14 +64,15 @@ const { Layout } = DefaultTheme;
<template>
<Layout>
<template #layout-top>
<TopBanner />
</template>
<!-- <template #sidebar-nav-before>
<AdBanner />
</template> -->
<template #doc-footer-before>
<QrCode />
<template #doc-before>
<div
v-if="blogTranslationLink"
class="blog-language-switch"
aria-label="Article language switch"
>
<span>{{ blogTranslationLink.note }}</span>
<a :href="blogTranslationLink.href">{{ blogTranslationLink.label }}</a>
</div>
</template>
<template #doc-after>
<Comments />
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 MiB

@@ -1,14 +0,0 @@
<template>
<div class="ad-container">
<img src="/images/ad.png" alt="ad" />
</div>
</template>
<script setup lang="ts"></script>
<style scoped>
.ad-container {
width: 100%;
padding: 0;
}
</style>
+2 -32
View File
@@ -17,18 +17,7 @@
<div class="text-sm text-[var(--vp-c-text-2)]">{{ t("slogan") }}</div>
</div>
<!-- 右侧区域 -->
<div class="flex flex-col md:flex-row gap-8 md:gap-12">
<!-- 二维码部分 -->
<div class="px-3 flex-shrink-0 mt-8 md:mt-0">
<!-- <div class="font-semibold mb-2 text-[var(--vp-c-text-1)]">{{ t('contact') }}</div> -->
<img
src="../assets/wx.png"
alt="WeChat QR Code"
class="w-[280px] object-contain"
/>
</div>
<!-- 帮助链接部分 -->
<div class="px-3 text-sm flex-shrink-0 min-w-[150px] mt-8 md:mt-0">
<div class="font-semibold mb-2 text-[var(--vp-c-text-1)]">
@@ -37,29 +26,10 @@
<ul class="list-none m-0 p-0">
<li class="mb-1">
<a
target="_blank"
href="https://mediago.pro/"
href="/blog/"
class="text-[var(--vp-c-text-2)] no-underline transition-colors hover:text-[var(--vp-c-text-1)] duration-300"
>
{{ t("search") }}
</a>
</li>
</ul>
</div>
<!-- 友情链接部分 -->
<div class="px-3 text-sm flex-shrink-0 min-w-[150px] mt-8 md:mt-0">
<div class="font-semibold mb-2 text-[var(--vp-c-text-1)]">
{{ t("links") }}
</div>
<ul class="list-none m-0 p-0">
<li class="mb-1">
<a
href="https://www.jiexi.im/player/"
class="text-[var(--vp-c-text-2)] no-underline transition-colors hover:text-[var(--vp-c-text-1)] duration-300"
target="_blank"
>
{{ t("jiexi.im") }}
{{ t("blog") }}
</a>
</li>
</ul>
@@ -1,12 +0,0 @@
<template>
<div class="mt-12 py-6 text-center border-t border-[var(--vp-c-divider)]">
<img
src="../assets/wx.png"
alt="WeChat QR Code"
class="w-[300px] object-contain mx-auto"
/>
<p class="mt-3 text-sm text-[var(--vp-c-text-2)]">
扫码关注获取更多精彩内容
</p>
</div>
</template>
@@ -1,245 +0,0 @@
<script setup lang="ts">
import { ref } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const isVisible = ref(true);
const closeBanner = () => {
isVisible.value = false;
};
</script>
<template>
<div v-if="isVisible" class="top-banner">
<div class="banner-content">
<div class="banner-left">
<span class="banner-badge">{{ t("banner.new") }}</span>
<span class="banner-text">
<span class="banner-highlight">{{ t("banner.title") }}</span>
{{ t("banner.desc") }}
</span>
</div>
<div class="banner-right">
<a
href="https://mediago.torchstellar.com/?from=banner"
target="_blank"
class="banner-button"
>
{{ t("banner.action") }}
<svg
class="banner-icon"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path d="M5 12h14M12 5l7 7-7 7" />
</svg>
</a>
<button
class="banner-close"
@click="closeBanner"
:aria-label="t('banner.close')"
>
<svg
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<path d="M18 6L6 18M6 6l12 12" />
</svg>
</button>
</div>
</div>
<div class="banner-shimmer"></div>
</div>
</template>
<style scoped>
.top-banner {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
width: 100%;
height: var(--vp-layout-top-height, 60px);
background: linear-gradient(135deg, #5e9ef3 0%, #2a82f6 50%, #1a6dd6 100%);
padding: 16px 20px;
overflow: hidden;
box-sizing: border-box;
display: flex;
align-items: center;
}
.banner-content {
display: flex;
align-items: center;
justify-content: space-between;
flex: 1;
padding: 0 36px;
position: relative;
z-index: 2;
}
.banner-left {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
.banner-badge {
background: rgba(255, 255, 255, 0.25);
backdrop-filter: blur(10px);
color: #fff;
font-size: 12px;
font-weight: 700;
padding: 4px 10px;
border-radius: 20px;
text-transform: uppercase;
letter-spacing: 0.5px;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%,
100% {
transform: scale(1);
box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.4);
}
50% {
transform: scale(1.05);
box-shadow: 0 0 20px 5px rgba(255, 255, 255, 0.2);
}
}
.banner-text {
color: rgba(255, 255, 255, 0.95);
font-size: 14px;
font-weight: 500;
}
.banner-highlight {
color: #fff;
font-weight: 700;
}
.banner-right {
display: flex;
align-items: center;
gap: 16px;
}
.banner-button {
display: inline-flex;
align-items: center;
gap: 6px;
background: rgba(255, 255, 255, 0.95);
color: #2a82f6;
font-size: 13px;
font-weight: 600;
padding: 8px 18px;
border-radius: 25px;
text-decoration: none;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15);
}
.banner-button:hover {
background: #fff;
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
}
.banner-button:hover .banner-icon {
transform: translateX(3px);
}
.banner-icon {
width: 16px;
height: 16px;
transition: transform 0.3s ease;
}
.banner-close {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.15);
border: none;
border-radius: 50%;
cursor: pointer;
transition: all 0.2s ease;
}
.banner-close:hover {
background: rgba(255, 255, 255, 0.3);
}
.banner-close svg {
width: 14px;
height: 14px;
color: rgba(255, 255, 255, 0.9);
}
.banner-shimmer {
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.15),
transparent
);
animation: shimmer 3s infinite;
}
@keyframes shimmer {
0% {
left: -100%;
}
100% {
left: 100%;
}
}
/* Mobile responsiveness */
@media (max-width: 768px) {
.top-banner {
padding: 10px 16px;
}
.banner-content {
flex-direction: column;
gap: 8px;
text-align: center;
}
.banner-left {
justify-content: center;
}
.banner-text {
font-size: 13px;
}
.banner-button {
font-size: 12px;
padding: 6px 14px;
}
.banner-close {
position: absolute;
top: 10px;
right: 10px;
}
}
</style>
+3 -30
View File
@@ -13,49 +13,22 @@ const i18n = createI18n({
slogan: "Easy to use, fast download",
articles: "Articles",
help: "Help",
search: "intelligent search",
blog: "Blog",
privacy: "Privacy Policy",
links: "Links",
"jiexi.im": "Smart Video Analysis",
banner: {
new: "NEW",
title: "MediaGo Pro is Live!",
desc: "- Experience faster downloads & exclusive features",
action: "Try Now",
close: "Close",
},
},
jp: {
slogan: "使いやすく、ダウンロードも速い",
articles: "記事",
help: "ヘルプ",
search: "スマート検索",
blog: "ブログ",
privacy: "プライバシーポリシー",
links: "友情リンク",
"jiexi.im": "スマートビデオ解析",
banner: {
new: "新着",
title: "MediaGo Pro がリリースされました!",
desc: "- より高速なダウンロードと限定機能をお楽しみください",
action: "今すぐ試す",
close: "閉じる",
},
},
zh: {
slogan: "简单易用,快速下载",
articles: "文章",
help: "帮助",
search: "智能搜索",
blog: "博客",
privacy: "隐私政策",
links: "友情链接",
"jiexi.im": "智能视频解析",
banner: {
new: "全新上线",
title: "MediaGo Pro 正式发布!",
desc: "- 更快的下载速度,更多专属功能",
action: "立即体验",
close: "关闭",
},
},
},
});
+57 -7
View File
@@ -1,13 +1,63 @@
@import "tailwindcss";
/* Top Banner - 使用 VitePress 官方变量 */
:root {
--vp-layout-top-height: 60px;
/* Keep blog tables inside the article column. */
.vp-doc[class*="_blog_"] table {
display: block;
width: 100%;
max-width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
/* 移动端横幅高度 */
@media (max-width: 768px) {
:root {
--vp-layout-top-height: 80px;
.vp-doc[class*="_blog_"] th,
.vp-doc[class*="_blog_"] td {
min-width: 120px;
vertical-align: top;
}
.vp-doc[class*="_blog_"] th {
white-space: nowrap;
}
/* Blog translations are handled by an explicit article-level link to avoid untranslated locale URLs. */
body:has(.vp-doc[class*="_blog_"]) .VPNavBarTranslations,
body:has(.vp-doc[class*="_blog_"]) .VPNavBarExtra .translations,
body:has(.vp-doc[class*="_blog_"]) .VPNavScreen .translations {
display: none !important;
}
.blog-language-switch {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin: 0 0 24px;
padding: 10px 12px;
border: 1px solid var(--vp-c-divider);
border-radius: 8px;
background: var(--vp-c-bg-soft);
color: var(--vp-c-text-2);
font-size: 14px;
}
.blog-language-switch a {
flex: 0 0 auto;
padding: 4px 10px;
border-radius: 999px;
background: var(--vp-c-brand-soft);
color: var(--vp-c-brand-1);
font-weight: 600;
text-decoration: none;
}
.blog-language-switch a:hover {
background: var(--vp-c-brand-2);
color: var(--vp-c-white);
}
@media (max-width: 640px) {
.blog-language-switch {
align-items: flex-start;
flex-direction: column;
}
}
+302
View File
@@ -0,0 +1,302 @@
---
layout: doc
outline: deep
---
# 下载接口
MediaGo 把下载核心暴露成一个 HTTP 服务。桌面端在 `39719` 端口,Docker 部署在 `9900` 端口。
你可以用任何支持 HTTP 的工具(curl / Python / Node.js / Postman 等)直接调用接口,新建下载任务、启动、停止、查询进度 —— MediaGo 自己的浏览器扩展、AI Skill 都是这套接口的消费者。
## 基础信息
### 接口地址
| 部署方式 | Base URL |
| -------- | ---------------------------------------------------- |
| 桌面端 | `http://localhost:39719` |
| Docker | `http://<服务器地址>:9900`(按实际 `-p` 端口映射调整) |
所有接口都在 `/api` 前缀下。下文示例默认用桌面端的 `39719` 端口,Docker 部署请自行替换。
### 响应格式
所有 `/api/*` 接口都返回统一的 JSON 包裹结构:
```json
{
"success": true,
"code": 0,
"message": "ok",
"data": { ... }
}
```
| 字段 | 类型 | 说明 |
| --------- | ------ | --------------------------- |
| `success` | bool | 业务是否成功 |
| `code` | number | 业务错误码,`0` 表示成功 |
| `message` | string | 人类可读的提示 |
| `data` | any | 实际响应载荷,结构因接口而异 |
下文示例中的"响应"只展示 `data` 字段的内容。
### 认证
- **桌面端**:默认**无需认证**,直接请求 `localhost:39719` 即可
- **Docker 部署**:启用认证时,在 MediaGo **设置页面**中获取 API Key,之后的请求带 `Authorization: Bearer <key>`
## 快速上手
下面这三条命令串起"新建 → 开始下载 → 完成通知"的完整流程。
### 1. 新建下载任务
```bash
curl -X POST http://localhost:39719/api/downloads \
-H "Content-Type: application/json" \
-d '{
"tasks": [
{
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"name": "我的视频"
}
],
"startDownload": true
}'
```
- `type`:下载类型,可选 `m3u8` / `bilibili` / `direct` / `youtube` / `mediago`
- `url`:视频链接
- `name`:任务名称(会作为保存文件名)
- `startDownload`:创建后是否立即开始下载
响应:
```json
[
{
"id": 123,
"name": "我的视频",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"status": "waiting",
"createdDate": "2026-04-23T10:00:00Z"
}
]
```
记下返回的 `id`,后续接口会用到。
### 2. 订阅下载事件(SSE)
```bash
curl -N http://localhost:39719/api/events
```
这是一条长连接,服务端推什么、你收什么:
```text
event: download-start
data: {"id": "123"}
event: download-success
data: {"id": "123"}
```
浏览器 / Node.js 里:
```javascript
const es = new EventSource("http://localhost:39719/api/events");
es.addEventListener("download-success", (e) => {
const { id } = JSON.parse(e.data);
console.log("任务完成:", id);
});
```
### 3. 查询状态 / 手动控制
```bash
# 列出所有下载任务(分页)
curl "http://localhost:39719/api/downloads?current=1&pageSize=20"
# 查单个任务
curl http://localhost:39719/api/downloads/123
# 启动已存在的任务
curl -X POST http://localhost:39719/api/downloads/123/start \
-H "Content-Type: application/json" \
-d '{"localPath": "/Downloads/MediaGo", "deleteSegments": true}'
# 停止任务
curl -X POST http://localhost:39719/api/downloads/123/stop
# 查下载日志
curl http://localhost:39719/api/downloads/123/logs
```
## 下载事件
`GET /api/events` 是 Server-Sent Events 流,下载相关的事件:
| 事件名 | 载荷 | 说明 |
| ------------------ | -------------------------------- | ------------ |
| `download-create` | `{ids: number[], count: number}` | 批量创建任务 |
| `download-start` | `{id: string}` | 下载开始 |
| `download-success` | `{id: string}` | 下载成功 |
| `download-failed` | `{id: string, error: string}` | 下载失败 |
| `download-stop` | `{id: string}` | 下载手动停止 |
## 接口参考
### 列表 / 查询
#### `GET /api/downloads` — 分页列出下载任务
**Query 参数:**
- `current` (number, 默认 1):页码
- `pageSize` (number, 默认 20):每页条数
- `filter` (string, 可选):按状态筛选,如 `downloading` / `success` / `failed`
- `localPath` (string, 可选):按保存路径筛选
**响应:**
```json
{
"total": 42,
"list": [
/* DownloadTask[] */
]
}
```
#### `GET /api/downloads/active` — 列出活动中的任务
返回所有 `waiting` / `downloading` 状态的任务。
#### `GET /api/downloads/:id` — 查单个任务
**响应**(`DownloadTask` 结构):
```json
{
"id": 123,
"name": "我的视频",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"folder": "my-folder",
"headers": "User-Agent: ...",
"isLive": false,
"status": "success",
"file": "/path/to/saved.mp4",
"createdDate": "2026-04-23T10:00:00Z",
"updatedDate": "2026-04-23T10:05:30Z"
}
```
#### `GET /api/downloads/folders` — 列出所有不重复的保存目录
**响应:** `string[]`
#### `GET /api/downloads/export` — 导出下载列表
返回纯文本,每行一个 URL。
#### `GET /api/downloads/:id/logs` — 查下载日志
**响应:** `{ id, log: string }`
### 创建 / 删除
#### `POST /api/downloads` — 批量新建下载
**请求体:**
```json
{
"tasks": [
{
"type": "m3u8 | bilibili | direct | youtube | mediago",
"url": "https://example.com/video.m3u8",
"name": "任务名",
"folder": "可选子目录",
"headers": "可选,多行 HTTP 头"
}
],
"startDownload": true
}
```
**响应:** `DownloadTask[]`
#### `DELETE /api/downloads/:id` — 删除任务
**响应:** `{}`
### 编辑 / 状态
#### `PUT /api/downloads/:id` — 编辑任务
**请求体**(字段都可选):
```json
{
"name": "新名字",
"url": "新 URL",
"headers": "新的 headers",
"folder": "新的子目录"
}
```
#### `PUT /api/downloads/:id/live` — 标记 / 取消直播流
**请求体:** `{ "isLive": true }`
#### `PUT /api/downloads/status` — 批量修改任务状态
**请求体:** `{ "ids": number[], "status": "waiting | downloading | success | failed | stopped" }`
### 启动 / 停止
#### `POST /api/downloads/:id/start` — 启动下载
**请求体:**
```json
{
"localPath": "/Users/me/Downloads/MediaGo",
"deleteSegments": true
}
```
- `localPath`:保存到哪里(绝对路径)
- `deleteSegments`:m3u8 下载完成后是否删除分段 `.ts` 文件
#### `POST /api/downloads/:id/stop` — 停止下载
**响应:** `{}`
## 枚举值
### 下载类型 `type`
| 值 | 说明 |
| ---------- | ----------------------------------- |
| `m3u8` | HLS 流媒体(底层 N_m3u8DL-RE) |
| `bilibili` | B 站视频(底层 BBDown) |
| `direct` | 直接 HTTP 下载(底层 aria2) |
| `youtube` | YouTube 及 yt-dlp 支持的 1000+ 站点 |
| `mediago` | MediaGo 内部类型 |
### 任务状态 `status`
| 值 | 说明 |
| ------------- | ---------- |
| `waiting` | 等待开始 |
| `downloading` | 下载中 |
| `success` | 已完成 |
| `failed` | 失败 |
| `stopped` | 已手动停止 |
+92
View File
@@ -0,0 +1,92 @@
---
title: MediaGo 博客
description: MediaGo 博客围绕网页视频下载、M3U8/HLS、视频嗅探、NAS/Docker 部署和下载器评测,提供面向搜索和 AI 摘要的专题指南。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [MediaGo, 视频下载器, m3u8, HLS, 视频嗅探]
---
# MediaGo 博客
这里是 MediaGo 的学习中心,内容围绕网页视频下载、M3U8/HLS、视频嗅探、NAS/Docker 部署、下载器评测和自动化工作流展开。
如果你刚开始了解 MediaGo,建议先看 [快速开始](/guides);如果你正在比较工具,优先阅读 [2026 年视频下载器推荐](/blog/video-downloader-recommendation/),再进入完整评测报告。
## 推荐阅读路径
| 主题 | 适合问题 | 推荐入口 |
| ------------ | ------------------------------------------------------------- | -------------------------------------------------------- |
| 工具推荐 | 哪个视频下载器更适合我?免费、电脑端、m3u8、IDM、猫抓怎么选? | [视频下载器推荐](/blog/video-downloader-recommendation/) |
| 深度评测 | MediaGo 和 yt-dlp、4K、NAS 工具有什么区别? | [视频下载器评测](/blog/video-downloader-review/) |
| 网页视频下载 | 网页里的视频怎么下载?B站视频怎么保存?复制链接无效怎么办? | [网页视频下载指南](/blog/video-download/) |
| M3U8 / HLS | m3u8 视频怎么下载?下载失败、转 MP4、NAS 工具怎么选? | [M3U8 / HLS 下载指南](/blog/m3u8-hls-download/) |
| 视频嗅探 | 视频嗅探器浏览器哪个好用?插件、内置浏览器、网页工具怎么选? | [网页视频嗅探指南](/blog/video-sniffer/) |
## 支柱专题
### [2026 年视频下载器推荐](/blog/video-downloader-recommendation/)
面向国内搜索里的“视频下载器推荐”“视频下载软件哪个好”“m3u8 下载器”“IDM 下载器”“猫抓下载器”等需求,先给出按场景选择工具的结论。
配套文章:
- [IDM 下载器和 MediaGo 怎么选?](/blog/video-downloader-review/idm-vs-mediago/)
- [m3u8 下载器推荐:电脑、Docker、NAS 和浏览器工具怎么选?](/blog/video-downloader-review/m3u8-downloader-recommendation/)
- [猫抓下载器和 MediaGo 有什么区别?](/blog/video-downloader-review/cat-catch-vs-mediago/)
- [MediaGo 和 yt-dlp 怎么选?](/blog/video-downloader-review/mediago-vs-ytdlp/)
### [2026 年视频下载器评测](/blog/video-downloader-review/)
从站点覆盖、HLS/M3U8、浏览器嗅探、NAS/Docker、API、AI 后处理等维度,对比 MediaGo、yt-dlp、4K Video Downloader、Video DownloadHelper、MeTube、Tube Archivist 等工具。
子文章:
- [IDM 下载器和 MediaGo 怎么选?](/blog/video-downloader-review/idm-vs-mediago/)
- [m3u8 下载器推荐:电脑、Docker、NAS 和浏览器工具怎么选?](/blog/video-downloader-review/m3u8-downloader-recommendation/)
- [猫抓下载器和 MediaGo 有什么区别?](/blog/video-downloader-review/cat-catch-vs-mediago/)
- [MediaGo 和 yt-dlp 怎么选?](/blog/video-downloader-review/mediago-vs-ytdlp/)
- [MediaGo 和 4K Video Downloader 怎么选?](/blog/video-downloader-review/mediago-vs-4k-video-downloader/)
- [NAS 视频下载器怎么选?](/blog/video-downloader-review/nas-video-downloader-tools/)
### [网页视频下载完整指南](/blog/video-download/)
解释网页视频下载的常见入口、使用场景、操作流程和工具选择,适合作为普通用户的入门专题。
子文章:
- [网页视频怎么下载?](/blog/video-download/download-web-video/)
- [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)
- [B站视频怎么下载?](/blog/video-download/bilibili-video-download/)
- [B站视频怎么转文字稿、提取字幕和音频?](/blog/video-download/bilibili-video-to-text-audio/)
- [课程回看视频怎么下载?](/blog/video-download/download-course-video/)
- [视频下载工作流怎么搭?](/blog/video-download/video-download-workflow/)
### [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
围绕 m3u8、HLS、DASH、直播流和分段视频,说明协议差异、下载流程和常见失败原因。
子文章:
- [M3U8 是什么?](/blog/m3u8-hls-download/what-is-m3u8/)
- [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/)
- [m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/)
- [m3u8 下载后怎么转 MP4](/blog/m3u8-hls-download/m3u8-to-mp4/)
### [网页视频嗅探器使用指南](/blog/video-sniffer/)
解释浏览器扩展、内置浏览器和桌面端嗅探的区别,帮助用户选择更稳定的网页视频识别方式。
子文章:
- [Chrome 视频嗅探怎么用?](/blog/video-sniffer/chrome-video-sniffer/)
- [视频嗅探器浏览器哪个好用?](/blog/video-sniffer/browser-extension-vs-desktop/)
- [为什么网页视频嗅探到很多资源?](/blog/video-sniffer/detect-video-resources/)
## 相关产品文档
- [快速开始](/guides)
- [使用说明](/documents)
- [浏览器扩展](/extension)
- [下载接口](/api)
- [Docker / 宝塔面板部署](/bt-install)
@@ -0,0 +1,43 @@
---
title: m3u8 视频怎么下载?MediaGo 下载 HLS 视频教程
description: 介绍 m3u8/HLS 视频的下载步骤,包括网页嗅探、选择资源、下载分片、合并保存和常见注意事项。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [m3u8 下载, HLS 下载, 视频下载, MediaGo]
---
# m3u8 视频怎么下载?
一句话答案:可以用 MediaGo 打开视频页面,自动识别 HLS/M3U8 资源,然后选择目标清晰度加入下载队列,由下载器完成分片下载和合并保存。
## 快速步骤
1. 打开 MediaGo。
2. 使用内置浏览器访问目标视频页面。
3. 播放视频并等待资源识别。
4. 在资源列表中选择 m3u8/HLS 项。
5. 添加下载任务。
6. 等待分片下载、合并和保存完成。
## 下载前检查
- 视频页面是否可以正常播放;
- 是否需要登录或授权访问;
- 目标资源是否有多个清晰度;
- 下载路径是否有足够空间;
- 是否需要保留字幕、音频或封面。
## 为什么推荐内置浏览器
内置浏览器可以保留页面播放过程中的上下文信息,比如 Referer、Cookie、User-Agent 和临时请求。对于复杂的 HLS 页面,它比手动复制 m3u8 更稳定。
## 与支柱页的关系
这篇文章是 [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/) 的子文章,用于承接 “m3u8 视频怎么下载” 这个核心长尾词。
## 继续阅读
- [M3U8 是什么?](/blog/m3u8-hls-download/what-is-m3u8/)
- [m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
@@ -0,0 +1,41 @@
---
title: m3u8 下载失败怎么办?HLS 视频常见问题排查
description: 总结 m3u8/HLS 视频下载失败的常见原因,包括链接过期、请求头缺失、分片失败、音视频分离和直播流停止条件。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [m3u8 下载失败, HLS, 视频下载问题, MediaGo]
---
# m3u8 下载失败怎么办?
一句话答案:m3u8 下载失败通常和链接过期、请求头缺失、分片无法访问、音视频分离或直播流规则有关。优先用 MediaGo 内置浏览器重新识别资源,再确认页面是否仍能正常播放。
## 常见原因
| 问题 | 可能原因 | 处理建议 |
| -------------------- | ---------------------------------- | ---------------------- |
| 任务一开始就失败 | m3u8 地址过期 | 重新打开页面并识别资源 |
| 部分分片失败 | 网络波动或分片地址失效 | 重试任务或降低并发 |
| 播放器能看但下载失败 | 缺少 Referer、Cookie 或 User-Agent | 使用内置浏览器识别 |
| 只有视频没有声音 | 音视频分离 | 检查是否需要混流 |
| 直播流无法结束 | 没有固定总时长 | 设置停止条件或手动停止 |
## 排查顺序
1. 确认网页还能正常播放;
2. 重新用内置浏览器打开页面;
3. 重新选择资源并创建任务;
4. 检查网络和保存路径;
5. 如果是直播流,确认停止条件;
6. 如果仍失败,再考虑手动工具或日志排查。
## 与支柱页的关系
这篇文章是 [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/) 的子文章,用于承接下载失败和问题排查场景。
## 继续阅读
- [M3U8 是什么?](/blog/m3u8-hls-download/what-is-m3u8/)
- [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/)
- [网页视频下载完整指南](/blog/video-download/)
+93
View File
@@ -0,0 +1,93 @@
---
title: M3U8 / HLS 视频下载完整指南
description: 解释 M3U8、HLS、DASH、直播流和分段视频的关系,并介绍如何使用 MediaGo 下载和处理网页中的流媒体资源。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [m3u8, HLS, DASH, 直播流, MediaGo]
---
# M3U8 / HLS 视频下载完整指南
一句话答案:m3u8 是 HLS 流媒体常见的播放列表格式,里面通常记录了一组视频分片地址。MediaGo 可以识别网页中的 HLS/M3U8 资源,并调用内置下载能力完成分片下载、合并和保存。
这篇支柱页覆盖“m3u8下载”“m3u8下载器”“m3u8下载器电脑版”“m3u8下载转mp4工具”“HLS下载”等搜索意图。概念、教程、排错和工具选型会分到不同子文章里。
## M3U8、HLS 和 DASH 是什么
| 名称 | 说明 | 常见场景 |
| ------------- | ------------------------------------------------------ | ---------------------------- |
| M3U8 | HLS 播放列表文件,通常包含清晰度、分片地址或子播放列表 | 网页视频、课程回看、直播回放 |
| HLS | Apple 推出的 HTTP Live Streaming 协议 | 移动端播放、直播、长视频平台 |
| DASH / MPD | 另一类自适应流媒体协议 | YouTube、部分国际视频平台 |
| TS / M4S 分片 | 实际承载视频和音频的数据片段 | HLS/DASH 下载和合并 |
## 为什么 m3u8 下载容易失败
- 播放地址有时效性,过期后无法继续访问;
- 视频分片需要 Referer、Cookie、User-Agent 等请求头;
- 音频和视频可能分离,需要下载后重新混流;
- 直播流没有固定结束点,需要按任务规则停止;
- 部分页面只暴露播放器地址,不直接暴露 m3u8 地址。
## MediaGo 的处理方式
MediaGo 的价值在于把“识别资源”和“下载处理”连起来。用户不需要手动抓包、复制 m3u8、拼接 ts 分片或反复调整命令行参数。
推荐流程:
1. 用 MediaGo 内置浏览器打开视频页面。
2. 等待资源列表识别出 HLS/M3U8 或直播流。
3. 选择目标清晰度和视频资源。
4. 添加下载任务。
5. 下载完成后按需进行格式转换或移动端播放。
## 什么时候用专业命令行工具
如果你已经拿到了稳定的 m3u8、mpd 或直播流地址,并且需要精细控制 headers、分片并发、混流、字幕、断点续传等参数,N_m3u8DL-RE、FFmpeg 和 Streamlink 仍然适合高级场景。
如果你希望把这些能力放到图形界面、浏览器嗅探、下载队列和 NAS/Docker 工作流里,MediaGo 会更省心。
## 按搜索问题快速进入
| 你搜索的问题 | 应该先看 |
| ------------------------------- | -------------------------------------------------------------------------------- |
| m3u8 是什么、HLS 是什么 | [M3U8 是什么?](/blog/m3u8-hls-download/what-is-m3u8/) |
| m3u8 视频怎么下载 | [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/) |
| m3u8 下载失败、key 请求失败 | [m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/) |
| m3u8 下载转 MP4 工具 | [m3u8 下载后怎么转 MP4](/blog/m3u8-hls-download/m3u8-to-mp4/) |
| 好用的 m3u8 下载器、电脑版、NAS | [m3u8 下载器推荐](/blog/video-downloader-review/m3u8-downloader-recommendation/) |
## 专题文章
| 文章 | 解决的问题 | 目标搜索意图 |
| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------ | --------------------------- |
| [M3U8 是什么?](/blog/m3u8-hls-download/what-is-m3u8/) | 解释 M3U8、HLS、TS 分片关系 | m3u8 是什么、HLS 是什么 |
| [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/) | 具体下载步骤和工具流程 | m3u8 视频怎么下载、HLS 下载 |
| [m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/) | 排查链接过期、请求头、分片失败 | m3u8 下载失败、HLS 下载失败 |
| [m3u8 下载后怎么转 MP4](/blog/m3u8-hls-download/m3u8-to-mp4/) | 分片合并、转码、离线播放 | m3u8 下载转 mp4 工具 |
| [m3u8 下载器推荐:电脑、Docker、NAS 和浏览器工具怎么选?](/blog/video-downloader-review/m3u8-downloader-recommendation/) | 工具选型、桌面端、NAS 场景 | m3u8 下载器、HLS 下载工具 |
## 常见问题
### m3u8 文件就是视频文件吗?
不是。m3u8 通常是播放列表,真正的视频数据在它引用的分片里。下载工具需要读取播放列表,再逐个获取分片并合并。
### 为什么播放器能看,下载器不能下?
播放器可能携带了页面上下文、Cookie、Referer 或临时签名。下载器如果没有这些请求信息,就可能访问失败。
### 直播流可以下载吗?
可以,但直播流和普通点播不同。它通常没有固定总时长,需要下载器持续读取新分片,并按用户设置的时间或手动停止条件结束任务。
### m3u8 下载后一定要转 MP4 吗?
不一定。如果播放器能直接读取本地 HLS 文件夹,可以不转。但对普通用户来说,MP4 更适合离线播放、移动设备传输和长期归档。
## 继续阅读
- [网页视频下载完整指南](/blog/video-download/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [2026 年视频下载器评测](/blog/video-downloader-review/)
@@ -0,0 +1,103 @@
---
title: m3u8 下载后怎么转 MP4?自动合并、转码和离线播放完整说明
description: 解释 m3u8 下载转 MP4 的流程,说明为什么下载后只有几 KB、为什么需要合并 TS/M4S 分片,以及如何用 MediaGo、FFmpeg 等工具完成转码。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [m3u8下载转mp4工具, m3u8下载, HLS下载, m3u8转MP4, 视频格式转换]
---
# m3u8 下载后怎么转 MP4?自动合并、转码和离线播放完整说明
一句话答案:m3u8 本身通常不是视频文件,而是 HLS 播放列表。要转成 MP4,需要先读取播放列表,下载里面的 TS/M4S 分片,再合并或转码成一个本地 MP4 文件。MediaGo 适合普通用户完成识别、下载、合并和后续格式处理;FFmpeg 更适合高级参数和脚本化处理。
本文只讨论公开可访问内容、用户自有内容、授权内容、课程回看、企业内部资料和个人素材归档。
## m3u8、TS 分片和 MP4 的区别
| 名称 | 它是什么 | 能不能直接当视频播放 |
| -------- | ------------------------------ | -------------------------------- |
| m3u8 | 播放列表,记录分片地址和清晰度 | 通常不能,它只是索引文件 |
| TS / M4S | 真实的视频或音频分片 | 单个分片通常不适合独立观看 |
| MP4 | 常见本地视频容器 | 可以,适合离线播放和跨设备保存 |
| HLS | 使用 m3u8 和分片的流媒体协议 | 需要播放器或下载器按顺序读取分片 |
如果你下载后只看到一个几 KB 的 m3u8 文件,说明你保存的是播放列表,不是完整视频。
## m3u8 转 MP4 的完整流程
1. 获取有效的 m3u8 播放列表。
2. 读取播放列表里的分片地址。
3. 下载所有 TS/M4S 分片。
4. 如果音频和视频分离,需要分别下载后混流。
5. 合并分片,必要时转码为 MP4。
6. 检查时长、画面、声音和字幕是否正常。
普通用户不建议手动复制分片地址。分片数量可能很多,而且地址经常带临时签名,复制后很快过期。
## 用 MediaGo 处理 m3u8 转 MP4
MediaGo 更适合不想写命令的用户。推荐方式是:
1. 用 MediaGo 内置浏览器打开视频页面。
2. 等待资源列表识别出 HLS/M3U8。
3. 选择目标清晰度或主播放列表。
4. 添加下载任务。
5. 下载完成后按需进行格式转换或移动端播放。
这种方式的关键是保留页面上下文。很多 m3u8 资源需要 Referer、Cookie、User-Agent 或临时签名,直接复制链接可能会失败。
## 用 FFmpeg 转 MP4 适合什么情况
如果你已经拿到了稳定、有效、可访问的 m3u8 地址,并且熟悉命令行,可以使用 FFmpeg 处理。
常见场景包括:
- 已有本地 m3u8 和分片文件;
- 需要批量转码;
- 需要指定编码、码率、字幕或音轨;
- 需要在服务器或自动化脚本里处理。
但如果 m3u8 地址依赖浏览器登录态、临时签名或请求头,单独拿 FFmpeg 处理可能会遇到 403、key 请求失败或分片下载失败。这时先用 MediaGo 重新识别资源更稳。
## 下载后还用联网吗
如果已经完整下载并合并为 MP4,本地播放通常不需要联网。如果你只保存了 m3u8 播放列表,播放时仍然需要访问原始分片地址;一旦分片过期或服务器不可访问,就无法播放。
所以判断是否真正离线保存,可以看这三点:
1. 文件是不是一个完整 MP4,而不是几 KB 的 m3u8
2. 断网后是否能播放;
3. 视频时长、声音和画面是否完整。
## 转 MP4 后没有画面或没有声音怎么办
| 现象 | 可能原因 | 处理方式 |
| ------------ | -------------------------- | ------------------------ |
| 有声音没画面 | 视频轨没有合并或编码不兼容 | 重新下载完整视频轨并转码 |
| 有画面没声音 | 音频轨分离或缺失 | 检查是否有单独音频资源 |
| 时长不完整 | 分片缺失或下载中断 | 重新识别资源后重试 |
| 文件无法播放 | 容器或编码不兼容 | 转为通用 MP4 编码 |
如果问题发生在下载阶段,先看:[m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/)。
## 常见问题
### m3u8 下载转 MP4 工具怎么选?
普通用户优先选择能自动识别、下载、合并和转换的图形界面工具,例如 MediaGo。开发者和高级用户可以选择 FFmpeg、N_m3u8DL-RE 等命令行工具。
### m3u8 下载器电脑版一定比浏览器插件好吗?
不一定。插件适合发现资源,桌面端适合下载、合并、转码和失败重试。复杂网页通常需要两者配合,或直接使用内置浏览器。
### m3u8 转 MP4 会降低画质吗?
如果只是无损封装或合并,画质通常不会明显变化。如果重新编码、压缩码率或转换格式,画质可能下降。
## 继续阅读
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/)
- [m3u8 下载器推荐:电脑、Docker、NAS 和浏览器工具怎么选?](/blog/video-downloader-review/m3u8-downloader-recommendation/)
- [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)
@@ -0,0 +1,39 @@
---
title: M3U8 是什么?HLS 播放列表、TS 分片和网页视频的关系
description: 用通俗方式解释 M3U8、HLS、TS 分片和网页视频播放的关系,帮助用户理解为什么 m3u8 不是普通视频文件。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [m3u8, HLS, TS 分片, 流媒体]
---
# M3U8 是什么?
一句话答案:M3U8 通常不是视频文件本身,而是 HLS 流媒体的播放列表,里面记录了不同清晰度、音视频轨道或视频分片地址。
## M3U8 的作用
播放器拿到 m3u8 后,会继续读取里面的分片地址,再按顺序下载并播放这些分片。用户看到的是连续视频,底层可能是一系列 ts 或 m4s 小文件。
## 常见结构
| 内容 | 说明 |
| ------------- | ------------------------------- |
| 主播放列表 | 可能包含多个清晰度或码率 |
| 子播放列表 | 指向具体分片列表 |
| TS / M4S 分片 | 实际承载视频或音频数据 |
| Key 信息 | 某些 HLS 流可能包含加密相关信息 |
## 为什么理解 M3U8 很重要
理解 m3u8 之后,就能知道为什么普通复制链接经常失败:你复制到的可能只是页面地址,真正需要处理的是播放列表、分片、请求头和有效期。
## 与支柱页的关系
这篇文章是 [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/) 的子文章,负责解释基础概念。
## 继续阅读
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/)
- [m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/)
@@ -0,0 +1,105 @@
---
title: B站视频怎么下载?保存到电脑、手机本地和后续处理方法
description: 面向“b站视频怎么下载”“b站视频怎么下载到本地”“b站视频如何下载到电脑/手机”的合规教程,说明公开内容、自有稿件和课程回看的保存思路。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags:
[b站视频怎么下载, b站视频下载, b站视频下载到本地, b站视频下载工具, Bilibili]
---
# B站视频怎么下载?保存到电脑、手机本地和后续处理方法
一句话答案:B站视频下载要先确认你是否有权保存该内容。对公开可访问内容、自有稿件、已授权素材、课程回看或企业内部资料,可以用 MediaGo 这类工具在电脑端识别真实视频资源,再保存到本地、NAS 或后续处理流程中。
本文只讨论公开可访问内容、用户自有内容、授权内容、课程回看、企业内部资料和个人素材归档,不讨论去水印、绕过权限、破解会员内容或下载受保护内容。
## 适合哪些场景
| 场景 | 是否适合写入下载流程 | 说明 |
| ---------------------- | -------------------- | ------------------------ |
| 自己发布的稿件 | 适合 | 用于备份、剪辑、归档 |
| 已获授权的视频素材 | 适合 | 适合团队协作和素材管理 |
| 课程回看或学习资料 | 视授权而定 | 只处理有保存权限的内容 |
| 公开素材或公开视频 | 视平台规则而定 | 需要遵守平台和原作者要求 |
| 会员、付费、受保护内容 | 不建议 | 不讨论绕过限制或访问控制 |
## B站视频下载到电脑怎么做
推荐先用电脑端处理,因为电脑端更适合识别、下载、合并、转码和长期管理。
1. 安装 MediaGo 桌面端或部署 Docker/NAS 版本。
2. 打开需要保存的 B站视频页面。
3. 用 MediaGo 内置浏览器或浏览器扩展识别视频资源。
4. 在资源列表里选择目标视频、清晰度或音视频资源。
5. 添加到下载队列,等待下载、合并和格式处理完成。
6. 按需移动到素材库、NAS、课程资料文件夹或后续处理流程。
如果复制页面链接后不能下载,通常是因为页面地址不是视频真实地址。可以看:[网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)。
## B站视频怎么下载到手机本地
如果你搜索的是“b站视频如何下载到手机”“b站视频怎么保存在手机本地”,要先区分两件事:
- B站客户端缓存:适合在 App 内离线观看,但通常不是通用本地视频文件;
- 本地视频文件:适合跨设备播放、剪辑、归档或转文字,需要先完整保存为可播放文件。
MediaGo 当前更适合电脑端、浏览器扩展、Docker/NAS 和局域网访问。更稳的流程是先在电脑或 NAS 上完成识别和下载,再通过局域网、移动硬盘、网盘或媒体库在手机上访问。
## B站视频链接在哪里找
用户常问“B站视频的链接在哪里找到”,通常有三类链接:
| 链接类型 | 说明 | 下载时是否足够 |
| ------------ | ---------------------------- | ------------------------ |
| 页面链接 | 浏览器地址栏里的视频页面地址 | 不一定,常只是播放器页面 |
| 分享链接 | App 或网页分享出来的短链接 | 不一定,需要还原到页面 |
| 真实视频资源 | 播放过程中请求的视频或音频流 | 下载器真正需要识别的资源 |
普通用户不建议手动从开发者工具里找资源。B站页面可能存在音视频分离、清晰度选择、临时签名和分段请求,手动复制很容易选错或过期。
## B站视频下载工具怎么选
| 需求 | 更适合的方式 |
| ---------------------- | ------------------------------ |
| 不想写命令 | MediaGo 桌面端或内置浏览器 |
| 边浏览边识别 | MediaGo 浏览器扩展 |
| 批量、脚本化 | 命令行工具或 API 工作流 |
| 长期保存和多端访问 | Docker/NAS、局域网和私有媒体库 |
| 下载后转文字或提取音频 | 下载后处理流程 |
如果你的重点是工具对比,可以先看:[2026 年视频下载器推荐](/blog/video-downloader-recommendation/)。
## 下载后可以做什么
B站视频下载到本地后,常见后续需求包括:
- 转为 MP4 便于本地播放;
- 提取音频或转 MP3
- 提取字幕或转文字稿;
- 生成 AI 总结;
- 归档到 NAS 或课程资料库;
- 按项目、课程、作者或日期整理。
如果你的目标是“b站视频转文字稿、提取字幕、提取音频 mp3”,可以看:[B站视频怎么转文字稿、提取字幕和音频?](/blog/video-download/bilibili-video-to-text-audio/)。
## 常见问题
### B站视频缓存等于下载到本地吗?
不完全等于。缓存通常服务于 App 内离线观看,不一定是可自由管理的本地 MP4 文件。如果你需要剪辑、转文字或归档,需要保存为可处理的视频文件。
### B站视频可以批量下载吗?
自有稿件、授权课程或公开资料可以考虑批量整理,但要遵守平台规则和内容授权。批量下载更适合放到后续工作流或 NAS 自动化中,不建议把它写成绕过限制的教程。
### B站视频去水印、无水印下载要不要做?
不建议。去水印和无水印下载容易涉及平台规则和作者权益。MediaGo 内容应该围绕有权保存和处理的场景,不主攻这类词。
## 继续阅读
- [网页视频下载完整指南](/blog/video-download/)
- [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)
- [视频嗅探器浏览器哪个好用?](/blog/video-sniffer/browser-extension-vs-desktop/)
- [B站视频怎么转文字稿、提取字幕和音频?](/blog/video-download/bilibili-video-to-text-audio/)
@@ -0,0 +1,91 @@
---
title: B站视频怎么转文字稿、提取字幕和音频?
description: 面向“b站视频怎么转文字”“b站视频提取字幕”“b站视频提取音频 mp3”“b站视频 AI 总结”的后处理指南,说明下载后转写、字幕和音频处理流程。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags:
[b站视频转文字, b站视频提取字幕, b站视频提取音频, b站视频转mp3, b站视频AI总结]
---
# B站视频怎么转文字稿、提取字幕和音频?
一句话答案:B站视频转文字稿、提取字幕或音频,通常分两步:先在有授权的前提下保存视频或音频文件,再使用转写、字幕提取、音频提取或 AI 总结工具处理。MediaGo 适合作为“识别和保存视频资源”的入口,后续可以接转写和音频处理流程。
本文只讨论公开可访问内容、用户自有内容、授权内容、课程回看、企业内部资料和个人素材归档,不讨论去水印、绕过权限或处理无授权内容。
## 常见后处理需求
| 需求 | 目标结果 | 适合场景 |
| --------------- | -------------------- | ------------------------ |
| B站视频转文字稿 | 一份可编辑文本 | 课程笔记、会议资料、复盘 |
| B站视频提取字幕 | srt、vtt 或文本字幕 | 学习、剪辑、资料整理 |
| B站视频提取音频 | 音频文件 | 听课、播客化、语音资料 |
| B站视频转 mp3 | 更通用的音频格式 | 手机收听、离线整理 |
| B站视频 AI 总结 | 摘要、要点、章节大纲 | 快速浏览长视频内容 |
## 推荐处理流程
1. 确认内容是否允许保存和二次处理。
2. 使用 MediaGo 保存公开视频、自有稿件或授权课程回看。
3. 检查下载文件是否完整,确认画面、声音和时长正常。
4. 如果只需要音频,先提取音轨或转 MP3。
5. 如果需要文字稿,使用语音转文字工具生成初稿。
6. 对照原视频校对术语、时间点、人名和专有名词。
7. 按用途整理成字幕、笔记、摘要或知识库内容。
## 转文字稿和提取字幕有什么区别
| 类型 | 来源 | 优点 | 局限 |
| -------- | ------------------------ | -------------------------- | -------------------- |
| 提取字幕 | 视频自带字幕或外挂字幕 | 准确度通常更高,时间轴完整 | 前提是原视频有字幕 |
| 语音转写 | 从音频识别出文字 | 没有字幕也能生成文本 | 需要校对,受音质影响 |
| AI 总结 | 基于文字稿或字幕生成摘要 | 适合快速提炼要点 | 不能替代原文校对 |
如果视频没有字幕,先提取音频再做语音转文字会更稳。音质差、多人说话、背景音乐明显的视频,需要人工校对。
## B站视频提取音频 mp3 怎么做
如果你有权处理该视频,可以先保存完整视频,再从视频文件中提取音频或转为 MP3。
适合提取音频的场景:
- 自己上传的视频备份;
- 已授权课程或培训内容;
- 公开演讲、公开资料的个人学习归档;
- 企业内部视频资料整理。
不建议把“转 MP3”写成规避平台播放规则或无授权搬运的教程。SEO 页面可以承接这个搜索意图,但正文必须清楚说明使用边界。
## AI 总结适合放在哪一步
AI 总结最好放在转文字之后,而不是直接跳过文字稿。推荐顺序是:
1. 下载或保存有权处理的视频;
2. 提取音频或字幕;
3. 生成文字稿;
4. 清理口癖、错字和重复段落;
5. 再生成摘要、章节、关键词和待办事项。
这样得到的总结更稳定,也更适合被搜索和 AI 摘要理解。
## 常见问题
### B站视频提取字幕一定能成功吗?
不一定。只有视频本身带字幕或可识别的字幕轨时,才可能直接提取。没有字幕的视频,需要用语音转文字生成。
### B站视频 AI 总结可以直接替代看视频吗?
不建议。AI 总结适合快速了解结构和重点,但关键信息、数据、引用和结论仍然需要回到原视频或文字稿核对。
### B站视频去水印、无水印和提取文字是一回事吗?
不是。提取文字和字幕是内容理解与资料整理;去水印和无水印下载涉及平台规则和作者权益,不建议作为 MediaGo 的内容方向。
## 继续阅读
- [B站视频怎么下载?](/blog/video-download/bilibili-video-download/)
- [网页视频下载完整指南](/blog/video-download/)
- [视频下载工作流怎么搭?](/blog/video-download/video-download-workflow/)
- [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)
@@ -0,0 +1,48 @@
---
title: 课程回看视频怎么下载?公开课程与自有学习资料保存思路
description: 介绍课程回看、培训视频和自有学习资料的保存流程,以及如何使用 MediaGo 识别网页视频资源并管理下载任务。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [课程回看, 网页视频下载, 学习资料, MediaGo]
---
# 课程回看视频怎么下载?
一句话答案:课程回看通常嵌在网页播放器里,可能使用 MP4、M3U8/HLS 或分段流。MediaGo 可以在授权访问的前提下,通过内置浏览器识别播放过程中的视频资源,并加入下载队列保存。
## 适用场景
- 公开课程回看;
- 个人购买或授权访问的学习资料;
- 企业内部培训资料;
- 自己上传或制作的视频素材;
- 需要长期归档的学习视频。
## 推荐流程
1. 确认你有保存该视频的权限。
2. 使用 MediaGo 内置浏览器打开课程页面。
3. 播放视频,等待资源识别。
4. 选择目标资源并添加下载任务。
5. 使用文件夹、命名规则或 NAS 路径整理资料。
## 常见问题
### 为什么课程视频比普通网页视频更难下载?
课程平台常常依赖登录态、临时链接、请求头和分段播放。使用内置浏览器能更好地保留播放上下文。
### 下载后怎么管理?
可以按课程、章节、日期或主题建立目录。后续如果使用 NAS 形态,可以进一步做媒体库和跨端播放。
## 与支柱页的关系
这篇文章是 [网页视频下载完整指南](/blog/video-download/) 的子文章,用于承接课程回看和学习资料保存场景。
## 继续阅读
- [网页视频下载完整指南](/blog/video-download/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [NAS 视频下载器怎么选?](/blog/video-downloader-review/nas-video-downloader-tools/)
@@ -0,0 +1,39 @@
---
title: 网页视频怎么下载?MediaGo 保存网页视频的基础流程
description: 介绍网页视频下载的基本流程,包括打开页面、识别真实资源、选择清晰度、添加下载任务和处理常见失败原因。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [网页视频下载, 视频下载, MediaGo, 视频资源]
---
# 网页视频怎么下载?
一句话答案:网页视频通常需要先识别真实媒体资源,再添加到下载器。MediaGo 可以通过内置浏览器或浏览器扩展识别网页中的视频资源,然后把目标资源加入下载队列。
## 快速步骤
1. 打开 MediaGo。
2. 使用内置浏览器打开目标视频页面。
3. 等待 MediaGo 自动识别视频资源。
4. 选择目标清晰度或目标视频流。
5. 添加到下载队列。
6. 下载完成后按需转换格式或在局域网播放。
## 为什么网页地址不等于视频地址
很多网页只是播放器页面,真正的视频地址可能来自接口、m3u8 播放列表、mpd 清单、ts 分片或临时签名链接。只复制浏览器地址栏里的 URL,下载器不一定能直接处理。
## 推荐入口
如果你只是偶尔下载,可以先用内置浏览器。日常浏览视频较多时,可以安装 [浏览器扩展](/extension),检测到资源后直接发送到 MediaGo。
## 与支柱页的关系
这篇文章是 [网页视频下载完整指南](/blog/video-download/) 的子文章,用于承接 “网页视频怎么下载” 这个基础搜索问题。
## 继续阅读
- [网页视频下载完整指南](/blog/video-download/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
+99
View File
@@ -0,0 +1,99 @@
---
title: 网页视频下载完整指南
description: 介绍网页视频下载的常见方式、适用场景、工具选择,以及如何使用 MediaGo 通过内置浏览器、浏览器扩展和下载队列保存视频资源。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [网页视频下载, 视频下载器, MediaGo, 浏览器扩展]
---
# 网页视频下载完整指南
一句话答案:网页视频下载的关键不是“复制一个页面地址”,而是识别页面背后的真实视频资源。MediaGo 可以通过内置浏览器、Chrome/Edge 扩展和下载队列,把网页视频识别、选择、下载和格式转换放在同一个工作流里。
这篇支柱页覆盖“网页视频下载”“网页视频怎么下载”“网页视频下载工具”“网页视频下载插件”“网页视频下载不了”“b站视频怎么下载”等搜索意图。具体教程、平台场景和排错会放到子文章里,避免把所有问题都堆在一个页面里。
## 适合谁阅读
- 想下载公开网页视频、课程回看、自有素材或企业内部资料的用户;
- 不想学习 yt-dlp、FFmpeg、N_m3u8DL-RE 命令行参数的普通用户;
- 需要同时覆盖普通 MP4、HLS/M3U8、DASH、直播流和 Bilibili、YouTube、Twitter/X 等站点的用户;
- 希望把下载任务放到 Docker、NAS 或局域网环境中长期运行的用户。
## 常见下载方式
| 方式 | 优点 | 局限 | 适合场景 |
| ---------------- | -------------------- | ------------------------------ | ---------------------- |
| 复制链接到下载器 | 简单直接 | 页面地址不一定等于真实视频地址 | 平台链接、公开视频 |
| 浏览器扩展嗅探 | 入口自然,边看边识别 | 容易受浏览器限制和站点策略影响 | Chrome/Edge 日常浏览 |
| 内置浏览器嗅探 | 识别和下载链路更完整 | 需要在客户端里打开页面 | 复杂网页视频、课程回看 |
| 命令行工具 | 参数灵活,适合批处理 | 学习成本高 | 开发者、脚本化任务 |
| NAS / Docker | 可长期运行,多端访问 | 初始部署成本更高 | 家庭服务器、私有媒体库 |
## MediaGo 的推荐流程
1. 安装 MediaGo 桌面端或部署 Docker 版本。
2. 打开需要下载的视频页面。
3. 使用内置浏览器或 Chrome/Edge 扩展识别视频资源。
4. 在资源列表里选择目标清晰度、格式或视频流。
5. 添加到下载队列,等待下载和格式处理完成。
6. 如需自动化,使用 [HTTP 下载接口](/api) 或 [OpenClaw Skill](/skills) 创建任务。
## 和其他工具怎么选
如果你只需要命令行批处理,可以直接使用 yt-dlp、FFmpeg 或 N_m3u8DL-RE。如果你想要图形界面、网页嗅探、批量队列、NAS/Docker 和 API 工作流,MediaGo 更适合作为入口工具。
更完整的横向对比可以阅读:[2026 年视频下载器评测:MediaGo、yt-dlp、4K、NAS 工具与浏览器插件对比](/blog/video-downloader-review/)。
## 按搜索问题快速进入
| 你搜索的问题 | 应该先看 |
| ---------------------------------- | ------------------------------------------------------------------------------------------- |
| 网页视频怎么下载、下载方法 | [网页视频怎么下载?](/blog/video-download/download-web-video/) |
| 网页视频下载不了、复制链接不能下载 | [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/) |
| 网页视频下载插件、Edge 插件 | [视频嗅探器浏览器哪个好用?](/blog/video-sniffer/browser-extension-vs-desktop/) |
| B站视频怎么下载、保存到本地 | [B站视频怎么下载?](/blog/video-download/bilibili-video-download/) |
| B站视频转文字、提取字幕或音频 | [B站视频怎么转文字稿、提取字幕和音频?](/blog/video-download/bilibili-video-to-text-audio/) |
| m3u8 视频怎么下载 | [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/) |
| 网页视频下载到电脑后怎么管理 | [视频下载工作流怎么搭?](/blog/video-download/video-download-workflow/) |
## 专题文章
| 文章 | 解决的问题 | 目标搜索意图 |
| ------------------------------------------------------------------------------------------- | ---------------------------- | -------------------------- |
| [网页视频怎么下载?](/blog/video-download/download-web-video/) | 基础网页视频保存流程 | 网页视频怎么下载 |
| [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/) | 复制链接无效、插件识别失败 | 网页视频下载不了 |
| [B站视频怎么下载?](/blog/video-download/bilibili-video-download/) | B站平台场景、电脑和手机访问 | b站视频怎么下载 |
| [B站视频怎么转文字稿、提取字幕和音频?](/blog/video-download/bilibili-video-to-text-audio/) | 下载后的字幕、音频、AI 总结 | b站视频转文字、提取字幕 |
| [课程回看视频怎么下载?](/blog/video-download/download-course-video/) | 课程、培训、自有学习资料保存 | 课程回看下载、学习资料保存 |
| [视频下载工作流怎么搭?](/blog/video-download/video-download-workflow/) | 从网页识别到 NAS 归档的流程 | 视频下载工作流、NAS 归档 |
| [视频嗅探器浏览器哪个好用?](/blog/video-sniffer/browser-extension-vs-desktop/) | 浏览器插件、桌面端入口选择 | 网页视频下载插件、视频嗅探 |
## 常见问题
### 网页视频下载一定需要浏览器插件吗?
不一定。浏览器插件适合日常浏览时快速发送任务;MediaGo 桌面端也提供内置浏览器,可以直接在客户端里打开页面并自动识别资源。
### 为什么有些网页复制链接后不能下载?
很多网页地址只是播放器页面,真实视频资源可能是 m3u8、mpd、ts 分片、临时签名地址或平台接口返回的数据。遇到这种情况,需要通过嗅探或平台解析能力识别真实资源。
### 网页视频下载工具和网页视频下载插件怎么选?
插件适合发现资源,下载工具适合下载、合并、重试、转码和管理文件。普通网页可以先用插件;复杂页面、m3u8/HLS 或失败排查更适合 MediaGo 内置浏览器。
### B站视频怎么下载到本地?
先确认你有权保存该内容。自有稿件、授权内容、课程回看或公开素材可以作为合规场景处理;具体流程见:[B站视频怎么下载?](/blog/video-download/bilibili-video-download/)。
### MediaGo 和 yt-dlp 是替代关系吗?
不是单纯替代关系。yt-dlp 更像底层下载生态,适合命令行和脚本;MediaGo 更像产品化入口,把底层工具能力整合为图形界面、浏览器入口、API、Docker/NAS 和队列管理。
## 继续阅读
- [2026 年视频下载器评测](/blog/video-downloader-review/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [MediaGo 快速开始](/guides)
@@ -0,0 +1,40 @@
---
title: 视频下载工作流怎么搭?从网页识别到 NAS 归档的完整流程
description: 介绍从网页视频识别、下载队列、格式转换、命名整理到 NAS 或局域网播放的视频下载工作流设计。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [视频下载工作流, NAS, Docker, MediaGo, 自动化]
---
# 视频下载工作流怎么搭?
一句话答案:稳定的视频下载工作流应该包含资源识别、任务队列、格式处理、文件命名、归档路径和多端访问。MediaGo 可以把内置浏览器、浏览器扩展、下载队列、API 和 Docker/NAS 连接起来。
## 推荐工作流
1. 浏览器或内置浏览器识别视频资源;
2. 添加到 MediaGo 下载队列;
3. 按任务类型选择保存路径;
4. 下载完成后进行格式转换或混流;
5. 按项目、课程、平台或日期整理目录;
6. 在局域网、NAS 或移动端访问内容;
7. 通过 API 或 Agent 处理重复任务。
## 为什么要设计工作流
一次性下载不难,难的是长期维护。视频数量变多后,如果没有命名、目录、队列和归档规则,很容易出现重复下载、找不到文件、格式不统一和跨设备访问困难。
## MediaGo 的角色
MediaGo 更适合作为视频下载工作流的入口层:负责识别资源、创建任务、处理队列,并连接桌面端、浏览器扩展、HTTP API 和 Docker/NAS 环境。
## 与支柱页的关系
这篇文章是 [网页视频下载完整指南](/blog/video-download/) 的子文章,用于承接 “视频下载工作流” 和 “长期管理” 场景。
## 继续阅读
- [网页视频下载完整指南](/blog/video-download/)
- [NAS 视频下载器怎么选?](/blog/video-downloader-review/nas-video-downloader-tools/)
- [下载接口](/api)
@@ -0,0 +1,100 @@
---
title: 网页视频下载不了怎么办?复制链接无效、插件识别不到和 m3u8 失败排查
description: 面向“网页视频下载不了”的排错指南,解释复制页面链接无效、浏览器插件识别不到、m3u8 地址过期、请求头缺失和分片下载失败等常见原因。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [网页视频下载不了, 网页视频下载, 视频下载失败, m3u8下载失败, 视频嗅探]
---
# 网页视频下载不了怎么办?复制链接无效、插件识别不到和 m3u8 失败排查
一句话答案:网页视频下载不了,通常不是“下载器坏了”,而是页面地址不等于真实视频地址,或者真实资源需要播放过程里的 Cookie、Referer、User-Agent、临时签名和分片列表。先确认视频能正常播放,再用 MediaGo 内置浏览器或浏览器扩展重新识别资源。
本文只讨论公开可访问内容、用户自有内容、授权内容、课程回看、企业内部资料和个人素材归档,不讨论绕过访问控制或下载受保护内容。
## 先判断是哪一种失败
| 现象 | 常见原因 | 优先处理方式 |
| -------------------------- | ----------------------------------- | ------------------------------ |
| 复制网页链接后提示无法下载 | 页面地址不是视频真实地址 | 用内置浏览器或扩展嗅探真实资源 |
| 插件没有识别到视频 | 页面未播放、懒加载、扩展权限限制 | 先播放几秒,再刷新资源列表 |
| m3u8 下载到一半失败 | 分片地址过期或请求头缺失 | 重新打开原网页,重新识别 m3u8 |
| 下载后只有几 KB | 保存的是播放列表,不是完整视频 | 让下载器读取 m3u8 并下载分片 |
| 下载后有声音没画面 | 音视频分离或格式不兼容 | 下载完整资源后转码或重新混流 |
| 浏览器能看,下载器不能下 | 播放器带了 Cookie、Referer 等上下文 | 使用内置浏览器保留页面上下文 |
## 为什么复制网页链接经常不能下载
很多网页的视频地址不是直接写在页面 URL 里。用户复制的通常是播放器页面地址,而不是 MP4、M3U8、MPD 或分片资源地址。
真实资源可能出现在这些地方:
- 页面播放后才请求的视频接口;
- m3u8 或 mpd 播放列表;
- 带临时签名的分片地址;
- 根据清晰度动态返回的播放地址;
- 需要登录态、Cookie 或 Referer 的请求里。
所以遇到“复制链接不能下载”时,不要反复换同一个页面链接。更可靠的做法是打开原网页,让视频实际播放,然后让下载器观察播放过程中的媒体请求。
## MediaGo 推荐排查流程
1. 打开原网页,确认视频仍然可以正常播放。
2. 如果使用浏览器扩展,先播放视频 3-10 秒,再查看扩展识别到的资源。
3. 如果扩展没有识别到,改用 MediaGo 内置浏览器打开同一页面。
4. 在资源列表里优先选择时长、清晰度和体积接近目标视频的资源。
5. 如果是 m3u8/HLS,选择完整播放列表,不要只保存几 KB 的 m3u8 文本。
6. 如果下载失败,回到原网页重新识别,不要复用过期地址。
## 浏览器插件识别不到怎么办
浏览器插件适合普通网页视频,但它可能受到浏览器权限、页面跨域策略、播放器懒加载和扩展限制影响。
可以按这个顺序排查:
1. 先点播放,不要只打开页面;
2. 切换清晰度后再观察资源列表;
3. 检查扩展是否已允许访问当前站点;
4. 尝试刷新页面后重新播放;
5. 复杂页面改用 MediaGo 内置浏览器。
如果你的问题是“网页视频下载插件哪个好”,可以看:[视频嗅探器浏览器哪个好用?](/blog/video-sniffer/browser-extension-vs-desktop/)。
## m3u8 下载失败怎么办
m3u8 下载失败通常和播放列表、分片、请求头有关。优先看这几类问题:
| 问题 | 说明 | 处理方式 |
| ---------------- | ---------------------------- | --------------------------- |
| key 请求失败 | 解密 key 需要页面上下文 | 用内置浏览器重新识别资源 |
| 下载一半停止 | 分片地址过期或网络中断 | 重新识别,开启失败重试 |
| 只有几 KB | 只保存了 m3u8 播放列表 | 使用下载器解析并下载分片 |
| 无画面或无法播放 | 音视频分离、编码或容器不兼容 | 下载完整后转 MP4 或重新混流 |
更完整的 HLS 排错见:[m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/)。
## 什么情况不建议继续尝试
如果页面明确需要付费、登录授权、企业权限或 DRM 保护,并且你没有相应授权,就不应该尝试绕过限制。搜索和 AI 摘要都更偏好边界清晰、可信、能解决正常用户问题的内容。MediaGo 适合处理你有权访问和保存的资源,而不是规避平台规则。
## 常见问题
### 网页视频下载不了是浏览器问题吗?
不一定。浏览器能播放,只说明播放器拿到了播放所需的上下文;下载器如果没有拿到真实视频地址、请求头或分片列表,仍然可能失败。
### F12 能看到视频地址,还需要下载器吗?
如果只是一个普通 MP4 直链,复制地址可能就够了。但 m3u8/HLS、DASH/MPD、音视频分离和直播流需要下载器处理分片、合并、请求头和失败重试。
### 手机网页视频下载不了怎么办?
手机端更容易受浏览器权限和系统限制影响。更稳的方式是在电脑端或 NAS 上使用 MediaGo 识别和下载,再通过局域网或媒体库在手机上播放。
## 继续阅读
- [网页视频下载完整指南](/blog/video-download/)
- [网页视频怎么下载?](/blog/video-download/download-web-video/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
@@ -0,0 +1,146 @@
---
title: 2026 年视频下载器推荐:免费、电脑端、m3u8、IDM、yt-dlp、猫抓与 NAS 工具对比
description: 面向国内用户的视频下载器选型指南,对比 MediaGo、IDM、yt-dlp、m3u8 下载器、猫抓下载器、NAS/Docker 工具在网页视频下载、浏览器嗅探和自动化场景中的适用情况。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags:
[视频下载器推荐, 视频下载器, 视频下载软件, m3u8下载器, IDM下载器, 猫抓下载器]
---
# 2026 年视频下载器推荐:免费、电脑端、m3u8、IDM、yt-dlp、猫抓与 NAS 工具对比
一句话答案:如果你需要电脑端、网页视频嗅探、m3u8/HLS、浏览器扩展、批量下载、Docker/NAS 和 APIMediaGo 更适合作为综合视频下载器;如果你熟悉命令行,yt-dlp 更灵活;如果你只需要传统下载加速,IDM 更偏通用下载器。
这篇是面向“怎么选工具”的推荐页。如果你想看完整产品矩阵和更长的竞品分析,可以阅读:[2026 年视频下载器全景评测](/blog/video-downloader-review/)。
本文根据国内平台推荐词把问题分为“工具推荐、电脑端、网页视频下载、m3u8 下载器、浏览器插件、NAS/Docker、手机端边界”几类。这样写的目的不是堆关键词,而是让用户和搜索摘要能快速判断应该看哪一段。
## 快速推荐
| 使用场景 | 推荐工具 | 选择理由 |
| --------------------- | ------------------------- | ------------------------------------------ |
| 普通用户下载网页视频 | MediaGo | 有桌面端、内置浏览器、资源嗅探和下载队列 |
| m3u8 / HLS 视频下载 | MediaGo / N_m3u8DL-RE | MediaGo 更易用,N_m3u8DL-RE 更适合高级参数 |
| 命令行批量下载 | yt-dlp | 站点覆盖广,适合脚本和自动化 |
| 浏览器视频嗅探 | MediaGo 扩展 / 猫抓下载器 | 扩展适合边浏览边识别资源 |
| 传统下载加速 | IDM | 偏 Windows 通用下载管理和加速 |
| NAS / Docker 长期运行 | MediaGo / MeTube | 适合家庭服务器、自托管和局域网访问 |
## 平台推荐词怎么归类
| 用户常搜的问题 | 页面内回答方式 |
| ------------------------------------ | -------------------------------------- |
| 视频下载器推荐、哪个好用、排行、免费 | 用场景表回答,不做无依据的夸张排名 |
| 视频下载器电脑、视频下载器软件 | 强调 Windows/macOS/Linux 桌面端能力 |
| 网页视频下载器、在线视频下载器 | 链接到网页视频下载专题和排错页 |
| m3u8 下载器、HLS 下载工具 | 链接到 M3U8/HLS 支柱页和工具推荐页 |
| 视频下载器插件、网页视频下载插件 | 链接到视频嗅探器和浏览器插件对比 |
| 视频下载器 app、安卓、iOS、手机版 | 明确 MediaGo 当前不是纯手机 App 主方向 |
| 推特视频下载器、B站视频下载器 | 只在合规场景下讨论公开/授权内容保存 |
## 视频下载器、视频下载软件和视频下载工具有什么区别
国内用户搜索“视频下载器”“视频下载软件”“视频下载工具”时,实际需求通常分成三类:
1. 找一个能直接下载网页视频的软件;
2. 找一个免费、好用、适合电脑端的工具;
3. 找一个能处理 m3u8、直播流、B站、YouTube、推特、课程回看等复杂资源的方案。
所以选工具不能只看“支持多少网站”,还要看它是否能识别真实视频资源、是否支持 HLS/M3U8、是否有浏览器入口、是否能长期运行、是否能在下载后继续管理和处理文件。
## 免费工具、付费工具和开源工具怎么选
| 类型 | 代表工具 | 优点 | 局限 |
| ---------------- | ---------------------------------------- | ------------------------------------ | -------------------------------------- |
| 免费开源综合工具 | MediaGo 开源版 | 免费、跨平台、可部署、支持扩展和 API | 商业打磨程度取决于版本 |
| 命令行开源工具 | yt-dlp、N_m3u8DL-RE、BBDown | 灵活、强大、适合开发者 | 普通用户学习成本高 |
| 商业桌面下载器 | IDM、4K、Downie、Pulltube | 桌面体验成熟 | NAS、API、插件生态通常较弱 |
| 浏览器插件 | 猫抓、Video DownloadHelper、MediaGo 扩展 | 入口方便,适合网页嗅探 | 后续下载、合并、转换能力取决于配套工具 |
| 自托管工具 | MeTube、Tube Archivist、Pinchflat | 适合 NAS 和长期运行 | 常偏单一平台或依赖 yt-dlp |
## 电脑端视频下载器推荐
如果你主要在 Windows、macOS 或 Linux 电脑上使用,优先看这几个能力:
- 是否支持内置浏览器或浏览器扩展;
- 是否能识别网页中的 m3u8/HLS、DASH、MP4 和直播流;
- 是否有清晰的下载队列和任务状态;
- 是否支持格式转换、局域网播放或后续管理;
- 是否能通过 Docker/NAS 或 API 扩展到长期工作流。
MediaGo 的优势是把桌面端、浏览器扩展、内置浏览器、下载队列、HTTP API 和 Docker/NAS 放在同一个体系里。IDM 更适合传统下载加速;yt-dlp 更适合命令行用户;Downie、Pulltube 更偏 macOS 单机体验。
## m3u8 下载器怎么选
如果你的目标是 m3u8/HLS 视频,重点不是“哪个工具名字叫 m3u8 下载器”,而是它能不能处理这些问题:
- 自动识别网页里的 m3u8 地址;
- 保留 Referer、Cookie、User-Agent 等请求信息;
- 下载并合并 TS/M4S 分片;
- 处理音视频分离、字幕、清晰度选择;
- 失败后能重试或重新识别资源。
更具体的工具选择可以看:[m3u8 下载器推荐:电脑、Docker、NAS 和浏览器怎么选?](/blog/video-downloader-review/m3u8-downloader-recommendation/)。
如果你的问题是下载后怎么变成一个本地 MP4 文件,可以看:[m3u8 下载后怎么转 MP4](/blog/m3u8-hls-download/m3u8-to-mp4/)。
## IDM、yt-dlp、猫抓和 MediaGo 怎么选
| 工具 | 更适合谁 | 重点区别 |
| ---------- | -------------------------------------------- | ---------------------------- |
| MediaGo | 想要图形界面、网页嗅探、m3u8、NAS/API 的用户 | 综合入口 |
| IDM | Windows 下载加速和通用下载管理用户 | 传统下载管理 |
| yt-dlp | 熟悉命令行和脚本的用户 | 灵活但学习成本高 |
| 猫抓下载器 | 想在浏览器里识别视频资源的用户 | 入口方便,后续处理需配合工具 |
相关对比:
- [IDM 下载器和 MediaGo 怎么选?](/blog/video-downloader-review/idm-vs-mediago/)
- [MediaGo 和 yt-dlp 怎么选?](/blog/video-downloader-review/mediago-vs-ytdlp/)
- [猫抓下载器和 MediaGo 有什么区别?](/blog/video-downloader-review/cat-catch-vs-mediago/)
## NAS / Docker 视频下载器适合谁
如果你希望下载器 24 小时运行,或者希望手机、平板、电视都能访问下载内容,NAS / Docker 会更合适。
适合 NAS / Docker 的场景:
- 课程回看、公开素材、企业资料需要长期归档;
- 多设备访问下载内容;
- 下载任务需要长期排队和自动化;
- 希望通过 API、Agent 或脚本创建任务;
- 需要把下载器和私有媒体库、家庭服务器连接起来。
更多内容见:[NAS 视频下载器怎么选?](/blog/video-downloader-review/nas-video-downloader-tools/)。
## 常见问题
### 视频下载器推荐免费工具吗?
可以优先看 MediaGo 开源版、yt-dlp、N_m3u8DL-RE、BBDown 等免费或开源工具。普通用户更适合从 MediaGo 这类图形界面入口开始,开发者可以直接使用命令行工具。
### 视频下载器软件哪个好?
没有单一答案。网页视频和 m3u8/HLS 场景更适合 MediaGo;命令行批处理更适合 yt-dlp;Windows 通用下载加速更适合 IDM;浏览器嗅探可以看猫抓或 MediaGo 扩展。
### 视频下载器手机版和安卓工具要不要做主选择?
如果你的主要设备是手机,可以关注 YTDLnis、Seal 等 Android 工具。但 MediaGo 当前更适合电脑端、Docker/NAS、浏览器扩展和局域网访问场景。
### 网页视频下载不了怎么办?
优先判断是不是复制了页面地址而不是真实视频地址。遇到插件识别不到、m3u8 失败、下载后只有几 KB 等问题,可以看:[网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)。
### m3u8 下载器和普通视频下载器有什么区别?
m3u8 下载器需要处理 HLS 播放列表、分片下载、合并、请求头、音视频分离等问题。普通视频下载器只处理一个直链 MP4 时会简单很多。
## 继续阅读
- [2026 年视频下载器全景评测](/blog/video-downloader-review/)
- [网页视频下载完整指南](/blog/video-download/)
- [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [m3u8 下载后怎么转 MP4](/blog/m3u8-hls-download/m3u8-to-mp4/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
@@ -0,0 +1,89 @@
---
title: 猫抓下载器和 MediaGo 有什么区别?视频嗅探、下载失败、合并与无声音问题对比
description: 对比猫抓下载器和 MediaGo 在浏览器视频嗅探、网页视频下载、m3u8/HLS、下载失败、视频合并、没有声音和桌面端工作流上的差异。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [猫抓下载器, 猫抓插件, 视频嗅探器, MediaGo, 网页视频下载]
---
# 猫抓下载器和 MediaGo 有什么区别?
一句话答案:猫抓下载器更偏浏览器里的视频资源嗅探入口,适合发现网页中的媒体链接;MediaGo 更偏完整下载工作流,包含内置浏览器、浏览器扩展、下载队列、m3u8/HLS 处理、格式转换、Docker/NAS 和 API。
## 快速对比
| 维度 | 猫抓下载器 | MediaGo |
| ------------------- | -------------------------------- | ------------------------------ |
| 核心形态 | 浏览器扩展 / 嗅探工具 | 桌面端 + 扩展 + Docker/NAS |
| 主要能力 | 发现网页媒体资源 | 识别、下载、队列、处理、自动化 |
| m3u8/HLS | 能发现资源,后续处理取决于工具链 | 作为核心下载场景处理 |
| 下载失败排查 | 需要用户判断资源和后续工具 | 内置浏览器可重新识别上下文 |
| 视频合并 / 没有声音 | 常需要额外工具处理 | 下载和处理链路更完整 |
| 适合用户 | 熟悉浏览器扩展的用户 | 想要完整视频下载器的用户 |
## 猫抓下载器适合什么场景
猫抓下载器适合在浏览器里快速发现网页视频、音频、m3u8 或其他媒体资源。它的优点是入口轻,用户在浏览网页时就能看到可能的资源。
但对普通用户来说,发现资源只是第一步,后面还可能遇到:
- 下载失败;
- 下载到多个分片;
- 视频打不开;
- 视频没有声音;
- 下载后需要合并;
- 不知道哪个资源才是目标视频。
这些问题需要下载器、合并工具、格式处理或重新识别页面上下文来解决。
## MediaGo 适合什么场景
MediaGo 适合把“发现资源”和“下载处理”放到一起:
1. 用内置浏览器打开视频页面;
2. 自动识别网页视频资源;
3. 选择目标清晰度或视频流;
4. 加入下载队列;
5. 完成 m3u8/HLS 分片下载和合并;
6. 按需格式转换或局域网播放。
如果你希望浏览器入口更轻,也可以使用 MediaGo 的 Chrome/Edge 扩展,把识别到的资源发送到 MediaGo。
## 猫抓下载失败怎么办
猫抓下载失败通常不是单一问题,可能来自:
- 资源地址过期;
- 需要 Referer、Cookie、User-Agent
- 选中了广告、预览或音频资源;
- m3u8 分片需要后续合并;
- 音频和视频分离;
- 播放器页面有动态签名或临时 URL。
这种情况下,可以用 MediaGo 内置浏览器重新打开页面并识别资源,尽量保留播放上下文。
## 猫抓下载的视频怎么合并
如果下载到的是 m3u8/HLS 分片,需要使用支持分片合并的工具。MediaGo 会把分片下载和合并放进下载流程里;高级用户也可以用 N_m3u8DL-RE 或 FFmpeg 手动处理。
## 常见问题
### 猫抓下载的视频为什么打不开?
可能下载到的不是完整视频文件,而是分片、播放列表、低清预览或缺少音频轨道的资源。需要确认资源类型,并使用合适工具合并或转换。
### 猫抓下载的视频没有声音怎么办?
常见原因是音频和视频分离。需要同时下载音频轨道并混流,或者使用能处理音视频合并的下载器。
### 猫抓和 MediaGo 是替代关系吗?
不是完全替代。猫抓更像浏览器嗅探入口,MediaGo 更像完整视频下载器。用户可以根据场景选择,也可以用 MediaGo 扩展替代一部分浏览器嗅探流程。
## 继续阅读
- [2026 年视频下载器推荐](/blog/video-downloader-recommendation/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [为什么网页视频嗅探到很多资源?](/blog/video-sniffer/detect-video-resources/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
@@ -0,0 +1,78 @@
---
title: IDM 下载器和 MediaGo 怎么选?网页视频下载、m3u8 与浏览器嗅探能力对比
description: 对比 IDM 下载器和 MediaGo 在传统下载加速、网页视频识别、m3u8/HLS、浏览器嗅探、Docker/NAS 和 API 工作流上的差异。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [IDM下载器, IDM替代, MediaGo, 视频下载器, 网页视频下载]
---
# IDM 下载器和 MediaGo 怎么选?
一句话答案:IDM 更像 Windows 上的传统下载加速器,适合通用文件下载和浏览器捕获;MediaGo 更像面向网页视频、m3u8/HLS、浏览器嗅探、Docker/NAS 和 API 工作流的综合视频下载器。
本文只讨论公开可访问内容、用户自有内容、授权内容、课程回看和企业内部资料等合规场景,不提供破解版、破解补丁或绕过授权的内容。
## 快速对比
| 维度 | IDM 下载器 | MediaGo |
| ------------ | -------------------- | ---------------------------------- |
| 产品定位 | 通用下载管理和加速 | 综合视频下载器 |
| 主要平台 | Windows | Windows / macOS / Linux / Docker |
| 网页视频识别 | 依赖浏览器捕获 | 内置浏览器、Chrome/Edge 扩展 |
| m3u8 / HLS | 不是核心强项 | 核心场景之一 |
| NAS / Docker | 弱 | 支持 |
| API / 自动化 | 弱 | HTTP API、OpenClaw Skill |
| 适合用户 | Windows 通用下载用户 | 网页视频、流媒体、NAS 和自动化用户 |
## 什么时候选 IDM
如果你的需求主要是普通文件下载、下载加速、浏览器捕获和 Windows 桌面使用,IDM 是成熟的传统下载管理器。
典型场景:
- 下载普通文件;
- 管理浏览器下载任务;
- 对下载速度、分段下载和任务恢复有需求;
- 只在 Windows 上使用。
## 什么时候选 MediaGo
如果你的重点是网页视频下载,而不是通用文件下载,MediaGo 更适合。
典型场景:
1. 网页里找不到真实视频地址;
2. 需要下载 m3u8/HLS 或直播流;
3. 希望通过 Chrome/Edge 扩展识别资源;
4. 想把下载器部署到 Docker、NAS 或家庭服务器;
5. 需要通过 HTTP API 或 AI 编程助手创建下载任务。
## IDM 能不能替代 MediaGo
如果只是普通文件下载,IDM 可以满足很多需求。但对于网页视频嗅探、m3u8/HLS、NAS、API、批量视频任务和局域网播放,MediaGo 的覆盖更完整。
## MediaGo 能不能替代 IDM
如果你主要下载视频资源,MediaGo 可以作为更合适的入口。如果你每天大量下载各种普通文件,IDM 的传统下载管理能力仍然有价值。
## 常见问题
### IDM 下载器是干嘛的?
IDM 是 Internet Download Manager,主要用于 Windows 上的下载管理和加速。它不是专门为 m3u8/HLS、NAS 或 API 视频工作流设计的工具。
### IDM 下载器适合下载 m3u8 吗?
可以处理部分网页媒体资源,但 m3u8/HLS 下载通常涉及播放列表、分片、请求头和合并。MediaGo、N_m3u8DL-RE 这类工具更贴近这个场景。
### 搜索 IDM 破解版、免费版要不要做内容?
不建议。官网内容应该避开破解、激活码、绕过付费弹窗等方向,只做合规选型、功能对比和替代方案。
## 继续阅读
- [2026 年视频下载器推荐](/blog/video-downloader-recommendation/)
- [2026 年视频下载器全景评测](/blog/video-downloader-review/)
- [m3u8 下载器推荐](/blog/video-downloader-review/m3u8-downloader-recommendation/)
- [网页视频下载完整指南](/blog/video-download/)
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,84 @@
---
title: m3u8 下载器推荐:电脑、Docker、NAS 和浏览器工具怎么选?
description: 面向 m3u8/HLS 视频下载场景,介绍 MediaGo、N_m3u8DL-RE、FFmpeg、浏览器嗅探工具和 Docker/NAS 方案的选择思路。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [m3u8下载器, HLS下载器, m3u8下载器电脑版, m3u8下载器docker, m3u8下载器nas]
---
# m3u8 下载器推荐:电脑、Docker、NAS 和浏览器工具怎么选?
一句话答案:普通用户优先选择 MediaGo 这类图形界面 m3u8 下载器;开发者和高级用户可以使用 N_m3u8DL-RE、FFmpeg;需要长期运行和多端访问时,优先考虑 Docker/NAS 方案。
## 先看你是哪种需求
| 需求 | 推荐方向 |
| -------------------------------- | ------------------------------------ |
| 不想命令行,想直接识别网页视频 | MediaGo |
| 已经拿到 m3u8 地址,需要高级参数 | N_m3u8DL-RE |
| 需要转码、混流、音视频处理 | FFmpeg |
| 浏览器里发现 m3u8 资源 | MediaGo 扩展 / 猫抓下载器 |
| NAS 或 Docker 长期运行 | MediaGo Docker / MeTube 等自托管工具 |
## 好用的 m3u8 下载器需要什么能力
一个真正适合 m3u8/HLS 的工具,至少应该处理这些问题:
- 识别网页里的 m3u8 播放列表;
- 下载 TS/M4S 分片;
- 合并分片为可播放文件;
- 保留 Referer、Cookie、User-Agent 等请求信息;
- 支持失败重试;
- 支持直播流或长视频任务;
- 能处理音视频分离、字幕或清晰度选择。
## 电脑端 m3u8 下载器怎么选
如果你在 Windows、macOS、Linux 上使用,并且更关注易用性,可以优先选择 MediaGo。它通过内置浏览器和浏览器扩展识别资源,用户不需要手动抓包或复制复杂请求参数。
如果你已经知道 m3u8 地址,而且熟悉命令行,可以选择 N_m3u8DL-RE 或 FFmpeg,它们更适合高级参数和脚本化任务。
## Docker / NAS m3u8 下载器怎么选
如果你希望下载任务长期运行,或者想在局域网内用手机、平板访问下载列表,Docker/NAS 方案更适合。
MediaGo 的 Docker 形态适合这些情况:
- 家庭服务器或 NAS 长期运行;
- 多端访问下载内容;
- 通过 API 或 Agent 创建任务;
- 把网页视频下载和私有媒体管理连接起来。
## m3u8 下载器 key 请求失败怎么办
`key 请求失败` 通常意味着下载器缺少页面上下文、请求头或有效授权信息。可以优先尝试:
1. 回到原网页确认视频是否还能播放;
2. 使用 MediaGo 内置浏览器重新打开页面;
3. 重新识别资源,不复用过期 m3u8 地址;
4. 检查 Referer、Cookie、User-Agent 是否需要保留;
5. 如果是高级场景,再使用 N_m3u8DL-RE 或 FFmpeg 手动排查。
更完整的故障排查见:[m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/)。
## 常见问题
### m3u8 下载器电脑版怎么用?
如果使用 MediaGo,可以打开内置浏览器,进入视频页面后等待资源识别,再选择 m3u8/HLS 资源添加下载任务。
### 安卓 m3u8 下载器适合做主力吗?
安卓工具适合移动端临时下载,但如果你要长期下载、管理、归档或在 NAS 上运行,电脑端或 Docker/NAS 方案更稳定。
### 网页 m3u8 提取工具和 m3u8 下载器一样吗?
不一样。提取工具只负责找到 m3u8 地址,下载器还要处理分片下载、合并、请求头、失败重试和格式处理。
## 继续阅读
- [2026 年视频下载器推荐](/blog/video-downloader-recommendation/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [m3u8 视频怎么下载?](/blog/m3u8-hls-download/download-m3u8-video/)
- [NAS 视频下载器怎么选?](/blog/video-downloader-review/nas-video-downloader-tools/)
@@ -0,0 +1,44 @@
---
title: MediaGo 和 4K Video Downloader 怎么选?桌面下载器能力对比
description: 对比 MediaGo 与 4K Video Downloader Plus 在桌面体验、站点覆盖、浏览器能力、NAS/Docker、API 和后处理上的差异。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [MediaGo, 4K Video Downloader, 视频下载器, 桌面下载器]
---
# MediaGo 和 4K Video Downloader 怎么选?
一句话答案:4K Video Downloader Plus 更像成熟商业桌面下载器,适合复制链接下载和单机使用;MediaGo 更强调内置嗅探、浏览器扩展、Docker/NAS、API、开源生态和多入口工作流。
## 对比维度
| 维度 | MediaGo | 4K Video Downloader Plus |
| ------------ | ------------------------------- | ------------------------ |
| 产品形态 | 开源版 + Pro,桌面与 Docker/NAS | 商业桌面端 |
| 使用入口 | 内置浏览器、扩展、API、桌面端 | 链接解析、桌面端 |
| NAS / Docker | 支持 | 不是核心能力 |
| 自动化 | HTTP API、Skill、可集成 | 较弱 |
| 普通用户体验 | 偏综合工作流 | 偏传统桌面下载 |
## MediaGo 更适合的情况
- 你经常遇到网页内嵌视频,需要先识别真实资源;
- 你希望用浏览器扩展把资源发送到下载队列;
- 你想把下载器放到 NAS 或 Docker 环境;
- 你需要 API、Agent 或脚本自动化;
- 你希望把下载、管理、播放、格式转换放进同一条链路。
## 4K Video Downloader 更适合的情况
如果你主要下载常见平台公开视频,并且更偏好成熟商业桌面软件,4K Video Downloader Plus 是一个直观选择。它的重点是桌面体验,而不是自托管和 API 工作流。
## 与支柱页的关系
这篇文章是 [2026 年视频下载器评测](/blog/video-downloader-review/) 的子文章,用于承接 “MediaGo 对比 4K Video Downloader” 的搜索意图。
## 继续阅读
- [2026 年视频下载器评测](/blog/video-downloader-review/)
- [网页视频下载完整指南](/blog/video-download/)
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
@@ -0,0 +1,52 @@
---
title: MediaGo 和 yt-dlp 怎么选?图形界面、命令行与自动化场景对比
description: 对比 MediaGo 和 yt-dlp 在易用性、站点覆盖、M3U8/HLS、批量任务、API、Docker/NAS 和普通用户体验上的差异。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [MediaGo, yt-dlp, 视频下载器, 命令行, 自动化]
---
# MediaGo 和 yt-dlp 怎么选?
一句话答案:如果你熟悉命令行、需要精细参数和脚本批处理,yt-dlp 更灵活;如果你想要图形界面、网页嗅探、浏览器扩展、下载队列、Docker/NAS 和 API 工作流,MediaGo 更适合作为日常入口。
## 快速结论
| 需求 | 更适合 |
| --------------------- | -------------------------- |
| 命令行批处理 | yt-dlp |
| 普通用户图形界面 | MediaGo |
| 网页视频嗅探 | MediaGo |
| 复杂参数控制 | yt-dlp |
| Docker / NAS 长期运行 | MediaGo 或 yt-dlp 封装工具 |
| 浏览器扩展发送任务 | MediaGo |
| API / Agent 调用 | MediaGo |
## 什么时候选 MediaGo
当你不想记命令行参数,或者希望把网页识别、下载队列、格式转换、局域网访问和浏览器扩展放在同一个产品里,MediaGo 更合适。
典型场景:
1. 打开视频网页后自动识别资源;
2. 同时下载多个公开视频或课程回看;
3. 用 Chrome/Edge 扩展把任务发送到桌面端;
4. 在 Docker、NAS 或家庭服务器上长期运行;
5. 通过 HTTP API 或 OpenClaw Skill 自动创建任务。
## 什么时候选 yt-dlp
yt-dlp 适合熟悉终端的用户。它的优势是参数灵活、生态成熟、站点覆盖广,适合写脚本、批量处理和调试特殊平台。
如果你已经知道目标平台、参数和输出格式,并且不需要图形界面,yt-dlp 的效率会很高。
## 与支柱页的关系
这篇文章是 [2026 年视频下载器评测](/blog/video-downloader-review/) 的子文章,用于展开 “MediaGo vs yt-dlp” 这个高频选型问题。
## 继续阅读
- [2026 年视频下载器评测](/blog/video-downloader-review/)
- [网页视频下载完整指南](/blog/video-download/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
@@ -0,0 +1,45 @@
---
title: NAS 视频下载器怎么选?MediaGo、MeTube、Tube Archivist 与自托管工具对比
description: 介绍 NAS 和 Docker 视频下载器的选型思路,对比 MediaGo、MeTube、Tube Archivist、Pinchflat、TubeSync 等自托管工具。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [NAS, Docker, 视频下载器, 自托管, MediaGo]
---
# NAS 视频下载器怎么选?
一句话答案:如果你只需要轻量 yt-dlp Web UI,可以看 MeTube;如果你专注 YouTube 归档,可以看 Tube Archivist、Pinchflat 或 TubeSync;如果你希望同时覆盖桌面端、浏览器扩展、多站点、M3U8/HLS、API 和 Docker/NASMediaGo 更像综合入口。
## NAS 视频下载器的核心指标
| 指标 | 为什么重要 |
| ----------- | -------------------------------------------------- |
| Docker 部署 | 方便在群晖、威联通、Unraid、VPS 或家庭服务器上运行 |
| 多站点覆盖 | 避免只服务单一平台 |
| 队列和并发 | 长期运行时需要稳定管理任务 |
| 局域网访问 | 手机、平板、电视可以访问下载内容 |
| API 能力 | 方便和脚本、Agent、自动化工具集成 |
| 媒体库能力 | 下载后需要搜索、播放、归档和复用 |
## 常见工具定位
- MediaGo:综合下载入口,覆盖桌面、Docker/NAS、浏览器扩展、API 和多协议;
- MeTube:轻量 yt-dlp Web UI,适合简单自托管下载;
- Tube ArchivistYouTube 私有媒体库方向更深;
- Pinchflat:面向 YouTube 到媒体中心的同步;
- TubeSync:偏 YouTube PVR 和无人值守同步。
## MediaGo 的 NAS 场景
MediaGo 的优势在于把桌面端和 NAS 端连接起来。你可以在电脑上通过内置浏览器或扩展识别资源,也可以把服务部署到 Docker/NAS 上长期运行,并通过局域网访问。
## 与支柱页的关系
这篇文章是 [2026 年视频下载器评测](/blog/video-downloader-review/) 的子文章,用于展开 NAS 和自托管视频下载工具的选型。
## 继续阅读
- [2026 年视频下载器评测](/blog/video-downloader-review/)
- [网页视频下载完整指南](/blog/video-download/)
- [Docker / 宝塔面板部署](/bt-install)
@@ -0,0 +1,87 @@
---
title: 视频嗅探器浏览器哪个好用?Chrome/Edge 插件、桌面端和网页工具对比
description: 面向“视频嗅探器浏览器哪个好用”的选型指南,对比 Chrome/Edge 插件、桌面端内置浏览器、网页视频嗅探工具和手动抓包的适用场景。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags:
[视频嗅探器浏览器哪个好用, 视频嗅探器, 视频嗅探插件, 网页视频嗅探器, MediaGo]
---
# 视频嗅探器浏览器哪个好用?Chrome/Edge 插件、桌面端和网页工具对比
一句话答案:普通网页优先用 Chrome/Edge 视频嗅探插件,因为入口最自然;复杂网页、课程回看、m3u8/HLS、需要 Cookie 或 Referer 的资源,优先用 MediaGo 内置浏览器。网页工具适合临时检测,手动抓包适合高级排错。
本文只讨论公开可访问内容、用户自有内容、授权内容、课程回看、企业内部资料和个人素材归档,不讨论绕过访问控制或下载受保护内容。
## 先看结论
| 入口 | 适合谁 | 优点 | 局限 |
| ------------------------ | ----------------------------- | ------------------------------ | ---------------------------- |
| Chrome/Edge 视频嗅探插件 | 日常浏览网页视频的用户 | 不离开常用浏览器,发现资源快 | 受扩展权限和浏览器策略影响 |
| MediaGo 内置浏览器 | 复杂网页、课程回看、m3u8 用户 | 识别和下载链路完整,保留上下文 | 需要在 MediaGo 里打开页面 |
| 网页视频嗅探工具 | 临时检测资源的用户 | 不一定需要安装客户端 | 后续下载、合并、重试能力有限 |
| 手动抓包 | 开发者和高级排错用户 | 信息最细,可看完整请求 | 学习成本高,容易选错资源 |
## 什么时候用浏览器插件
如果你搜索的是“视频嗅探插件”“网页视频下载插件”“嗅探网页视频的拓展程序”,通常优先看浏览器插件。它适合这些情况:
- 普通网页 MP4 或 HLS 资源;
- 希望边浏览边发送下载任务;
- 使用 Chrome、Edge 等桌面浏览器;
- 不想每次都复制页面链接到下载器。
MediaGo 浏览器扩展适合作为日常入口。它检测到资源后,可以把任务发送到 MediaGo,由桌面端或后端下载能力继续处理。
## 什么时候用桌面端内置浏览器
如果出现这些情况,桌面端内置浏览器通常更稳:
- 插件识别不到资源;
- 复制网页链接后不能下载;
- m3u8 下载失败或 key 请求失败;
- 页面需要 Cookie、Referer、User-Agent 等请求上下文;
- 资源列表里有很多分片,不知道选哪个;
- 需要下载后合并、转码或长期管理。
这类问题的关键不是“换一个浏览器”,而是让识别、下载、重试、合并都在同一个工作流里完成。
## 网页工具和手动抓包适合做主力吗
网页工具适合临时判断页面里有没有视频资源,但它通常不适合长期作为主力下载方案。原因是它很难完整保留登录态、请求头、失败重试和本地转码能力。
手动抓包更适合开发者排错。普通用户容易把广告资源、预览片段、音频分片或过期 m3u8 当成目标视频,最后出现下载失败、无画面或只有几 KB 的问题。
## 推荐使用顺序
1. 普通网页先用 Chrome/Edge 扩展。
2. 插件识别不到时,用 MediaGo 内置浏览器重新打开页面。
3. 资源很多时,优先选时长、清晰度、体积接近目标视频的条目。
4. m3u8/HLS 失败时,不复用旧地址,回到原网页重新识别。
5. 高级排错再使用开发者工具或命令行工具。
## 常见问题
### 视频嗅探器浏览器哪个好用?
如果只看浏览器入口,Chrome/Edge 扩展最适合日常使用。但如果你经常遇到课程回看、m3u8、复杂播放器或下载失败,建议使用带内置浏览器和下载队列的桌面端工具。
### 视频嗅探器网页版靠谱吗?
可以作为临时检测工具,但不建议作为主力。复杂网页往往需要页面上下文和后续下载处理,单纯网页工具很难覆盖完整流程。
### 手机视频嗅探器适合 MediaGo 用户吗?
MediaGo 当前更适合电脑端、浏览器扩展和 Docker/NAS 场景。手机可以作为播放和访问下载结果的设备,不建议把 MediaGo 内容写成纯手机 App 或安卓版下载器。
## 与支柱页的关系
这篇文章是 [网页视频嗅探器使用指南](/blog/video-sniffer/) 的子文章,用于承接“视频嗅探器浏览器哪个好用”“视频嗅探插件”“嗅探网页视频的拓展程序”等搜索意图。
## 继续阅读
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [Chrome 视频嗅探怎么用?](/blog/video-sniffer/chrome-video-sniffer/)
- [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/)
- [网页视频下载完整指南](/blog/video-download/)
@@ -0,0 +1,42 @@
---
title: Chrome 视频嗅探怎么用?用 MediaGo 扩展识别网页视频资源
description: 介绍 Chrome 和 Edge 浏览器中视频嗅探的使用方式,以及如何通过 MediaGo 扩展把识别到的资源发送到下载器。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [Chrome 视频嗅探, Edge 视频下载, 浏览器扩展, MediaGo]
---
# Chrome 视频嗅探怎么用?
一句话答案:安装 MediaGo 浏览器扩展后,在 Chrome 或 Edge 中打开视频页面,扩展会检测播放过程中的媒体资源,并可以把资源发送到 MediaGo 下载队列。
## 使用步骤
1. 安装 MediaGo 桌面端。
2. 安装 [浏览器扩展](/extension)。
3. 打开目标视频页面并播放。
4. 查看扩展图标上的资源数量。
5. 选择目标资源并发送到 MediaGo。
6. 在 MediaGo 中确认下载任务。
## 适合场景
- 日常浏览时快速保存公开视频;
- 不想复制链接或切换到内置浏览器;
- 希望在 Chrome/Edge 中发现资源后直接发送任务;
- 简单网页视频、普通 MP4 或常见 HLS 页面。
## 什么时候改用内置浏览器
如果扩展识别不到资源,或者任务发送后下载失败,可以改用 MediaGo 内置浏览器。内置浏览器更适合处理需要请求上下文、登录态或复杂播放器的页面。
## 与支柱页的关系
这篇文章是 [网页视频嗅探器使用指南](/blog/video-sniffer/) 的子文章,用于承接 Chrome/Edge 视频嗅探场景。
## 继续阅读
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [浏览器扩展](/extension)
- [网页视频下载完整指南](/blog/video-download/)
@@ -0,0 +1,44 @@
---
title: 为什么网页视频嗅探到很多资源?如何判断该下载哪一个
description: 解释网页视频嗅探时出现多个资源的原因,并提供从体积、时长、格式、清晰度和请求类型判断目标视频的方法。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [视频嗅探, 视频资源, m3u8, MP4, MediaGo]
---
# 为什么网页视频嗅探到很多资源?
一句话答案:一个网页可能同时加载广告、预览片段、音频、不同清晰度、字幕、封面、m3u8 播放列表和分片资源。需要结合资源类型、大小、时长和清晰度判断真正目标。
## 判断方法
| 判断项 | 说明 |
| -------- | ---------------------------------- |
| 文件类型 | MP4、M3U8、MPD 更可能是目标视频 |
| 资源大小 | 体积过小可能只是广告、封面或片段 |
| 时长 | 接近目标视频时长的资源优先 |
| 清晰度 | 720p、1080p、4K 等信息可辅助判断 |
| 出现时机 | 播放目标视频后出现的资源更值得关注 |
## 常见误判
- 把广告视频当作目标视频;
- 选择了低清预览流;
- 只下载了音频流;
- 只下载了视频流但没有声音;
- 选择了过期的临时链接。
## MediaGo 的处理建议
如果不确定该选哪个,可以先选择体积较大、时长接近、格式为 MP4/M3U8/MPD 的资源。复杂页面建议用内置浏览器重新播放并识别。
## 与支柱页的关系
这篇文章是 [网页视频嗅探器使用指南](/blog/video-sniffer/) 的子文章,用于解决用户“识别到了很多资源但不知道选哪个”的问题。
## 继续阅读
- [网页视频嗅探器使用指南](/blog/video-sniffer/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [m3u8 下载失败怎么办?](/blog/m3u8-hls-download/fix-m3u8-download-failed/)
+73
View File
@@ -0,0 +1,73 @@
---
title: 网页视频嗅探器使用指南
description: 介绍网页视频嗅探器的工作方式、浏览器扩展和内置浏览器的区别,以及如何使用 MediaGo 识别并下载网页视频资源。
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [视频嗅探, 浏览器扩展, Chrome 视频下载, Edge 视频下载, MediaGo]
---
# 网页视频嗅探器使用指南
一句话答案:视频嗅探器会观察网页播放过程中产生的网络请求,从中识别 MP4、M3U8、MPD、直播流或其他媒体资源。MediaGo 提供内置浏览器和 Chrome/Edge 扩展两种入口,适合不同复杂度的网页视频场景。
这篇支柱页覆盖“视频嗅探器”“网页视频嗅探器”“视频嗅探工具”“视频嗅探插件”“视频嗅探器浏览器哪个好用”等搜索意图。手机 App、安卓版、网页版等词会以 FAQ 方式说明边界,避免误导成 MediaGo 的主能力。
## 视频嗅探器能解决什么问题
很多网页并不会在页面源码里直接写出视频地址。真实资源可能在播放器接口、动态脚本、m3u8 播放列表或分片请求里。视频嗅探器的作用是把这些隐藏在播放过程中的资源整理出来,让用户可以选择并下载。
## 浏览器扩展和内置浏览器的区别
| 方式 | 优点 | 局限 | 推荐场景 |
| ------------------ | ---------------------------------------- | ------------------------------ | ---------------------------------------- |
| Chrome/Edge 扩展 | 不离开日常浏览器,检测到资源后可直接发送 | 受浏览器扩展权限和页面策略影响 | 普通网页视频、快速发送任务 |
| MediaGo 内置浏览器 | 识别和下载链路在同一客户端内,信息更完整 | 需要在 MediaGo 内打开页面 | 复杂页面、课程回看、需要请求上下文的资源 |
| 手动抓包 | 信息最细,适合排错 | 学习成本高,容易出错 | 开发者、高级排查 |
## 推荐使用方式
日常使用可以先安装 [浏览器扩展](/extension),在 Chrome 或 Edge 里浏览视频页面。扩展检测到资源后,把任务发送到 MediaGo。
如果扩展没有识别到目标资源,或者下载失败,再使用 MediaGo 内置浏览器打开页面。内置浏览器更适合处理依赖页面上下文、请求头或播放过程的资源。
## 按搜索问题快速进入
| 你搜索的问题 | 应该先看 |
| ---------------------------------- | ------------------------------------------------------------------------------- |
| 视频嗅探器浏览器哪个好用、嗅探插件 | [视频嗅探器浏览器哪个好用?](/blog/video-sniffer/browser-extension-vs-desktop/) |
| Chrome 视频嗅探、Edge 视频下载 | [Chrome 视频嗅探怎么用?](/blog/video-sniffer/chrome-video-sniffer/) |
| 视频嗅探到很多资源不知道选哪个 | [为什么网页视频嗅探到很多资源?](/blog/video-sniffer/detect-video-resources/) |
| 网页视频下载不了、复制链接不能下载 | [网页视频下载不了怎么办?](/blog/video-download/web-video-download-failed/) |
## 专题文章
| 文章 | 解决的问题 | 目标搜索意图 |
| ------------------------------------------------------------------------------- | -------------------------------- | -------------------------------- |
| [Chrome 视频嗅探怎么用?](/blog/video-sniffer/chrome-video-sniffer/) | 浏览器扩展识别并发送资源 | Chrome 视频嗅探、Edge 视频下载 |
| [视频嗅探器浏览器哪个好用?](/blog/video-sniffer/browser-extension-vs-desktop/) | 解释扩展、内置浏览器、抓包的取舍 | 视频嗅探器浏览器哪个好用 |
| [为什么网页视频嗅探到很多资源?](/blog/video-sniffer/detect-video-resources/) | 判断多个资源中哪个才是目标视频 | 视频嗅探资源很多、怎么选视频资源 |
## 常见问题
### 为什么嗅探到很多资源,不知道该选哪个?
网页可能同时加载广告、预览、音频、不同清晰度的视频流和分片地址。一般优先选择体积更大、清晰度更高、持续时长更接近目标视频的资源。
### 视频嗅探等于破解吗?
不是。视频嗅探只是识别网页正常播放过程中请求到的媒体资源。使用时应只处理公开可访问内容、用户自有内容、授权内容、课程回看、企业内部资料或个人素材归档。
### 浏览器扩展和桌面端必须一起用吗?
不必须。桌面端内置浏览器可以独立使用;扩展的价值是让日常浏览器里的视频页面可以更快发送到 MediaGo。
### 视频嗅探器 app、安卓版和手机版要不要作为主方向?
MediaGo 当前更适合电脑端、浏览器扩展和 Docker/NAS 场景,不建议把主要标题写成纯手机 App 或安卓版。移动端可以作为播放、访问下载结果和局域网查看的补充场景。
## 继续阅读
- [网页视频下载完整指南](/blog/video-download/)
- [M3U8 / HLS 视频下载完整指南](/blog/m3u8-hls-download/)
- [2026 年视频下载器评测](/blog/video-downloader-review/)
+22
View File
@@ -5,6 +5,28 @@ outline: deep
# 更新日志
## v3.5.0 (2026.4.22 发布)
### 软件下载
- [【mediago】 windows(安装版) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 windows(便携版) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macos arm64apple 芯片) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macos x64intel 芯片) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago)`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
### 主要更新
- **🌐 浏览器扩展(Chrome / Edge)** —— 任意网站一键嗅探视频、一键发到 MediaGo
- **🎬 支持 YouTube 和 1000+ 站点** —— 集成 yt-dlp
- **🦞 OpenClaw Skill** —— 通过 AI 编程助手用自然语言下载视频
- **🔌 开放 HTTP 接口** —— 支持脚本、自动化工具、第三方应用接入
- **🎞️ 内置视频格式转换** —— 下载完成后在应用内选输出格式和画质
- **🐳 Docker 部署简化** —— 镜像迁至 GitHub Container RegistryGHCR),支持 x86 / ARM 双架构,挂载单一目录即可
- **⚡ 启动更快** —— 后端用 Go 重写,内存占用更低,内置视频播放器
## v3.0.0 (2024.10.7 发布)
### 软件下载
+1 -1
View File
@@ -25,7 +25,7 @@ outline: deep
### 3. 显示语言、
支持中文英文
支持中文英文和意大利语
### 4. 下载完成提示
+302
View File
@@ -0,0 +1,302 @@
---
layout: doc
outline: deep
---
# Download API
MediaGo exposes its download engine as an HTTP service. The desktop app listens on port `39719`; the Docker deployment listens on port `9900`.
You can drive it from anything that speaks HTTP — curl, Python, Node.js, Postman, your own scripts, automation platforms. MediaGo's own browser extension and AI Skill are just consumers of this API.
## Basics
### Base URL
| Deployment | Base URL |
| ---------- | ------------------------------------------------------- |
| Desktop | `http://localhost:39719` |
| Docker | `http://<your-host>:9900` (adjust to your port mapping) |
All endpoints live under the `/api` prefix. The examples below use the desktop port `39719` by default — swap in your Docker port if that's what you're targeting.
### Response envelope
Every `/api/*` endpoint returns this JSON wrapper:
```json
{
"success": true,
"code": 0,
"message": "ok",
"data": { ... }
}
```
| Field | Type | Notes |
| --------- | ------ | ---------------------------------------------- |
| `success` | bool | Whether the call succeeded |
| `code` | number | Business error code, `0` on success |
| `message` | string | Human-readable hint |
| `data` | any | The actual payload — shape varies per endpoint |
Example responses below only show the `data` body.
### Authentication
- **Desktop**: no auth by default, just hit `localhost:39719`
- **Docker**: when auth is enabled, grab the API key from MediaGo's **Settings** page, then include `Authorization: Bearer <key>` on every request
## Quick start
Three curl commands that walk through the whole "create → download → get notified" flow.
### 1. Create a download task
```bash
curl -X POST http://localhost:39719/api/downloads \
-H "Content-Type: application/json" \
-d '{
"tasks": [
{
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"name": "My Video"
}
],
"startDownload": true
}'
```
- `type`: download type — `m3u8` / `bilibili` / `direct` / `youtube` / `mediago`
- `url`: video URL
- `name`: task name (used as the saved file name)
- `startDownload`: whether to start immediately after creation
Response:
```json
[
{
"id": 123,
"name": "My Video",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"status": "waiting",
"createdDate": "2026-04-23T10:00:00Z"
}
]
```
Keep the `id` — you'll need it later.
### 2. Subscribe to download events (SSE)
```bash
curl -N http://localhost:39719/api/events
```
A long-lived connection — whatever the server emits, you receive:
```text
event: download-start
data: {"id": "123"}
event: download-success
data: {"id": "123"}
```
In the browser / Node.js:
```javascript
const es = new EventSource("http://localhost:39719/api/events");
es.addEventListener("download-success", (e) => {
const { id } = JSON.parse(e.data);
console.log("Done:", id);
});
```
### 3. Query / manually control
```bash
# List all downloads (paginated)
curl "http://localhost:39719/api/downloads?current=1&pageSize=20"
# Get one task
curl http://localhost:39719/api/downloads/123
# Start an existing task
curl -X POST http://localhost:39719/api/downloads/123/start \
-H "Content-Type: application/json" \
-d '{"localPath": "/Downloads/MediaGo", "deleteSegments": true}'
# Stop a task
curl -X POST http://localhost:39719/api/downloads/123/stop
# Get logs
curl http://localhost:39719/api/downloads/123/logs
```
## Download events
`GET /api/events` is a Server-Sent Events stream. Download-related events:
| Event | Payload | Notes |
| ------------------ | -------------------------------- | ------------------------- |
| `download-create` | `{ids: number[], count: number}` | Bulk task creation |
| `download-start` | `{id: string}` | Download started |
| `download-success` | `{id: string}` | Download completed |
| `download-failed` | `{id: string, error: string}` | Download failed |
| `download-stop` | `{id: string}` | Download manually stopped |
## Endpoint reference
### List / query
#### `GET /api/downloads` — paginated list
**Query params:**
- `current` (number, default 1) — page number
- `pageSize` (number, default 20) — page size
- `filter` (string, optional) — status filter (`downloading` / `success` / `failed`)
- `localPath` (string, optional) — save-path filter
**Response:**
```json
{
"total": 42,
"list": [
/* DownloadTask[] */
]
}
```
#### `GET /api/downloads/active` — list active tasks
Returns all tasks in `waiting` or `downloading` state.
#### `GET /api/downloads/:id` — get one task
**Response** (`DownloadTask` shape):
```json
{
"id": 123,
"name": "My Video",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"folder": "my-folder",
"headers": "User-Agent: ...",
"isLive": false,
"status": "success",
"file": "/path/to/saved.mp4",
"createdDate": "2026-04-23T10:00:00Z",
"updatedDate": "2026-04-23T10:05:30Z"
}
```
#### `GET /api/downloads/folders` — list unique save directories
**Response:** `string[]`
#### `GET /api/downloads/export` — export URL list
Plain text, one URL per line.
#### `GET /api/downloads/:id/logs` — fetch download logs
**Response:** `{ id, log: string }`
### Create / delete
#### `POST /api/downloads` — batch create downloads
**Body:**
```json
{
"tasks": [
{
"type": "m3u8 | bilibili | direct | youtube | mediago",
"url": "https://example.com/video.m3u8",
"name": "Task name",
"folder": "optional subdir",
"headers": "optional multi-line HTTP headers"
}
],
"startDownload": true
}
```
**Response:** `DownloadTask[]`
#### `DELETE /api/downloads/:id` — delete task
**Response:** `{}`
### Edit / status
#### `PUT /api/downloads/:id` — edit task
**Body** (all fields optional):
```json
{
"name": "New name",
"url": "New URL",
"headers": "New headers",
"folder": "New subdir"
}
```
#### `PUT /api/downloads/:id/live` — toggle live-stream flag
**Body:** `{ "isLive": true }`
#### `PUT /api/downloads/status` — bulk status update
**Body:** `{ "ids": number[], "status": "waiting | downloading | success | failed | stopped" }`
### Start / stop
#### `POST /api/downloads/:id/start` — start download
**Body:**
```json
{
"localPath": "/Users/me/Downloads/MediaGo",
"deleteSegments": true
}
```
- `localPath`: where to save (absolute path)
- `deleteSegments`: for m3u8 downloads, whether to delete segment `.ts` files after merging
#### `POST /api/downloads/:id/stop` — stop download
**Response:** `{}`
## Enum values
### Download type `type`
| Value | Notes |
| ---------- | ------------------------------------------ |
| `m3u8` | HLS streams (backed by N_m3u8DL-RE) |
| `bilibili` | Bilibili videos (backed by BBDown) |
| `direct` | Direct HTTP download (backed by aria2) |
| `youtube` | YouTube and 1000+ sites (backed by yt-dlp) |
| `mediago` | MediaGo internal type |
### Task status `status`
| Value | Notes |
| ------------- | ------------------- |
| `waiting` | Queued, not started |
| `downloading` | In progress |
| `success` | Completed |
| `failed` | Errored out |
| `stopped` | Manually stopped |
+26
View File
@@ -0,0 +1,26 @@
---
title: MediaGo Blog
description: MediaGo blog covers video downloading workflows, M3U8/HLS, browser video detection, NAS/Docker setups, and downloader comparisons for global users.
date: 2026-04-26
updated: 2026-04-26
author: MediaGo
tags: [MediaGo, video downloader, m3u8, HLS, video sniffer]
---
# MediaGo Blog
The MediaGo blog is a practical resource for video downloading workflows, M3U8/HLS handling, browser video detection, NAS/Docker deployment, and downloader comparisons.
## Featured guide
| Topic | Best for | Start here |
| --------------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| Video downloader comparison | Choosing between MediaGo, yt-dlp, 4K Video Downloader, browser extensions, NAS tools, and stream utilities | [2026 Video Downloader Review](/en/blog/video-downloader-review/) |
## Product docs
- [Quick Start](/en/guides)
- [User Guide](/en/documents)
- [Browser Extension](/en/extension)
- [Download API](/en/api)
- [Docker / BT Panel Deployment](/en/bt-install)
File diff suppressed because it is too large Load Diff
+22
View File
@@ -5,6 +5,28 @@ outline: deep
# Changelog
## v3.5.0 (Released on 2026.4.22)
### Software Downloads
- [【mediago】 Windows (Installer) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 Windows (Portable) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macOS arm64 (Apple Silicon) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macOS x64 (Intel) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 Linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago): `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
### Highlights
- **🌐 Browser extension (Chrome / Edge)** — one-click video sniffing on any site, sent straight to MediaGo.
- **🎬 YouTube and 1000+ sites** — powered by yt-dlp.
- **🦞 OpenClaw Skill** — download videos through AI coding assistants with natural language.
- **🔌 Open HTTP API** — integrate with scripts, automation and third-party tools.
- **🎞️ In-app format conversion** — pick output format and quality after a download completes.
- **🐳 Simpler Docker deployment** — multi-arch images (x86 / ARM) on GitHub Container Registry, mount a single folder.
- **⚡ Faster startup** — backend rewritten in Go, lower memory footprint, built-in video player.
## v3.0.0 (Released on 2024.10.7)
### Software Downloads
+1 -1
View File
@@ -25,7 +25,7 @@ Supports light and dark modes.
### 3. Display Language
Supports Chinese and English.
Supports Chinese, English, and Italian.
### 4. Download Completion Notification
+1 -1
View File
@@ -46,7 +46,7 @@ Two toggles on the options page under **Import Behaviour**:
## Interface language
The extension supports Chinese and English. By default it follows the browser UI language (Chinese browser → Chinese UI). You can force a choice on the options page under **Interface Language**: Follow system / 中文 / English.
The extension supports Chinese, English, and Italian. By default it follows the browser UI language. You can force a choice on the options page under **Interface Language**: Follow system / 中文 / English / Italiano.
## Troubleshooting
+26 -31
View File
@@ -7,50 +7,45 @@ outline: deep
This article provides a simple guide to help you get started with using the software. Supports [OpenClaw Skill](/en/skills) for downloading videos via natural language in AI coding assistants.
::: tip
To facilitate communication and feedback, you can join the feedback group:
MediaGo QQ Feedback Group 1: 574209001
:::
::: info
v3.0 is the latest version. Please feel free to provide feedback within version 3.0, and we will address it as soon as possible.
v3.5 is the latest version. Please feel free to provide feedback in this release and we will address it as quickly as possible.
:::
::: tip
macOS usage
- **[Intel chip]** Install the x64 build from the release page. After installation, allow apps from unidentified developers in Mac's Security settings.
- **[Apple Silicon]** Install the arm64 build from the release page. After installation, run `sudo xattr -dr com.apple.quarantine /Applications/mediago-community.app` in Terminal.
:::
## Download and Installation
### v3.0.0 (Released on October 7, 2024)
### v3.5.0 (Released on April 22, 2026)
#### Software Download
- [【mediago】 Windows (Installer) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-win32-x64-3.0.0.exe)
- [【mediago】 Windows (Portable) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-portable-win32-x64-3.0.0.exe)
- [【mediago】 macOS arm64 (Apple Silicon) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-arm64-3.0.0.dmg)
- [【mediago】 macOS x64 (Intel) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-x64-3.0.0.dmg)
- [【mediago】 Linux v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-linux-amd64-3.0.0.deb)
- 【mediago】 Docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:latest`
- [【mediago】 Windows (Installer) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 Windows (Portable) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macOS arm64 (Apple Silicon) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macOS x64 (Intel) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 Linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago): `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
#### Important Updates
Older releases are on the [GitHub Releases page](https://github.com/caorushizi/mediago/releases).
- Support for Docker deployment of the web version.
- Updated desktop UI.
#### What's New
#### Changelog
- Support for Docker deployment of the web version.
- Updated desktop UI.
- Added video playback, supporting both desktop and mobile versions.
- Fixed an issue where macOS could not display the interface.
- Optimized the interaction for batch downloads.
- Added a portable version for Windows (no installation required).
- Optimized the download list, supporting sniffing of multiple videos on a page.
- Supports manual import/export of the favorite list.
- Supports export of the homepage download list.
- Optimized the interaction logic for the "New Download" form.
- Supports UrlScheme to open the app and add download tasks.
- Fixed some bugs and improved the user experience.
- **Browser extension** (Chrome / Edge) — one-click video sniffing on any site.
- **YouTube and 1000+ sites** — powered by yt-dlp.
- **OpenClaw Skill** — download videos through AI coding assistants.
- **Open HTTP API** — integrate with scripts, automation and third-party tools.
- **In-app format conversion** — pick output format and quality after downloading.
- **Simpler Docker deployment** — multi-arch images on GHCR, mount a single folder.
- **Faster startup** — backend rewritten in Go, lower memory footprint, built-in player.
## Operation Instructions
+30 -18
View File
@@ -3,34 +3,46 @@
layout: home
hero:
name: "Online Video Downloader"
text: "Simple and Easy, Fast Downloading"
tagline: Simple to learn, no need for packet capture, no plugins required
name: "MediaGo"
text: "Cross-platform video downloader"
tagline: "Built-in sniffing — point it at a page, pick what you want, save. No packet capture, no plugins, no command-line tools."
image:
src: /home.png
alt: home
src: /home_en.png
alt: MediaGo home screen
actions:
- theme: brand
text: Quick Start
link: /guides
link: /en/guides
- theme: alt
text: User Guide
link: /documents
link: /en/documents
features:
- icon: ⏩
title: No Packet Capture Required
details: Use the built-in browser of the software to easily sniff video resources on web pages. Select the resource you want to download from the sniffed resource list—simple and fast.
- icon: 📱
title: Mobile Playback
details: Seamlessly switch between PC and mobile devices. After the download is complete, you can watch the video on your phone.
title: No packet capture required
details: The desktop app ships with a built-in browser that sniffs every downloadable resource on the page automatically. No Fiddler, no Charles, no DevTools gymnastics.
- icon: 🌐
title: Browser extension for Chrome / Edge
details: One-click video sniffing in your everyday browser. Detected count shows in the toolbar badge; covers YouTube, Bilibili and most mainstream video platforms. Bundled with the desktop app.
- icon: 🎬
title: Broad video source coverage
details: HLS / m3u8 streams, live streaming, Bilibili, YouTube, Twitter/X, Instagram and over a thousand more video sites — powered by N_m3u8DL-RE, BBDown and yt-dlp under the hood.
- icon: ⚡️
title: Batch Download Supported
details: Supports downloading multiple videos and live streaming resources at the same time, ensuring that your high-speed bandwidth is fully utilized.
- icon: 🎉
title: Docker Deployment Supported
details: Supports Docker deployment for the web version, making it quick and easy.
title: Batch download
details: Download multiple videos and live streams at once. Your high-speed bandwidth never sits idle; tweak the concurrency to taste.
- icon: 🎞️
title: Built-in format conversion
details: Convert completed downloads to another format or quality without leaving MediaGo. No separate ffmpeg tool required.
- icon: 📱
title: Mobile playback
details: The desktop app listens on your LAN IP too — open the web UI on a phone or tablet on the same Wi-Fi to browse downloads and play them directly.
- icon: 🔌
title: Open HTTP API
details: Full HTTP API lets scripts, automation tools and third-party apps create download tasks, query progress and manage the list.
- icon: 🦞
title: OpenClaw Skill
details: Download videos using natural language in AI coding assistants (OpenClaw, Claude Code, etc.). Install with one command.
details: Tell Claude Code, Cursor or your AI coding assistant "please download this video" — it handles the rest. One command to install.
- icon: 🐳
title: One-line Docker deployment
details: One command to deploy to your NAS or VPS. Access from any browser on your network. Multi-arch images on Docker Hub and GHCR.
---
+1 -1
View File
@@ -46,7 +46,7 @@ MediaGo 尚未上架 Chrome Web Store,需以"加载已解压的扩展程序"
## 界面语言
扩展支持中文,默认跟随浏览器 UI 语言(浏览器是中文即显示中文)。也可以在设置页 **界面语言** 卡片强制切换到"跟随系统 / 中文 / English"之一。
扩展支持中文、英文和意大利语,默认跟随浏览器 UI 语言。也可以在设置页 **界面语言** 卡片强制切换到"跟随系统 / 中文 / English / Italiano"之一。
## 常见问题
+10 -7
View File
@@ -25,7 +25,7 @@ MacOS 使用
## 下载安装
### v3.0.1 (2025.1.14 发布)
### v3.5.02026.4.22 发布
::: tip
国内用户可以通过网盘下载
@@ -38,12 +38,15 @@ MacOS 使用
:::
- [【mediago】 windows(安装版) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-win32-x64-3.5.0-beta.0.exe)
- [【mediago】 windows(便携版) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-portable-win32-x64-3.5.0-beta.0.exe)
- [【mediago】 macos arm64apple 芯片) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-darwin-arm64-3.5.0-beta.0.dmg)
- [【mediago】 macos x64intel 芯片) v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-darwin-x64-3.5.0-beta.0.dmg)
- [【mediago】 linux v3.5.0-beta.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0-beta.0/mediago-community-setup-linux-amd64-3.5.0-beta.0.deb)
- 【mediago】 docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0-beta.0`
- [【mediago】 windows安装版 v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 windows便携版 v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macos arm64apple 芯片) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macos x64intel 芯片) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago)`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
历史版本请查看 [GitHub Releases](https://github.com/caorushizi/mediago/releases)。
## 操作说明
+40 -13
View File
@@ -3,12 +3,12 @@
layout: home
hero:
name: "在线视频下载"
text: "简单易用,快速下载"
tagline: 简单易学,无需抓包,不需要安装插件
name: "MediaGo"
text: "跨平台视频下载"
tagline: "内置嗅探,打开网页、选一下想要的资源、保存完事。不用抓包,不用折腾浏览器插件,不用碰命令行。"
image:
src: /home.png
alt: home
alt: MediaGo 首页
actions:
- theme: brand
text: 快速开始
@@ -20,17 +20,44 @@ hero:
features:
- icon: ⏩
title: 无需抓包
details: 使用软件自带浏览器可以轻松嗅探网页中的视频资源,通过嗅探到的资源列表选择自己想要下载的资源,简单快速
- icon: 📱
title: 移动播放
details: 可以轻松无缝的在PC和移动设备之前切换,下载完成后即可使用手机观看视频
details: 桌面端内置浏览器,打开视频页就自动嗅探出所有可下载的资源,不用 Fiddler、Charles 之类的抓包工具
- icon: 🌐
title: 浏览器扩展(Chrome / Edge
details: 日常用的 Chrome / Edge 里也能一键嗅探视频,检测到的数量显示在工具栏图标上。随桌面端一起打包
- icon: 🎬
title: 多种视频源一锅端
details: HLS / m3u8 流媒体、直播推流、Bilibili、YouTube、Twitter/X、Instagram 等一千多个视频站点,底层集成 N_m3u8DL-RE、BBDown、yt-dlp 等专业下载工具。
- icon: ⚡️
title: 支持批量下载
details: 支持同时下载多个视频和直播资源,高速带宽不闲置。
- icon: 🎉
title: 支持 docker 部署
details: 支持 docker 部署 web 端,方便快捷
details: 同时下载多个视频和直播资源,高速带宽不闲置,队列并发全由你调
- icon: 🎞️
title: 内置格式转换
details: 下载完成后直接在 MediaGo 里转换格式、选画质,不用再打开别的工具
- icon: 📱
title: 移动播放
details: 桌面端同时监听局域网 IP,同一 Wi-Fi 下的手机、平板打开浏览器就能访问下载列表并直接播放。
- icon: 🔌
title: 开放 HTTP 接口
details: 提供完整的 HTTP API,脚本、自动化工具、第三方应用都能创建任务、查询进度、管理下载列表。
- icon: 🦞
title: OpenClaw Skill
details: 支持通过 AI 编程助手(OpenClaw、Claude Code 等)用自然语言下载视频,一键安装即可使用
details: 在 Claude Code、Cursor 等 AI 编程助手中直接说"帮我下这个视频"即可,剩下的交给 AI。一条命令安装 Skill
- icon: 🐳
title: Docker 一键部署
details: 一条命令部署到 NAS / VPS 上,浏览器直接访问。Docker Hub 和 GHCR 同步发布多架构镜像。
- icon: 📚
title: 视频下载器推荐
details: 按免费、电脑端、M3U8、IDM、yt-dlp、猫抓和 NAS 场景梳理主流工具怎么选。
link: /blog/video-downloader-recommendation/
linkText: 查看推荐
- icon: 🧭
title: 网页视频下载指南
details: 了解网页视频下载的常见入口、工具选择和 MediaGo 的内置浏览器、扩展、队列工作流。
link: /blog/video-download/
linkText: 查看指南
- icon: 📡
title: M3U8 / HLS 专题
details: 解释 M3U8、HLS、DASH、直播流和分段视频的关系,以及常见下载失败原因。
link: /blog/m3u8-hls-download/
linkText: 了解专题
---
+302
View File
@@ -0,0 +1,302 @@
---
layout: doc
outline: deep
---
# API di download
MediaGo espone il proprio motore di download come servizio HTTP. L'app desktop ascolta sulla porta `39719`; il deploy Docker ascolta sulla porta `9900`.
Puoi controllarlo da qualsiasi strumento che parli HTTP: curl, Python, Node.js, Postman, script personali o piattaforme di automazione. L'estensione browser e la Skill AI di MediaGo sono semplicemente consumer di questa API.
## Nozioni di base
### Base URL
| Deploy | Base URL |
| ------- | ----------------------------------------------------------- |
| Desktop | `http://localhost:39719` |
| Docker | `http://<your-host>:9900` (adatta alla tua mappatura porta) |
Tutti gli endpoint sono sotto il prefisso `/api`. Gli esempi usano la porta desktop `39719` per impostazione predefinita: sostituiscila con la porta Docker se stai usando quel deploy.
### Envelope della risposta
Ogni endpoint `/api/*` restituisce questo wrapper JSON:
```json
{
"success": true,
"code": 0,
"message": "ok",
"data": { ... }
}
```
| Campo | Tipo | Note |
| --------- | ------ | ----------------------------------------- |
| `success` | bool | Indica se la chiamata è riuscita |
| `code` | number | Codice errore business, `0` se riuscita |
| `message` | string | Suggerimento leggibile |
| `data` | any | Payload effettivo, variabile per endpoint |
Gli esempi sotto mostrano solo il corpo `data`.
### Autenticazione
- **Desktop**: nessuna autenticazione predefinita, usa `localhost:39719`
- **Docker**: se l'autenticazione è abilitata, copia l'API key dalla pagina **Impostazioni** di MediaGo e includi `Authorization: Bearer <key>` in ogni richiesta
## Avvio rapido
Tre comandi curl per il flusso "crea → scarica → ricevi notifica".
### 1. Crea un'attività di download
```bash
curl -X POST http://localhost:39719/api/downloads \
-H "Content-Type: application/json" \
-d '{
"tasks": [
{
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"name": "My Video"
}
],
"startDownload": true
}'
```
- `type`: tipo di download — `m3u8` / `bilibili` / `direct` / `youtube` / `mediago`
- `url`: URL del video
- `name`: nome dell'attività, usato come nome file salvato
- `startDownload`: se avviare subito dopo la creazione
Risposta:
```json
[
{
"id": 123,
"name": "My Video",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"status": "waiting",
"createdDate": "2026-04-23T10:00:00Z"
}
]
```
Conserva l'`id`: ti servirà dopo.
### 2. Sottoscrivi gli eventi di download (SSE)
```bash
curl -N http://localhost:39719/api/events
```
È una connessione persistente: ricevi tutto ciò che il server emette.
```text
event: download-start
data: {"id": "123"}
event: download-success
data: {"id": "123"}
```
Nel browser / Node.js:
```javascript
const es = new EventSource("http://localhost:39719/api/events");
es.addEventListener("download-success", (e) => {
const { id } = JSON.parse(e.data);
console.log("Done:", id);
});
```
### 3. Consulta / controlla manualmente
```bash
# Lista tutti i download (paginata)
curl "http://localhost:39719/api/downloads?current=1&pageSize=20"
# Ottieni una singola attività
curl http://localhost:39719/api/downloads/123
# Avvia un'attività esistente
curl -X POST http://localhost:39719/api/downloads/123/start \
-H "Content-Type: application/json" \
-d '{"localPath": "/Downloads/MediaGo", "deleteSegments": true}'
# Ferma un'attività
curl -X POST http://localhost:39719/api/downloads/123/stop
# Ottieni i log
curl http://localhost:39719/api/downloads/123/logs
```
## Eventi di download
`GET /api/events` è uno stream Server-Sent Events. Eventi legati al download:
| Evento | Payload | Note |
| ------------------ | -------------------------------- | ---------------------------- |
| `download-create` | `{ids: number[], count: number}` | Creazione batch |
| `download-start` | `{id: string}` | Download avviato |
| `download-success` | `{id: string}` | Download completato |
| `download-failed` | `{id: string, error: string}` | Download fallito |
| `download-stop` | `{id: string}` | Download fermato manualmente |
## Riferimento endpoint
### Lista / query
#### `GET /api/downloads` — lista paginata
**Query params:**
- `current` (number, default 1) — numero pagina
- `pageSize` (number, default 20) — dimensione pagina
- `filter` (string, opzionale) — filtro stato (`downloading` / `success` / `failed`)
- `localPath` (string, opzionale) — filtro percorso di salvataggio
**Risposta:**
```json
{
"total": 42,
"list": [
/* DownloadTask[] */
]
}
```
#### `GET /api/downloads/active` — lista attività attive
Restituisce tutte le attività in stato `waiting` o `downloading`.
#### `GET /api/downloads/:id` — ottieni una attività
**Risposta** (forma `DownloadTask`):
```json
{
"id": 123,
"name": "My Video",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"folder": "my-folder",
"headers": "User-Agent: ...",
"isLive": false,
"status": "success",
"file": "/path/to/saved.mp4",
"createdDate": "2026-04-23T10:00:00Z",
"updatedDate": "2026-04-23T10:05:30Z"
}
```
#### `GET /api/downloads/folders` — lista directory di salvataggio uniche
**Risposta:** `string[]`
#### `GET /api/downloads/export` — esporta lista URL
Testo semplice, un URL per riga.
#### `GET /api/downloads/:id/logs` — recupera log di download
**Risposta:** `{ id, log: string }`
### Crea / elimina
#### `POST /api/downloads` — crea download in batch
**Body:**
```json
{
"tasks": [
{
"type": "m3u8 | bilibili | direct | youtube | mediago",
"url": "https://example.com/video.m3u8",
"name": "Task name",
"folder": "optional subdir",
"headers": "optional multi-line HTTP headers"
}
],
"startDownload": true
}
```
**Risposta:** `DownloadTask[]`
#### `DELETE /api/downloads/:id` — elimina attività
**Risposta:** `{}`
### Modifica / stato
#### `PUT /api/downloads/:id` — modifica attività
**Body** (tutti i campi opzionali):
```json
{
"name": "New name",
"url": "New URL",
"headers": "New headers",
"folder": "New subdir"
}
```
#### `PUT /api/downloads/:id/live` — cambia flag live-stream
**Body:** `{ "isLive": true }`
#### `PUT /api/downloads/status` — aggiornamento stato batch
**Body:** `{ "ids": number[], "status": "waiting | downloading | success | failed | stopped" }`
### Avvio / stop
#### `POST /api/downloads/:id/start` — avvia download
**Body:**
```json
{
"localPath": "/Users/me/Downloads/MediaGo",
"deleteSegments": true
}
```
- `localPath`: dove salvare (percorso assoluto)
- `deleteSegments`: per download m3u8, se eliminare i segmenti `.ts` dopo il merge
#### `POST /api/downloads/:id/stop` — ferma download
**Risposta:** `{}`
## Valori enum
### Tipo download `type`
| Valore | Note |
| ---------- | ------------------------------------- |
| `m3u8` | Stream HLS (tramite N_m3u8DL-RE) |
| `bilibili` | Video Bilibili (tramite BBDown) |
| `direct` | Download HTTP diretto (tramite aria2) |
| `youtube` | YouTube e 1000+ siti (tramite yt-dlp) |
| `mediago` | Tipo interno MediaGo |
### Stato attività `status`
| Valore | Note |
| ------------- | -------------------- |
| `waiting` | In coda, non avviata |
| `downloading` | In corso |
| `success` | Completata |
| `failed` | Terminata con errore |
| `stopped` | Fermata manualmente |
+36
View File
@@ -0,0 +1,36 @@
---
layout: doc
outline: deep
---
# Deploy con BT Panel
Questo documento spiega come distribuire `MediaGo` usando `BT Panel`.
## Prerequisiti
- Applicabile solo a BT Panel versione 9.2.0 o superiore
- Installa BT Panel dal [sito ufficiale BT Panel](https://www.bt.cn/new/download.html?r=dk_mediago), scegliendo lo script della versione stabile
## Deploy
1. Accedi a BT Panel e clicca `Docker` nel menu a sinistra
![Docker](../images/bt-install-step1.png)
2. Al primo accesso verrà richiesto di installare i servizi `Docker` e `Docker Compose`. Clicca "Installa ora"; se sono già installati, ignora il passaggio.
![Docker](../images/bt-install-step2.png)
3. Dopo l'installazione, vai in `Docker - App Store`, trova `MediaGo` e clicca `Install`
![Docker](../images/bt-install-step3.png)
4. Dopo l'invio, il pannello inizializza automaticamente l'applicazione. Potrebbero servire 1-3 minuti; al termine potrai accedervi.
- Porta: 8899
- Versione: v3.0.0
## Accedere a MediaGo
Inserisci il dominio o l'indirizzo `http://<IP BT Panel>:8899` nella barra del browser per aprire la console di `MediaGo`.
+151
View File
@@ -0,0 +1,151 @@
---
layout: doc
outline: deep
---
# Changelog
## v3.5.0 (rilasciata il 22/04/2026)
### Download software
- [【mediago】 Windows (installer) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 Windows (portable) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macOS arm64 (Apple Silicon) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macOS x64 (Intel) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 Linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago): `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
### Punti principali
- **🌐 Estensione browser (Chrome / Edge)** — sniffing video con un clic su qualsiasi sito, inviato direttamente a MediaGo.
- **🎬 YouTube e 1000+ siti** — basato su yt-dlp.
- **🦞 OpenClaw Skill** — scarica video tramite assistenti AI usando linguaggio naturale.
- **🔌 API HTTP aperta** — integrazione con script, automazioni e strumenti di terze parti.
- **🎞️ Conversione formato in app** — scegli formato e qualità dopo il completamento del download.
- **🐳 Deploy Docker più semplice** — immagini multi-arch (x86 / ARM) su GitHub Container Registry, montando una sola cartella.
- **⚡ Avvio più rapido** — backend riscritto in Go, minore consumo di memoria, player video integrato.
## v3.0.0 (rilasciata il 07/10/2024)
### Download software
- [【mediago】 Windows (installer) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-win32-x64-3.0.0.exe)
- [【mediago】 Windows (portable) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-portable-win32-x64-3.0.0.exe)
- [【mediago】 macOS ARM64 (Apple Chip) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-arm64-3.0.0.dmg)
- [【mediago】 macOS x64 (Intel Chip) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-x64-3.0.0.dmg)
- [【mediago】 Linux v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-linux-amd64-3.0.0.deb)
- 【mediago】 Docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /root/mediago:/root/mediago registry.cn-beijing.aliyuncs.com/caorushizi/mediago:v3.0.0`
### Download in Cina
- [【mediago】 Windows (installer) v3.0.0](https://static.ziying.site/mediago/mediago-setup-win32-x64-3.0.0.exe)
- [【mediago】 Windows (portable) v3.0.0](https://static.ziying.site/mediago/mediago-portable-win32-x64-3.0.0.exe)
- [【mediago】 macOS ARM64 (Apple Chip) v3.0.0](https://static.ziying.site/mediago/mediago-setup-darwin-arm64-3.0.0.dmg)
- [【mediago】 macOS x64 (Intel Chip) v3.0.0](https://static.ziying.site/mediago/mediago-setup-darwin-x64-3.0.0-beta.5.dmg)
- [【mediago】 Linux v3.0.0](https://static.ziying.site/mediago/mediago-setup-linux-amd64-3.0.0.deb)
- 【mediago】 Docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /root/mediago:/root/mediago registry.cn-beijing.aliyuncs.com/caorushizi/mediago:v3.0.0`
### Screenshot software
![Home](../images/changelog4.png)
### Aggiornamenti principali
- Supporto al deploy Docker della versione web
- UI desktop aggiornata
### Changelog
- UI desktop aggiornata
- Supporto al deploy Docker della versione web
- Aggiunta riproduzione video, con supporto desktop e mobile
- Corretto un problema per cui la versione Mac non mostrava l'interfaccia
- Ottimizzata l'interazione del download batch
- Aggiunta versione portable per Windows, senza installazione
- Ottimizzata la lista download per supportare lo sniffing di più video nella stessa pagina
- Supporto a import/export manuale della lista preferiti
- Supporto all'export della lista download in homepage
- Ottimizzata la logica di interazione del modulo "Nuovo download"
- Supporto all'apertura dell'app tramite UrlScheme e aggiunta di attività download
- Correzione di diversi bug e miglioramento dell'esperienza utente
## v2.2.3 (rilasciata il 06/07/2024)
### Link download
- [Windows mediago v2.2.3](https://github.com/caorushizi/mediago/releases/download/v2.2.3/mediago-setup-x64-2.2.3.exe)
- [macOS mediago v2.2.3](https://github.com/caorushizi/mediago/releases/download/v2.2.3/mediago-setup-x64-2.2.3.dmg)
- [Linux mediago v2.2.3](https://github.com/caorushizi/mediago/releases/download/v2.2.3/mediago-setup-arm64-2.2.3.dmg)
### Changelog
- Aggiunto toggle "Aggiornamento automatico" nelle impostazioni: solo le versioni release verranno aggiornate automaticamente, non le beta
- Aggiunto "Aggiornamento batch" nel modulo download
- Rilasciata nuova versione Linux
- Selezione automatica della massima qualità video durante il download
- Aggiunti "Cancella cache" e "Modalità incognito"
- Selezione personalizzata del percorso di installazione
- Correzione di diversi bug
## v2.2.0 (rilasciata il 22/05/2024)
### Link download
- [Windows mediago v2.2.0](https://github.com/caorushizi/mediago/releases/download/v2.2.0/mediago-setup-2.2.0.exe)
- [macOS mediago v2.2.0](https://github.com/caorushizi/mediago/releases/download/v2.2.0/mediago-setup-2.2.0.dmg)
### Changelog
- Supporto al download di live stream
- Supporto al download video Bilibili
- Ottimizzazione del processo di sniffing immersivo
- Supporto all'output console durante il download
- Correzione di diversi bug
## v2.0.1 (rilasciata il 01/07/2023)
### Link download
- [Windows mediago v2.0.1](https://github.com/caorushizi/mediago/releases/download/v2.0.1/media-downloader-setup-2.0.1.exe)
- [macOS mediago v2.0.1](https://github.com/caorushizi/mediago/releases/download/v2.0.1/media-downloader-setup-2.0.1.dmg)
### Screenshot software
![Home](../images/changelog3.png)
### Changelog
- Modalità scura
- Più configurazioni di download
- Supporto all'iniezione automatica degli header
- Supporto all'abilitazione del filtro annunci
- Supporto allo sniffing immersivo
- Supporto al cambio tra modalità mobile e PC
- Supporto alla modifica del limite di download simultanei
- Correzione di diversi bug
## v1.1.5 (rilasciata il 05/02/2022)
### Link download
- [Windows mediago v1.1.5](https://github.com/caorushizi/mediago/releases/download/1.1.5/media-downloader-setup-1.1.4.exe)
### Screenshot software
![Home](../images/changelog2.webp)
### Changelog
- Supporto al download video
## v1.0.1 (rilasciata il 01/03/2021)
### Screenshot software
![Home](../images/changelog1.webp)
### Changelog
- Supporto al download video
+152
View File
@@ -0,0 +1,152 @@
---
layout: doc
outline: deep
---
# Guida utente
Questa pagina spiega principalmente il significato dei parametri nella pagina
delle impostazioni.
![passaggio 1](../images/documents-step1.png)
## Impostazioni di base
::: tip
Impostazioni globali del downloader
:::
### 1. Scegli cartella
Il percorso in cui scaricare i video.
### 2. Tema downloader
Supporta modalità chiara e scura.
### 3. Lingua di visualizzazione
Supporta cinese, inglese e italiano.
### 4. Notifica di completamento download
Se abilitata, il sistema mostra una notifica al termine del download.
### 5. Mostra console
Se abilitata, viene mostrata la console del download.
### 6. Aggiornamento automatico
Se abilitato, il software controllerà automaticamente la disponibilità di aggiornamenti.
### 7. Consenti aggiornamenti a versioni di test
Se abilitato, il software controllerà automaticamente anche le versioni di test.
### 8. Chiusura finestra principale
Controlla se il software deve "nascondersi nella tray di sistema" o "uscire dal software" quando la finestra principale viene chiusa.
## Impostazioni browser
::: tip
Impostazioni relative alla finestra del browser
:::
### 1. Apri browser in una nuova finestra
Se abilitato, la pagina del browser viene aperta in una finestra separata.
![passaggio 1](../images/documents-step2.png)
### 2. Impostazioni proxy
Inserisci il tuo indirizzo proxy.
### 3. Interruttore proxy
Se abilitato, il **browser** usa l'indirizzo proxy inserito. Se l'interruttore proxy è disabilitato, questa impostazione non sarà disponibile.
### 4. Abilita blocco annunci
Se abilitato, gli annunci nella pagina vengono filtrati.
### 5. Usa modalità mobile
Se abilitato, il browser simula un browser mobile e richiede la versione mobile del sito.
![passaggio 2](../images/documents-step3.png)
### 6. Usa sniffing immersivo
- **Abilitato**: le risorse rilevate dal browser non vengono aggiunte automaticamente alla lista download; devi cliccare manualmente "Aggiungi alla lista" nella pagina.
![passaggio 3](../images/documents-step4.png)
- **Disabilitato**: le risorse rilevate dal browser vengono aggiunte automaticamente alla lista download.
### 7. Modalità privacy
Se abilitata, il software non salva la cronologia di navigazione.
![passaggio 4](../images/documents-step5.png)
### 8. Altre operazioni
- Cancella cache: cancella la cache del software.
- Esporta preferiti [Importa preferiti]: esporta i preferiti del software.
## Impostazioni download
::: tip
Impostazioni relative ai download
:::
### 1. Interruttore proxy download
Se abilitato, il **downloader** usa l'indirizzo proxy inserito. Le impostazioni proxy del **browser** e del **downloader** sono indipendenti.
### 2. Elimina file parziali al completamento
Se abilitato, i file parziali vengono eliminati al termine del download.
### 3. Download simultanei massimi
Controlla quanti file video possono essere scaricati contemporaneamente. Il massimo è 10, il minimo è 1.
### 4. Altre operazioni
- Directory file di configurazione: percorso del database, dei log e degli altri dati del software.
- Directory file eseguibili: percorso dei binari del downloader.
- Percorso archiviazione locale: percorso locale in cui vengono salvati i video scaricati.
### 5. Versione corrente
Mostra la versione corrente del software.
## Altri problemi
### D: Download di live stream
R: Il software supporta i download di live stream. Al momento non esiste un metodo affidabile per distinguerli, quindi tutte le console di download vengono abilitate. L'utente deve selezionare manualmente la sorgente dati da scaricare.
### D: Versione macOS
R: Per **chip Intel**, devi installare la versione x64 dalla release.
Dopo l'installazione, devi consentire l'apertura dell'app nelle impostazioni Sicurezza di macOS.
![QA1](../images/documents-qa1.png)
Per **chip Apple**, devi installare la versione arm64 dalla release.
Dopo l'installazione, esegui il comando `sudo xattr -dr com.apple.quarantine /Applications/mediago.app` nella console.
### D: Versioni precedenti
R: La versione 1.1.5 è stata rilasciata tempo fa ed è stata verificata come stabile da molti utenti. Se vuoi usare la vecchia versione, visita [questo link](/it/history.html).
### D: Utenti Windows 7
R: Le versioni successive alla v2.0.0 non supportano più Windows 7. Se devi usare il software su Windows 7, scarica la versione 1.1.5. I sistemi a 32 bit non sono supportati per impostazione predefinita.
+70
View File
@@ -0,0 +1,70 @@
---
layout: doc
outline: deep
---
# Estensione browser
MediaGo include una leggera estensione browser Manifest V3 che rileva URL video / audio scaricabili su qualsiasi sito e li invia a MediaGo con un clic.
## Cosa fa
- Rileva stream HLS / m3u8 e file multimediali diretti `.mp4` / `.flv` / `.mov` in ogni pagina visitata
- Riconosce pagine video Bilibili e URL YouTube video / short / live / embed
- Mostra il numero di risorse rilevate nel badge dell'icona della toolbar
- Importa una singola sorgente o tutte le sorgenti in MediaGo con un clic (desktop o self-hosted)
## Installazione
L'estensione non è ancora su Chrome Web Store, quindi deve essere caricata come "estensione non pacchettizzata". L'installer di MediaGo Desktop la include già: non devi scaricarla separatamente.
1. Apri MediaGo Desktop
2. Vai in **Impostazioni → Altre impostazioni → Directory estensione browser** e clicca il pulsante per aprire la cartella dell'estensione
3. In Chrome / Edge, visita `chrome://extensions/`
4. Attiva **Modalità sviluppatore** in alto a destra
5. Clicca **Carica estensione non pacchettizzata** e seleziona la cartella aperta al punto 2
6. Dovresti vedere l'icona dell'estensione nella toolbar: fissala per accedervi più facilmente
## Modalità di invio
Clicca l'icona ingranaggio nel popup per aprire la pagina opzioni, poi scegli una modalità:
| Modalità | Quando usarla | Richiede |
| ----------------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| **Desktop · Protocollo schema** | MediaGo Desktop installato localmente; il browser può passare link protocollo | Nessuna configurazione; la prima chiamata mostra "Aprire MediaGo?" — spunta "Consenti sempre" per l'invio silenzioso successivo |
| **Desktop · HTTP locale** (default) | MediaGo Desktop installato e in esecuzione | Nessuna configurazione; l'estensione si connette a `127.0.0.1:39719` |
| **Docker / Self-hosted · HTTP** | Connessione a un server MediaGo remoto, ad esempio Docker | URL server richiesto; API Key se il server è avviato con `--enable-auth` |
> **L'estensione non effettua mai fallback silenziosi.** Una volta scelta una modalità, qualsiasi errore viene mostrato così com'è: cambia modalità manualmente nella pagina opzioni se necessario.
## Comportamento di importazione
Due toggle nella pagina opzioni sotto **Comportamento importazione**:
- **Avvia download subito** — On: l'attività viene messa in coda e avviata. Off: viene solo aggiunta alla lista, in attesa dell'avvio manuale. Vale per Schema e HTTP.
- **Importazione silenziosa (modalità Schema)** — On: il deeplink include `silent=1` e MediaGo crea subito l'attività. Off: MediaGo apre il modulo download precompilato con nome / tipo / cartella rilevati per la revisione. Vale solo in modalità Schema; HTTP è sempre silenzioso.
## Lingua interfaccia
L'estensione supporta cinese, inglese e italiano. Per impostazione predefinita segue la lingua UI del browser. Puoi forzare la scelta nella pagina opzioni sotto **Lingua interfaccia**: Segui sistema / 中文 / English / Italiano.
## Risoluzione problemi
### Il pulsante "Directory estensione browser" non fa nulla
- **Sviluppo**: esegui prima `pnpm -F @mediago/extension build` per generare la dist
- **Produzione**: reinstalla MediaGo: la cartella `resources/extension/` dovrebbe esistere nella directory di installazione dell'app
### Il test connessione Desktop · HTTP fallisce
- Verifica che MediaGo Desktop sia in esecuzione
- Verifica che la porta `39719` non sia occupata da un altro processo (`netstat -ano | findstr 39719` su Windows)
- Se esegui anche MediaGo in modalità web/server locale, nota che Go Core standalone usa `9900`, non `39719`
### La modalità Schema chiede conferma ogni volta
Al primo passaggio Chrome mostra "Aprire MediaGo-community?": spunta **Consenti sempre**. Le chiamate successive saranno silenziose.
### La modalità Schema fallisce con l'importazione batch
Schema invia una sola attività per chiamata: è una limitazione fondamentale dei protocolli di hand-off. Passa alla modalità HTTP (Desktop o Docker) per importazioni batch.
+111
View File
@@ -0,0 +1,111 @@
---
layout: doc
outline: deep
---
# Avvio rapido
Questa guida ti aiuta a iniziare rapidamente con MediaGo. Supporta anche
[OpenClaw Skill](/it/skills) per scaricare video tramite linguaggio naturale
nei tuoi assistenti AI per programmare.
::: info
v3.5 è la versione più recente. Se incontri problemi in questa release,
lascia pure un feedback: lo gestiremo il prima possibile.
:::
::: tip
Uso su macOS
- **[Chip Intel]** Installa la build x64 dalla pagina release. Dopo l'installazione, consenti le app di sviluppatori non identificati nelle impostazioni Sicurezza del Mac.
- **[Apple Silicon]** Installa la build arm64 dalla pagina release. Dopo l'installazione, esegui `sudo xattr -dr com.apple.quarantine /Applications/mediago-community.app` nel Terminale.
:::
## Download e installazione
### v3.5.0 (rilasciata il 22 aprile 2026)
#### Download software
- [【mediago】 Windows (installer) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 Windows (portable) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macOS arm64 (Apple Silicon) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macOS x64 (Intel) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 Linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago): `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**: `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
Le versioni precedenti sono disponibili nella [pagina GitHub Releases](https://github.com/caorushizi/mediago/releases).
#### Novità
- **Estensione browser** (Chrome / Edge): sniffing video con un clic su qualsiasi sito.
- **YouTube e 1000+ siti**: basato su yt-dlp.
- **OpenClaw Skill**: scarica video tramite assistenti AI.
- **API HTTP aperta**: integrazione con script, automazioni e strumenti di terze parti.
- **Conversione formato in app**: scegli formato e qualità dopo il download.
- **Deploy Docker più semplice**: immagini multi-arch su GHCR, montando una sola cartella.
- **Avvio più rapido**: backend riscritto in Go, minore memoria, player integrato.
## Istruzioni operative
### Sniffing video automatico
1. Seleziona "Estrazione risorse"
![passaggio 1](../images/guides-step1.png)
2. Inserisci l'URL del video
![passaggio 2](../images/guides-step2.png)
3. Clicca "Avvia download" per scaricare il video
![passaggio 3](../images/guides-step3.png)
### Download manuale
1. Clicca il pulsante "Nuovo download" in alto a destra
![passaggio 1](../images/guides-step4.png)
2. Nella finestra del nuovo download, inserisci "Nome video" e il link "Stream (m3u8)" o "Bilibili"
![passaggio 2](../images/guides-step5.png)
3. Clicca per scaricare il video dalla lista
![passaggio 3](../images/guides-step3.png)
### Download in batch
![passaggio 3](../images/guides-step6.png)
### Funzioni aggiuntive
1. Converti in audio
![passaggio 1](../images/guides-step7.png)
2. Altre funzioni saranno aggiunte in futuro. Restate sintonizzati!
### Riproduzione video
- Riproduzione su PC
![passaggio 2](../images/addition-step3.png)
- Riproduzione mobile
![passaggio 3](../images/addition-step4.png)
## Inizia a scaricare i tuoi video
È così semplice. Puoi iniziare subito a scaricare i tuoi video.
::: warning
Questo software è destinato esclusivamente a scopi di studio e comunicazione.
:::
+21
View File
@@ -0,0 +1,21 @@
---
layout: doc
outline: deep
---
# Versioni precedenti
::: info
Questo è il link permanente per le versioni precedenti. Se necessario, puoi scaricarle qui.
**Nota: queste versioni non si aggiornano automaticamente, quindi puoi usarle con tranquillità.**
:::
**v1.1.5 (rilasciata il 5 febbraio 2022)**
- [Windows mediago v1.1.5](https://github.com/caorushizi/mediago/releases/download/1.1.5/media-downloader-setup-1.1.4.exe)
- ~~macOS mediago v1.1.5 non disponibile~~
**Changelog**
- Aggiunto supporto al download video.
+48
View File
@@ -0,0 +1,48 @@
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home
hero:
name: "MediaGo"
text: "Downloader video multipiattaforma"
tagline: "Sniffing integrato: apri una pagina, scegli cosa scaricare, salva. Nessuna cattura pacchetti, nessun plugin, nessuno strumento da riga di comando."
image:
src: /home_en.png
alt: "Schermata iniziale di MediaGo"
actions:
- theme: brand
text: "Avvio rapido"
link: /it/guides
- theme: alt
text: "Guida utente"
link: /it/documents
features:
- icon: ⏩
title: "Nessuna cattura pacchetti"
details: "L'app desktop include un browser integrato che rileva automaticamente ogni risorsa scaricabile nella pagina. Niente Fiddler, niente Charles, niente acrobazie con DevTools."
- icon: 🌐
title: "Estensione browser per Chrome / Edge"
details: "Sniffing video con un clic nel browser che usi ogni giorno. Il conteggio appare nel badge della toolbar; copre YouTube, Bilibili e la maggior parte delle piattaforme video principali. Inclusa nell'app desktop."
- icon: 🎬
title: "Ampia copertura delle sorgenti video"
details: "Stream HLS / m3u8, dirette, Bilibili, YouTube, Twitter/X, Instagram e oltre mille altri siti video, grazie a N_m3u8DL-RE, BBDown e yt-dlp."
- icon: ⚡️
title: "Download in batch"
details: "Scarica più video e live stream contemporaneamente. La banda veloce non resta inattiva; puoi regolare la concorrenza come preferisci."
- icon: 🎞️
title: "Conversione formato integrata"
details: "Converti i download completati in un altro formato o qualità senza uscire da MediaGo. Non serve uno strumento ffmpeg separato."
- icon: 📱
title: "Riproduzione mobile"
details: "L'app desktop ascolta anche sull'IP LAN: apri la UI web da telefono o tablet sulla stessa rete Wi-Fi per sfogliare e riprodurre i download."
- icon: 🔌
title: "API HTTP aperta"
details: "Una API HTTP completa permette a script, automazioni e app di terze parti di creare attività, controllare l'avanzamento e gestire la lista."
- icon: 🦞
title: "OpenClaw Skill"
details: 'Di'' a Claude Code, Cursor o al tuo assistente AI "please download this video": MediaGo gestisce il resto. Si installa con un solo comando.'
- icon: 🐳
title: "Deploy Docker con un comando"
details: "Un comando per distribuire MediaGo su NAS o VPS. Accesso da qualsiasi browser nella rete. Immagini multi-arch su Docker Hub e GHCR."
---
+22
View File
@@ -0,0 +1,22 @@
---
layout: doc
outline: deep
---
# Siti supportati
::: tip
Se hai siti web che vorresti vedere supportati, puoi proporli qui.
:::
**Template**
---
- Homepage del sito: xxx
- Pagina lista video (live): xxx
- Pagina video (live): xxx
---
Quando il supporto sarà completato, risponderò nella sezione commenti.
+10
View File
@@ -0,0 +1,10 @@
---
layout: doc
outline: deep
---
# Privacy Policy
::: tip
Questa è la privacy policy del software.
:::
+16
View File
@@ -0,0 +1,16 @@
---
layout: doc
outline: deep
---
# Raccolta feedback
::: info
Questa pagina serve a raccogliere problemi, suggerimenti o feedback dagli utenti.
:::
Se il software presenta un errore, descrivi chiaramente il sito e il video che stavi scaricando quando si è verificato.
Se hai un suggerimento, descrivi i tuoi requisiti in dettaglio.
Se vuoi lasciare un feedback, condividilo pure. Farò del mio meglio per soddisfare le esigenze di tutti.
+102
View File
@@ -0,0 +1,102 @@
---
layout: doc
outline: deep
---
# OpenClaw Skill
MediaGo fornisce una [OpenClaw](https://docs.openclaw.ai) Skill che ti permette di scaricare video usando linguaggio naturale nel tuo assistente AI per programmare. Installala tramite [ClawHub](https://clawhub.com).
## Prerequisiti
- MediaGo installato e in esecuzione (app desktop o Docker)
- Un assistente AI che supporta OpenClaw, ad esempio Claude Code, Cursor, ecc.
## Installare la Skill
Esegui questo comando nel terminale per installare la skill mediago da ClawHub:
```bash
npx clawhub@latest install mediago
```
## Inizializzare la configurazione
Dopo l'installazione devi configurare l'indirizzo del servizio MediaGo.
### App desktop
Invia questo messaggio al tuo assistente AI:
```
set mediago url to http://192.168.x.x:39719
```
::: tip
Puoi trovare il comando di configurazione già generato nell'app desktop MediaGo sotto **Impostazioni → Skills**: copialo e incollalo.
:::
### Docker
Docker richiede autenticazione API. Configura sia l'URL sia l'API Key:
```
set mediago url to http://localhost:8899, api key is YOUR_API_KEY
```
::: tip
Puoi trovare la tua API Key nell'interfaccia web MediaGo sotto **Impostazioni → Altre impostazioni**.
:::
## Utilizzo
Una volta configurata, puoi scaricare video con linguaggio naturale:
```
download this video https://example.com/video.m3u8
```
```
download this bilibili video https://www.bilibili.com/video/BV1xxxxxxxx
```
La skill farà automaticamente:
1. Rilevare il tipo di video (m3u8 / Bilibili / direct)
2. Creare un'attività di download e avviarla
3. Riportare l'avanzamento in tempo reale
4. Indicarti il percorso del file al termine
## Tipi video supportati
| Tipo | Descrizione | Esempio URL |
| -------- | ---------------- | --------------------------------------- |
| m3u8 | Stream HLS | `https://example.com/video.m3u8` |
| bilibili | Video Bilibili | `https://www.bilibili.com/video/BVxxxx` |
| direct | Download diretto | `https://example.com/video.mp4` |
## Altri comandi
Puoi anche gestire i download con linguaggio naturale:
- "list downloads"
- "check download status"
- "update mediago url"
## Risoluzione problemi
### Impossibile connettersi a MediaGo
Verifica:
1. Il servizio MediaGo è in esecuzione
2. URL e porta configurati sono corretti
3. Per Docker, la mappatura porta è corretta (default 8899)
### Errore API Key
Aggiorna l'API key:
```
set mediago api key to YOUR_NEW_API_KEY
```
+302
View File
@@ -0,0 +1,302 @@
---
layout: doc
outline: deep
---
# ダウンロード API
MediaGo はダウンロードエンジンを HTTP サービスとして公開しています。デスクトップ版はポート `39719` で、Docker デプロイメントはポート `9900` でリッスンします。
HTTP をしゃべれるツール(curl / Python / Node.js / Postman など)なら何でも、この API を直接呼び出してダウンロードタスクの作成、開始、停止、進捗の取得ができます —— MediaGo 自身のブラウザ拡張機能や AI Skill もこの API の利用者です。
## 基本情報
### ベース URL
| デプロイメント | Base URL |
| -------------- | ---------------------------------------------------------------------------- |
| デスクトップ版 | `http://localhost:39719` |
| Docker | `http://<サーバーアドレス>:9900`(実際の `-p` ポートマッピングに合わせて調整) |
すべてのエンドポイントは `/api` プレフィックスの下にあります。以下の例はデスクトップ版のポート `39719` を使っています。Docker 構成の場合はそちらのポートに置き換えてください。
### レスポンス形式
すべての `/api/*` エンドポイントは統一された JSON ラッパー構造を返します:
```json
{
"success": true,
"code": 0,
"message": "ok",
"data": { ... }
}
```
| フィールド | 型 | 説明 |
| ---------- | ------ | ------------------------------------------------------------ |
| `success` | bool | ビジネス処理が成功したかどうか |
| `code` | number | ビジネスエラーコード。`0` は成功 |
| `message` | string | 人間が読めるメッセージ |
| `data` | any | 実際のレスポンスペイロード。エンドポイントにより構造が異なる |
以下の例の「レスポンス」では `data` フィールドの内容のみを示します。
### 認証
- **デスクトップ版**:デフォルトで**認証不要**、`localhost:39719` に直接リクエストするだけ
- **Docker デプロイメント**:認証を有効にした場合、MediaGo の**設定ページ**から API キーを取得し、以降のリクエストに `Authorization: Bearer <key>` ヘッダーを付与します
## クイックスタート
以下の 3 つの curl コマンドで「作成 → ダウンロード開始 → 完了通知」のフローが一通り流れます。
### 1. ダウンロードタスクの作成
```bash
curl -X POST http://localhost:39719/api/downloads \
-H "Content-Type: application/json" \
-d '{
"tasks": [
{
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"name": "私の動画"
}
],
"startDownload": true
}'
```
- `type`:ダウンロードタイプ。`m3u8` / `bilibili` / `direct` / `youtube` / `mediago` から選択
- `url`:動画の URL
- `name`:タスク名(保存ファイル名として使われる)
- `startDownload`:作成後すぐにダウンロードを開始するかどうか
レスポンス:
```json
[
{
"id": 123,
"name": "私の動画",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"status": "waiting",
"createdDate": "2026-04-23T10:00:00Z"
}
]
```
返ってきた `id` を控えておいてください。以降のエンドポイントで使います。
### 2. ダウンロードイベントの購読(SSE)
```bash
curl -N http://localhost:39719/api/events
```
これは長時間接続です。サーバーがプッシュした内容がそのまま流れてきます:
```text
event: download-start
data: {"id": "123"}
event: download-success
data: {"id": "123"}
```
ブラウザ / Node.js の場合:
```javascript
const es = new EventSource("http://localhost:39719/api/events");
es.addEventListener("download-success", (e) => {
const { id } = JSON.parse(e.data);
console.log("タスク完了:", id);
});
```
### 3. 状態の照会 / 手動制御
```bash
# すべてのダウンロードタスクを一覧表示(ページング)
curl "http://localhost:39719/api/downloads?current=1&pageSize=20"
# 単一のタスクを取得
curl http://localhost:39719/api/downloads/123
# 既存のタスクを開始
curl -X POST http://localhost:39719/api/downloads/123/start \
-H "Content-Type: application/json" \
-d '{"localPath": "/Downloads/MediaGo", "deleteSegments": true}'
# タスクを停止
curl -X POST http://localhost:39719/api/downloads/123/stop
# ログを取得
curl http://localhost:39719/api/downloads/123/logs
```
## ダウンロードイベント
`GET /api/events` は Server-Sent Events ストリームです。ダウンロード関連のイベント:
| イベント名 | ペイロード | 説明 |
| ------------------ | -------------------------------- | ---------------------- |
| `download-create` | `{ids: number[], count: number}` | タスクの一括作成 |
| `download-start` | `{id: string}` | ダウンロード開始 |
| `download-success` | `{id: string}` | ダウンロード成功 |
| `download-failed` | `{id: string, error: string}` | ダウンロード失敗 |
| `download-stop` | `{id: string}` | ダウンロードを手動停止 |
## エンドポイントリファレンス
### 一覧 / 照会
#### `GET /api/downloads` — ページング付きの一覧取得
**クエリパラメータ:**
- `current` (number, デフォルト 1):ページ番号
- `pageSize` (number, デフォルト 20):ページサイズ
- `filter` (string, 任意):ステータスでフィルタ(`downloading` / `success` / `failed`)
- `localPath` (string, 任意):保存パスでフィルタ
**レスポンス:**
```json
{
"total": 42,
"list": [
/* DownloadTask[] */
]
}
```
#### `GET /api/downloads/active` — アクティブなタスクの一覧
`waiting` / `downloading` 状態のタスクをすべて返します。
#### `GET /api/downloads/:id` — 単一タスクの取得
**レスポンス**(`DownloadTask` 構造):
```json
{
"id": 123,
"name": "私の動画",
"type": "m3u8",
"url": "https://example.com/video.m3u8",
"folder": "my-folder",
"headers": "User-Agent: ...",
"isLive": false,
"status": "success",
"file": "/path/to/saved.mp4",
"createdDate": "2026-04-23T10:00:00Z",
"updatedDate": "2026-04-23T10:05:30Z"
}
```
#### `GET /api/downloads/folders` — 重複なしの保存ディレクトリ一覧
**レスポンス:** `string[]`
#### `GET /api/downloads/export` — ダウンロードリストのエクスポート
プレーンテキスト、1 行 1 URL。
#### `GET /api/downloads/:id/logs` — ダウンロードログの取得
**レスポンス:** `{ id, log: string }`
### 作成 / 削除
#### `POST /api/downloads` — ダウンロードの一括作成
**リクエストボディ:**
```json
{
"tasks": [
{
"type": "m3u8 | bilibili | direct | youtube | mediago",
"url": "https://example.com/video.m3u8",
"name": "タスク名",
"folder": "任意のサブディレクトリ",
"headers": "任意、複数行の HTTP ヘッダー"
}
],
"startDownload": true
}
```
**レスポンス:** `DownloadTask[]`
#### `DELETE /api/downloads/:id` — タスクの削除
**レスポンス:** `{}`
### 編集 / ステータス
#### `PUT /api/downloads/:id` — タスクの編集
**リクエストボディ**(すべて任意):
```json
{
"name": "新しい名前",
"url": "新しい URL",
"headers": "新しいヘッダー",
"folder": "新しいサブディレクトリ"
}
```
#### `PUT /api/downloads/:id/live` — ライブ配信フラグの切り替え
**リクエストボディ:** `{ "isLive": true }`
#### `PUT /api/downloads/status` — ステータスの一括更新
**リクエストボディ:** `{ "ids": number[], "status": "waiting | downloading | success | failed | stopped" }`
### 開始 / 停止
#### `POST /api/downloads/:id/start` — ダウンロード開始
**リクエストボディ:**
```json
{
"localPath": "/Users/me/Downloads/MediaGo",
"deleteSegments": true
}
```
- `localPath`:保存先(絶対パス)
- `deleteSegments`:m3u8 ダウンロード完了後、分割された `.ts` ファイルを削除するかどうか
#### `POST /api/downloads/:id/stop` — ダウンロード停止
**レスポンス:** `{}`
## 列挙値
### ダウンロードタイプ `type`
| 値 | 説明 |
| ---------- | ------------------------------------------------- |
| `m3u8` | HLS ストリーム(内部では N_m3u8DL-RE を使用) |
| `bilibili` | Bilibili 動画(内部では BBDown を使用) |
| `direct` | 直接 HTTP ダウンロード(内部では aria2 を使用) |
| `youtube` | YouTube および yt-dlp がサポートする 1000+ サイト |
| `mediago` | MediaGo 内部タイプ |
### タスク状態 `status`
| 値 | 説明 |
| ------------- | -------------------- |
| `waiting` | キューに入り、未開始 |
| `downloading` | ダウンロード中 |
| `success` | 完了 |
| `failed` | 失敗 |
| `stopped` | 手動停止 |
+22
View File
@@ -5,6 +5,28 @@ outline: deep
# 更新ログ
## v3.5.0 (2026.4.22 リリース)
### ソフトウェアダウンロード
- [【mediago】 Windows(インストーラー版) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 Windows(ポータブル版) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macOS arm64Apple Silicon v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macOS x64Intel v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 Linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago)`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
### 主な新機能
- **🌐 ブラウザ拡張機能(Chrome / Edge)** — 任意のサイトで動画をワンクリックスニッフィング、MediaGo へ送信
- **🎬 YouTube と 1000+ サイト** — yt-dlp による対応
- **🦞 OpenClaw Skill** — AI コーディングアシスタント経由で自然言語ダウンロード
- **🔌 HTTP API** — スクリプト・自動化・サードパーティツールとの統合
- **🎞️ アプリ内フォーマット変換** — ダウンロード完了後に出力形式と画質を選択
- **🐳 Docker デプロイの簡素化** — GitHub Container Registry のマルチアーキテクチャイメージ、単一ディレクトリのマウント
- **⚡ 起動の高速化** — バックエンドを Go で書き直し、メモリ使用量の削減、内蔵動画プレーヤー
## v3.0.0 (2024.10.7 リリース)
### ソフトウェアダウンロード
+1 -1
View File
@@ -25,7 +25,7 @@ outline: deep
### 3. 表示言語
中国語と英語がサポートされています。
中国語、英語、イタリア語がサポートされています。
### 4. ダウンロード完了通知
+1 -1
View File
@@ -46,7 +46,7 @@ Chrome Web Store には未公開のため、「パッケージ化されていな
## インターフェース言語
拡張機能は日本語表示はサポートしておらず、中国語英語のみ対応します。既定ではブラウザの UI 言語に追随します(中国語ブラウザでは中国語、それ以外は英語)。設定ページの **インターフェース言語** から強制切替も可能です(システムに従う / 中文 / English)。
拡張機能は日本語表示はサポートしておらず、中国語英語・イタリア語に対応します。既定ではブラウザの UI 言語に追随します。設定ページの **インターフェース言語** から強制切替も可能です(システムに従う / 中文 / English / Italiano)。
## よくある質問
+25 -31
View File
@@ -7,49 +7,43 @@ outline: deep
この記事では、ソフトウェアの簡単な説明を行い、すぐに使用できるようにします。[OpenClaw Skill](/jp/skills) に対応し、AI アシスタントで自然言語を使って動画をダウンロードできます。
::: tip
皆さんがより便利にコミュニケーションできるよう、フィードバックグループに参加できます:
MediaGo QQフィードバックグループ 1 574209001
::: info
v3.5 が最新バージョンです。ご意見はできるだけこのバージョンでお寄せください。できるだけ早く対応します。
:::
::: info
v3.0 は最新バージョンです。皆さんの意見はできるだけ3.0バージョンでお寄せください。私たちはできるだけ早く修正します。
::: tip
macOS での使用
- **【Intel チップ】** Release から x64 版をインストールしてください。インストール後、Mac のセキュリティ設定で「身元不明の開発元からの App」を許可する必要があります。
- **【Apple チップ】** Release から arm64 版をインストールしてください。インストール後、ターミナルで `sudo xattr -dr com.apple.quarantine /Applications/mediago-community.app` を実行する必要があります。
:::
## ダウンロードとインストール
### v3.0.0 (2024年10月7日リリース)
### v3.5.0 (2026年4月22日リリース)
#### ソフトウェアのダウンロード
- [【mediago】 windows(インストー版) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-win32-x64-3.0.0.exe)
- [【mediago】 windows(ポータブル版) v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-portable-win32-x64-3.0.0.exe)
- [【mediago】 macos arm64Appleチップ v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-arm64-3.0.0.dmg)
- [【mediago】 macos x64Intelチップ v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-darwin-x64-3.0.0.dmg)
- [【mediago】 linux v3.0.0](https://github.com/caorushizi/mediago/releases/download/v3.0.0/mediago-setup-linux-amd64-3.0.0.deb)
- 【mediago】 docker v3.0 `docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:latest`
- [【mediago】 Windows(インストーラー版) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-win32-x64-3.5.0.exe)
- [【mediago】 Windows(ポータブル版) v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-portable-win32-x64-3.5.0.exe)
- [【mediago】 macOS arm64Apple Silicon v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-arm64-3.5.0.dmg)
- [【mediago】 macOS x64Intel v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-darwin-x64-3.5.0.dmg)
- [【mediago】 Linux v3.5.0](https://github.com/caorushizi/mediago/releases/download/v3.5.0/mediago-community-setup-linux-amd64-3.5.0.deb)
- [**Docker Hub**](https://hub.docker.com/r/caorushizi/mediago)`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0`
- **GHCR**`docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago ghcr.io/caorushizi/mediago:3.5.0`
#### 重要な更新内容
過去のバージョンは [GitHub Releases ページ](https://github.com/caorushizi/mediago/releases) をご覧ください。
- DockerでWeb端末の展開をサポート
- デスクトップ端末UIを更新
#### 主な新機能
#### 更新ロ
- DockerでWeb端末の展開をサポート
- デスクトップ端末UIを更新
- 動画再生機能を追加、デスクトップとモバイル端末両方で再生可能
- macで画面が表示されない問題を修正
- バッチダウンロードのインタラクションを最適化
- Windows用ポータブル版(インストール不要)を追加
- ダウンロードリストを最適化し、ページ内の複数の動画の嗅探をサポート
- お気に入りリストの手動インポート/エクスポートをサポート
- ホームページのダウンロードリストエクスポートをサポート
- 【新規ダウンロード】フォームのインタラクションロジックを最適化
- UrlSchemeを使用してアプリを開き、ダウンロードタスクを追加
- バグの修正とユーザーエクスペリエンスの向上
- **ブラウザ拡張機能** (Chrome / Edge) — 任意のサイトで動画をワンクリックスニッフィン
- **YouTube と 1000+ サイト** — yt-dlp による対応
- **OpenClaw Skill** — AI コーディングアシスタント経由でのダウンロード
- **HTTP API** — スクリプト・自動化・サードパーティツールとの統合
- **アプリ内フォーマット変換** — ダウンロード完了後に出力形式と画質を選択
- **Docker デプロイの簡素化** — GHCR のマルチアーキテクチャイメージ、単一ディレクトリのマウント
- **起動の高速化** — バックエンドを Go で書き直し、メモリ使用量の削減、内蔵動画プレーヤー
## 操作方法
+27 -15
View File
@@ -2,34 +2,46 @@
layout: home
hero:
name: "オンライン動画ダウンロード"
text: "簡単に使えて、素早くダウンロー"
tagline: 簡単に学べ、パケットキャプチャ不要、プラグインのインストールも不要
name: "MediaGo"
text: "クロスプラットフォーム動画ダウンローダー"
tagline: "ビルトインのスニッフィング — ページを開いて、欲しいリソースを選んで、保存するだけ。パケットキャプチャ不要、プラグイン不要、コマンドライン不要。"
image:
src: /home.png
alt: home
alt: MediaGo ホーム画面
actions:
- theme: brand
text: すぐに開始
link: /guides
link: /jp/guides
- theme: alt
text: 使用説明
link: /documents
link: /jp/documents
features:
- icon: ⏩
title: パケットキャプチャ不要
details: ソフトウェア内蔵ブラウザを使用して、ウェブページの動画リソースを簡単にスニッフし、スニッフしたリソースのリストからダウンロードしたいリソースを選択できます。シンプルで高速です。
- icon: 📱
title: モバイル再生
details: PCとモバイルデバイス間でシームレスに切り替えができ、ダウンロードが完了するとすぐにスマホで動画を視聴できます
details: デスクトップ版に内蔵ブラウザを搭載、動画ページを開くだけでダウンロード可能なリソースを自動で検出します。Fiddler や Charles などのパケットキャプチャツールは不要です。
- icon: 🌐
title: ブラウザ拡張機能(Chrome / Edge
details: 普段使いの Chrome / Edge でワンクリック動画スニッフィング。ツールバーアイコンに検出件数を表示し、YouTube、Bilibili など主要な動画サイトに対応。デスクトップ版に同梱
- icon: 🎬
title: 幅広い動画ソースに対応
details: HLS / m3u8 ストリーム、ライブ配信、Bilibili、YouTube、Twitter/X、Instagram など 1000 以上の動画サイトに対応。内部では N_m3u8DL-RE、BBDown、yt-dlp を使用しています。
- icon: ⚡️
title: バッチダウンロード対応
details: 複数の動画やライブストリーミングリソースを同時にダウンロードでき、高速な帯域幅無駄に使われることはありません
- icon: 🎉
title: Dockerデプロイ対応
details: Web端をDockerでデプロイでき、簡単で迅速に設定できます
details: 複数の動画やライブストリーミングを同時にダウンロード高速な帯域幅無駄にせず、同時実行数もお好みで調整できます
- icon: 🎞️
title: 内蔵フォーマット変換
details: ダウンロード完了後、MediaGo 内で他のフォーマットや画質に変換できます。ffmpeg を別途起動する必要はありません
- icon: 📱
title: モバイル再生
details: デスクトップ版は LAN IP でも待ち受けるため、同じ Wi-Fi のスマートフォンやタブレットから Web UI を開いてダウンロード一覧を参照し、直接再生できます。
- icon: 🔌
title: 開放 HTTP API
details: 完全な HTTP API を提供し、スクリプト、自動化ツール、サードパーティアプリからダウンロードタスクの作成、進捗の取得、リスト管理が可能です。
- icon: 🦞
title: OpenClaw Skill
details: AI コーディングアシスタント(OpenClaw、Claude Code など)で自然言語を使って動画をダウンロード。ワンコマンドでインストール。
details: Claude Code や Cursor などの AI コーディングアシスタントに「この動画をダウンロードして」と伝えるだけで OK。ワンコマンドで Skill をインストール。
- icon: 🐳
title: Docker ワンライン展開
details: 1 コマンドで NAS / VPS にデプロイ、同じネットワーク内のブラウザから直接アクセス。Docker Hub と GHCR のマルチアーキテクチャイメージ対応。
---
Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

+1
View File
@@ -24,6 +24,7 @@
"check": "pnpm lint && pnpm format:check && turbo type:check",
"pack:electron": "pnpm core:build && pnpm build:electron && pnpm -F @mediago/electron run pack",
"release:electron": "pnpm core:build && pnpm build:electron && pnpm -F @mediago/electron run release",
"build:docker": "docker build -t mediago:local .",
"docs:dev": "pnpm -F @mediago/docs run docs:dev",
"docs:build": "pnpm -F @mediago/docs run docs:build",
"type:check": "turbo type:check",
@@ -0,0 +1,14 @@
{
"appName": {
"message": "MediaGo Rilevatore media",
"description": "Extension name shown in the Chrome toolbar and chrome://extensions."
},
"appDescription": {
"message": "Rileva URL video / audio scaricabili su qualsiasi pagina e inviali al tuo server MediaGo con un clic.",
"description": "Extension description shown in chrome://extensions."
},
"actionTitle": {
"message": "MediaGo Rilevatore media",
"description": "Tooltip shown when hovering the toolbar icon."
}
}
+5 -2
View File
@@ -17,12 +17,15 @@ export type ExtensionLanguage = "system" | SupportedLanguage;
export function resolveLanguage(
setting: ExtensionLanguage | undefined,
): SupportedLanguage {
if (setting === "zh" || setting === "en") return setting;
if (setting === "zh" || setting === "en" || setting === "it") return setting;
const uiLang =
(typeof chrome !== "undefined" && chrome.i18n?.getUILanguage?.()) ||
(typeof navigator !== "undefined" ? navigator.language : "") ||
"";
return uiLang.toLowerCase().startsWith("zh") ? "zh" : "en";
const normalizedUiLang = uiLang.toLowerCase();
if (normalizedUiLang.startsWith("zh")) return "zh";
if (normalizedUiLang.startsWith("it")) return "it";
return "en";
}
/**
@@ -33,6 +33,7 @@ const resource: ExtensionResources = {
system: "Follow system",
zh: "中文",
en: "English",
it: "Italiano",
},
server: {
title: "Dispatch Mode",
@@ -1,10 +1,12 @@
import en from "./en";
import it from "./it";
import zh from "./zh";
export { type ExtensionResources } from "./zh";
export const resources = {
en: { translation: en },
it: { translation: it },
zh: { translation: zh },
} as const;
@@ -0,0 +1,115 @@
import type { ExtensionResources } from "./zh";
const resource: ExtensionResources = {
popup: {
header: "Sniffer MediaGo",
clear: "Azzera",
importAll: "Importa tutto",
importAllWithCount: "Importa tutto ({{count}})",
settings: "Impostazioni",
imported: "Importate {{count}} attività",
importFailed: "Importazione fallita",
},
status: {
detecting: "Rilevamento",
schemaMode: "Modo schema",
notConfigured: "Non configurato",
connectionFailed: "Connessione fallita",
},
empty: {
title: "Nessuna risorsa scaricabile rilevata in questa pagina.",
hint: "Durante la navigazione le sorgenti corrispondenti vengono visualizzate automaticamente qui.",
},
source: {
unnamed: "(senza titolo)",
import: "Importa",
},
options: {
pageTitle: "Impostazioni estensione MediaGo",
language: {
title: "Lingua interfaccia",
description:
`Lingua usata dal popup e dalla pagina delle opzioni. Scelte "Usa stessa lingua sistema" in base alla lingua dell'interfaccia utente del browser.`,
system: "Usa stessa lingua sistema",
zh: "中文",
en: "English",
it: "Italiano",
},
server: {
title: "Modalità spedizione",
description:
"L'estensione non fallisce mai silenziosamente. Una volta scelta una modalità, qualsiasi errore viene segnalato così com'è: se necessario cambia modalità manualmente in questa pagina.",
modeSchemaTitle: "Desktop · Protocollo schema",
modeSchemaDesc:
"Passa tramite il protocollo mediago-community:// (avvia desktop se non è in esecuzione). Richiede l'installazione locale dell'app MediaGo Desktop.",
modeDesktopHttpTitle: "Desktop · HTTP locale",
modeDesktopHttpDesc:
"Parla con l'app desktop in esecuzione tramite {{base}}. Richiede che l'app desktop sia in esecuzione, ma non c'è nessuna finestra di conferma.",
modeDockerHttpTitle: "Docker / HTTP self-hosted",
modeDockerHttpDesc:
"Connettiti ad una distribuzione Docker remota o a qualsiasi server MediaGo self-hosted. Richiede una URL del server; quando l'autenticazione è abilitata aggiungi una chiave API.",
serverUrlLabel: "URL server",
serverUrlPlaceholder: "http://your-host:8899",
apiKeyLabel: "Chiave API",
apiKeyOptional: "(opzionale)",
apiKeyPlaceholder: "Lascia vuoto per saltare l'intestazione X-API-Key",
schemaNoteLead: "Usa MediaGo esistente",
schemaNoteMid:
"Protocollo di instradamento del renderer per richiamare Desktop. La scheda attiva viene indirizzata all'URL del protocollo (stesso schema di cat-catch). Chrome visualizza la prima volta una finestra di dialogo 'Apri MediaGo-community?'",
schemaAllow: "Consenti",
schemaAlways: "Consenti sempre",
schemaAfter: "per rendere silenziosi i successivi passaggi di consegna.",
limitationLabel: "Limitazione",
limitationBody:
"Lo schema invia solo un'attività alla volta: per le importazioni batch usa la modalità HTTP.",
desktopHttpNoteLead: "Collegati sempre a",
desktopHttpNoteTail:
"Il desktop ascolta automaticamente all'avvio; per verificare che sia online usa 'Verifica connessione'.",
},
importBehaviour: {
title: "Comportamento importazione",
descriptionLead: "Questi switch si basano sulla stringa di query del collegamento diretto (",
descriptionMid: ") o dal corpo HTTP (",
descriptionTail: ") e dicono a MediaGo cosa fare con l'attività in arrivo.",
downloadNowLabel: "Avvia immediatamente download",
downloadNowDesc:
"ON: l'attività è in coda e AVVIATA. OFF: viene solo aggiunta all'elenco, in attesa che l'utente la avvii. Si applica sia alla modalità Schema che a quella HTTP.",
schemaSilentLabel: "Importazione silenziosa (modalità schema)",
schemaSilentActive:
"ON: il deeplink porta silent=1 quindi MediaGo crea immediatamente l'attività. OFF: MediaGo apre il modulo di download precompilato con il nome/tipo/cartella sniffata per la revisione.",
schemaSilentInactive:
"Ha effetto solo in modalità sSchema: la modalità HTTP non prevede il concetto di dialogo ed è sempre silenziosa.",
},
rules: {
title: "Regole sniffing",
descriptionLead: "Le regole vengono mantenute centralmente in",
descriptionTail: "e condivise tra app desktop e l'estensione del browser.",
m3u8Label: "Stream HLS/m3u8",
directLabel: "File multimediali diretti",
bilibiliLabel: "Pagine video Bilibili",
youtubeLabel: "YouTube",
},
},
common: {
save: "Salva",
saved: "Salvato",
saveFailed: "Impossibile salvare",
testConnection: "Test connessione",
},
errors: {
serverUrlRequired: "Prima inserisci l'URL del server",
dockerServerRequired: "La modalità Docker richiede una URL del server",
schemaBatchNotSupported:
"La modalità schema può inviare solo un'attività alla volta. Per le importazioni batch passa alla modalità HTTP (pagina Opzioni).",
schemaNoActiveTab:
"Nessuna scheda attiva nella finestra attuale: impossibile richiamare il protocollo",
schemaInvoked:
"Invocato mediago-community://: se la finestra desktop non viene visualizzata, assicurati che MediaGo Desktop sia installato.",
serverNotConfigured: "Server MediaGo non configurato",
dockerNotConfigured:
"La modalità Docker non ha ancora un URL del server- configura il server nella pagina delle opzioni.",
unknown: "{{detail}}",
},
};
export default resource;
@@ -31,6 +31,7 @@ const resource = {
system: "跟随系统",
zh: "中文",
en: "English",
it: "Italiano",
},
server: {
title: "调用方式",
@@ -22,6 +22,7 @@ export function LanguageCard() {
{ value: "system", title: t("options.language.system") },
{ value: "zh", title: t("options.language.zh") },
{ value: "en", title: t("options.language.en") },
{ value: "it", title: t("options.language.it") },
];
const apply = async (next: ExtensionLanguage) => {
@@ -4,12 +4,12 @@ import type { DownloadType } from "@mediago/shared-common";
* UI language choice persisted in extension settings.
*
* - `system` — follow the browser UI language (`chrome.i18n.getUILanguage()`).
* - `zh` / `en` — hard-pinned.
* - `zh` / `en` / `it` — hard-pinned.
*
* This maps 1:1 to the "跟随系统 / 中文 / English" radio on the options
* This maps 1:1 to the language radio on the options
* page and is resolved to a concrete locale at i18n bootstrap time.
*/
export type ExtensionLanguage = "system" | "zh" | "en";
export type ExtensionLanguage = "system" | "zh" | "en" | "it";
/**
* Wire-format for localisable text produced in the service worker and
+14 -4
View File
@@ -6,8 +6,10 @@ export const BASE_I18N_OPTIONS = {
},
} as const;
export type ResolvedAppLanguage = "zh" | "en" | "it";
/**
* Resolve a stored AppStore.language value to a real i18n key ("zh" | "en").
* Resolve a stored AppStore.language value to a real i18n key.
*
* The persisted language may be `"system"` (meta value meaning "follow OS locale").
* Each process resolves it at apply-time by passing its own locale source:
@@ -19,9 +21,17 @@ export const BASE_I18N_OPTIONS = {
export function resolveAppLanguage(
language: string | undefined,
systemLocale: string | undefined,
): "zh" | "en" {
if (language === "zh" || language === "en") {
): ResolvedAppLanguage {
if (language === "zh" || language === "en" || language === "it") {
return language;
}
return (systemLocale ?? "").toLowerCase().startsWith("zh") ? "zh" : "en";
const normalizedSystemLocale = (systemLocale ?? "").toLowerCase();
if (normalizedSystemLocale.startsWith("zh")) {
return "zh";
}
if (normalizedSystemLocale.startsWith("it")) {
return "it";
}
return "en";
}
+1
View File
@@ -9,5 +9,6 @@ export {
DEFAULT_FRONTEND_APP,
i18nResources,
en,
it,
zh,
} from "./resources";
@@ -57,6 +57,7 @@ export const en = {
displayLanguage: "Language",
chinese: "中文",
english: "English",
italian: "Italiano",
pleaseSelectLanguage: "Select a language",
downloadPrompt: "Download prompt",
browserSetting: "Browser",

Some files were not shown because too many files have changed in this diff Show More