Compare commits

..

1164 Commits

Author SHA1 Message Date
caorushizi 9a35583eed 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:03:18 +08: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
caorushizi 74b67101ae feat(extension): pin manifest version to the Desktop app version
Build & Push Docker Image / Build and push multi-arch image (push) Failing after 1s
Users naturally expect the "Current version" label in chrome://extensions
to match the version shown inside the MediaGo window. Tie both to a single
source of truth: `apps/electron/app/package.json`, which Electron's build
pipeline (`apps/electron/tsdown.config.ts`) already reads and exposes as
`process.env.APP_VERSION`.

`manifest.config.ts` now imports the same file and:

- `version`   — stripped down to the numeric prefix (`split(/[-+]/)[0]`)
                so Chrome accepts it. Chrome's manifest parser only
                allows 1–4 dot-separated integers; SemVer pre-release
                or build suffixes (`-beta.2`, `+build.7`) get rejected
                at install time.
- `version_name` — keeps the full SemVer string. It's free-form, not
                used for update-ordering, and is what chrome://extensions
                displays when present.

Effect: bumping `apps/electron/app/package.json` once is enough to
re-stamp both the Desktop binary and the bundled extension manifest.
The extension's own `packages/mediago-extension/package.json` is a
private workspace package — its `version` field is unused by the
manifest and intentionally left alone to avoid a pointless sync step
on every release.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 18:16:07 +08:00
caorushizi 3279f40541 v3.5.0 2026-04-21 18:16:07 +08:00
caorushizi 62331e5c7b fix(ui,shared): refresh download list on externally-created tasks
Go Core already broadcast a `download-create` SSE event whenever
`/api/downloads` POST lands (UI, browser extension, Docker clients —
any route). The UI listened, but only to bump the sidebar badge via
`useDownloadStore.increase()`. The SWR list fetched by `useTasks`
stayed stale until the user refreshed manually, so tasks imported
through the extension's desktop-http / docker-http modes never
appeared without a page reload.

Fan the same SSE event through the existing `dispatchDownload`
pipeline so `useTasks` can mutate its SWR cache alongside the other
lifecycle events (success / failed / stopped).

- `packages/shared/common/src/types/index.ts`: new
  `DownloadCreatedEvent` (`type: "created"`, carries `{ ids, count }`).
- `apps/ui/src/api/events.ts`: existing `download-create` handler now
  additionally calls `dispatchDownload({ type: "created", ... })`
  after its badge-increment side effect. Parses `ids` from the
  payload for downstream filtering if anyone needs it later.
- `apps/ui/src/hooks/use-tasks.ts`: adds `isCreatedEvent` type guard
  and calls `mutate()` on hit, same pattern as the other events.

Internal task creation (UI form submit) is untouched — it still
refreshes via its own local mutate. The SSE path only matters for
tasks that show up out-of-band.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 17:11:37 +08:00
caorushizi d9c3d8ae1d fix(ui): let users copy text from the download-log terminal
Two separate bugs had to be fixed together before copy worked:

1. `terminal-dialog.tsx` used to swallow every contextmenu event
   inside the dialog (`e.preventDefault(); e.stopPropagation()`) —
   killing Electron's built-in "Copy" menu for selected text in the
   xterm log. Drop the preventDefault so the native menu fires, but
   keep stopPropagation (now scoped to the contextmenu handler
   alone) so the event doesn't bubble up through the React tree to
   `DownloadTaskItem`'s `onContextMenu` and pop its "select /
   download / refresh / delete" menu instead. Radix Dialog portals
   the DOM to document.body, but React synthetic events still
   travel the virtual tree — this is the classic portal-bubbling
   gotcha.

2. xterm.js does not bind Ctrl+C / Cmd+C to "copy selection" by
   default; it forwards them as control chars. Since the log view
   uses `disableStdin: true`, hijacking those keys is safe.
   `attachCustomKeyEventHandler` now intercepts copy shortcuts,
   writes the selection to the clipboard via `navigator.clipboard`,
   and returns false so xterm stops handling the event. No selection
   → passthrough.

Result: both right-click → Copy and Ctrl/Cmd+C paths work.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 17:11:16 +08:00
caorushizi c34812841e fix(core): sanitize filenames at task creation to prevent path-separator injection
Twitter-style page titles like "(2) 主页 / X" land a literal "/" in
the download filename. Gopeed used to strip such characters silently;
aria2 is strict and passes them through to the OS, which then reads
"/" as a path separator — the save ends up at
`.../(2) 主页 /X-....mp4` pointing at a non-existent sub-directory
and fails with `ERROR_PATH_NOT_FOUND (errNum=3)`.

Sanitize once, at the task-creation boundary, so the DB row, the
downloader command-line `-o` arg, and the post-download
`CheckFileExists(rec.Name, ...)` probe all agree on the same
filesystem-safe value.

- New exported `core.SanitizeFilename` replaces reserved path /
  wildcard characters (`\ / : * ? " < > |`) and ASCII control chars
  with `_`, and right-trims dots / spaces (Windows strips those
  silently, producing a filename that doesn't match the DB row).
  Falls back to "download" if every character was illegal.
- `service/download_task.go` `AddDownloadTask` and `AddDownloadTasks`
  run titles through `SanitizeFilename` before the
  `FindByName` de-duplication check, so both the dedup lookup and
  the persisted row see the cleaned value.
- `core/downloader.go` `buildArgs` still calls `SanitizeFilename`
  defensively on `p.Name` — cheap, and guards any future path that
  bypasses the service layer.

Applies to every downloader (aria2, yt-dlp, BBDown, N_m3u8DL-RE,
mediago) since the fix is in the shared `name` arg-building branch
used by all Schema entries. Pre-existing broken tasks in the DB will
still fail "file not found" on the UI and need to be deleted +
re-created.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 17:10:54 +08:00
caorushizi 28e2c58366 fix(node-service): fail fast when the preferred port is already bound
If a stray MediaGo instance (typically the installed Desktop build
running in the background from the Start menu) already holds the
preferred port, a freshly-spawned child fails to bind and exits
immediately — but `waitForHealthy()` happily answers green because
the *other* instance's `/healthy` responds on the same port.
ServiceRunner then considers the service "started" and every
subsequent request silently lands on the wrong process. In practice
this surfaced as dev mode talking to the installed Go Core and
reporting a stale gopeed binary path, even though the dev build had
already been rebuilt with aria2c.

Pre-check: before spawning, open and close a throwaway TCP listener
on `<bindHost>:<preferredPort>`. If the bind fails, throw a
human-readable error instead of proceeding. The tiny check-vs-bind
race window is acceptable for catching the real-world "long-running
stray instance" case.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 17:10:30 +08:00
caorushizi a9e3ed6a22 feat(core): switch direct downloader from gopeed to aria2
Gopeed's last release is aging and its SChannel-linked Windows build
chokes on modern CDN TLS handshakes (we hit SEC_I_MESSAGE_FRAGMENT on
twimg.com). Replace it with aria2 — same short flags (-x/-s/-k carry
over verbatim), stricter arg handling, and well-trodden cross-platform
builds.

Binaries are vendored in-tree at extra/aria2/<os>/<arch>/ rather than
pulled from a single GitHub release, because aria2 static builds for
Linux / macOS / Windows come from different upstream repos. To keep
the deps pipeline unified:

- `scripts/download-deps.ts` grows a "source": "local" branch that
  copies from `extra/<tool>/<os>/<arch>/` into `.deps/<os>-<arch>/`
  instead of fetching from GitHub. Resulting layout matches the rest
  of the tools, so binaryResolver.ts needs no changes.
- `scripts/deps-versions.json`: `gopeed` entry removed, `aria2`
  entry added with source:"local" + path:"extra/aria2".
- `apps/core/internal/core/types.go`: BinaryNames[TypeDirect]
  `"gopeed"` → `"aria2c"`.
- `apps/core/internal/core/schema/loader.go`: direct schema's Args
  map to aria2's flags (-d / -o, plus --console-log-level=notice /
  --summary-interval=1 / --allow-overwrite=true /
  --auto-file-renaming=false for parseable output and predictable
  rerun behaviour). ConsoleReg regexes updated to aria2's summary
  line format (e.g. "DL:512KiB" for speed, "(83%)" for percent).
  `--check-certificate=false` tacked on as a workaround for the
  SChannel handshake issue on the bundled 1.19.0 Windows build —
  proper fix is upgrading the vendored binary to a build that links
  against OpenSSL (e.g. 1.37.0), comment calls that out.
- `apps/core/.env`, `Dockerfile`, `apps/electron/scripts/build.ts`,
  `apps/core/README.md`: gopeed → aria2c / aria2 references.

No DB migration: existing `type: "direct"` rows keep working, the
underlying binary just swaps.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 17:09:35 +08:00
caorushizi 48aabc9a7d v3.5.0-beta.2 2026-04-21 14:26:34 +08:00
caorushizi b72b39ad7e fix(node-service): bind to 0.0.0.0 when internal=false so localhost reaches the server
ServiceRunner used to pass the detected LAN IPv4 as the `HOST` env var
when `internal: false`, so the Go Core bound *only* to that LAN IP —
requests to 127.0.0.1 / localhost were refused. That blocked the
browser-extension's `desktop-http` mode (fixed at `http://127.0.0.1`).

Split bind host from display host:
- Bind (`HOST` env to child): `0.0.0.0` when `internal: false`, else
  `127.0.0.1`. Listener now accepts traffic on every interface.
- Display (`state.host` / `getURL()`): keeps the detected LAN IPv4
  when `internal: false` so the settings UI can surface a shareable
  LAN URL, falls back to 127.0.0.1 otherwise.

Net effect: Desktop is reachable via 127.0.0.1, localhost, and its LAN
IP simultaneously, while the UI still shows the LAN address.

Also translates all remaining Chinese JSDoc / inline comments in
`index.ts` and `utils.ts` to English, matching the rest of the package.
Behaviour otherwise unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 13:56:22 +08:00
caorushizi f04989e973 feat(extension): bundle into desktop app with settings entry and docs
Ship the MediaGo browser extension alongside the Desktop installer so
users can "Load unpacked" it from Chrome / Edge without building the
repo or downloading a separate zip. Adds a discovery path from inside
the app, a three-language doc page, and fixes the Desktop HTTP port
the extension was pointing at.

Packaging:
- `pnpm build:electron` now also builds `@mediago/extension` (turbo
  filter), and `apps/electron/scripts/build.ts` copies the dist to
  `app/build/extension/` and declares it in electron-builder
  `extraResources` → installers land `resources/extension/`.

Runtime:
- `resolveExtensionDir()` in binaryResolver — dev points at the
  monorepo dist, prod at `process.resourcesPath/extension`, env
  override via `MEDIAGO_EXTENSION_DIR`.
- New IPC `app.getExtensionDir()` returns the resolved path. UI pairs
  it with the existing `shell.open()` (no dedicated open-folder IPC)
  so the pattern matches configDir / binDir / localDir.

Settings UI:
- New "Browser extension directory" button in Settings → More Settings,
  right next to the existing folder shortcuts. Web/server mode hides
  the row behind `isWeb` and the stub returns "".
- New i18n key `extensionDir` in shared zh/en resources; duplicate
  `currentVersion` key removed from zh.ts along the way.

Port fix:
- Extension `DESKTOP_HTTP_BASE` corrected from `:9900` → `:39719` to
  match the Electron-side `preferredPort`. 9900 is the standalone
  Go Core / web-server port — two separate deployments.

Docs:
- New `docs/extension.md` + `docs/en/extension.md` + `docs/jp/extension.md`
  covering what the extension does, how to install the unpacked
  build, the three dispatch modes (schema / desktop-http / docker-http),
  import-behaviour toggles, language switching, and common pitfalls.
- Sidebar entries registered in `.vitepress/config.ts` for all three
  locales.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 13:56:05 +08:00
caorushizi e5bcd7a224 chore(core): translate build-script console logs to English
Mirror the English-only convention already used in the Electron/UI
scripts. Covers dev.ts (start dev server / build Player UI / compile
dev binary) and release.ts (build all-platform binaries / package /
clean). Behaviour unchanged — message text only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 13:55:34 +08:00
caorushizi fbf31d706c style(extension): apply Cursor-inspired warm palette and typography
Reskin popup + options to match Cursor's design language — warm off-
white over cream surfaces, gothic/serif/mono three-voice typography,
oklab borders, diffused atmospheric shadows. Preserves every feature;
only visuals change.

Palette & tokens (globals.css):
- Light: `#f2f1ed` page, `#26251e` text, `#e6e5e0` card, `#cf2d56`
  crimson for hover, `#f54e00` orange accent, surface-100..500 scale,
  AI-timeline colors (peach / sage / blue / lavender)
- Dark: warm-offset variant (`#1e1d16` page, `#ebeae5` text) — no
  cold neutral inversion
- Borders: `oklab(0.263084 -0.00230259 0.0124794 / 0.1)` perceptually
  uniform warm brown
- Shadows: ambient (16/8px), elevated (28/70px + oklab ring), focus
  (4/12px) — all token-driven
- Radius scale: 4px inline / 8px default / 10px featured / 14px breathing
- Motion: `--transition-color: 150ms ease` / `--transition-shadow: 200ms`

Fonts (locally bundled variable woff2, no remote fetch):
- Geist Variable (→ CursorGothic analogue)
- Source Serif 4 Variable (→ jjannon analogue)
- JetBrains Mono Variable (→ berkeleyMono analogue)
- OpenType feat utilities: `.font-feat-display` (ss09/ss01) and
  `.font-feat-editorial` (cv11/liga)
- Global h1/h2/h3 letter-spacing follows Cursor's size curve
  (-0.03em / -0.02em / -0.0125em)

Components:
- Button — warm-primary (hover → crimson text) + dark / outline /
  secondary-pill / tertiary-pill / ghost / light-surface / link
- Badge — full pill + timeline-color variants mapped to DownloadType
  (thinking/grep/read/edit/mediago) via `variantForDownloadType()`
- Card — ambient by default; `elevated` for permanent lift;
  `interactive` eases ambient → elevated on hover (used on ServerCard,
  the page's primary action target)
- Sonner / Switch / Input / RadioGroup — warm-palette rewrites with
  oklab focus rings and serif descriptions where appropriate

Pages:
- Popup — tonal bands (header cream → page-info surface-100 → list
  bg → footer surface-100), source type badges colored by DownloadType
- Options — responsive hero (40 → 52 → 60px with scaled letter-
  spacing), decorative blur glows behind headline, "cream → bg →
  cream" section rhythm with a closing surface-200 strip, per-card
  mono chapter dots in timeline colors, RuleListCard redone as a
  vertical timeline echoing Cursor's AI-step visualisation

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 11:16:43 +08:00
caorushizi b782329ae2 feat(extension): add i18n with system/zh/en language toggle
The MediaGo extension shipped Chinese-only (50+ hardcoded strings across
popup, options, background). Wire up i18next + react-i18next so the UI
follows the browser language by default and lets the user override to
zh / en in a new LanguageCard on the options page.

- `ExtensionSettings.language: "system" | "zh" | "en"` (default system),
  persisted via existing `chrome.storage.local`
- `resolveLanguage()` maps system -> `chrome.i18n.getUILanguage()` or
  navigator.language with a zh/en fallback
- Bootstrap one i18next instance per page (popup / options), subscribe
  to `chrome.storage.onChanged` so switching on one surface updates the
  other without a reload
- Background service worker emits `LocalizedMessage` descriptors
  (`{ key, values? }`) for toast copy; popup calls `t(key, values)` so
  the SW never has to carry an i18n instance
- Full zh/en coverage for popup, options, error paths
- Chrome-native `_locales/{en,zh_CN}/messages.json` + `__MSG_*__` for
  `manifest.name` / `description` / `action.default_title` so the
  chrome://extensions row and toolbar tooltip follow the browser UI
  language (independent dimension from the in-UI toggle, by design)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 11:16:03 +08:00
caorushizi 65e20638ff feat(extension): expose silent / downloadNow knobs in options
The useUrlInvoke hook at apps/ui/src/hooks/use-url-invoke.ts reads
both `silent` and `downloadNow` query params; they were previously
hard-coded on the extension side. Surface them as user toggles so
Schema-mode users can opt into "open the download form for review"
and both modes can opt into "start downloading immediately instead
of just queuing".

- ExtensionSettings gains `downloadNow` (default false) and
  `schemaSilent` (default true).
- importViaHttp threads `startDownload` into the POST body.
- buildTaskDeeplink writes `silent=1` / `downloadNow=1` into the
  deeplink URL based on the flags (falsy => omit the key, matching
  the truthy-check in useUrlInvoke).
- New headless Switch component (no @radix-ui/react-switch dep).
- New ImportBehaviourCard in options, with a patch-style save hook
  so each toggle persists immediately.
- use-options.ts now merges on top of the current persisted settings
  so the server-config card doesn't wipe the new fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 23:58:44 +08:00
caorushizi 19048f6ead feat(extension): add MediaGo browser extension for media URL sniffing
A Manifest V3 extension that sniffs downloadable video / audio URLs
across every site the user visits and hands captured sources to a
MediaGo server in one click. Ships unlisted (load-unpacked .zip), no
Chrome Web Store.

Dispatch modes (user-picked in options, no silent fallback):
- desktop-schema: navigates the current tab to
  `mediago-community://index.html/?n=1&silent=1&url=…` using the
  cat-catch `chrome.tabs.update` pattern. Reuses the existing
  `useUrlInvoke` hook in apps/ui — no new deeplink plumbing.
- desktop-http: POST http://127.0.0.1:9900/api/downloads against the
  Go Core bundled in a running Desktop.
- docker-http: same POST against a user-configured host, with an
  optional X-API-Key header for `--enable-auth` deployments.

UI is React 19 + Tailwind v4 + shadcn/ui (new-york, neutral), matched
to apps/ui's stack. Popup shows per-tab sources with a red badge count;
options page has a 3-mode radio + per-mode field panel.

Supporting changes:
- Abstract sniff filter rules into @mediago/shared-common/sniff and
  point the Electron sniffing helper at the same exports so desktop
  and extension stay in lock-step.
- Tighten the YouTube host rule to actual video / short / live / embed
  URLs (drops the homepage and feed false-positives).
- Fix the macOS electron-builder config: CFBundleURLSchemes was
  hard-coded to a test string "mediagoaaa" — now sourced from
  process.env.APP_NAME (mediago-community in .env) like everywhere
  else. Also add a top-level `protocols` entry for clarity.
- Vite build pulls APP_NAME from the repo root .env via loadEnv() +
  `define`, so the scheme name stays single-sourced.
- Root scripts: `pnpm dev:extension`, `pnpm build:extension`,
  `pnpm pack:extension` (+ scripts/pack-extension.ts that cross-
  platform-zips dist/ into release/).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 23:54:31 +08:00
caorushizi b29a5f1748 perf(settings): mount cards one per frame to break up navigation jank
DevTools profiling showed a ~319ms long task when switching to the
settings page, dominated by scripting inside node_modules — Ant Design
Form.Item registration and cssinjs style generation firing for ~25
fields in a single synchronous pass. Chunk loading was only ~9ms, so
earlier fixes around lazy-import and Suspense fallbacks missed the real
cause.

Changes:
- Stream the 6 cards in one per animation frame (visibleCount driven
  by requestAnimationFrame), so the longest task is a single card's
  registration instead of the full page. The first card paints
  immediately and the rest follow over the next few frames.
- Skip the initial setFieldsValue via an isFirstSync ref;
  initialValues already seeds the form, so that effect was only
  forcing Ant Form to diff every Form.Item again right after mount.
- Wrap cardSections in useMemo with a narrow dep list
  (settings.apiKey, settings.local, envPath, updateAvailable, stable
  callbacks) so SSE config-changed updates don't rebuild the 340-line
  JSX tree unless those specific fields changed.
- Move the key from <Card> to the outer <div> so React stops treating
  each re-render as a remount of the card subtree.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 06:03:33 +08:00
caorushizi 8783d949ba feat(favorite): optional title with auto-fetch and URL-first form
- Make favorite title optional in both the DTO (drop binding:"required")
  and the add-favorite modal (no validator). Server falls back to the
  URL when the title is empty so the list entry always has a label.
- Auto-fill the title via the existing GET /api/url/title scraper when
  the user leaves the URL field, unless they already typed their own
  title. Failures are swallowed (server fallback still applies).
- Reorder the modal so URL is on top and Title below, matching the
  actual data-flow: users paste a URL first and the title follows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 05:28:35 +08:00
caorushizi bee6bd1cbd fix(ui,core): drive download badge via SSE and polish favorite error UX
- Go Core now broadcasts a "download-create" SSE event after
  POST /api/downloads succeeds, carrying the new task ids and count.
  The renderer's events.ts listens for it and calls useDownloadStore's
  increase() imperatively, so the sidebar badge updates regardless of
  which WebContents issued the request — the source-extract overlay
  dialog has its own Zustand instance and can no longer silently swallow
  the increment.
- Remove the now-redundant local increase() calls in download-form and
  browser-view-panel so the counter is incremented exactly once per task
  from a single source of truth.
- Favorite.Create returns 409 Conflict with a translated
  MsgURLAlreadyExists message when the URL already exists, instead of
  500 with the raw "url_already_exists" string.
- http.ts response interceptor now surfaces the server's translated
  message on 4xx/5xx instead of Axios's generic
  "Request failed with status code XXX".
- Simplify getFavIcon: drop the 1s <img> probe that dropped most URLs
  and return the canonical /favicon.ico; <Avatar> already falls back to
  a link icon when the image fails to load.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 05:28:22 +08:00
caorushizi bdea15ace9 fix(electron): rebuild tray menu on language change
The tray context menu was built once at startup, before the language
was loaded from Go Core, so its labels were stuck in the fallback
locale and never updated when the user switched languages. Keep the
Tray instance on the class, extract the menu build into refreshTrayMenu,
and subscribe to i18n "languageChanged" so the menu follows the
current language for both startup hydration and runtime changes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 04:01:20 +08:00
caorushizi 72acd2ca94 refactor(ui,electron): fix "system" language fallback and rework settings layout
- Resolve AppStore.language at apply-time via a shared resolveAppLanguage
  helper so both renderer (navigator.language) and Electron main
  (app.getLocale) follow the actual OS locale instead of silently
  falling back to zh when the stored value is "system".
- Settings page: horizontal form with a fixed label column, borderless
  cards flowing naturally in a 2-column CSS columns layout; drop
  width="xl" on inputs and wrap button groups to fix English-label
  overflow.
- scripts/download-deps: add a PowerShell fallback for zip extraction
  on Windows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 03:46:38 +08:00
caorushizi ba5f389dbe fix: upgrade zustand to stable and fix broken player build scripts
- Upgrade zustand from 5.0.0-rc.2 to ^5.0.0 (resolved 5.0.12)
- Fix player:dev and player:build scripts that referenced non-existent
  @mediago/player-build, now correctly point to @mediago/core-build

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 04:22:05 +08:00
caorushizi aaa5ee69d2 docs: fix documentation drift in CLAUDE.md
Correct 8 inaccuracies where CLAUDE.md diverged from the actual codebase:
server is a Node.js launcher not Koa 3, apps/player/ doesn't exist,
remove non-existent commands, fix adapter layer and event bridge file
names, correct DI and module format claims.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:21:14 +08:00
dependabot[bot] fb671d5790 chore(deps): bump axios from 1.14.0 to 1.15.0
Build & Push Docker Image / Build and push multi-arch image (push) Failing after 0s
Bumps [axios](https://github.com/axios/axios) from 1.14.0 to 1.15.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.14.0...v1.15.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.15.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-13 00:30:13 +08:00
caorushizi e32bfd1cb2 v3.5.0-beta.1 2026-04-13 00:27:24 +08:00
caorushizi 50a1a90e6a docs: rewrite README in English and polish UI translations
- Rewrite README.md in idiomatic English as the default language
- Move original Chinese README to README.zh.md, delete README.en.md
- Polish ~80 UI translation strings in en.ts for natural English
- Fix hardcoded Chinese in Skills setup commands (setting-page)
- Fix mismatched translation key: reppeatPassword → repeatPassword

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 2406b5b617 chore(electron,server): remove verbose startup logs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 913d645d89 fix(electron): resolve deprecation warnings and unhandled promise rejection
- Replace deprecated webContents.canGoBack/goBack with navigationHistory API
- Add try/catch to autoUpdater.checkForUpdates to handle ERR_CONNECTION_REFUSED
- Replace cross-fetch with Node native fetch to fix url.parse() deprecation
- Remove unused cross-fetch dependency

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi c7dd925a34 feat(core): add yt-dlp plugin and consolidate binary paths into --deps-dir
- Add youtube download type with yt-dlp schema (CLI args, progress regex)
- Replace 6 individual --xxx-bin flags with single --deps-dir flag
- Add BinaryNames map in Go core to auto-resolve binary paths from deps dir
- Simplify Electron/Server binary resolvers to return depsDir only
- Add yt-dlp to deps-versions.json (v2026.03.17)
- Add YouTube option to UI download form with URL auto-detection
- Fix download-terminal.tsx writing [object Object] instead of log content
- Improve error messages when binary not found (include path and type)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi c289d3690f refactor(browser-extension): remove dead FloatButton, jQuery and Lit dependencies
FloatButton was effectively dead — it listened for "webview-link-message" which
no one sends after the IPC namespace refactoring, and its functionality is fully
covered by BrowserViewPanel in the main UI. Remove it along with jQuery, Lit and
nanoid dependencies. Consolidate remaining BilibiliButton into a single-file
vanilla custom element, replace fragile global-index DOM lookup with
closest()-based card-relative queries, and replace setInterval polling with
MutationObserver. Build output reduced from 607KB to 1.9KB.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 8224c68f66 refactor(ui): optimize source-extract page and browser navigation flow
Extract shared navigation logic into useBrowserActions hook, fix race conditions
in sniffing helper, add event listener cleanup in webview service, split store
selectors for granular re-renders, memoize list items, throttle ResizeObserver,
and add loading/error states to favorites list. Also remove unused getMachineId
IPC handler and fix IPC callback type signatures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 6571fc022d refactor(ipc): namespace IPC events and consolidate similar methods
Replace flat IPC string constants with namespaced groups (browser.*,
app.*, dialog.*, shell.*, contextMenu.*, update.*) and consolidate
similar operations into generic methods:
- dialog.open/save replaces selectFile, selectDownloadDir, export/import
- shell.open replaces openDir, openUrl, openBrowser
- contextMenu.show replaces 3 separate context menu handlers
- on/off replaces rendererEvent/removeEventListener

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 109c09a911 refactor(electron): replace screenshot hack with overlay WebContentsView for download dialog
Instead of capturing a screenshot, transferring a large DataURL via IPC,
and hiding the browser WebContentsView, use a separate overlay
WebContentsView layered above the browser view to render the download
form. This eliminates flicker, avoids potential page state loss, and
removes the inefficient screenshot transfer.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 90d7fe578f feat(core): upgrade mediago-core to v0.2.1 and adapt log parsing
- Bump mediago-core from v0.1.0 to v0.2.1 in deps-versions.json
- Update ConsoleReg to match new structured log format:
  speed regex for B/s units, start/isLive/error patterns
- Remove --no-log flag so structured logs are visible for parsing

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 82f948cdd9 fix(ui): fix openDir using wrong field names and antd 6 form warnings
- Use correct GoEnvPath fields (configDir/binDir) instead of non-existent workspace/binPath
- Defer form.setFieldsValue after modal opens so Form is mounted
- Add Input child to hidden Form.Item with name prop to satisfy antd 6

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 25d149e9ef feat(core): integrate mediago-core as new download type
Add mediago-core (caorushizi/mediago-core) as a fourth download type
alongside m3u8, bilibili, and direct. This enables HLS/DASH streaming
downloads using the custom Go-based downloader.

Changes span the full integration path: dependency download config,
Go Core backend (type, schema, CLI flag, binary map), binary resolution
for Electron/Server, shared TypeScript types, i18n labels, UI dropdown,
dev scripts, and Dockerfile.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 00:19:14 +08:00
caorushizi 8d757ba18d docs: fix docker image tag (remove v prefix)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 22:20:01 +08:00
caorushizi 4f1c9fe65c docs: add OpenClaw Skill to README intro, docs homepage and guides
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 19:17:23 +08:00
caorushizi 78e3f96e3a docs: update README and guides for v3.5.0-beta.0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 19:10:53 +08:00
caorushizi 0c377b7cb8 chore: bump version to 3.5.0-beta.0
Build & Push Docker Image / Build and push multi-arch image (push) Failing after 0s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 17:56:51 +08:00
caorushizi c2db365729 fix(core): add User-Agent and Referer for Bilibili title fetching
Bilibili returns an error page ("出错了") when requests lack a proper
User-Agent. Add browser User-Agent and Referer headers to both
GetPageTitle (service/helpers.go) and fetchTitle (handler/util.go).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:12:42 +08:00
caorushizi 7e21097175 fix(core): prioritize CLI --local-dir over appStore value
When --local-dir is explicitly passed (e.g. Docker's /app/mediago/downloads),
use it directly and write back to appStore. Previously appStore's stale value
(e.g. home directory) would override the CLI flag.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 15:45:56 +08:00
caorushizi 0a36e39156 fix(core): whitelist static assets and SPA routes in auth middleware
Docker mode with --enable-auth was returning 401 for the homepage
and all static assets. Add /assets/, /favicon.ico, / and SPA
frontend routes (non-API paths without dots) to the auth whitelist.

Verified locally: homepage 200, /signin 200, /api/config 401 without key.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:34:16 +08:00
caorushizi d178fa4510 chore: update pnpm-lock.yaml
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 12:00:36 +08:00
caorushizi 8ca4d443c4 feat(skills,docs,ui): add OpenClaw Skill with docs and settings tab
Skills:
- Rewrite SKILL.md as OpenClaw Skill (remove scripts dependency)
- Guide users to install MediaGo + initialize config in one message
- Support Chinese and English natural language commands
- Remove mediago-api.sh (use curl directly, cross-platform)

Docs:
- Add OpenClaw Skill page (zh/en/jp) with install, config, usage guide
- Add to VitePress sidebar for all 3 languages

Settings UI:
- Add "Skills 设置" tab with install command + init command
- Electron mode: init shows URL only
- Docker mode: init shows URL + API key
- One-click copy buttons

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 11:54:59 +08:00
caorushizi a9075606ad feat(skills): add mediago video download skill for Claude Code
Create a Claude Code skill that wraps MediaGo's download API:
- SKILL.md with setup instructions, download workflow, and config
  management via natural language
- mediago-api.sh helper script for health check, download, status,
  list, and wait commands
- Config stored in ~/.mediago-skill.json (URL + API key)
- Auto-detects download type from URL (m3u8/bilibili/direct)
- Supports first-time setup via natural language configuration

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 02:10:16 +08:00
caorushizi 05da1e1a75 fix(core): persist default download directory to config store
On first run, the CLI --local-dir value was used by the Go core
but never written to appStore. The UI reads the download directory
from /api/config (appStore), so it showed empty. Now writes the
resolved local-dir to appStore when the stored value is empty.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 01:35:48 +08:00
caorushizi b5e0456786 fix(ui): fix auth redirect using wrong field name from API
The auth status API returns { setuped: bool } but the frontend was
checking for non-existent fields (initialized, enableAuth). Fix to
use the correct field name so unauthenticated users are properly
redirected to the signin page in server mode.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 01:29:26 +08:00
caorushizi 218603ff9f refactor(video): use ID-based video streaming and fix playback issues
- Change video stream route from /videos/*filepath to /videos/:id
  (lookup file path from database by task ID instead of filename)
- Add mimeType field to Video API response so video.js knows the format
- Fix getVideoURL double-slash bug (/videos/... → //videos/...)
- Handle directory downloads: scan inside for first video file when
  CheckFileExists returns a directory (e.g. multi-part bilibili downloads)
- Remove unused videoRoot field and ServeVideo function
- Update player-ui PlaylistItem to pass full VideoItem object

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 01:22:15 +08:00
caorushizi 6f19d08a08 fix(electron): bind core service to LAN address for mobile access
Change internal flag from true to false so the Go core listens on
LAN IP instead of 127.0.0.1, enabling mobile player access via QR code.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:52:11 +08:00
caorushizi 5079180a31 refactor(server): use APP_NAME from env for data root directory
Load dotenv-flow to read APP_NAME, use it to derive the server data
root directory (~/.${APP_NAME}-server/) instead of hardcoding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:46:44 +08:00
caorushizi b291e30b13 docs(docker,server): unify data paths under single root directory
Consolidate all persistent paths under one mountable root:
- Docker: /app/mediago/{data,logs,downloads} with single VOLUME
- Server dev: ~/.mediago-server/{data,logs,downloads}
- DB renamed from app.db to data/mediago.db for consistency
- Update docker run command in README and docs (zh/en/jp)
- Add disclaimer to README

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:40:11 +08:00
caorushizi 9428f52f7d chore(ci): upgrade Node.js from 20 to 24 LTS
Node.js 20 reached EOL in April 2026. Upgrade build Node.js
version to 24.14.0 LTS across all CI workflows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:12:47 +08:00
caorushizi 0be4e5b9e6 chore(ci): upgrade GitHub Actions to Node 24 compatible versions
Upgrade all actions to eliminate Node.js 20 deprecation warnings:
- actions/checkout v5 → v6
- actions/setup-node v4 → v6
- actions/setup-go v5 → v6
- actions/upload-artifact v4 → v6
- pnpm/action-setup v4 → v5
- docker/setup-buildx-action v3 → v4
- docker/login-action v3 → v4
- docker/metadata-action v5 → v6
- docker/build-push-action v6 → v7

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:09:47 +08:00
caorushizi 5f8b1442c9 refactor(service-runner): remove portfinder, use fixed port
Remove dynamic port finding via portfinder. ServiceRunner now uses
preferredPort directly as the fixed port. Electron mode uses port 39719.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 00:01:37 +08:00
caorushizi b6c0c64dfa fix(docker): add libicu for N_m3u8DL-RE .NET runtime dependency
N_m3u8DL-RE is a .NET application that requires libicu for
globalization support. Without it the process aborts immediately.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:50:37 +08:00
caorushizi 548ca9cd46 fix(docker): fix build failures for UI, Go deps, and unzip
- Install unzip in Node builder for zip-format deps (BBDown, gopeed)
- Copy apps/electron/app/package.json needed by UI vite config
- Add second go mod download after full source copy to fix go.sum

Verified: docker build + run succeeds locally (healthy + player UI ok)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:33:35 +08:00
caorushizi 5d1dc7716f fix(docker): include all workspace package.json files for pnpm install
pnpm install --frozen-lockfile requires all workspace packages to be
present. The .dockerignore excluded apps/electron/ entirely, and the
Dockerfile was missing apps/core/ and apps/electron/ package.json.

- Keep apps/electron/package.json in build context (exclude only src/)
- Add COPY for apps/core/package.json and apps/electron/package.json

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:21:04 +08:00
caorushizi e9795e1667 docs: add macOS installation tips for Intel and Apple Silicon
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:15:22 +08:00
caorushizi 1dd39a6973 chore(docker): rewrite Dockerfile and CI for GHCR multi-arch builds
- Rewrite Dockerfile as 3-stage build (Node builder → Go builder → runtime)
- Use --platform=$BUILDPLATFORM for native Node/Go compilation (no QEMU)
- Cross-compile Go binary via GOOS/GOARCH for target architecture
- Add --platform flag to download-deps.ts for target-specific deps
- Map Docker TARGETARCH to Node arch naming (amd64 → linux-x64)
- Flatten deps directory structure in runtime image
- Rewrite build-server.yml to push to ghcr.io with docker/metadata-action
- Single job multi-arch build (linux/amd64 + linux/arm64) via QEMU
- Update .dockerignore to exclude electron, docs, build artifacts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 23:14:42 +08:00
caorushizi de3b805ea0 feat(core,player-ui): refactor video API to use database and fix playback
Refactor video player API from filesystem scanning to database-backed:
- Video list queries downloads with status="success" + file existence check
- Add GET /api/v1/videos/:id endpoint for playing specific video by task ID
- Add playerUrl to /api/env response (computed from request host)
- Whitelist player/video paths in auth middleware
- Fix video URL generation to preserve folder structure (relative path)
- Fix player-ui Vite base path and video URL resolution under /player/
- Add openUrl implementation to web platform stubs
- Player-UI supports ?id= query param to auto-play specific video
- Play button now passes task.id instead of filename

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 22:45:27 +08:00
caorushizi 452bbc3b7d refactor: merge player Go backend into core
Merge the standalone mediago-player binary into mediago-core. The core
now serves the player UI at /player/ via go:embed, and provides video
listing/streaming endpoints. Video root reuses the existing download
directory (local-dir) so no separate flag is needed.

Changes:
- Add internal/video package to core (handler, service, types)
- Embed player-ui assets via //go:embed in assets/embed.go
- Add SPA handler for /player/ path
- Register /api/v1/videos and /videos/* routes in core router
- core:build now builds player-ui before Go compilation
- Remove apps/player/ entirely (Go app, scripts, configs)
- Remove VideoServer from Electron, derive playerUrl from coreUrl
- Remove player binary management from server app
- Update CI workflow to remove player go.sum cache path

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 21:05:42 +08:00
caorushizi ae50e1d995 feat: add node service 2026-04-02 20:34:37 +08:00
caorushizi 7fd898a23a fix(core,player): quote args with spaces for Windows shell mode
Node.js spawn with shell:true joins args with spaces without quoting,
so `-s -w` becomes two separate args on Windows cmd.exe. Manually
wrap args containing spaces in double quotes before passing to spawn.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 20:00:45 +08:00
caorushizi b7527a012a fix(core): fix Windows build by using array-based spawn for Go commands
Refactor core build scripts to use the same array-based spawn pattern
that fixed the player build (5349295d). The single-string command with
shell quoting caused ldflags parsing failures on Windows cmd.exe.

- Change runCommand to spawn(command, args) with shell only on Windows
- Remove Unix-only 2>/dev/null redirect in getVersion()
- Replace shell chmod glob with native Node.js chmodSync loop
- Add child process cleanup on SIGINT/SIGTERM

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 19:52:58 +08:00
caorushizi 5349295df8 fix(player): fix go build ldflags parsing on Windows
Split "-ldflags=-s -w" into separate "-ldflags" and "-s -w" args
so that "-w" is not misinterpreted as a go build flag when shell
mode is enabled on Windows.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 19:05:27 +08:00
caorushizi 38a4f63269 fix(ci,player): fix Windows build and add deps download step
- Add shell option for Windows in player's runCommand to fix
  "spawn pnpm ENOENT" error (Windows needs shell:true to find .cmd)
- Add deps:download step to CI workflow so third-party tools
  (ffmpeg, BBDown, etc.) are available during packaging

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 18:52:09 +08:00
caorushizi a6eae611af fix(ci): add Go and swag setup to electron build workflow
The build was failing because:
- macOS runners don't have Go pre-installed (exit code 127)
- Ubuntu/Windows runners lack the swag tool (spawn swag ENOENT)

Add setup-go action and swag installation step before building.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 18:42:50 +08:00
caorushizi 6dbe57c625 chore: add binary paths to .gitignore after history cleanup
Prevent accidentally committing binary dependencies that were
removed from git history via git-filter-repo.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 17:12:24 +08:00
曹儒士子 f567f4f4a9 Merge pull request #616 from caorushizi/feat/skills
chore: migrate from @typescript/native-preview to typescript ^6.0.2
2026-04-02 17:00:01 +08:00
caorushizi b36585b927 docs: update catcatch integration URL scheme for community edition
Update the custom protocol from mediago:// to mediago-community://
and encode the URL parameter to handle special characters.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:58:34 +08:00
caorushizi 7c2a0474cd fix(ui): fix download progress polling and taskItem reference error
1. events.ts: progress polling was using /api/downloads/active which
   returns DB records without percent/speed fields. Changed to /api/tasks
   which returns TaskInfo with real-time progress data.

2. download-item.tsx: lint fix had renamed callback params from `task`
   to `taskItem` but missed updating all references in the function body,
   causing ReferenceError. Reverted param names back to `task`.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:57:01 +08:00
caorushizi 8d4903bdff refactor(electron): use dynamic app name for custom URL scheme
Replace hardcoded "mediago" protocol scheme with dynamic `appName`
from environment, so community/dev builds use their own scheme
(e.g. "mediago-community://"). Applies to:

- constants: defaultScheme = appName
- main.window.ts: production URL uses defaultScheme
- browser.window.ts: same
- build.ts: CFBundleURLSchemes uses dynamic scheme

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:46:52 +08:00
caorushizi 7eb654b6a5 feat(core,ui): move password hashing to backend with bcrypt
Previously the frontend hashed passwords with MD5 + a hardcoded salt
before sending to the backend. This exposed the salt in client-side JS
and used an insecure hash algorithm.

Backend changes:
- Setup: accepts plain password, bcrypt hashes it, generates UUID apiKey
- Signin: accepts plain password, bcrypt verifies, returns stored apiKey
- Status: checks passwordHash instead of apiKey
- AppStore: new passwordHash field
- Middleware: add X-API-Key header support (was only reading Authorization)
- CORS: allow X-API-Key header

Frontend changes:
- Signin page: send plain password, receive apiKey from response
- Remove md5/crypto-js dependency and APIKEY_SALT_KEY constant
- api/download-task: auto-inject localPath/deleteSegments from store
  (was lost during go-adapter migration, caused EOF errors)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 16:27:09 +08:00
caorushizi 403e01b28a fix(ui): auto-inject apiKey from Zustand store on every request
Instead of manually calling setHttpApiKey() after signin, use an axios
request interceptor that reads apiKey from useAppStore.getState() on
every request. This ensures the header is always in sync with the
stored apiKey, regardless of when or how it was set.

Removed: setHttpApiKey() function (no longer needed).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:21:44 +08:00
caorushizi da5fa76c04 fix(ui): call setHttpApiKey after signin to fix 401 errors
After login, the apiKey was saved to Zustand/localStorage but never
set on the http axios instance header, causing subsequent API calls
to return 401.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:18:20 +08:00
caorushizi b2fa4d2fbc feat(ui): add response types to all api/ functions and SWR hooks
Add proper TypeScript return types to every api/ function, using
existing shared types (Favorite, Video, Conversion, AppStore, etc.)
from @mediago/shared-common.

New types added:
- GoEnvPath (api/config.ts) for /api/env response
- AuthStatus (api/auth.ts) for /api/auth/status response

Updated SWR hooks to use typed data instead of Record<string, unknown>
casts: useFavorites, useConfig, useEnvPath, useAuthApi, useConversions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 15:10:05 +08:00
caorushizi c0bbfa5b09 fix(ui): fix auth redirect in server mode
Two issues:
1. http.ts 401 handler used window.location.hash (HashRouter syntax)
   but the app uses BrowserRouter — changed to window.location.pathname
2. useAuth() blindly checked localStorage apiKey, which is always empty
   on first visit. Now queries Go Core auth status first: only redirects
   to /signin when auth is enabled and configured (or needs setup)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:50:51 +08:00
caorushizi f6e59e864a fix(core): allow X-API-Key header in CORS config
The UI sends X-API-Key for authentication, but the CORS AllowHeaders
config only listed Authorization. This caused preflight failures in
server mode where UI (localhost:8555) and Go Core (127.0.0.1:9900)
are on different origins.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 14:47:04 +08:00
caorushizi ee669f94ab refactor(electron,ui): improve sidebar extract toggle and cleanup
- Sidebar: toggle between embedded and external browser window mode,
  show extract page in sidebar even when opened externally
- Home page: remove redundant material extraction button
- Converter: temporarily disable video format options, keep audio only
- Electron: remove node-machine-id dependency from package.json
- Tool bar: fix combineToHomePage argument structure

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:28:19 +08:00
caorushizi fa79482682 fix(ui): fix converter page pagination layout
PageContainer was missing flex-col, causing pagination to render inline
with the list. Add flex-col + gap-3 to PageContainer and remove
duplicate padding/bg from the inner list container.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:04:07 +08:00
caorushizi 69cd2e6394 feat(ui): add pagination to converter page
Replace hardcoded { current: 1, pageSize: 500 } with dynamic pagination
state. Default pageSize is 50 with an Ant Design Pagination component
at the bottom of the list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 13:00:24 +08:00
caorushizi b363b3dd7d refactor(electron): remove getMachineId controller method
machineId is now generated by Go Core on first startup (uuid),
so the Electron IPC handler using node-machine-id is no longer needed.

Removes: getMachineId handler, node-machine-id import, nanoid import.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 12:53:33 +08:00
caorushizi 23fc28805b feat(core,ui): generate machineId in Go Core instead of Electron IPC
Move machineId generation from Electron (node-machine-id) to Go Core.
On first startup, if machineId is empty in appStore config, Go Core
generates a UUID and persists it. This makes machineId available in
both Electron and Web modes via the config API.

UI now reads machineId from getConfig() instead of getMachineId() IPC.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 12:50:36 +08:00
caorushizi ba9e22381b fix(ui): add unwrapResponse to usePlatform() IPC method returns
PlatformApi methods via Electron IPC return { code, data, msg } objects.
After migrating from useAPI() to usePlatform(), the auto-unwrap logic was
lost, causing consumers to receive raw objects instead of extracted data
(e.g. onSelectDownloadDir() returned [object Object] instead of a path).

Fix: wrap all PlatformApi function calls in the Proxy get trap to
auto-unwrap { code, data } responses, matching the old useAPI() behavior.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 12:43:15 +08:00
caorushizi ec2f82db37 refactor(ui): replace monolithic useAPI() with domain-specific api/ + SWR hooks
Split the monolithic useAPI() hook into a clean layered architecture:

1. api/ layer: domain-specific axios request functions
   - download-task.ts, favorite.ts, conversion.ts, config.ts, auth.ts, util.ts
   - events.ts: native EventSource for Go Core SSE (no sdk dependency)

2. SWR hooks: thin wrappers with auto-caching and mutation
   - useFavorites(), useConversions(), useConfig(), useEnvPath(), useAuthApi()

3. usePlatform(): pure Electron IPC methods (Proxy-safe delegation)

4. http.ts: axios instance with setupHttp() + response interceptor

Go SSE events and Electron IPC events are now fully separated:
- Go SSE (download/config) → api/events.ts → onDownloadEvent/onConfigChanged
- Electron IPC (webview/update) → usePlatform() → addIpcListener

Deleted: use-api.ts, go-adapter.ts, go-event-bridge.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-02 12:39:55 +08:00
caorushizi 8f47bf93af feat: size 2026-04-02 00:15:20 +08:00
caorushizi 0bb8f93e94 fix(electron,core,ui): improve startup robustness and logging
- core: move defer logger.Sync() after logger re-init to avoid nil panic
  on early startup
- electron: replace console.log with ElectronLogger in DownloaderServer
  and ElectronApp for consistent log output
- ui: add 1s delay before fetching coreUrl in Electron mode to wait for
  Go core to finish starting
- ui: guard data?.list access in converter-page to prevent crash when
  data is undefined

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 23:12:00 +08:00
caorushizi 23108c342b fix(electron): ensure window always shows regardless of Go core startup errors
Previously, init() was not awaited in index.ts, so any failure in the async
chain (e.g. getConfig() timing out) was silently swallowed and the window
was never created.

Fix:
1. Await mediago.init() in index.ts so errors surface properly
2. Move serviceInit() (window creation) before Go core startup so the UI
   always appears, even if the backend fails to start

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 16:05:16 +08:00
caorushizi 43c11928fa feat(core,player): exclude swagger from prod builds; add chmod to binaries
1. Use Go build tag `dev` to conditionally compile swagger docs and routes.
   Production binaries no longer include swaggo/files (swagger UI assets):
   - mediago-core:   34 MB → 24 MB  (-10 MB, -29%)
   - mediago-player: 29 MB → 13 MB  (-16 MB, -55%)
   Dev builds (-tags dev) retain full swagger at /swagger and /docs.

2. Set executable permission (0o755) on built binaries (non-Windows).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 13:22:16 +08:00
caorushizi 4b01faad42 fix(electron): copy Go binaries via extraResources instead of npm packages
The packaged app failed to launch because mediago-core was missing from
Resources/bin/. The asarUnpack approach relied on platform-specific npm
optional deps that pnpm workspace hoisting never installed in app/node_modules/.

Fix: copy locally-built binaries (core, player, deps) into app/build/bin
and app/build/deps during the pack step, then expose them via extraResources
so electron-builder places them at the expected Resources/bin/ and
Resources/deps/ paths at runtime.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 12:56:35 +08:00
caorushizi 10beac128f fix: resolve TypeScript type errors 2026-04-01 12:26:48 +08:00
caorushizi 3f4dc0290e fix(lint): resolve all oxlint errors across codebase
- Merge duplicate 'node:child_process' imports (player/scripts/utils.ts)
- Remove unused catch parameter (ui/utils/tdapp.ts)
- Merge duplicate 'react' imports (tool-bar.tsx, source-extract/index.tsx)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:15:15 +08:00
caorushizi 38cb884b77 style: apply oxfmt formatting across codebase
Also fix pre-existing lint errors exposed by staging:
- Merge duplicate 'eventsource' imports in eventEmitter.ts
- Remove unused catch parameter in eventEmitter.ts
- Merge duplicate 'react' imports in app-side-bar.tsx

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:12:49 +08:00
caorushizi e659fccfad feat(converter): add file modal with browse, format, quality fields
Redesign the "Add File" flow as a modal dialog containing:
- File path field with "Browse" button (opens native file picker)
- Output format selector (Video: MP4/MKV/WebM, Audio: MP3/AAC/FLAC/WAV)
- Quality selector (High/Medium/Low)
- Two action buttons: "Add to List" (saves for later) and
  "Convert Now" (saves and starts conversion immediately)

Also fix silent failure when adding files — getFileName() used
new URL() which throws on local file paths. Replaced with simple
path.split() extraction and added try-catch error handling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 12:04:12 +08:00
caorushizi 21e232f042 feat: implement format conversion with ffmpeg in Go Core
Move ffmpeg execution from Electron to Go Core so conversion works in
both Electron and web server modes.

Go Core backend:
- Add -ffmpeg-bin CLI flag to pass ffmpeg binary path
- Enhance Conversion DB model with status, outputPath, outputFormat,
  quality, progress, and error fields
- Create converter executor (service/converter.go) that spawns ffmpeg,
  builds args per format/quality, and parses stderr for progress
- Add StartConversion/StopConversion to service with SSE events for
  real-time progress (conversion-start/progress/success/failed/stop)
- Add POST /api/conversions/:id/start and /:id/stop endpoints

Supported formats:
- Video: MP4 (H.264), MKV (H.264), WebM (VP9) with CRF quality
- Audio: MP3, AAC, FLAC, WAV with bitrate quality presets
- Quality presets: high/medium/low mapping to CRF and bitrate values

Frontend (converter-page):
- Add format selector (Video/Audio groups) and quality dropdown
- Show per-item status badge, progress bar during conversion
- Action buttons: Start/Stop/Open Folder/Delete based on status
- "Convert All" batch button for pending items
- SWR auto-refresh during active conversions

Integration:
- Pass -ffmpeg-bin from Electron and core:dev to Go Core
- Remove old broken Electron-only convertToAudio code
- Add startConversion/stopConversion to core-sdk and GoApi
- Add i18n keys for new UI elements (en/zh)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:38:14 +08:00
caorushizi e4aa62e6e4 fix: use function form for manualChunks (Vite 8 compat)
Vite 8's rollup types no longer accept the object shorthand for
manualChunks. Switch to the function form which is compatible with
all Vite versions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 05:16:57 +08:00
caorushizi 36daf13822 perf(ui): optimize frontend performance for UI and player
UI app:
- Add Vite manual chunks (vendor, antd, zustand) for better caching
- Wrap DownloadTaskItem with React.memo() to prevent list re-renders
- Wrap IconButton with React.memo() to prevent re-renders in lists
- Add missing Suspense fallback to SigninPage route

Player app:
- Add Vite manual chunks (videojs, vendor) to isolate video.js bundle
- Remove duplicate resize calculation in usePlayerSize hook
  (ResizeObserver already handles container size changes)
- Disable SWR revalidateOnFocus/revalidateOnReconnect for video list
  (list only changes when user adds/removes videos)
- Extract PlaylistItem into memoized component to prevent re-renders
  when sibling items change, and eliminate duplicated rendering logic

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 05:14:13 +08:00
caorushizi 55833142bd perf: only poll /api/tasks while downloads are active
Previously the app polled GET /api/tasks every second unconditionally
from startup, even with no downloads running. Now polling is driven
by SSE events: started on download-start, stopped when no tasks have
Downloading status (checked after success/failed/stop events).

Applied to both Electron main process (downloader.server.ts) and
web/UI mode (go-event-bridge.ts).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 05:06:06 +08:00
caorushizi 350e02c0f0 chore: translate all Chinese comments to English
Converted all Chinese-language comments across 47 source files to
English, covering Go backend (apps/core, apps/player), TypeScript
scripts, Electron main process, UI components, and shared packages.

Only comment text was modified — code, string literals, log messages,
and i18n translation values were left untouched.

Also fix pre-existing lint errors in scripts/release.ts and
scripts/utils.ts (node: protocol prefix, unused imports, bare catch).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 03:56:57 +08:00
caorushizi f2d150bb02 fix: prevent settings from reverting to defaults after restart
Three root causes fixed:

1. ElectronStore migration deleted Go Core's config.json on every startup.
   The old migration code unconditionally ran unlinkSync() on config.json
   in the workspace directory — the same file Go Core uses for persistence.
   Removed the migration entirely since it has already run for all users
   (window-state.json now holds the bounds data).

2. core:dev mode saved config to the wrong directory (log dir instead of
   data dir) because -config-dir was not passed. Added config_dir to
   devConfig and the dev() command args, pointing to ~/.mediago/data to
   avoid collision with the old v2.0 ~/.mediago/config.json format.

3. syncCLIToAppStore() overwrote user settings with CLI default values
   on every Go Core startup in core:dev mode. Removed the function; CLI
   args now only set initial cfg defaults, while appStore (user config)
   takes precedence via the existing syncAppStoreToCfg().

Also aligns blockAds default (true) between Go Core and frontend Zustand store.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-01 03:08:18 +08:00
caorushizi fff1259704 fix: lazily resolve getGoApi() in useAPI to avoid init-time crash
getGoApi() was called eagerly inside useMemo during component mount,
before initGoAdapter() had run. Now GoApi methods resolve getGoApi()
at invocation time, so useAPI() can safely be called in App.tsx before
the adapter is initialized.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:23:42 +08:00
caorushizi 9470f357ec fix: restore IS_SETUP constant used as SWR cache key
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:22:40 +08:00
caorushizi c1b8d67849 chore: add vercel-react-best-practices skill
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:21:02 +08:00
caorushizi 52c3cdfc60 refactor: split MediaGoApi into GoApi + PlatformApi, remove Proxy routing
Major cleanup of the frontend adapter layer:

1. Type split: MediaGoApi (55 methods) → GoApi (22 data/CRUD methods via
   Go Core HTTP) + PlatformApi (~30 Electron-native methods via IPC)

2. Remove Proxy-based routing: replace the fragile apiAdapter Proxy +
   GO_METHODS set + ALL_API_METHODS array with direct object composition.
   GoApi methods never fall through to Electron IPC.

3. Clean dead code: remove 18 preload methods that called IPC channels
   with no handler (getFavorites, getAppStore, createDownloadTasks, etc.)
   Remove unused event constants (SOCKET_TEST, SETUP_AUTH, SIGNIN, etc.)

4. New platform-stubs.ts: explicit no-op stubs for web/server mode
   instead of a catch-all Proxy that returns empty responses.

5. Simplified useAPI: direct spread of wrapped GoApi + PlatformApi
   instead of dynamic Object.keys().reduce() enumeration.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 01:17:48 +08:00
caorushizi 9156cf9cd9 fix: gate UI behind Go adapter init and auto-build core/player
- Add adapterReady state to App.tsx: show Loading until initGoAdapter
  completes, preventing API calls before goHandle is set (fixes
  "No handler registered" errors for get-favorites, get-app-store, etc.)
- Add error handling and debug logging for player server startup
- Prepend core:build && player:build to dev:electron, dev:server,
  pack:electron, and release:electron scripts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:52:38 +08:00
caorushizi 38fa71b44b fix: config persistence, download-now auto-start, and player integration
1. Sync Go Core config to Zustand on app startup so settings persist
   across restarts (Go Core is the single source of truth).

2. Go Core Create handler now respects startDownload param — downloads
   start immediately when "Download Now" is clicked.

3. Player integration fixes:
   - Electron: graceful skip when player binary is not built
   - Server: start player service alongside Go Core, expose playerUrl
   - Web adapter: derive playerUrl from current host instead of empty string

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:27:30 +08:00
caorushizi ce406767be docs: update CLAUDE.md with current architecture
Add apps/core, apps/player, apps/player-ui, packages/core-sdk.
Remove deleted packages (shared/node, shared/browser, config).
Replace stale TypeORM references with @mediago/service-runner.
Document Go Core commands, adapter architecture, and port numbers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:27:18 +08:00
caorushizi 8a5ac39cc5 chore: migrate player-ui to oxlint and upgrade to React 19, Vite 8, TS 6
- Remove biome.json from apps/player (use root oxlint/oxfmt config)
- Remove eslint from apps/player-ui, switch lint script to oxlint
- Upgrade React 18 → 19, Vite 7 → 8, TypeScript 5.9 → 6.0
- Upgrade @vitejs/plugin-react 5 → 6, @types/react to v19
- Fix vite.config.ts: __dirname → import.meta.dirname (ESM compat)
- Fix tsconfig.app.json: remove deprecated baseUrl option

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 00:05:02 +08:00
caorushizi 906db36c81 chore: set author to caorushizi and license to MIT across all packages
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 23:18:16 +08:00
caorushizi 208f2095bf chore: update app name to mediago-community and disable mac signing
- Rename APP_NAME to mediago-community in .env
- Update APP_ID to mediago.caorushizi.cn
- Set mac identity: null to skip code signing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 23:18:04 +08:00
caorushizi e6a8a76d32 chore: upgrade electron to v41 and related build tools
- Upgrade electron 35.7.5 → 41.1.0
- Upgrade electron-builder 26.0.12 → 26.8.1
- Upgrade electron-updater ^6.6.2 → ^6.8.3
- Add electron-builder-squirrel-windows 26.8.1 to resolve peer conflict
- Remove rebuild script (electron-rebuild no longer a dependency)
- Remove rebuild:electron script from root package.json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 23:03:16 +08:00
caorushizi 41eda86917 chore: update deps, remove showTerminal web restriction, format code
- Bump knip to v6.1.1, turbo to v2.9.1
- Remove oxlint-tsgolint devDependency
- Remove hidden={isWeb} from showTerminal setting item
- Format .vscode/settings.json and setting-page/index.tsx

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 22:53:42 +08:00
caorushizi ffd3170261 chore: remove unused native electron devDependencies
@electron/rebuild and prebuild-install are no longer needed as the
Electron app has no native runtime dependencies.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 22:43:45 +08:00
caorushizi 2425598c6a fix: fix download log display corruption in terminal
- Fix PTYRunner.readPTYOutput to use raw chunk reads instead of a
  broken bufio.Scanner split that called onStdLine with the entire
  remaining buffer on every invocation, causing log lines to be
  written multiple times
- Remove unused flushInterval field and NewPTYRunnerWithInterval
- Add convertEol: true to XTerm so bare \n in stored logs is treated
  as \r\n, preventing misaligned output when replaying log files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 22:43:36 +08:00
caorushizi e413bb5f38 fix: update binaryResolver paths, deps versions, and clean up docker-empty
- Fix monorepo root resolution in electron binaryResolver
- Downgrade N_m3u8DL-RE to v0.3.0-beta, use gopeed-web assets
- Remove win32-arm64 ffmpeg entry
- Convert download-deps to ESM with explicit file reads
- Add tsx devDependency
- Remove unused .docker-empty/.gitkeep

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 21:50:52 +08:00
caorushizi 93432c5968 refactor: move player-ui from apps/player/ to apps/ for cleaner monorepo structure
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 21:49:19 +08:00
caorushizi a0c10de673 fix: update server binaryResolver and remove npm binary deps
- Update apps/server/src/binaryResolver.ts to use monorepo paths
  instead of npm platform packages
- Remove @mediago/core and @mediago/deps from server package.json
- Add .gitkeep placeholder in apps/player/assets/ui/ for go:embed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 21:20:36 +08:00
caorushizi ffc4940508 feat: update cross-references and add deps download script
Phase 4-6 of monorepo merge:

- Create scripts/download-deps.ts for downloading third-party tools
  from GitHub Releases (ffmpeg, N_m3u8DL-RE, BBDown, gopeed)
- Add scripts/deps-versions.json for version-locked tool definitions
- Update pnpm-workspace.yaml for new monorepo structure
- Change @mediago/core-sdk references from file:// to workspace:*
- Remove @mediago/core, @mediago/deps, @mediago/player npm deps
  from electron package.json
- Rewrite binaryResolver.ts to use monorepo paths (dev) and
  extraResources (production) instead of npm platform packages
- Simplify apps/core/scripts/config.ts (remove npm config, use .deps/)
- Add Go project scripts to root package.json
- Update turbo.json build outputs

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 21:17:42 +08:00
caorushizi 72241bffd4 chore: merge mediago-player and clean up
- Subtree add mediago-player into apps/player
- Remove npm/ directory (7 platform packages)
- Remove pnpm-workspace.yaml, pnpm-lock.yaml, turbo.json
- Rename ui/ to player-ui/ to avoid conflict with apps/ui
- Rename package to @mediago/player-build
- Rename player-ui package to @mediago/player-ui
- Simplify gulpfile.ts and tasks.ts (remove npm build/publish)
- Remove npm templates
- Remove turbo, biome, vite override from devDependencies

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 21:13:11 +08:00
caorushizi b6d3f80f03 Merge commit '4c93a1bdfaae8a96cfac8594921c4354a03ab531' as 'apps/player' 2026-03-31 21:10:53 +08:00
caorushizi 4c93a1bdfa Squashed 'apps/player/' content from commit 102bd03c
git-subtree-dir: apps/player
git-subtree-split: 102bd03cac286179ab06c3527edea045023e6fb1
2026-03-31 21:10:53 +08:00
caorushizi 85c0ff01e8 chore: clean up mediago-core after subtree merge
- Move SDK to packages/core-sdk
- Remove npm/ directory (14 platform packages no longer needed)
- Remove .bin/ directory (third-party binaries, will download from GitHub)
- Remove pnpm-workspace.yaml, pnpm-lock.yaml
- Remove npm.ts build script and templates
- Simplify gulpfile.ts (remove npm build/publish tasks)
- Rename package to @mediago/core-build

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 21:10:39 +08:00
caorushizi a9129f4a3c Merge commit '84ed412899931d87a526bb0e8d391a9b9f60ce18' as 'apps/core' 2026-03-31 21:08:13 +08:00
caorushizi 84ed412899 Squashed 'apps/core/' content from commit 55da68f3
git-subtree-dir: apps/core
git-subtree-split: 55da68f3dc6415a2cefb53e6112d0e6e4c77f9be
2026-03-31 21:08:13 +08:00
caorushizi e5138360d8 chore: add go.work and update .gitignore for monorepo merge
Prepare for merging mediago-core and mediago-player into the monorepo.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 21:07:32 +08:00
caorushizi e6441aae6d refactor: remove DownloadController and fix export/import file dialogs
Delete DownloadController (4 methods now handled by Go Core go-adapter),
move showDownloadDialog to WebviewController. Remove exportFavorites,
importFavorites, exportDownloadList from GO_METHODS so Electron mode
uses IPC with native file dialogs instead of bypassing them.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 20:04:47 +08:00
caorushizi a611919bcb refactor: remove shared-browser, shared-node, config packages
- shared-browser: inline createBrowserI18n into apps/ui/src/i18n/
- shared-node: move code into apps/electron by function:
  - i18n → core/i18n.ts
  - handle decorator → core/decorators.ts
  - registerControllerHandlers → core/registerControllerHandlers.ts
  - TYPES → types/symbols.ts
  - binaryResolver → utils/binaryResolver.ts
  - DownloaderServer/VideoServer → services/
  - copy binaryResolver to apps/server for resolveCoreBinaries
- config: move tsconfig.{base,app,node}.json to monorepo root

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:47:51 +08:00
caorushizi c0cf028c55 feat: fetch real env paths from Go Core for config/bin directories
Update go-adapter getEnvPath to call the new /api/env endpoint instead
of returning hardcoded empty strings for binPath and workspace.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:13:23 +08:00
caorushizi d3142586f7 fix: resolve multiple runtime issues in web mode
- Add notification badge update after creating download tasks
- Add defensive null check in useAPI to prevent destructuring undefined adapter results
- Import download store for increase() calls in download-form

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 18:47:02 +08:00
caorushizi 8e8e71bd6b feat: replace Node.js server with Go Core direct connection
- Remove old Koa/Socket.IO server, replace with minimal ServiceRunner launcher
- UI now connects directly to Go Core via SDK (HTTP + SSE), no middleware
- Add GoEventBridge for SSE events and progress polling
- Add Dockerfile and docker-compose for single-container deployment
- Fix web mode adapter Proxy ownKeys for proper method enumeration
- Fix auth flow: setupAuth now sets apiKey, App.tsx passes stored apiKey
- Add error handling in download-form for getVideoFolders
- Remove conversion.controller import (file was deleted)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 17:30:44 +08:00
caorushizi 1a58a05ce4 fix: forward download failed/stopped events to UI for immediate status updates
Failed and stopped events were only logged but never sent to the UI,
causing tasks to stay stuck showing "downloading" status. Now all terminal
state changes (success/failed/stopped) are forwarded via IPC/Socket.io
and trigger SWR revalidation for immediate UI refresh.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 14:55:23 +08:00
caorushizi 8c70945a40 feat: migrate controllers to Go backend API, remove TypeORM/dao/services layer
Remove the entire TypeORM-based data layer (entities, repositories, services)
and refactor Electron/Server controllers to delegate to Go backend via HTTP API.
Add go-adapter for UI to communicate directly with Go core service.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 14:33:11 +08:00
caorushizi 515bbe9b8e feat: migrate config to Go backend as single source of truth
Electron:
- Add GoConfigCache for synchronous config reads, seeded from Go API
- Replace all ElectronStore AppStore reads with GoConfigCache
- SSE config-changed events drive platform side effects + IPC to UI
- Slim ElectronStore to window bounds only, with old config.json migration
- Fix useProxy handler passing boolean instead of proxy address
- Add missing audioMuted/enableMobilePlayer SSE handlers

Server:
- Add ServerConfigCache to eliminate per-request getConfig() HTTP calls
- Migrate auth middleware and controllers to use config cache
- Remove StoreService and conf dependency entirely

UI:
- Replace "store-change" full-dump IPC with incremental "config-changed"

Shared:
- Remove appStoreDefaults (no longer needed)
- Fix DownloadStatus.Watting → Pending typo
- Fix VideoServer.enableMobilePlayer inverted logic
- Simplify DownloadServiceOptions (Go reads its own config)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 14:28:50 +08:00
caorushizi 0e6b86b3a0 chore: remove unused .biomeignore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 20:03:47 +08:00
caorushizi b2bcfebeea chore(ui): add design assets
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 20:02:55 +08:00
caorushizi cc81040641 chore: optimize Turborepo task configuration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 18:24:24 +08:00
caorushizi 84102b4b00 docs: add CLAUDE.md for Claude Code guidance
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 18:16:54 +08:00
caorushizi 3a565676e3 chore: migrate from Prettier to oxlint + oxfmt toolchain
Replace Prettier with oxfmt for formatting and expand oxlint config with
full rule categories, React/TS overrides, and per-app config inheritance.
Add husky + lint-staged for pre-commit hooks to incrementally enforce
formatting on changed files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 17:51:09 +08:00
caorushizi 8f1df0c008 chore: switch from rolldown-vite to official vite 8 and upgrade plugin-react
- vite: npm:rolldown-vite@latest → ^8.0.3
- @vitejs/plugin-react: ^5.0.4 → ^6.0.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 17:09:54 +08:00
caorushizi e6c58bc2b7 chore: upgrade react to v19 and antd to v6
- react/react-dom: ^18.3.1 → ^19.2.4
- @types/react: ^18.3.3 → ^19.2.14
- @types/react-dom: ^18.3.0 → ^19.2.3
- antd: ^5.27.4 → ^6.3.4
- @ant-design/icons: ^6.1.0 → ^6.1.1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 17:06:28 +08:00
caorushizi 217bdde7d8 chore: migrate from @typescript/native-preview to typescript ^6.0.2
Replace @typescript/native-preview with standard typescript package
and remove tsgo-specific dts config from tsdown configurations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 16:57:48 +08:00
曹儒士子 299bd25c69 Refactor Footer.vue template structure 2026-02-24 14:42:53 +08:00
caorushizi deb3f9ff67 feat: banner 2026-01-16 02:08:48 +08:00
tiyongliu f9418857bd feat: 实现linux dark主题系统顶部topbar的颜色没随设置改变。 2026-01-07 17:28:48 +08:00
zhecydn 6294502641 Update tampermonkey.md
docs: add front matter for VitePress layout
2026-01-07 17:23:51 +08:00
zhecydn 336147166c Create tampermonkey.md
Create tampermonkey.md
2026-01-07 17:23:51 +08:00
caorushizi 9406d8c2cb v3.1.0-beta.1
Make MediaGo Docker Image / Build Docker Image (arm64, linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Make MediaGo Docker Image / Create Multi-Arch Manifest (push) Has been cancelled
Make MediaGo Docker Image / Build Docker Image (amd64, linux/amd64, ubuntu-latest) (push) Failing after 1s
2025-11-19 00:29:40 +08:00
caorushizi 99ceba5363 feat: true portable
fixes: #476
2025-11-19 00:21:08 +08:00
caorushizi 7dca0a1c81 feat: 支持修改每页的数量 2025-11-18 22:56:12 +08:00
Charlie 8fc92801ce fix: 嗅探自动更新,如果页面title变化,更新页面信息,展示到右侧嗅探列表 (#587)
Co-authored-by: 曹儒士子 <84996057@qq.com>
2025-11-18 21:59:30 +08:00
y2hlbg 506cd12fba fix: 增加归一化逻辑,解决进度条倒退问题 2025-11-18 21:56:24 +08:00
caorushizi 343c41a862 feat: 优化 schema 调起的逻辑 2025-11-18 21:51:07 +08:00
caorushizi a3f0658cf0 fix: null window error 2025-11-18 18:45:56 +08:00
caorushizi e33d695ca9 feat: 添加 sentry 2025-11-18 18:31:46 +08:00
Charlie cfe0644962 Merge pull request #585 from caorushizi/fix/issues_464
fix: 代理支持socks5
2025-11-18 17:04:16 +08:00
y2hlbg bc64464e20 fix: 代理支持socks5 2025-11-18 16:30:34 +08:00
caorushizi 3d4ae46e30 fix: 构建 dev 版本的 docker 2025-11-18 13:06:17 +08:00
caorushizi 0ff360e7d6 fix: download progress
fixes: #577
2025-11-18 12:16:00 +08:00
caorushizi 0ad5f54ed3 add gitcode badge 2025-11-07 08:07:21 +08:00
caorushizi 4a560a0f63 fix: docker image id
Make MediaGo Docker Image / Build Docker Image (arm64, linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Make MediaGo Docker Image / Create Multi-Arch Manifest (push) Has been cancelled
Make MediaGo Docker Image / Build Docker Image (amd64, linux/amd64, ubuntu-latest) (push) Failing after 1s
2025-11-05 00:50:58 +08:00
caorushizi 7aa22d096f v3.1.0-beta.0 2025-11-04 23:56:21 +08:00
caorushizi 9202051ff4 feat: update @mediago/deps 2025-11-04 23:55:07 +08:00
caorushizi 9e9748c6f8 fix: docker 无法播放视频 2025-11-03 18:18:47 +08:00
caorushizi ec94a136d6 feat: update deps to 0.0.5 2025-11-03 17:33:37 +08:00
caorushizi cb961bdc2f feat: 添加到 docker 2025-11-03 17:05:16 +08:00
caorushizi 45f740c36f fix: docker build 2025-11-03 16:31:22 +08:00
caorushizi 993c8f73ed fix: docker build 2025-11-03 16:02:07 +08:00
caorushizi a52518be28 fix: docker build 2025-11-03 15:21:32 +08:00
caorushizi 4c22bbdc18 fix: 修复批量下载字体大小 2025-11-03 12:00:01 +08:00
caorushizi 18cb7709de fix: docker build 2025-11-03 11:50:09 +08:00
caorushizi c1bda7fa9c fix: electron build 2025-11-03 11:41:12 +08:00
caorushizi b55dd91320 fix: pnpm setup 2025-11-03 11:35:28 +08:00
caorushizi 9c2f4664d6 fix: electron build 2025-11-03 11:26:05 +08:00
caorushizi 2467088b2f fix: electron builder 2025-11-03 11:10:34 +08:00
caorushizi 53d59c3ab9 feat: 修复登录时的问题 2025-11-03 03:50:35 +08:00
caorushizi e174aeef6a fix: 登录的一些问题 2025-11-03 03:50:35 +08:00
caorushizi f490539ee2 feat: 完善登录逻辑 2025-11-03 03:50:35 +08:00
caorushizi 74b3826319 refactor: 优化目录结构 2025-11-03 03:50:35 +08:00
caorushizi 910d1c30a6 feat: 添加登录页面 2025-11-03 03:50:35 +08:00
caorushizi c5f2dc94c9 fix: mac tray icon 2025-11-02 20:56:39 +08:00
caorushizi 4cd1955235 fix: electron build 2025-11-01 17:30:41 +08:00
caorushizi 16809c4ab5 fix: server build 2025-11-01 16:30:51 +08:00
caorushizi 52e40fed54 fix: server build 2025-11-01 16:23:35 +08:00
caorushizi bd833e7590 fix: build script 2025-11-01 15:49:48 +08:00
caorushizi f26248f0df feat: update deps 2025-11-01 15:46:05 +08:00
caorushizi 1fe1df486f feat: update electron 2025-11-01 01:55:42 +08:00
caorushizi 6189ca7f9a feat: 优化图标 2025-11-01 01:55:42 +08:00
caorushizi 9c5cdfff0d feat: 优化 ts 类型 2025-11-01 01:55:42 +08:00
caorushizi 7423e5cfca feat: 优化 ts 类型 2025-11-01 01:55:42 +08:00
caorushizi b9a4f5db57 feat: 优化代码逻辑 2025-11-01 01:55:42 +08:00
caorushizi 5717f454e6 fix: 优化代码逻辑 2025-11-01 01:55:42 +08:00
caorushizi efae7de938 fix: 修复了一些问题 2025-11-01 01:55:42 +08:00
caorushizi 1ea3c02471 fix: mediago server log 2025-11-01 01:55:42 +08:00
caorushizi cece6ee89b fix: something 2025-11-01 01:55:42 +08:00
caorushizi 02233e15fb build(server): switch Dockerfile to multi-stage 2025-11-01 01:55:42 +08:00
caorushizi 9e0752cafc chore(repo): convert text files to CRLF line endings 2025-11-01 01:55:42 +08:00
caorushizi f92f1affc6 feat(download-log): fetch logs lazily in dialog
- replace terminal drawer with modal dialog and load logs via SWR

- resolve ffmpeg binary path using deps module across runtimes

- flatten shared i18n resources and bump core packages
2025-11-01 01:55:42 +08:00
caorushizi 9e0869b675 feat: update server 2025-10-28 01:18:57 +08:00
caorushizi b09b0a300e feat: build release 2025-10-28 00:35:31 +08:00
caorushizi 2fe71f39c7 fix: build 2025-10-28 00:35:31 +08:00
caorushizi 77b08f33c2 feat: use @mediago/core 2025-10-28 00:35:31 +08:00
caorushizi 919c872106 feat: use oxlint 2025-10-28 00:35:31 +08:00
caorushizi 02c33e468d fix: download task 2025-10-28 00:35:31 +08:00
caorushizi c1a84b25a3 feat: update @mediago/core v0.0.10 2025-10-28 00:35:31 +08:00
caorushizi c5251c1b3e feat: update @mediago/player 2025-10-25 00:16:46 +08:00
caorushizi 675b277f17 feat: update @mediago/core 2025-10-25 00:16:46 +08:00
caorushizi c673363848 fix: turbo.json 2025-10-25 00:16:46 +08:00
caorushizi 44ca432508 feat: use tsdown 2025-10-25 00:16:46 +08:00
caorushizi 9d0e663928 feat: use tsdown 2025-10-25 00:16:46 +08:00
caorushizi 438ddfb46b feat: use tsdown 2025-10-25 00:16:46 +08:00
caorushizi 13077a571f feat: use tsdown 2025-10-25 00:16:46 +08:00
caorushizi 0482b6bbae feat: use tsdown 2025-10-25 00:16:46 +08:00
caorushizi 171e46cf1b feat: use tsdown 2025-10-25 00:16:46 +08:00
caorushizi 427e552ed7 fix: exists & color 2025-10-25 00:16:46 +08:00
caorushizi fa7a175260 fix: video not exist & download dropdown item 2025-10-25 00:16:46 +08:00
caorushizi 39d2646cd8 feat: use @mediago/service-runner 2025-10-25 00:16:46 +08:00
caorushizi dccc3db755 feat: use @mediago/core 0.0.5 2025-10-25 00:16:46 +08:00
caorushizi c452b14b2f fix: 获取下载进度 2025-10-25 00:16:46 +08:00
曹儒士子 cad18fafc0 refactor(ui): rename download item task variable 2025-10-16 14:58:02 +08:00
caorushizi 43160bf5e7 feat: modify database 2025-10-16 02:39:47 +08:00
caorushizi d97131d081 feat: add native bin 2025-10-16 00:51:56 +08:00
caorushizi 4cf87b7811 feat: ui 2025-10-16 00:51:56 +08:00
caorushizi fe7eae890b upgrade tailwindcss 2025-10-14 18:56:10 +08:00
caorushizi 174c11e792 update package.json 2025-10-14 18:56:10 +08:00
caorushizi 463664f7ec feat: use video and downloader server 2025-10-14 18:56:10 +08:00
caorushizi 59617b868f feat: add video service 2025-10-13 11:34:56 +08:00
caorushizi 5795d8cadd feat: remove mobile and desktop player 2025-10-13 11:34:56 +08:00
caorushizi 9323f54ac6 refactor: download form 2025-10-13 11:34:56 +08:00
caorushizi e733f13fde fix: __bin__ path 2025-10-13 11:34:56 +08:00
caorushizi 4a340617e6 tsconfig 2025-10-09 00:28:12 +08:00
caorushizi e1af2310f4 feat: edit tsconfig 2025-10-09 00:19:53 +08:00
caorushizi 395c3fac2c feat: use vite define version 2025-10-09 00:19:53 +08:00
caorushizi 26a402366d docs: package.json 2025-10-09 00:19:53 +08:00
dependabot[bot] 4290c8648b build(deps): bump axios from 1.11.0 to 1.12.2
Bumps [axios](https://github.com/axios/axios) from 1.11.0 to 1.12.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.11.0...v1.12.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.12.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-09 00:12:06 +08:00
caorushizi 467cc1da3a feat: opt deps 2025-10-08 22:51:34 +08:00
caorushizi 5dad2fb876 fix: build cache 2025-10-08 22:24:17 +08:00
caorushizi 3c78f377fc fix: build failed 2025-10-08 21:42:54 +08:00
caorushizi b869f23b20 fix: build failed 2025-10-08 21:00:03 +08:00
caorushizi 144ba39fdc fix: build failed 2025-10-08 20:47:00 +08:00
caorushizi ebb544cbcb fix: build failed 2025-10-08 20:27:51 +08:00
caorushizi 65be51094d fix: build failed 2025-10-08 18:06:23 +08:00
caorushizi ecc45895d0 fix: build failed 2025-10-08 17:57:56 +08:00
caorushizi 252a166978 feat: edit action script 2025-10-08 17:47:39 +08:00
caorushizi 49195f4206 feat: edit action script 2025-10-08 17:38:20 +08:00
caorushizi 0659964009 feat: edit action script 2025-10-08 17:35:29 +08:00
caorushizi 103a111191 feat: edit action script 2025-10-08 17:30:45 +08:00
caorushizi 1a45c685e7 feat: edit action script 2025-10-08 17:12:02 +08:00
caorushizi d6ae275bf3 feat: edit actions sctipts 2025-10-08 16:58:05 +08:00
caorushizi a51cf4e9b1 feat: add copilot instructions 2025-10-08 14:31:09 +08:00
caorushizi 0867e2da0f refactor: reponame 2025-10-08 14:30:53 +08:00
caorushizi 779172f953 feat: use vite 2025-10-08 04:48:59 +08:00
caorushizi c31bd974db feat: add linux arm64 binaries and harden download flows
- bundle linux arm64 helper binaries under bin/linux/arm64\n- harden frontend download and browser components with safer defaults\n- assign stable ids via useId to avoid duplicate DOM targets\n- align shared Favorite type with title/icon fields and update consumers\n- point release pipeline at backend-electron and force clean deletions\n- switch preload build entry and loosen biome static interaction lint
2025-09-26 13:34:22 +08:00
caorushizi 81a72bbc1a refactor(i18n): centralize internationalization system and migrate to dedicated packages
- Move i18n instance from shared-common to shared-node for backend usage
- Create shared-browser package with React i18n integration for frontend
- Centralize i18n resources in shared-common with structured organization
- Update all imports across backend-electron, backend-web, and frontend-main
- Add language detection and browser-specific i18n configuration
- Maintain backward compatibility while improving maintainability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-26 00:01:35 +08:00
caorushizi fb380ffcc6 docs: add repository guidelines 2025-09-25 22:51:16 +08:00
caorushizi 15f3aecc9d refactor(frontend): rename files to kebab case 2025-09-25 21:06:11 +08:00
caorushizi c2c198c636 refactor: centralize IPC handle constants 2025-09-25 16:41:29 +08:00
caorushizi 75eed24552 refactor: remove shared package and migrate to specific shared packages
- Remove packages/shared package entirely
- Update all apps and packages to use @mediago/shared-common and @mediago/shared-node instead
- Simplify router implementation by removing dynamic electron imports
- Update build configurations and dependency references
- Clean up pnpm-lock.yaml to reflect new package structure

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 19:41:19 +08:00
caorushizi ad51d812d7 docs: 📸 migrate to local images and update architecture documentation
- Replace remote image URLs with local images in README.md
- Add screenshot images to images/ directory
- Update CLAUDE.md with current project structure and commands
- Remove obsolete @ghostery/adblocker patch

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 17:22:31 +08:00
曹儒士子 33f893f961 refactor: extract download state aggregator 2025-09-24 16:07:33 +08:00
曹儒士子 67631c995a Refactor app store handler mapping 2025-09-24 16:06:52 +08:00
曹儒士子 fb45213073 refactor: share controller registration helper 2025-09-24 16:05:18 +08:00
曹儒士子 e0671bd4c8 refactor: share app store defaults 2025-09-24 13:50:39 +08:00
spencer 80e493e1ae refactor: add item to ignore the '.store' directory 2025-09-16 16:52:23 +08:00
spencer c19d3b1fd7 refactor: use DESC sorting of created date in the download list and download complete list page 2025-09-13 20:16:33 +08:00
caorushizi d57c67eca6 refactor: 🚀 simplify download API by consolidating methods with optional parameters
Consolidate download-related methods to reduce duplication:
- Merge downloadNow, downloadItemsNow into addDownloadItems with startDownload flag
- Merge editDownloadNow into editDownloadItem with startDownload flag
- Remove redundant addDownloadItem method in favor of addDownloadItems
- Update both Electron and Web backends with unified parameter structure
- Maintain backward compatibility while simplifying the API surface

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 17:01:41 +08:00
caorushizi 4a1239b100 refactor: 📦️ split shared package into domain-specific packages
Extract shared package into three separate packages for better separation of concerns:
- @mediago/shared-common: Common types, constants, utilities, i18n
- @mediago/shared-node: Node.js specific services, DAOs, entities
- @mediago/shared-browser: Browser-specific code

Benefits:
- Improved dependency management and package isolation
- Eliminated circular dependencies between packages
- Better maintainability with domain-separated codebases
- Enhanced type safety across the monorepo

Changes:
- Created new packages with proper TypeScript configurations
- Migrated all code from packages/shared/src/{common,node,browser}
- Updated 40+ import statements across the entire codebase
- Resolved package dependency conflicts and circular references
- All backend packages pass TypeScript compilation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 17:01:41 +08:00
caorushizi cbe337baed refactor: 🏗️ extract shared business logic services from backend controllers
Extract platform-agnostic business logic from backend-electron and backend-web controllers
into reusable services in the shared package, enabling code reuse across platforms:

- ConversionService: handles conversion record management operations
- DownloadManagementService: manages download lifecycle, CRUD operations, and metadata
- FavoriteManagementService: handles bookmark/favorites management

Benefits:
- Eliminates code duplication between Electron and Web backends
- Centralizes business logic maintenance in shared package
- Preserves platform-specific UI interactions (dialogs, notifications)
- Maintains dependency injection architecture consistency

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 17:01:41 +08:00
caorushizi f6433e8f80 refactor: 🏗️ unify router architecture across Electron and Web backends
- Rename IpcHandlerService to ElectronRouter for clarity
- Introduce shared MEDIAGO_METHOD and MEDIAGO_EVENT constants
- Replace separate @get/@post decorators with unified @handle decorator
- Standardize routing metadata handling across platforms
- Add MediaGoRouter interface for consistent router contracts
- Remove unused @on decorator from Electron helpers

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-11 17:01:41 +08:00
caorushizi a6aa2094e2 fix: 🔧 make electron adapter enumerable with Proxy traps
- Move adapters from src/adapters/ to src/hooks/adapters/
- Add ownKeys and getOwnPropertyDescriptor traps to electronAdapter Proxy
- Enable Object.keys() iteration over electronAdapter methods
- Fix useAPI hook to properly enumerate API methods in Electron environment

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi a264284c05 refactor: 🏗️ migrate to Inversify 7 with binding decorators for dependency injection
Upgrade Inversify from v6 to v7 and implement modern binding decorators pattern:
- Replace manual container bindings with @provide decorators
- Update all controllers, services, and vendors to use decorator-based DI
- Simplify inversify.config.ts by removing explicit bindings
- Add @inversifyjs/binding-decorators dependency for cleaner configuration
- Maintain singleton pattern and existing functionality

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi 0e898be77c refactor: 📦️ extract Electron preload script into standalone package
Extract preload.ts from apps/backend-electron to packages/electron-preload for better modularity and reusability. This includes:

- Create new @mediago/electron-preload package with proper build configuration
- Update backend-electron to use the new preload package dependency
- Maintain all existing functionality while improving architecture

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi bd6a974e5c refactor: 🏗️ restructure frontend API and IPC adapters
- Replace `apis/` folder with `adapters/` for clearer architecture
- Integrate IPC logic into corresponding adapter files:
  - `electronIpcAdapter` in `electron.ts`
  - `webIpcAdapter` in `web.ts`
- Add new `useAPI` Hook with cleaner separation of concerns
- Maintain backward compatibility with `useElectron` alias
- Improve code organization and maintainability

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi 5356a580f2 refactor: 🔧 unify TypeScript configurations across all packages
- Create base configurations in packages/config for different app types
- Standardize all tsconfig.json files to extend from shared configs
- Fix module resolution inconsistencies (NodeNext -> bundler mode)
- Remove duplicate configuration options across packages
- Improve code quality by fixing linting issues in shared services

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi 90218e876e docs: add docs 2025-09-05 19:55:46 +08:00
caorushizi 735dc4bbd5 refactor: 📦️ reorganize the file directory 2025-09-05 19:55:46 +08:00
caorushizi 3113617d26 refactor: 🔧 migrate ptyRunner to app-specific implementations
- Move ptyRunner from shared package to individual apps (electron/webapi)
- Update package.json names and dependency versions
- Standardize node-pty versions across apps
- Remove shared ptyRunner export and update imports
- Update DownloaderService to accept runner as parameter

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi e5fad91210 feat: 🐳 add Docker development environment for webapi
- Add Docker configuration to resolve node-pty native module conflicts
- Create docker/Dockerfile for production builds
- Create docker/Dockerfile.dev for development with hot reload
- Add docker-compose.yml for easy development setup
- Include system dependencies (python3, make, g++, libicu-dev) for native modules
- Update package.json with dev:docker and build:docker commands
- Move .dockerignore to root directory for proper build context
- Remove electron rebuild scripts as Docker handles native module compilation
- Enable mixed development: webapi in container, electron on host

Usage:
- pnpm dev:docker # Start webapi in Docker container
- pnpm -F electron dev # Start electron locally in parallel

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi 763a5fcd86 refactor: 📦️ rename apps and migrate to pure Turborepo build system
- Rename apps with more descriptive names:
  • main → electron (Electron main process)
  • renderer → frontend (React UI for both Electron and web)
  • backend → webapi (Koa.js API server)

- Remove tools/scripts custom build logic:
  • Replace custom zx scripts with native Turbo commands
  • Update dev command to use Turbo filters for plugin/mobile builds
  • Migrate web-release build to use Turbo pipeline
  • Remove tools/scripts directory entirely

- Update comprehensive README documentation for each app:
  • apps/electron/README.md - Desktop application lifecycle and system integration
  • apps/frontend/README.md - React UI shared between Electron and web
  • apps/webapi/README.md - Standalone API server with Docker support

- Update all configuration references:
  • package.json: Update all Turbo filter commands
  • biome.json: Remove tools/scripts path references
  • pnpm-workspace.yaml: Remove tools/* workspace
  • CLAUDE.md: Update architecture documentation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi ba36d89cef refactor: 🏗️ migrate to Turborepo monorepo structure
- Install Turborepo for build orchestration and caching
- Reorganize directory structure following monorepo best practices:
  - Move packages/main,renderer,backend,mobile,plugin → apps/
  - Keep packages/shared for shared utilities and types
  - Create packages/config for shared configurations
  - Move scripts/ → tools/scripts/
- Update pnpm-workspace.yaml for new structure (apps/*, packages/*, tools/*)
- Configure turbo.json with build pipelines and task dependencies
- Update all package.json scripts to use Turbo commands
- Update biome.json paths for new directory structure
- Add packageManager field to root package.json
- Update CLAUDE.md documentation with new architecture

Benefits:
- Faster builds with intelligent caching and incremental builds
- Parallel task execution across packages
- Clear separation between apps and shared packages
- Improved developer experience with unified build system

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi b5ecbbb748 refactor: 🔧 migrate from ESLint/Prettier to Biome
- Install @biomejs/biome as unified linting and formatting tool
- Remove all ESLint/Prettier configurations and dependencies
- Create unified biome.json with TypeScript, React, CSS support
- Update all package scripts to use Biome commands
- Configure lint-staged across all packages
- Add root-level lint, format, and lint:fix commands

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-05 19:55:46 +08:00
caorushizi 386c6bfe16 fix: 🐛 type error 2025-05-20 14:12:18 +08:00
曹儒士子 a792fdc0b1 Merge pull request #483 from caorushizi/refactor/main 2025-05-18 19:31:49 +08:00
caorushizi 4358f7b767 refactor: 📦️ optimize socket.io 2025-05-18 19:29:31 +08:00
曹儒士子 658b245baf Merge pull request #482 from caorushizi/refactor/main 2025-05-18 13:49:30 +08:00
caorushizi b6dcd6fac7 refactor: 📦️ refactor main packages 2025-05-18 13:47:50 +08:00
caorushizi 953f9032b9 refactor: 📦️ add @mediago/shared 2025-05-17 23:02:31 +08:00
caorushizi 60652fbcd0 feat: optimize the message update mechanism of the download list 2025-05-17 15:18:19 +08:00
caorushizi e8d5cf5c7a refactor: 📦️ reconstruct the video download service 2025-05-17 00:51:56 +08:00
曹儒士子 4b34f51d96 Merge pull request #467 from zhou-xh/zhouxh
feat: 增加小屏页面自适应
2025-04-24 17:47:30 +08:00
zhouxunhai 14a88a78ed feat: 增加小屏页面自适应 2025-04-24 14:00:17 +08:00
曹儒士子 d6a8992d04 Merge pull request #432 from caorushizi/fix/some-thing
feat:   support for pushing download links to docker
2025-03-08 21:25:27 +08:00
caorushizi 63ddc1457b feat: get the page title in the web download 2025-03-03 13:11:35 +08:00
caorushizi ca6a90ec63 feat: support for pushing download links to docker 2025-03-02 23:28:07 +08:00
曹儒士子 f7a2790285 Merge pull request #427 from caorushizi/fix/bilibili-name
fix: bilibili video name
2025-03-02 18:21:15 +08:00
曹儒士子 e62a591c24 Merge branch 'master' into fix/bilibili-name 2025-03-02 18:20:47 +08:00
Charlie 8e5089b8db refactor: getPageTitle useElectron 2025-03-02 15:44:43 +08:00
caorushizi f9cbb7dfd4 fix: 🐛 skip check segments count 2025-02-28 02:11:56 +08:00
caorushizi 4f5625f7b4 fix: 🐛 some bugs 2025-02-28 02:07:37 +08:00
Charlie fa2c8de385 fix: bilibili video name 2025-02-18 00:46:21 +08:00
Charlie 68fcbd1670 Merge pull request #426 from caorushizi/fix/bilibili-dom
fix: ts fix
2025-02-17 22:09:42 +08:00
Charlie c5a9398607 fix: ts fix 2025-02-17 22:07:16 +08:00
曹儒士子 6886bf7e06 Merge pull request #421 from caorushizi/fix/bilibili-dom
fix: bilibili ele bug fix
2025-02-17 01:15:42 +08:00
Charlie d1871a1bb2 fix: bilibili ele bug fix 2025-02-17 01:09:27 +08:00
曹儒士子 05407600d6 Merge pull request #420 from caorushizi/fix/macOs_scheme
fix: scheme open app in macOs
2025-02-15 00:11:09 +08:00
Charlie ba7e280b82 docs: comments English 2025-02-15 00:05:40 +08:00
Charlie 0857376da5 fix: scheme open app in macOs 2025-02-14 23:37:40 +08:00
曹儒士子 d39e1fb1c5 Merge pull request #419 from caorushizi/title-encode
fix: 🐛  url encode
2025-02-14 01:31:18 +08:00
caorushizi 9867d26bdd fix: 🐛 url encode 2025-02-14 01:29:23 +08:00
曹儒士子 e5f6d70b7c Merge pull request #418 from IOLOII/master 2025-02-13 17:00:48 +08:00
IOLOII 2b363a91a9 Revert "build(deps): bump react-dom and @types/react-dom"
This reverts commit c8c7351f9e.
2025-02-13 16:29:34 +08:00
曹儒士子 c79fba28d1 Merge pull request #413 from caorushizi/gopeed
feat:  straight link download
2025-02-12 01:08:25 +08:00
caorushizi 66b841697d feat: direct link download 2025-02-12 01:06:56 +08:00
caorushizi 98ee8d88f7 feat: straight link download 2025-02-11 03:56:27 +08:00
曹儒士子 b6a1328be4 Merge pull request #381 from caorushizi/dependabot/npm_and_yarn/i18next-browser-languagedetector-8.0.2
build(deps): bump i18next-browser-languagedetector from 8.0.0 to 8.0.2
2025-02-10 17:59:02 +08:00
曹儒士子 4f6636b9eb Merge branch 'master' into dependabot/npm_and_yarn/i18next-browser-languagedetector-8.0.2 2025-02-10 17:58:53 +08:00
曹儒士子 1a33e35fe4 Merge pull request #384 from caorushizi/dependabot/npm_and_yarn/socket.io-client-4.8.1
build(deps): bump socket.io-client from 4.8.0 to 4.8.1
2025-02-10 17:58:38 +08:00
曹儒士子 17a76f9db0 Merge branch 'master' into dependabot/npm_and_yarn/socket.io-client-4.8.1 2025-02-10 17:58:32 +08:00
曹儒士子 4cd50e54c1 Merge pull request #382 from caorushizi/dependabot/npm_and_yarn/multi-3739722284
build(deps): bump react-dom and @types/react-dom
2025-02-10 17:58:18 +08:00
曹儒士子 215b1a85d0 Merge branch 'master' into dependabot/npm_and_yarn/multi-3739722284 2025-02-10 17:58:06 +08:00
曹儒士子 deb73cdcce Merge pull request #400 from caorushizi/dependabot/npm_and_yarn/stylelint-config-standard-37.0.0
build(deps-dev): bump stylelint-config-standard from 36.0.0 to 37.0.0
2025-02-10 17:57:47 +08:00
曹儒士子 d4fe4c0aab Merge branch 'master' into dependabot/npm_and_yarn/stylelint-config-standard-37.0.0 2025-02-10 17:57:38 +08:00
曹儒士子 dd862e90bb Merge pull request #385 from caorushizi/dependabot/npm_and_yarn/eslint-plugin-react-hooks-5.1.0
build(deps-dev): bump eslint-plugin-react-hooks from 4.6.2 to 5.1.0
2025-02-10 17:56:49 +08:00
曹儒士子 33f02b5719 Merge branch 'master' into dependabot/npm_and_yarn/eslint-plugin-react-hooks-5.1.0 2025-02-10 17:56:21 +08:00
曹儒士子 ed8ea0861e Merge pull request #411 from caorushizi/dependabot/npm_and_yarn/vite-6.1.0
build(deps-dev): bump vite from 5.2.11 to 6.1.0
2025-02-10 17:55:50 +08:00
曹儒士子 1b445927dd Merge branch 'master' into dependabot/npm_and_yarn/vite-6.1.0 2025-02-10 17:55:33 +08:00
caorushizi b65e0f8bd6 Merge branch 'master' of https://github.com/caorushizi/mediago 2025-02-10 17:54:55 +08:00
caorushizi 9d30a04cdf ci: 🎡 disable automatic triggering 2025-02-10 17:53:59 +08:00
曹儒士子 134237fc5e Merge branch 'master' into dependabot/npm_and_yarn/vite-6.1.0 2025-02-10 17:49:19 +08:00
曹儒士子 1a933fc3a2 Merge pull request #412 from caorushizi/dev_videoName
fix: 🐛  change the name of the detected video
2025-02-10 17:47:48 +08:00
dependabot[bot] 63087901b9 build(deps-dev): bump vite from 5.2.11 to 6.1.0
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.2.11 to 6.1.0.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.1.0/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 04:50:17 +00:00
caorushizi bd56f2aa04 fix: 🐛 change the name of the detected video 2025-01-16 21:26:30 +08:00
曹儒士子 de86c861d8 Merge pull request #401 from caorushizi/v3.0.1
feat:   v3.0.1
2025-01-14 16:22:28 +08:00
caorushizi af3b8a2a6b feat: v3.0.1 2025-01-14 15:34:57 +08:00
dependabot[bot] 6b40256ee3 build(deps-dev): bump stylelint-config-standard from 36.0.0 to 37.0.0
Bumps [stylelint-config-standard](https://github.com/stylelint/stylelint-config-standard) from 36.0.0 to 37.0.0.
- [Release notes](https://github.com/stylelint/stylelint-config-standard/releases)
- [Changelog](https://github.com/stylelint/stylelint-config-standard/blob/main/CHANGELOG.md)
- [Commits](https://github.com/stylelint/stylelint-config-standard/compare/36.0.0...37.0.0)

---
updated-dependencies:
- dependency-name: stylelint-config-standard
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 04:17:05 +00:00
dependabot[bot] d8f3f083c7 build(deps-dev): bump eslint-plugin-react-hooks from 4.6.2 to 5.1.0
Bumps [eslint-plugin-react-hooks](https://github.com/facebook/react/tree/HEAD/packages/eslint-plugin-react-hooks) from 4.6.2 to 5.1.0.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/eslint-plugin-react-hooks)

---
updated-dependencies:
- dependency-name: eslint-plugin-react-hooks
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-02 20:27:50 +00:00
曹儒士子 47d3d786ca Merge pull request #396 from caorushizi/dev/perfermance
Dev/perfermance
2025-01-03 04:25:10 +08:00
caorushizi 1c755b4bd5 feat: video sniffing page added one-click cleanup and one-click download 2025-01-03 04:19:31 +08:00
caorushizi 0cece2b194 perf: 🚀 use memoized function 2025-01-03 03:37:35 +08:00
caorushizi 840fc610f0 style: 💄 optimized the file reference path problem 2025-01-03 03:06:33 +08:00
caorushizi 6e55fe9f34 feat: some performance issues were optimized 2025-01-03 03:01:53 +08:00
dependabot[bot] c8c7351f9e build(deps): bump react-dom and @types/react-dom
Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) and [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom). These dependencies needed to be updated together.

Updates `react-dom` from 18.3.1 to 19.0.0
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.0.0/packages/react-dom)

Updates `@types/react-dom` from 18.3.0 to 19.0.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

---
updated-dependencies:
- dependency-name: react-dom
  dependency-type: direct:production
  update-type: version-update:semver-major
- dependency-name: "@types/react-dom"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 23:05:28 +00:00
dependabot[bot] 9bf2aa2c48 build(deps): bump socket.io-client from 4.8.0 to 4.8.1
Bumps [socket.io-client](https://github.com/socketio/socket.io) from 4.8.0 to 4.8.1.
- [Release notes](https://github.com/socketio/socket.io/releases)
- [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io/compare/socket.io-client@4.8.0...socket.io-client@4.8.1)

---
updated-dependencies:
- dependency-name: socket.io-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 23:05:26 +00:00
曹儒士子 1620b8e4c4 Merge pull request #395 from caorushizi/docs/packages
docs: 📝  simplify download buttons and supplement documentation
2025-01-02 07:03:12 +08:00
caorushizi f798bd3d8b feat: remove redux/toolkit 2025-01-02 06:54:49 +08:00
caorushizi 65850f158c docs: 📝 simplify download buttons and supplement documentation 2025-01-02 05:05:51 +08:00
曹儒士子 8f5991e65f Merge pull request #394 from caorushizi/feat/package-version
fix: 🐛  modify home page copy
2025-01-02 04:10:47 +08:00
caorushizi 5492e1df35 fix: 🐛 modify home page copy 2025-01-02 04:08:46 +08:00
曹儒士子 93fbd8768b Merge pull request #393 from caorushizi/feat/package-version
fix: 🐛  urlschema add headers params
2025-01-02 02:48:39 +08:00
caorushizi 246f079905 fix: 🐛 urlschema add headers params 2025-01-02 02:47:20 +08:00
曹儒士子 b25285fcc2 Merge pull request #392 from caorushizi/feat/package-version
feat:   use the silent parameter for immediate download
2025-01-02 02:33:36 +08:00
caorushizi 7a2b31d328 feat: use the silent parameter for immediate download 2025-01-02 02:32:47 +08:00
曹儒士子 a4ac847f0d Merge pull request #391 from caorushizi/feat/package-version
fix: 🐛  pass the request header when downloading
2025-01-02 01:19:50 +08:00
caorushizi 6b632b5502 fix: 🐛 pass the request header when downloading 2025-01-02 01:18:06 +08:00
dependabot[bot] 560a77ca52 build(deps): bump i18next-browser-languagedetector from 8.0.0 to 8.0.2
Bumps [i18next-browser-languagedetector](https://github.com/i18next/i18next-browser-languageDetector) from 8.0.0 to 8.0.2.
- [Changelog](https://github.com/i18next/i18next-browser-languageDetector/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next-browser-languageDetector/compare/v8.0.0...v8.0.2)

---
updated-dependencies:
- dependency-name: i18next-browser-languagedetector
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-01 16:40:19 +00:00
曹儒士子 86e1345684 Merge pull request #389 from caorushizi/feat/package-version
feat:   update adblocker
2025-01-02 00:38:02 +08:00
caorushizi b91de0e442 feat: update adblocker
feat #388
2025-01-02 00:29:35 +08:00
曹儒士子 62e47aac4c Merge pull request #387 from caorushizi/fix/bug
Fix some bug
2025-01-01 18:27:28 +08:00
caorushizi 43fb92ac82 fix: 🐛 fixed issues with YouTube login and cloudflare verification 2025-01-01 13:38:56 +08:00
caorushizi de5ecb570f fix: 🐛 fixed the createDate type error 2025-01-01 13:34:51 +08:00
caorushizi 014c851a03 fix: 🐛 fixed last character counld not be deleted 2025-01-01 13:32:37 +08:00
caorushizi eae07b1d3b fix: 🐛 fix Bilibili video file name 2025-01-01 13:30:06 +08:00
caorushizi df06736722 fix: 🐛 windows script 2024-12-19 20:39:31 +08:00
曹儒士子 25b90a0993 Merge pull request #378 from caorushizi/dev/docs
feat:   update readme
2024-12-19 20:11:45 +08:00
caorushizi ad1b58bf53 feat: update readme 2024-12-19 20:10:49 +08:00
曹儒士子 259118e48b Merge pull request #377 from caorushizi/dev/docs
feat:   update readme
2024-12-19 20:08:46 +08:00
caorushizi 145ac6bb12 feat: update readme 2024-12-19 20:08:01 +08:00
曹儒士子 7b581ff917 Merge pull request #376 from caorushizi/dev/docs
Dev/docs
2024-12-19 17:16:27 +08:00
caorushizi 62423f8156 feat: update README.md 2024-12-19 17:15:10 +08:00
caorushizi 5fd539445e docs: 📝 use English annotations 2024-12-19 16:54:28 +08:00
曹儒士子 7c756cccef feat: docker platform (#371)
* feat:   docker platform

* feat:   docker arch
2024-12-15 10:56:35 +08:00
曹儒士子 786826b434 Merge pull request #370 from woniuxingdong/master
feat: display created date for items in download list
2024-12-14 11:56:52 +08:00
spencer 56f41999b5 feat: display created date for items in download list 2024-12-13 17:42:58 +08:00
曹儒士子 7423cf89ab Merge pull request #369 from caorushizi/dev-bt
docs: update README.md
2024-12-13 16:03:32 +08:00
caorushizi 8c6ee20b30 docs: update README.md 2024-12-13 16:02:03 +08:00
曹儒士子 17ffa1acc0 Merge pull request #368 from woniuxingdong/master 2024-12-12 20:43:13 +08:00
spencer cec95c9f0a fix: add one setting item to control if the browser need to play audio 2024-12-12 17:33:49 +08:00
spencer eaf3d46e24 fix: defaultly to play audio 2024-12-10 16:48:47 +08:00
曹儒士子 c30badabbf Merge pull request #365 from caorushizi/feat/remove-docs
docs: 📝  remove docs
2024-12-09 12:56:18 +08:00
caorushizi 40cdecc820 docs: 📝 remove docs 2024-12-09 12:55:18 +08:00
caorushizi 3c1088b6d6 feat: website SEO 2024-11-28 17:18:20 +08:00
士子☀️ ac9a4c8f48 Update README.md 2024-10-17 11:03:32 +08:00
caorushizi b79ab2ee3f feat: release v3.0 2024-10-08 00:32:48 +08:00
caorushizi ceef11bca6 feat: v3.0.0 2024-10-08 00:23:01 +08:00
士子☀️ 5ce80eddb6 Merge pull request #323 from caorushizi/v3.0.0
v3.0.0
2024-10-07 22:37:04 +08:00
caorushizi 8bc3e229d7 v3.0.0 2024-10-07 22:34:46 +08:00
士子☀️ f939ce138c Merge pull request #322 from caorushizi/dev-docker-1
feat:   release scripts
2024-10-07 17:34:35 +08:00
caorushizi ad89281927 feat: release scripts 2024-10-07 17:33:53 +08:00
士子☀️ c9ae9e6b32 Fix mac build (#319)
* fix: 🐛  Mac build
#230 修复 intel 无法打开的问题
2024-10-07 14:53:08 +08:00
士子☀️ ce7dd57d36 Merge pull request #314 from caorushizi/fix-mac-build
Fix mac build
2024-10-07 00:59:36 +08:00
caorushizi 43ed1f8e3f fix: 🐛 mac build 2024-10-07 00:52:52 +08:00
caorushizi 9d1e796a20 fix: 🐛 mac build 2024-10-07 00:48:06 +08:00
士子☀️ 80bfe5f979 Merge pull request #313 from caorushizi/v3.0.0-beta.5
feat:   v3.0.0-beta.5
2024-10-06 17:12:57 +08:00
caorushizi 13ee214026 feat: v3.0.0-beta.5 2024-10-06 17:09:59 +08:00
士子☀️ 08e38d752a Merge pull request #312 from caorushizi/v3.0.0-beta.3
feat:   v3.0.0-beta.3
2024-10-06 16:38:44 +08:00
caorushizi aef4d4ffee feat: v3.0.0-beta.3 2024-10-06 16:37:28 +08:00
士子☀️ a1b2c70fdd Merge pull request #311 from caorushizi/v3.0.0-beta.3
feat:   v3.0.0-beta.3
2024-10-06 16:32:47 +08:00
caorushizi c9b4525baf feat: v3.0.0-beta.3 2024-10-06 16:30:59 +08:00
caorushizi 0b0666912e feat: supports urlscheme
#203
2024-10-04 23:47:29 +08:00
士子☀️ 9dbb5681f7 Merge pull request #310 from caorushizi/fix-merge-video
fix: 🐛  merge video
2024-10-04 16:11:34 +08:00
caorushizi eaa7bdd736 fix: 🐛 merge video 2024-10-04 16:10:28 +08:00
士子☀️ 0a65bbae5d Merge pull request #307 from caorushizi/dev-gulp
Dev gulp
2024-10-04 14:43:28 +08:00
caorushizi 82cfc1cabb feat: live streams are automatically merged 2024-10-04 14:42:11 +08:00
caorushizi f4402ac57b feat: add download folder 2024-10-04 14:26:26 +08:00
士子☀️ f6514f85dc Merge pull request #306 from caorushizi/dev-gulp
feat:   optimize web Some interaction & optimize engineering logic
2024-10-04 00:01:57 +08:00
caorushizi 1cf4c0ce39 feat: optimize web Some interaction & optimize engineering logic 2024-10-03 23:59:26 +08:00
士子☀️ 3ffe7a63e9 Merge pull request #305 from david88558855/master
Update README.md
2024-10-03 22:24:13 +08:00
david88558855 a532d9d209 Update README.md 2024-10-03 22:21:02 +08:00
士子☀️ 9c1f2f6662 Merge pull request #304 from caorushizi/dev-docker
fix: 🐛  compressed image volume
2024-10-03 14:45:20 +08:00
caorushizi 0b9ef9ff4c fix: 🐛 compressed image volume 2024-10-03 11:29:28 +08:00
caorushizi 35f25abd8a fix: 🐛 fragments are not deleted after downloading 2024-10-02 23:22:40 +08:00
士子☀️ 70bed8c006 Merge pull request #303 from caorushizi/package-version
fix: 🐛  lock version
2024-10-02 17:12:21 +08:00
caorushizi dcfad6a3c0 fix: 🐛 lock version 2024-10-02 17:01:24 +08:00
士子☀️ e7d1540b72 Merge pull request #302 from caorushizi/docker
feat:   support docker
2024-10-02 16:27:14 +08:00
caorushizi 4bc09d74ff feat: support docker 2024-10-02 16:23:47 +08:00
士子☀️ 7ab45498e6 Merge pull request #301 from caorushizi/fix-charset
Fix charset
2024-10-01 22:17:22 +08:00
caorushizi da7ffd9c12 feat: docker file 2024-10-01 22:15:51 +08:00
caorushizi b5d7ec111d feat: remote docker image 2024-10-01 21:52:07 +08:00
caorushizi 9077eb836c fix: 🐛 database charset 2024-10-01 20:32:08 +08:00
士子☀️ 6f3c2666ca Merge pull request #300 from caorushizi/dev-web
feat:   dev web
2024-10-01 01:28:10 +08:00
caorushizi eaa3170f01 feat: support web 2024-10-01 01:26:55 +08:00
caorushizi 7e1c425676 feat: dev web 2024-09-30 23:02:25 +08:00
caorushizi 7df980f881 feat: dev web 2024-09-30 18:28:34 +08:00
士子☀️ 7f0259e9cc Merge pull request #294 from caorushizi/dev-web
feat:   web
2024-09-30 13:14:24 +08:00
caorushizi c7b2f99c43 feat: backend log 2024-09-30 13:12:57 +08:00
caorushizi 4534238216 feat: nodejs 2024-09-30 03:04:57 +08:00
caorushizi 2085ef3063 feat: web 2024-09-29 02:39:49 +08:00
士子☀️ 7d3d69eae5 Merge pull request #293 from caorushizi/fix-list-style
fix: 🐛  fix list style
2024-09-28 15:06:49 +08:00
caorushizi 5c129e050b feat: nodejs version 2024-09-28 15:01:59 +08:00
caorushizi 73163de408 fix: 🐛 fix list style 2024-09-27 02:46:36 +08:00
士子☀️ f18bdc4375 Merge pull request #292 from caorushizi/fix-error
fix: 🐛  error message style in dark mode
2024-09-26 23:24:55 +08:00
caorushizi 2d9a226378 fix: 🐛 error message style in dark mode 2024-09-26 23:23:42 +08:00
士子☀️ 6cd4094159 Merge pull request #291 from caorushizi/dev-icon
fix: 🐛  optimize some styles
2024-09-26 23:06:30 +08:00
caorushizi d4c43ece23 fix: 🐛 optimize some styles 2024-09-26 22:58:35 +08:00
士子☀️ 9ac8d5d2bf Merge pull request #290 from caorushizi/dev-icon
feat:   optimized app ICONS
2024-09-26 21:52:22 +08:00
caorushizi 049ef746f4 feat: optimized app ICONS 2024-09-26 21:51:09 +08:00
士子☀️ 83d26211a0 Merge pull request #289 from caorushizi/v3.0.0-beta.2
feat:   v3.0.0-beta.2
2024-09-26 19:42:49 +08:00
caorushizi 680641707e feat: v3.0.0-beta.2 2024-09-26 19:40:58 +08:00
士子☀️ 27d4e092cf Merge pull request #288 from caorushizi/feature-export
feat:   added video link export & new download style optimization
2024-09-26 19:38:29 +08:00
caorushizi 5b477b9e9e feat: added video link export & new download style optimization 2024-09-26 19:36:59 +08:00
士子☀️ eb332b70e0 Merge pull request #287 from caorushizi/feature
feat:   video sniffing logic optimization
2024-09-26 17:59:52 +08:00
caorushizi 824df9cae2 feat: video sniffing logic optimization 2024-09-26 17:54:37 +08:00
士子☀️ 1fc73f324c Merge pull request #286 from caorushizi/feature
Feature
2024-09-26 16:47:15 +08:00
caorushizi 8dcdb1f8a3 fix: 🐛 automatically fill the video name
#127
2024-09-26 16:46:04 +08:00
caorushizi 4fe1d1ea66 feat: upgrade download program 2024-09-26 16:24:27 +08:00
士子☀️ 93b6f8c7b6 Merge pull request #285 from caorushizi/feature
Feature
2024-09-26 15:37:10 +08:00
caorushizi a33e7c3903 fix: 🐛 fixed an issue with ICONS adding favorites 2024-09-26 15:34:32 +08:00
caorushizi 4ea0180781 feat: display error message when download fails 2024-09-26 12:37:28 +08:00
caorushizi 1d4850d7fb feat: tdapp 2024-09-26 11:58:59 +08:00
士子☀️ cf77e6633e Merge pull request #284 from caorushizi/feature
feat:   new icon
2024-09-26 03:43:43 +08:00
caorushizi c692fdf6c3 feat: new icon 2024-09-26 03:41:24 +08:00
士子☀️ 1901b177cc Merge pull request #283 from caorushizi/feature
feat:   添加关闭窗口选项
2024-09-26 02:49:49 +08:00
caorushizi ce60d77c8d feat: 添加关闭窗口选项 2024-09-26 02:47:46 +08:00
士子☀️ fbe1d43488 Merge pull request #282 from caorushizi/feature
Feature
2024-09-26 02:21:42 +08:00
caorushizi ee8e75513d feat: 版本更新检查 2024-09-26 02:19:12 +08:00
caorushizi f094fd1e7f feat: main process adds multiple languages 2024-09-25 21:34:59 +08:00
士子☀️ 14c30e0e58 Merge pull request #281 from caorushizi/feature-batch
fix: 🐛  批量下载功能优化
2024-09-25 14:01:05 +08:00
caorushizi 872f1b9284 fix: 🐛 批量下载功能优化
#244, #198
2024-09-25 13:59:22 +08:00
士子☀️ 5680512573 Merge pull request #279 from caorushizi/v3.0.0-beta.1
feat:   v3.0.0-beta.1
2024-09-25 03:33:48 +08:00
caorushizi 2f6a43d98a feat: v3.0.0-beta.1 2024-09-25 03:32:14 +08:00
士子☀️ 1142c2c501 Merge pull request #278 from caorushizi/fix-issues
fix: 🐛  便携版上传
2024-09-25 03:20:01 +08:00
caorushizi c1502c0230 fix: 🐛 便携版上传 2024-09-25 03:04:59 +08:00
士子☀️ 55cf680b0c Merge pull request #276 from caorushizi/fix-issues
feat(download):   新建下载时默认带入上次表单信息
2024-09-25 02:54:25 +08:00
caorushizi 6c0d0cdf74 feat: 新增便携版 2024-09-25 02:52:40 +08:00
caorushizi 32ad030838 fix: 🐛 阻止 deeplink 打开 2024-09-25 01:55:21 +08:00
caorushizi 9811c18407 fix: 🐛 优化视频识别逻辑 & 添加完成列表的右键菜单 2024-09-25 01:44:30 +08:00
caorushizi a9c6e01294 fix: 🐛 修复批量下载 & icon 样式 2024-09-25 00:48:37 +08:00
caorushizi b904d6aaec fix: 🐛 pC 端的视频无法播放 2024-09-24 22:36:03 +08:00
caorushizi 78958d925a fix: 🐛 解决列表页面在操作时跳动的问题 2024-09-24 21:55:11 +08:00
caorushizi afba340028 fix: 🐛 新建收藏之后没有关闭弹窗 2024-09-24 21:03:07 +08:00
caorushizi ec4b24149f fix: 🐛 修复收藏页面中无法通过右键删除的问题 2024-09-24 20:52:02 +08:00
caorushizi 8e1bd8596f feat: 增加导入导出网址
#205
2024-09-24 20:33:03 +08:00
caorushizi f8785f8db8 fix: 🐛 收藏列表样式优化 2024-09-24 14:49:10 +08:00
caorushizi c508c1dd1a fix: 🐛 构建产物添加平台的名称 2024-09-24 13:28:11 +08:00
caorushizi c78b593afa feat: 将首页的【打开浏览器】按钮换成【素材提取】
#238
2024-09-24 13:20:10 +08:00
caorushizi 1b906804de feat(download): 新建下载时默认带入上次表单信息
#273 #273
2024-09-24 13:02:27 +08:00
士子☀️ 62561e9826 Merge pull request #265 from caorushizi/release-v3.0.0-beta.0
feat:   release 3.0.0-beta.0
2024-09-01 16:32:13 +08:00
caorushizi cbb9798174 feat: release 3.0.0-beta.0 2024-09-01 16:30:44 +08:00
caorushizi 2de6b6a1cc fix: 🐛 修复一些 bug 2024-09-01 16:28:00 +08:00
士子☀️ 5893d1492e Merge pull request #264 from caorushizi/fix/download-list-ui
fix: 🐛  fix: tag ui scaling bug
2024-09-01 01:52:19 +08:00
Charlie 5906f29180 fix: 🐛 fix: tag ui scaling bug 2024-09-01 01:32:00 +08:00
caorushizi 9b838e496e feat: fix macos 2024-08-27 02:12:24 +08:00
士子☀️ 106a1fa9eb Merge pull request #261 from caorushizi/dev-backend
Dev backend
2024-08-27 01:14:29 +08:00
caorushizi ecfb2371f4 feat: macos 2024-08-27 01:11:00 +08:00
caorushizi fe3ae95a22 feat: web 初步 2024-08-25 17:35:13 +08:00
士子☀️ 4ae352d5d2 Merge pull request #255 from caorushizi/dev-backend
feat:   add backend
2024-08-22 02:52:55 +08:00
caorushizi 67d56fc5ab feat: 完成 backend 基础工程 & 新增 docker 配置 2024-08-22 02:50:58 +08:00
士子☀️ 039f9eb092 Merge pull request #254 from caorushizi/dev-ui
feat:   local ip
2024-08-14 13:40:48 +08:00
caorushizi df67e52e47 feat: add backend 2024-08-14 13:38:31 +08:00
caorushizi e3f7c48f80 feat: local ip 2024-08-11 21:21:06 +08:00
士子☀️ 57b67ea55c Merge pull request #253 from caorushizi/dev-ui
feat:   add mobile player
2024-08-11 20:47:27 +08:00
caorushizi 21c3eb475f feat: add mobile player 2024-08-11 20:45:59 +08:00
士子☀️ 805f9435f3 Merge pull request #252 from caorushizi/dev-ui
feat:   new ui
2024-08-11 18:16:15 +08:00
士子☀️ 213261fbbb Merge pull request #250 from caorushizi/dev-ui
Dev UI
2024-08-11 18:10:25 +08:00
caorushizi ceda93a8cf feat: new ui 2024-08-11 18:06:24 +08:00
caorushizi 39ec4f863d feat: new ui 2024-08-11 18:02:33 +08:00
caorushizi 4d9188221f feat: new ui 2024-08-11 01:23:16 +08:00
caorushizi 30c8085964 feat: new ui 2024-08-11 01:14:24 +08:00
士子☀️ 97206279d8 Merge pull request #249 from ruixingshi/srx/add-version-info 2024-08-10 20:18:46 +08:00
shiruixing 8d3c8f4ad1 docs: change text 2024-08-10 20:15:27 +08:00
士子☀️ bf4075ba1c Merge pull request #248 from ruixingshi/srx/add-version-info 2024-08-10 18:23:43 +08:00
shiruixing 5f5892242b docs: add update info 2024-08-10 18:17:58 +08:00
fenglei 29602d9fa2 docs: update icon button (#243) 2024-08-07 18:37:23 +08:00
Hanzc f2f1f963d4 docs: 创建 axios 实例 (#242) 2024-08-07 18:29:00 +08:00
士子☀️ 56219c8fe4 V3.0.0 (#235)
* feat:   v3.0.0

* feat:   v3.0.0
2024-07-28 23:18:22 +08:00
士子☀️ ba211c1360 feat: v3.0.0 (#234)
* feat:   v3.0.0

* feat:   v3.0.0
2024-07-25 00:00:33 +08:00
caorushizi 2870a42cd4 feat: new ui 2024-07-23 22:09:30 +08:00
caorushizi f8a2188760 feat(ui): new ui 2024-07-23 22:09:30 +08:00
caorushizi 5c4020a52f fix: 🐛 remove @tailwindcss/line-clamp 2024-07-23 22:09:30 +08:00
caorushizi 4c060366b8 fix: 🐛 修复 @cliqz/adblocker 版本问题 2024-07-23 22:09:30 +08:00
caorushizi af219bde11 feat(ui): new ui 2024-07-23 22:09:30 +08:00
caorushizi caa279ce36 feat(ui): new ui 2024-07-23 22:09:30 +08:00
caorushizi 4651229a0d feat: update dependencies 2024-07-23 22:09:30 +08:00
caorushizi 6c8916a9e6 feat: new ui 2024-07-23 22:09:30 +08:00
caorushizi 8d831e2c9d feat(ui): new ui 2024-07-23 22:09:30 +08:00
caorushizi 1f3b4f5624 feat: new ui 2024-07-23 22:09:30 +08:00
caorushizi 04c8afe616 feat: ui 2024-07-23 22:09:30 +08:00
caorushizi e53aed0910 feat(ui): style revisions 2024-07-23 22:09:30 +08:00
caorushizi 520b63a8de feat: add mobile project 2024-07-23 22:09:30 +08:00
caorushizi 0e4aa730eb feat: add video server 2024-07-23 22:09:30 +08:00
caorushizi 07c7ddccad feat: 新 UI 重构 2024-07-23 22:09:30 +08:00
caorushizi 5ff7252ee9 feat: add tailwindcss 2024-07-23 22:09:30 +08:00
士子☀️ 5461e74539 Merge pull request #216 from caorushizi/release-v2.2.3
feat:   v2.2.3
2024-07-06 17:42:02 +08:00
caorushizi 417484cb6d feat: v2.2.3 2024-07-06 17:38:30 +08:00
士子☀️ 9aaffd3550 Merge pull request #214 from caorushizi/dev-docs
docs: 📝  更新文档
2024-07-03 15:40:36 +08:00
caorushizi 94759d48c7 docs: 📝 更新文档 2024-07-03 15:37:16 +08:00
士子☀️ c0e343b696 Merge pull request #204 from caorushizi/fix-search
fix: 🐛  修复新版本在更换安装目录后下载失败的问题
2024-06-30 19:01:26 +08:00
caorushizi f18ac7c444 fix: 🐛 修复新版本在更换安装目录后下载失败的问题
下载中的视频无法停止 #202
2024-06-30 18:58:58 +08:00
士子☀️ f637610734 Merge pull request #196 from caorushizi/fix-search
fix: 🐛  修复搜索时跳转的链接
2024-06-24 23:43:47 +08:00
caorushizi 5e1046dd5b fix: 🐛 修复搜索时跳转的链接 2024-06-23 11:41:33 +08:00
士子☀️ f25584cb2f Merge pull request #195 from caorushizi/fix-videoname
fix: 🐛  修复获取视频名称的问题
2024-06-23 00:13:13 +08:00
caorushizi 03999585d0 fix: 🐛 修复获取视频名称的问题 2024-06-23 00:12:06 +08:00
士子☀️ 772c2b0300 Merge pull request #194 from caorushizi/dev-webview
Dev webview
2024-06-22 22:59:28 +08:00
caorushizi 3622e67a56 fix: 🐛 修复浏览器背景颜色 2024-06-22 22:58:25 +08:00
caorushizi c51630cdd6 fix: 🐛 修复切换隐私模式时 Proxy 和嗅探问题 2024-06-22 22:14:49 +08:00
士子☀️ dab1c55a93 Merge pull request #193 from caorushizi/dev-webview
feat(settings):   新增无痕浏览模式
2024-06-22 21:48:11 +08:00
caorushizi 7b966bc988 feat(settings): 新增无痕浏览模式
设置页面新增无痕浏览模式

新增无痕浏览模式 #52
2024-06-22 21:46:27 +08:00
士子☀️ e5e46bee38 Merge pull request #192 from caorushizi/dev-webview
feat(settings):   添加自动更新选项
2024-06-22 15:55:09 +08:00
caorushizi 3365d96a03 feat(settings): 添加自动更新选项
设置页面添加自动更新选项,下次启动时生效

auto upgrade #185
2024-06-22 15:53:42 +08:00
士子☀️ fb223cd493 Merge pull request #191 from caorushizi/dev-webview
feat:   添加下载代理开关 & 添加清空缓存
2024-06-22 15:36:18 +08:00
caorushizi 60d49c4773 feat: 添加下载代理开关 & 添加清空缓存 2024-06-22 15:35:08 +08:00
士子☀️ e7aa4ae147 Merge pull request #190 from caorushizi/dev-webview
build: 🛠  portable
2024-06-22 12:42:50 +08:00
caorushizi c45be41ddc build: 🛠 portable 2024-06-22 12:41:45 +08:00
士子☀️ 85b37facee Merge pull request #189 from caorushizi/dev-webview
Dev webview
2024-06-22 12:27:58 +08:00
caorushizi 90567009ef Merge branch 'dev-webview' of https://github.com/caorushizi/m3u8-downloader into dev-webview 2024-06-22 12:26:36 +08:00
caorushizi 899afc156e build: 🛠 upload artifact 2024-06-22 12:25:51 +08:00
caorushizi 9e33b7e488 build: 🛠 upload artifact 2024-06-22 12:24:24 +08:00
士子☀️ e7ba60a51f Merge pull request #188 from caorushizi/dev-webview
build: 🛠  portable
2024-06-22 12:11:55 +08:00
caorushizi 2a3ad325c2 build: 🛠 portable 2024-06-22 12:11:19 +08:00
caorushizi 7575b80d31 build: 🛠 portable 2024-06-22 12:08:33 +08:00
士子☀️ 8bb9d119b5 Merge pull request #187 from caorushizi/dev-webview
Dev webview
2024-06-22 11:54:18 +08:00
caorushizi 5da3f2b1c7 build: 🛠 优化构建 2024-06-22 11:50:40 +08:00
caorushizi da6cbcfb75 feat: 修复 webview 中加载的问题 2024-06-22 10:44:34 +08:00
caorushizi 3d7aff41ee feat: 优化内置浏览器逻辑 2024-06-22 03:42:15 +08:00
士子☀️ 2cc49e8679 Merge pull request #186 from caorushizi/dev-ap
feat:   ap
2024-06-21 23:44:42 +08:00
caorushizi 0e961c0647 feat: use td app 2024-06-21 23:39:45 +08:00
caorushizi 4d5757a6ce feat: ap 2024-06-21 00:04:21 +08:00
士子☀️ 62ae0e5075 Merge pull request #184 from caorushizi/feat/v2.2.2
feat:   v2.2.2
2024-06-18 09:08:22 +08:00
caorushizi 7513fe2882 feat: v2.2.2 2024-06-18 09:06:42 +08:00
士子☀️ c945dc8360 Merge pull request #183 from caorushizi/feat/v2.2.1
feat:   release v2.2.1
2024-06-17 23:59:20 +08:00
caorushizi de7e0da045 feat: release v2.2.1 2024-06-17 23:57:36 +08:00
士子☀️ a706429395 Merge pull request #182 from caorushizi/feat/v2.2.1
feat:   v2.2.1
2024-06-17 23:34:01 +08:00
caorushizi f26c9761c3 feat: v2.2.1 2024-06-17 23:32:58 +08:00
士子☀️ 9424dd4c0e Merge pull request #181 from caorushizi/dev/form
Dev/form
2024-06-17 23:30:55 +08:00
caorushizi 271294a8e7 feat: conversion page 2024-06-17 23:29:27 +08:00
caorushizi 6b2786292f feat: conversion page 2024-06-10 00:17:32 +08:00
caorushizi c36247b5e1 feat: update form 2024-06-09 23:09:55 +08:00
士子☀️ c182afff2c Merge pull request #177 from caorushizi/feat/v2.2.1-beta.0
feat:   release 2.2.1-beta.0
2024-06-09 20:25:36 +08:00
caorushizi 1129d70dca feat: release 2.2.1-beta.0 2024-06-09 20:24:20 +08:00
士子☀️ bde71d13f9 Merge pull request #176 from caorushizi/dev/download-items
fix: 🐛  download items
2024-06-08 18:37:57 +08:00
caorushizi 67b513d380 fix: 🐛 merge master 2024-06-08 18:36:51 +08:00
caorushizi 8d8d1ee238 fix: 🐛 download item 2024-06-08 18:32:23 +08:00
caorushizi 7c10715607 Merge branch 'master' of https://github.com/caorushizi/m3u8-downloader 2024-06-08 18:27:50 +08:00
caorushizi a939f06fcd Revert "fix: 🐛 下载嗅探到的最后一个文件"
This reverts commit 2a42a02f3d.
2024-06-08 18:24:38 +08:00
士子☀️ c50625b0c8 Merge pull request #170 from caorushizi/feat/addForm
fix: 🐛  下载嗅探到的最后一个文件
2024-06-08 18:20:48 +08:00
caorushizi bfa2d88935 fix: 🐛 download items 2024-06-08 18:02:38 +08:00
士子☀️ b04ea61e83 Merge pull request #170 from caorushizi/feat/addForm
fix: 🐛  下载嗅探到的最后一个文件
2024-05-31 12:10:06 +08:00
caorushizi 2a42a02f3d fix: 🐛 下载嗅探到的最后一个文件 2024-05-31 12:08:25 +08:00
士子☀️ 1e80278a1d Merge pull request #167 from caorushizi/dependabot/npm_and_yarn/cz-git-1.9.2
chore(deps-dev): bump cz-git from 1.9.1 to 1.9.2
2024-05-27 21:20:01 +08:00
士子☀️ f38d9156c5 Merge pull request #169 from caorushizi/feat/addForm
docs: 📝  release
2024-05-27 21:18:58 +08:00
caorushizi 0f32864079 docs: 📝 release 2024-05-27 21:16:59 +08:00
士子☀️ f8fbecebc9 Merge pull request #168 from caorushizi/feat/addForm
fix: 🐛  build scripts
2024-05-27 20:52:39 +08:00
caorushizi 40c5656080 fix: 🐛 build scripts 2024-05-27 20:47:07 +08:00
dependabot[bot] ddf36a7091 chore(deps-dev): bump cz-git from 1.9.1 to 1.9.2
Bumps [cz-git](https://github.com/Zhengqbbb/cz-git/tree/HEAD/packages/cz-git) from 1.9.1 to 1.9.2.
- [Release notes](https://github.com/Zhengqbbb/cz-git/releases)
- [Changelog](https://github.com/Zhengqbbb/cz-git/blob/main/packages/cz-git/CHANGELOG.md)
- [Commits](https://github.com/Zhengqbbb/cz-git/commits/v1.9.2/packages/cz-git)

---
updated-dependencies:
- dependency-name: cz-git
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-27 04:15:52 +00:00
士子☀️ 258c67554d Merge pull request #166 from caorushizi/feat/addForm
feat:   完善表单项
2024-05-27 04:40:01 +08:00
caorushizi 007ff31200 feat: 完善表单项 2024-05-27 04:37:50 +08:00
士子☀️ ff75e3d94b Merge pull request #165 from caorushizi/feat/addForm
feat:   修改创建修改表单
2024-05-27 01:52:01 +08:00
caorushizi aaa18e0048 feat: 修改创建修改表单 2024-05-27 01:51:07 +08:00
士子☀️ 5c6f89a067 Merge pull request #164 from caorushizi/feat/dependencies
refactor: 📦️  update eslint
2024-05-26 20:00:37 +08:00
caorushizi c4efc4c293 refactor: 📦️ update eslint 2024-05-26 19:40:51 +08:00
士子☀️ 2d955257e6 Merge pull request #163 from caorushizi/feat/dependencies
fix: 🐛  update dependencies
2024-05-26 18:57:29 +08:00
caorushizi 3cf84a2992 fix: 🐛 update dependencies 2024-05-26 18:56:02 +08:00
士子☀️ 94a795fe69 Merge pull request #162 from caorushizi/feat/dependencies
feat:   update dependencies
2024-05-26 18:10:18 +08:00
caorushizi cc10ae8b2e feat: update dependencies 2024-05-26 17:58:40 +08:00
caorushizi 63ed7cdaca fix: 🐛 直播视频不展示下载进度 2024-05-26 17:21:58 +08:00
caorushizi 064919e0a2 fix: 🐛 build variable 2024-05-26 17:14:27 +08:00
士子☀️ 31b2652c9b Merge pull request #161 from caorushizi/fix/scripts
fix: 🐛  build script
2024-05-26 16:38:58 +08:00
caorushizi d080d709d1 fix: 🐛 build script 2024-05-26 16:37:59 +08:00
士子☀️ 0c301c79f2 Merge pull request #160 from caorushizi/fix/scripts
fix: 🐛  build
2024-05-26 15:59:19 +08:00
caorushizi a1dbb6234f fix: 🐛 build 2024-05-26 15:56:40 +08:00
士子☀️ 30248194af Merge pull request #159 from caorushizi/fix/scripts
fix: 🐛  pnpm actions
2024-05-26 15:32:03 +08:00
caorushizi 8f54ebeb3a fix: 🐛 pnpm actions 2024-05-26 15:30:34 +08:00
士子☀️ d8ef0b9eee Merge pull request #158 from caorushizi/fix/scripts
fix: 🐛  npm rebuild
2024-05-26 15:10:52 +08:00
caorushizi 6a3bfd071a fix: 🐛 npm rebuild 2024-05-26 15:05:58 +08:00
士子☀️ 849df04c05 Merge pull request #157 from caorushizi/fix/scripts
fix: 🐛  打包分片
2024-05-26 14:29:25 +08:00
caorushizi a40ae5ef82 fix: 🐛 打包分片 2024-05-26 14:28:18 +08:00
士子☀️ 00c535665f Merge pull request #156 from caorushizi/fix/scripts
fix: 🐛  scripts name
2024-05-26 02:29:51 +08:00
caorushizi 8b4a4d8ff8 fix: 🐛 scripts name 2024-05-26 02:29:05 +08:00
士子☀️ f9fecd541c Merge pull request #155 from caorushizi/fix/adblocker
Fix/adblocker
2024-05-26 02:07:25 +08:00
caorushizi 93b1028498 fix: 🐛 some bug
'
2024-05-26 02:05:53 +08:00
caorushizi a0a3dba188 refactor: 📦️ 代码分割 2024-05-25 23:37:23 +08:00
caorushizi 92ded00495 feat: 构建流程优化 2024-05-25 22:00:31 +08:00
caorushizi bcbe258f60 fix: 🐛 修复打包完成后没有权限执行的问题 2024-05-25 15:23:26 +08:00
caorushizi 660f9c7c9b feat: support linux 2024-05-25 03:02:49 +08:00
caorushizi 8c5ef29894 feat: support linux 2024-05-25 02:59:48 +08:00
caorushizi 612fc4c533 fix: 🐛 修复开启广告过滤时无法沉浸式嗅探 2024-05-24 21:27:36 +08:00
士子☀️ 635377d227 Merge pull request #153 from caorushizi/feat/webcontentsView
Feat/webcontents view
2024-05-22 21:11:38 +08:00
caorushizi dc86ab8f4c feat: release 2.2.0 2024-05-22 21:09:25 +08:00
caorushizi 36b63ad916 fix: 🐛 bilibili 2024-05-22 20:56:18 +08:00
士子☀️ e1b378811d Merge pull request #152 from caorushizi/feat/webcontentsView
fix: 🐛  .env
2024-05-22 19:30:00 +08:00
caorushizi 37fb9bba75 fix: 🐛 .env 2024-05-22 19:28:19 +08:00
士子☀️ 848253c678 Merge pull request #151 from caorushizi/feat/webcontentsView
Feat/webcontents view
2024-05-22 18:19:33 +08:00
caorushizi b64e779ed1 feat: release 2.2.0-beta.4 2024-05-22 18:18:07 +08:00
caorushizi 046a62cde3 fix: 🐛 load url 2024-05-22 18:16:38 +08:00
caorushizi 1a9e6efb90 feat: use webcontents view and capture page 2024-05-22 15:15:39 +08:00
士子☀️ fd422c15ba Merge pull request #150 from caorushizi/fix/addForm
fix: 🐛  fix run release scripts
2024-05-22 04:04:18 +08:00
caorushizi c338f76f8d fix: 🐛 fix run release scripts 2024-05-22 04:03:32 +08:00
士子☀️ 4285b3f4f7 Merge pull request #149 from caorushizi/fix/addForm
feat:   支持直播视频下载
2024-05-22 03:51:41 +08:00
caorushizi d0109869a6 feat: 支持直播视频下载 2024-05-22 03:50:38 +08:00
士子☀️ d29ad44c54 Merge pull request #148 from caorushizi/fix/addForm
fix: 🐛  float button position
2024-05-22 01:02:50 +08:00
caorushizi be61b07fea fix: 🐛 float button position 2024-05-22 01:01:38 +08:00
士子☀️ e5e171fb6f Merge pull request #147 from caorushizi/fix/addForm
fix: 🐛  release 2.2.0-beta.3
2024-05-22 00:33:59 +08:00
caorushizi 805d97c3ca fix: 🐛 release 2.2.0-beta.3 2024-05-22 00:32:35 +08:00
士子☀️ 040222f259 Merge pull request #146 from caorushizi/fix/addForm
fix: 🐛  fix browser window event
2024-05-21 22:52:39 +08:00
caorushizi 09ed55eba4 fix: 🐛 fix browser window event 2024-05-21 22:51:40 +08:00
士子☀️ a6d4f8cf98 Merge pull request #145 from caorushizi/fix/addForm
fix: 🐛  release 2.2.0-beta.2
2024-05-21 02:38:48 +08:00
caorushizi d19b2394e8 fix: 🐛 release 2.2.0-beta.2 2024-05-21 02:37:40 +08:00
士子☀️ 036a99d84d Merge pull request #143 from caorushizi/fix/video
Fix/video
2024-05-14 12:22:24 +08:00
caorushizi b022335af7 feat: release 2.2.0-beta.1 2024-05-14 12:21:21 +08:00
caorushizi a66c20c9d5 feat: 修复页面中下载嗅探问题 2024-05-14 12:19:47 +08:00
caorushizi f9fc135647 fix: 🐛 修复 dom-ready 执行的顺序 2024-05-13 09:49:34 +08:00
士子☀️ fbbee9c114 Merge pull request #142 from caorushizi/fix/docs
Fix/docs
2024-05-13 09:42:35 +08:00
caorushizi a65fbcbaf8 fix: 🐛 修复插件展现运行的时机 2024-05-13 09:41:06 +08:00
士子☀️ 39b68b71d4 refactor: 📦️ modify mediago protocol, upgrade adblocker 2024-05-13 01:51:13 +08:00
士子☀️ 4d12a0a937 Merge pull request #140 from caorushizi/fix/docs
ci: 🎡  github actions
2024-05-02 19:01:16 +08:00
士子☀️ 960973302e ci: 🎡 github actions 2024-05-02 18:58:01 +08:00
士子☀️ 1a68b00bdd Merge pull request #139 from caorushizi/fix/docs
ci: 🎡  modify github actions
2024-05-02 18:32:22 +08:00
士子☀️ dba73fc473 ci: 🎡 modify github actions 2024-05-02 18:30:24 +08:00
士子☀️ 211f7314ce Merge pull request #138 from caorushizi/fix/docs
docs: 📝  remove reaction
2024-05-02 18:18:19 +08:00
士子☀️ 64d719a63a docs: 📝 remove reaction 2024-05-02 18:17:19 +08:00
士子☀️ 0304e6b569 Merge pull request #135 from caorushizi/feat/mediago
Feat/mediago
2024-04-05 23:46:23 +08:00
士子☀️ 190447a0bd feat: release v2.2.0-beta.0 2024-04-05 23:44:13 +08:00
士子☀️ 497d1265f0 chore: 🔨 add lint-staged 2024-04-05 23:42:35 +08:00
士子☀️ 6d459e0692 feat: rename mediago 2024-04-05 23:09:30 +08:00
士子☀️ 45cde40cea chore: 🔨 fix pre-commit 2024-04-05 22:36:13 +08:00
士子☀️ e9deb4c7f7 chore: 🔨 use tsx instead of ts-node 2024-04-05 22:02:59 +08:00
caorushizi 1abfc763dc docs: 📝 update waline client 2024-03-26 14:31:00 +08:00
caorushizi b84ddcc88d docs: 📝 update vitepress 2024-03-26 13:02:22 +08:00
士子☀️ 33f7951901 refactor: 📦️ remove submodule 2024-03-20 23:23:09 +08:00
士子☀️ d3354f9109 Merge pull request #125 from caorushizi/feat/player
refactor: 📦️  remove tsno
2024-03-20 19:32:06 +08:00
caorushizi d252816cc3 refactor: 📦️ remove tsno 2024-03-20 19:29:27 +08:00
士子☀️ 6e31904e95 Merge pull request #124 from caorushizi/feat/player
refactor: 📦️  remove video player
2024-03-20 16:59:12 +08:00
caorushizi 2825d1f4c7 refactor: 📦️ remove video player 2024-03-20 16:50:58 +08:00
士子☀️ fcb10c6137 Merge pull request #118 from caorushizi/feat/player
fix: 🐛  catch video
2024-03-17 18:04:27 +08:00
士子☀️ f564739578 fix: 🐛 catch video 2024-03-17 18:03:24 +08:00
士子☀️ 40faf4b383 Merge pull request #117 from caorushizi/feat/player
fix: 🐛  fix mobile video size
2024-03-17 17:46:01 +08:00
士子☀️ affff353bd fix: 🐛 fix mobile video size 2024-03-17 17:45:04 +08:00
士子☀️ f410fabff7 Merge pull request #116 from caorushizi/feat/player
fix: 🐛  fix video container
2024-03-17 17:22:13 +08:00
士子☀️ 7d4b201b6e fix: 🐛 fix video container 2024-03-17 17:21:10 +08:00
士子☀️ a9ac0aa16b Merge pull request #115 from caorushizi/2.1.0-beta.1
feat:   v2.1.0-beta.1
2024-03-17 16:09:16 +08:00
士子☀️ 5419970080 feat: v2.1.0-beta.1 2024-03-17 16:08:34 +08:00
士子☀️ 506a573180 Merge pull request #114 from caorushizi/feat/dialog
fix: 🐛 按照获取时间正序排列
2024-03-17 02:03:43 +08:00
士子☀️ 17b2450b43 feat: use download dialog 2024-03-17 02:01:32 +08:00
士子☀️ 2942e65a54 fix: 🐛 按照获取时间正序排列 2024-03-17 00:17:47 +08:00
士子☀️ 913a7bd9e5 Merge pull request #113 from caorushizi/feat/dialog
feat:   show download dialog
2024-03-17 00:12:31 +08:00
士子☀️ c5f2edd9de feat: show download dialog 2024-03-17 00:09:34 +08:00
士子☀️ 24d511e6b6 Merge pull request #112 from caorushizi/feat/plugins
feat:  bilibili plguins
2024-03-10 19:23:15 +08:00
士子☀️ 47f3336f9a feat: 2.1.0-beta.0 2024-03-10 19:22:30 +08:00
士子☀️ e0e6e5dbed feat: bilibili plguins 2024-03-10 19:19:27 +08:00
士子☀️ aa7f3e7bf7 Merge pull request #111 from caorushizi/feat/terminal
feat:  use terminal
2024-03-10 16:43:04 +08:00
caorushizi 065a6c45f7 feat: terminal 2024-03-10 16:40:25 +08:00
士子☀️ b13174dda1 feat: use terminal 2024-03-10 16:19:16 +08:00
士子☀️ 9e6a931a41 Merge pull request #109 from caorushizi/feat/terminal
feat:  terminal
2024-03-09 08:57:23 +08:00
士子☀️ cdabdfd2f8 feat: layout style 2024-03-09 01:06:49 +08:00
士子☀️ b4cdbd7547 feat: show terminal 2024-03-09 00:05:15 +08:00
caorushizi 75fe603919 feat: terminal 2024-03-08 21:35:05 +08:00
士子☀️ 16ef9ae642 Merge pull request #104 from caorushizi/feat/actions
feat:   add vscode debug config
2024-02-27 23:13:35 +08:00
士子☀️ 7db3162748 feat: add vscode debug config 2024-02-27 23:11:37 +08:00
士子☀️ 3f0e6d9856 Merge pull request #102 from caorushizi/feat/actions
feat:   update actions version
2024-02-27 01:04:51 +08:00
士子☀️ d87fc4a400 feat: update actions version 2024-02-27 01:03:26 +08:00
士子☀️ ec6241b79e Merge pull request #101 from caorushizi/fix/node-pty
fix: 🐛  cannot find module 'node-pty'
2024-02-27 00:50:42 +08:00
士子☀️ 9b37398e9f fix: 🐛 cannot find module 'node-pty' 2024-02-27 00:49:05 +08:00
士子☀️ 3fca8694ee fix: 🐛 filename 2024-02-25 23:39:24 +08:00
士子☀️ 78efffa29b Merge pull request #95 from caorushizi/dev/terminal
Dev/terminal
2024-02-25 22:40:02 +08:00
士子☀️ 737ecbdadd fix: 🐛 build player 2024-02-25 22:37:34 +08:00
士子☀️ fa6ce22ea7 Merge pull request #94 from caorushizi/dev/terminal
Dev/terminal
2024-02-25 22:22:36 +08:00
士子☀️ 315c55c844 feat: terminal 2024-02-25 18:28:37 +08:00
士子☀️ d9ba60e1a5 feat: terminal 2024-02-25 17:31:58 +08:00
士子☀️ 7503322d01 feat: terminal 2024-02-25 13:36:14 +08:00
士子☀️ 2e5f2dc687 Merge pull request #91 from caorushizi/dev/plugins
style: 💄 eslint
2024-02-24 23:28:27 +08:00
士子☀️ e4afd27908 fix: 🐛 add tsconfig 2024-02-24 23:19:09 +08:00
士子☀️ 6fe5d5523e feat: remove player page. use node-pty 2024-02-24 22:50:03 +08:00
士子☀️ 7335946ec2 refactor: 📦️ refactoring the project directory structure 2024-02-23 19:32:06 +08:00
士子☀️ eb4576de9b feat: 使用 node 伪终端 2024-02-21 22:17:02 +08:00
士子☀️ 1e41a9ee99 feat: node 伪终端获取详细日志 2024-02-21 21:44:12 +08:00
士子☀️ dd5226ab47 refactor: 📦️ downloader 2024-02-12 09:56:07 +08:00
士子☀️ 989e5535eb feat: new player 2024-02-12 01:55:11 +08:00
士子☀️ 65efeed692 style: 💄 eslint 2024-02-11 23:18:45 +08:00
士子☀️ fcddb2d382 Merge pull request #88 from caorushizi/dev/plugins
fix: 🐛  types
2024-02-11 18:13:57 +08:00
士子☀️ bbc892ec81 fix: 🐛 types 2024-02-11 18:08:51 +08:00
士子☀️ ca1c2821a7 Merge pull request #87 from caorushizi/dev/plugins
fix: 🐛  types
2024-02-11 18:02:50 +08:00
士子☀️ c8d4f763fd fix: 🐛 types 2024-02-11 18:00:08 +08:00
士子☀️ a3d587af44 Merge pull request #85 from caorushizi/dev/plugins
feat:  new plugin
2024-02-11 17:00:28 +08:00
士子☀️ ce2146cc89 feat: add plugin 2024-02-11 16:59:02 +08:00
士子☀️ 8455f17517 style: 💄 somthing 2024-02-11 10:45:32 +08:00
士子☀️ c075bdd4f9 feat: new plugin 2024-02-09 22:18:35 +08:00
士子☀️ 65d88d0896 Merge pull request #82 from caorushizi/dev/i18n
feat: display language
2024-02-09 17:01:55 +08:00
士子☀️ 1c62640301 style: 💄 add lint-staged 2024-02-09 17:00:48 +08:00
士子☀️ dd6684c550 feat: build plugin
build plugin with lit.
2024-02-09 15:54:22 +08:00
士子☀️ 2e1a753583 test 2024-02-09 15:41:34 +08:00
士子☀️ cbf6e4ecfb test 2024-02-09 15:26:20 +08:00
士子☀️ 5af471fe1a plugin 2024-02-09 13:23:52 +08:00
士子☀️ 0deb205faa plugin 2024-02-09 00:11:40 +08:00
士子☀️ 73eaf0ecaa plugin 2024-02-09 00:10:32 +08:00
士子☀️ 4791defbdd sniffing helper 2024-02-08 18:23:49 +08:00
士子☀️ 926249184b i18n 2024-02-08 15:12:08 +08:00
士子☀️ 659b2755ef feat: display language 2024-02-04 20:15:43 +08:00
士子☀️ e9d36edaa4 v2.0.3-beta.3 2024-01-22 23:01:56 +08:00
士子☀️ fdcdbf27eb dev tools 2024-01-22 22:25:29 +08:00
士子☀️ 2f5cc2eb80 Merge branch 'master' of https://github.com/caorushizi/m3u8-downloader 2024-01-21 19:11:42 +08:00
士子☀️ c087fa4956 webview 2024-01-21 19:10:11 +08:00
士子☀️ ed33ec6532 actions 2024-01-21 17:54:37 +08:00
士子☀️ 2d96c2730c .npmrc 2024-01-21 17:41:59 +08:00
士子☀️ 5bcec10be3 docs 2024-01-21 17:18:02 +08:00
士子☀️ 207bd15b14 .npmrc 2024-01-21 17:07:41 +08:00
士子☀️ 00f0bfc84b os version 2024-01-21 17:06:59 +08:00
士子☀️ 7bc3f83c88 update electron. 2024-01-21 16:56:59 +08:00
士子☀️ 1af2803c22 eslint 2024-01-21 01:20:02 +08:00
士子☀️ fd6a81abfd package version 2024-01-21 00:01:09 +08:00
士子☀️ a383093914 Merge pull request #71 from caorushizi/dependabot/npm_and_yarn/typescript-eslint/parser-6.19.0
build(deps-dev): bump @typescript-eslint/parser from 5.60.0 to 6.19.0
2024-01-20 23:29:33 +08:00
士子☀️ 13656429af Merge pull request #70 from caorushizi/dependabot/npm_and_yarn/better-sqlite3-9.3.0
build(deps): bump better-sqlite3 from 8.7.0 to 9.3.0
2024-01-20 23:29:11 +08:00
dependabot[bot] bc34881b38 build(deps-dev): bump @typescript-eslint/parser from 5.60.0 to 6.19.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.60.0 to 6.19.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.19.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 15:11:08 +00:00
dependabot[bot] e3b11cb087 build(deps): bump better-sqlite3 from 8.7.0 to 9.3.0
Bumps [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) from 8.7.0 to 9.3.0.
- [Release notes](https://github.com/WiseLibs/better-sqlite3/releases)
- [Commits](https://github.com/WiseLibs/better-sqlite3/compare/v8.7.0...v9.3.0)

---
updated-dependencies:
- dependency-name: better-sqlite3
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-20 15:11:00 +00:00
士子☀️ 8df78ca377 Merge pull request #61 from caorushizi/dependabot/npm_and_yarn/typescript-5.3.3
build(deps-dev): bump typescript from 5.1.6 to 5.3.3
2024-01-20 23:08:49 +08:00
士子☀️ f12919c6bc Update README.md 2024-01-16 23:02:29 +08:00
士子☀️ 00df324ae7 Merge pull request #66 from caorushizi/readme
readme
2024-01-15 22:25:23 +08:00
士子☀️ f14f9ffc1b readme 2024-01-15 22:23:40 +08:00
dependabot[bot] a388b725bc build(deps-dev): bump typescript from 5.1.6 to 5.3.3
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.1.6 to 5.3.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v5.1.6...v5.3.3)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-14 07:37:58 +00:00
caorushizi e64eaeefef macos 2024-01-14 15:35:15 +08:00
士子☀️ 6830d69b62 build script. 2024-01-14 12:09:08 +08:00
士子☀️ 8f609a8e93 checkout 2024-01-14 10:42:54 +08:00
士子☀️ 99c23f47c5 setup go 2024-01-14 10:36:14 +08:00
士子☀️ 95f9e20f39 go build 2024-01-14 01:34:08 +08:00
士子☀️ df1e664bc9 Merge pull request #60 from caorushizi/dev0114
add plugin
2024-01-14 01:25:05 +08:00
士子☀️ fec30a6453 add plugin 2024-01-14 01:24:24 +08:00
士子☀️ a048211486 add plugin 2024-01-14 01:14:02 +08:00
士子☀️ 465e9b2988 add plugin 2024-01-13 23:19:19 +08:00
士子☀️ af1ff19cb2 add web plugin 2024-01-13 20:28:58 +08:00
士子☀️ eae470f2ec video server 2024-01-13 12:24:52 +08:00
士子☀️ 1933799e32 feat: video list. 2024-01-13 01:03:46 +08:00
士子☀️ c7977bf7b4 Merge pull request #55 from caorushizi/dependabot/npm_and_yarn/electron-25.8.4
build(deps-dev): bump electron from 25.2.0 to 25.8.4
2023-12-29 16:40:43 +08:00
士子☀️ ce8407ce46 Merge pull request #58 from caorushizi/dependabot/npm_and_yarn/axios-1.6.0
build(deps): bump axios from 1.4.0 to 1.6.0
2023-12-29 16:40:01 +08:00
dependabot[bot] 5d313df190 build(deps): bump axios from 1.4.0 to 1.6.0
Bumps [axios](https://github.com/axios/axios) from 1.4.0 to 1.6.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.4.0...v1.6.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-11-11 13:41:05 +00:00
dependabot[bot] c560a09904 build(deps-dev): bump electron from 25.2.0 to 25.8.4
Bumps [electron](https://github.com/electron/electron) from 25.2.0 to 25.8.4.
- [Release notes](https://github.com/electron/electron/releases)
- [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md)
- [Commits](https://github.com/electron/electron/compare/v25.2.0...v25.8.4)

---
updated-dependencies:
- dependency-name: electron
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-05 17:37:26 +00:00
士子☀️ df66a92989 Merge pull request #46 from caorushizi/feat/v2.1.0
m3u8
2023-08-22 14:49:01 +08:00
士子☀️ 52c9611e49 m3u8 2023-08-07 23:54:19 +08:00
士子☀️ 4018112a1d 优化二进制调用逻辑 2023-08-02 21:26:46 +08:00
士子☀️ 633a257e65 优化表单 2023-08-01 23:49:22 +08:00
caorushizi 0666d41226 工程优化 2023-07-29 14:14:37 +08:00
士子☀️ c2cfe55e24 Merge pull request #43 from caorushizi/dev/2.1.0 2023-07-29 13:43:37 +08:00
士子☀️ cb7fbddd7a 工程优化 2023-07-29 13:41:16 +08:00
士子☀️ 135d9fed1b 工程优化 2023-07-29 10:39:27 +08:00
士子☀️ 267aedc594 工程优化 2023-07-29 09:24:11 +08:00
士子☀️ 325d0da930 工程优化 2023-07-29 00:28:01 +08:00
士子☀️ 615bc74d15 Merge pull request #42 from caorushizi/dev/2.1.0 2023-07-27 17:59:32 +08:00
士子☀️ 1ca6935d36 download form. 2023-07-24 23:49:10 +08:00
士子☀️ 3bfb7139d3 download form. 2023-07-22 12:56:56 +08:00
士子☀️ 14d44765e5 form name 2023-07-22 00:03:58 +08:00
士子☀️ 807dd2d920 request 2023-07-21 23:39:02 +08:00
士子☀️ c9a0a7f7c2 request 2023-07-21 23:31:07 +08:00
士子☀️ a3eea6d501 v2.1.0 2023-07-20 23:25:33 +08:00
士子☀️ 4ce7dcac1b Merge pull request #38 from caorushizi/dev 2023-07-18 23:51:35 +08:00
士子☀️ 096762f24c some thing 2023-07-18 23:49:03 +08:00
士子☀️ baf358d223 something 2023-07-18 23:44:22 +08:00
士子☀️ e72973346b add: get web request. 2023-07-12 00:30:15 +08:00
士子☀️ 41258ecee8 add: get web request response. 2023-07-11 22:48:14 +08:00
士子☀️ b6a5be152a Merge pull request #37 from caorushizi/dev0709 2023-07-09 15:39:55 +08:00
士子☀️ d5d45c4935 fix: download use proxy. 2023-07-09 15:38:48 +08:00
士子☀️ 81eb4ecf09 Merge pull request #36 from caorushizi/dev0709 2023-07-09 15:09:23 +08:00
士子☀️ 5a4cc8c449 bin dir 2023-07-09 15:07:57 +08:00
士子☀️ e7ab664310 release: v2.0.2 2023-07-09 14:54:21 +08:00
士子☀️ 3cb2fa27b9 release: v2.0.2 2023-07-09 14:18:41 +08:00
士子☀️ e29e41aa4c release: v2.0.2 2023-07-09 14:01:15 +08:00
士子☀️ cc62613640 Merge pull request #35 from caorushizi/release/v2.0.2 2023-07-09 13:53:19 +08:00
士子☀️ 2720bcc685 release: v2.0.2 2023-07-09 13:52:40 +08:00
士子☀️ c8ac4182fc Merge pull request #34 from caorushizi/release/v2.0.2 2023-07-09 13:25:36 +08:00
士子☀️ 55b70d3e6d release: v2.0.2 2023-07-09 13:24:06 +08:00
士子☀️ a19765b0d3 fix: browser loading status. 2023-07-08 23:05:13 +08:00
士子☀️ 5c7b65385a remove postinstall 2023-07-08 16:34:34 +08:00
caorushizi b6b84269a3 fix: mac app. 2023-07-08 15:55:12 +08:00
士子☀️ e44cb249d0 Merge pull request #30 from caorushizi/feat/v2.0.2 2023-07-08 12:11:51 +08:00
士子☀️ 8bea071865 release size. 2023-07-08 12:00:50 +08:00
caorushizi a782652fca fix: tray icon. 2023-07-06 22:49:11 +08:00
caorushizi 3a02803d3c fix: mac download. 2023-07-06 22:16:28 +08:00
士子☀️ 263a08ab4c Merge pull request #29 from caorushizi/feat/v2.0.2 2023-07-06 00:32:55 +08:00
士子☀️ ecdbd985ce feat: tray context menu. 2023-07-06 00:32:05 +08:00
士子☀️ dd403564cc docs: addition function. 2023-07-06 00:15:57 +08:00
士子☀️ 69d741b39a Merge pull request #28 from caorushizi/dev 2023-07-05 23:53:59 +08:00
士子☀️ 4c9c2e2d68 add: tray icon. 2023-07-05 23:52:38 +08:00
士子☀️ 8660701340 download list. 2023-07-05 22:48:41 +08:00
士子☀️ 341c5570af support live mode. 2023-07-05 01:13:29 +08:00
士子☀️ ee12753818 Update README.md 2023-07-04 12:56:52 +08:00
士子☀️ 055638278c feat: something 2023-07-04 07:52:43 +08:00
士子☀️ bf06ff6482 docs: dark mode. 2023-07-02 15:32:34 +08:00
士子☀️ 459a5bc5b7 docs: comments dark theme. 2023-07-02 14:08:04 +08:00
士子☀️ a93f18037c release: v2.0.1 2023-07-02 13:50:22 +08:00
士子☀️ 67b5218002 release: v2.0.1 2023-07-02 13:38:46 +08:00
士子☀️ d3c745dda4 docs: update. 2023-07-02 13:19:31 +08:00
士子☀️ e694818f8f docs: support dark mode. 2023-07-02 13:10:30 +08:00
士子☀️ 729d7645e1 docs 2023-07-02 12:30:58 +08:00
士子☀️ 795e21df9c docs: content done. 2023-07-02 01:22:14 +08:00
士子☀️ bdc15e6c50 feat: max runner. 2023-07-01 23:02:42 +08:00
士子☀️ c3398ec572 baidu 2023-07-01 22:08:48 +08:00
士子☀️ 6b38b348fc actions 2023-07-01 21:37:43 +08:00
士子☀️ d650529842 actions 2023-07-01 21:32:21 +08:00
士子☀️ 2094408f52 actions 2023-07-01 21:28:26 +08:00
士子☀️ 89cb8b3a3a actions 2023-07-01 21:24:36 +08:00
士子☀️ 7a2d546972 actions. 2023-07-01 21:21:57 +08:00
士子☀️ 69e801ba2b Merge pull request #25 from caorushizi/dev
Dev
2023-07-01 21:16:54 +08:00
士子☀️ 14edc27ed1 add: docs and deploy. 2023-07-01 21:14:45 +08:00
士子☀️ 6f7fa7f067 add: docs 2023-07-01 20:15:40 +08:00
caorushizi a5a1c02e10 update: mac downloader 2023-07-01 19:01:51 +08:00
士子☀️ ce08cbce4b feat: some feature. 2023-07-01 18:12:35 +08:00
士子☀️ e03a5d38bb video header & web extension 2023-07-01 14:40:49 +08:00
士子☀️ 720db5a476 video headers & params format 2023-07-01 01:27:04 +08:00
士子☀️ e97783b08e Merge branch 'dev' of https://github.com/caorushizi/m3u8-downloader into dev 2023-06-30 00:45:34 +08:00
士子☀️ 12566f8668 add webview preload script. 2023-06-30 00:44:47 +08:00
caorushizi d686819417 npmrc 2023-06-29 19:26:47 +08:00
士子☀️ ea7b4a77af feat: prettier & web extension. 2023-06-28 23:53:46 +08:00
士子☀️ 6427a06879 test: do somthing. 2023-06-27 23:54:43 +08:00
士子☀️ f2f7a50e95 refactor: window service 2023-06-27 22:22:42 +08:00
caorushizi fbc57ebfca fix: webContents is null. 2023-06-27 11:46:55 +08:00
士子☀️ 26a5681dab feat: web extension. 2023-06-26 23:34:54 +08:00
士子☀️ 4640ff51e8 feat: add web extension. 2023-06-26 00:59:36 +08:00
士子☀️ b3b58680e0 release: v2.0.0 2023-06-24 15:29:27 +08:00
士子☀️ d1b75df87d Merge pull request #22 from caorushizi/development
fix: mac active.
2023-06-23 22:10:35 +08:00
caorushizi 4b4e1b9f54 fix: mac active. 2023-06-23 22:05:47 +08:00
士子☀️ 8ebb550270 Merge pull request #21 from caorushizi/development
release: v2.0.0-beta.7
2023-06-23 21:52:50 +08:00
士子☀️ 6b93954246 release: v2.0.0-beta.7 2023-06-23 21:48:46 +08:00
士子☀️ 550d7ebd4b release: v2.0.0-beta.7 2023-06-23 21:18:29 +08:00
caorushizi 3f331e5d3d feat: package.json 2023-06-23 21:12:54 +08:00
士子☀️ 020f921af8 release v2.0.0-beta.6 2023-06-23 10:44:58 +08:00
士子☀️ efa72ce12b release: v2.0.0-beta.6 2023-06-23 09:39:41 +08:00
士子☀️ 38ead633a5 release: v2.0.0-beta.6 2023-06-23 09:29:50 +08:00
士子☀️ 3eb1d0ae99 fix: get video source & dark mode 2023-06-22 21:39:43 +08:00
士子☀️ 7bed4ed335 update dependencies version. 2023-06-22 16:23:48 +08:00
士子☀️ b357d41f23 add: dark mode. 2023-06-22 15:58:48 +08:00
士子☀️ 3834603b0a update dependencies version. 2023-06-22 12:40:33 +08:00
士子☀️ f38ba108a3 add adblocker 2023-06-22 11:33:37 +08:00
士子☀️ 7ceda3d73f readme 2023-06-21 23:53:03 +08:00
士子☀️ aee57b6f98 feat: set dev tool load. 2023-06-20 23:28:47 +08:00
士子☀️ f9d49bd55f feat: restore browser state. 2023-06-20 22:49:07 +08:00
士子☀️ 3bb082473a Merge branch 'master' of https://github.com/caorushizi/m3u8-downloader 2023-06-20 22:01:23 +08:00
士子☀️ 31b6726fe5 fix: direct download. 2023-06-20 22:01:05 +08:00
士子☀️ 348b41b0dd Update README.md 2023-06-19 23:11:36 +08:00
士子☀️ d4bbfa0516 release: beta5 2023-06-18 18:38:38 +08:00
士子☀️ b2af9b3d25 release: 2.0.0-beta.5 2023-06-18 18:25:26 +08:00
caorushizi ded93a4f0b test 2023-06-18 18:04:59 +08:00
caorushizi d43f57565b feat: add video player. 2023-06-18 17:59:39 +08:00
caorushizi 34cf661fb2 feat: add video player 2023-06-18 17:05:05 +08:00
士子☀️ 91cfb883b6 feat: add video player. 2023-06-18 15:06:15 +08:00
士子☀️ 1cb7deb376 player 2023-06-17 21:24:54 +08:00
caorushizi 70933c63bb pack 2023-06-17 19:29:25 +08:00
caorushizi 5723b9edd0 player 2023-06-17 14:15:50 +08:00
士子☀️ 65f37a9c66 main 2023-06-17 13:08:45 +08:00
士子☀️ 57516793ab main 2023-06-17 02:42:41 +08:00
士子☀️ afecc5ac12 rename url 2023-06-17 01:16:53 +08:00
士子☀️ 3331564155 Merge pull request #20 from caorushizi/dev-server
feat: add video server
2023-06-17 00:13:54 +08:00
士子☀️ 19ce7b9906 add 2023-06-17 00:12:54 +08:00
士子☀️ 40f39340f0 add mobile. 2023-06-16 23:20:20 +08:00
士子☀️ f085bcacf7 add mobile 2023-06-11 02:29:53 +08:00
士子☀️ dbd4e73b6e feat: add mobile player. 2023-06-10 17:23:31 +08:00
士子☀️ b35e6b3315 feat: add video player. 2023-06-10 16:56:02 +08:00
士子☀️ 3c603a67dd feat: add video player 2023-06-10 11:33:35 +08:00
士子☀️ 8ff5abf5d8 feat: add video server 2023-06-08 01:22:59 +08:00
士子☀️ 0fdbd39393 fix: windows address url. 2023-06-07 01:02:22 +08:00
caorushizi df93770128 test 2023-06-04 00:40:39 +08:00
caorushizi b61a935068 test 2023-06-03 23:07:42 +08:00
士子☀️ 95e96b1057 优化素材提取页交互,优化打点逻辑,优化页面切换时的问题 2023-05-28 19:18:36 +08:00
士子☀️ 3dd325a280 Update README.md 2023-05-06 09:54:08 +08:00
士子☀️ bbe922df74 Update README.md 2023-05-06 09:53:03 +08:00
caorushizi e31eddfd2e 2.0.0-beta.4 2023-05-05 11:25:10 +08:00
caorushizi bbb9f5798b fix: peocess.env 2023-05-05 10:20:10 +08:00
caorushizi b634cf056d fix: env file. 2023-05-05 09:45:38 +08:00
士子☀️ 2ede22b50a github action pnpm version 2023-05-05 01:15:29 +08:00
士子☀️ a4efd83f7a build and release 2023-05-05 01:10:57 +08:00
caorushizi c3ebced763 macos pack 2023-05-04 23:32:03 +08:00
caorushizi 6cb6621df1 platform: add macos 2023-05-04 23:16:13 +08:00
士子☀️ 4e5febba8b something 2023-04-22 19:47:10 +08:00
士子☀️ 1fb787d4ea 手动添加链接;某些视频网站跳转 about:blank ;修改下载名称 2023-04-22 17:29:26 +08:00
士子☀️ f24ddaa55e add favorite 2023-04-22 14:33:57 +08:00
士子☀️ 66542a0003 talking data version 2023-04-17 23:04:17 +08:00
士子☀️ f8a8e1d3e6 不展示menu 2023-04-15 22:22:34 +08:00
士子☀️ c1873b8c6d 在新页面中打开浏览器 2023-04-15 21:30:15 +08:00
士子☀️ 07dceb2704 在新页面中打开浏览器 2023-04-15 21:05:07 +08:00
士子☀️ ceec042ffd 在新页面中打开浏览器 2023-04-15 16:45:39 +08:00
士子☀️ 2a47f255ee 升级antd,下载完成后删除原始文件 2023-04-14 00:04:44 +08:00
士子☀️ 1f899e6c6d env 2023-04-02 15:07:56 +08:00
士子☀️ f0686bb18c release 2023-04-01 20:44:51 +08:00
士子☀️ b321dc06e9 app version 2023-04-01 19:11:55 +08:00
士子☀️ 5f7c6e846b updater 2023-04-01 11:03:19 +08:00
士子☀️ 2d71475a48 Merge branch 'master' of https://github.com/caorushizi/m3u8-downloader 2023-04-01 10:55:55 +08:00
士子☀️ cfdeb4a1a8 updater 2023-04-01 10:55:36 +08:00
士子☀️ 5d3abdefdc Create .github/dependabot.yml 2023-04-01 10:16:21 +08:00
士子☀️ abcff22f3e 转换为音频 2023-03-31 23:27:45 +08:00
士子☀️ 7d4ca4d758 ipcrenderer 事件监听 2023-03-31 21:01:07 +08:00
caorushizi 9b44b2f31f 2.0 优化功能 2023-03-31 20:27:28 +08:00
士子☀️ 55bd8da894 feature: 完善首页、视频获取逻辑 2023-03-31 00:37:18 +08:00
士子☀️ e8c7abaa2f 修复事件监听&完善下载页面交互 2023-03-30 01:05:02 +08:00
士子☀️ 1702b9beac update 2023-03-28 23:49:41 +08:00
士子☀️ de25052980 暂停下载逻辑 2023-03-27 23:47:10 +08:00
士子☀️ 03700ed4bb readme 2023-03-26 20:48:18 +08:00
士子☀️ e0147a4a6e readme 2023-03-26 20:41:55 +08:00
士子☀️ 281fd07e23 Merge pull request #15 from caorushizi/dev
Dev
2023-03-26 20:34:14 +08:00
士子☀️ 1d7a0e62e5 download. 2023-03-26 20:29:20 +08:00
士子☀️ e4dcdb9422 download. 2023-03-26 19:22:29 +08:00
士子☀️ f035bb09b4 download. 2023-03-26 17:59:54 +08:00
士子☀️ 869c6497e9 download. 2023-03-26 15:54:43 +08:00
士子☀️ 151ed1ce0d download list progress. 2023-03-26 01:12:49 +08:00
士子☀️ bab349da9b download list. 2023-03-25 20:17:02 +08:00
士子☀️ ac8f9d2955 home page. 2023-03-25 16:00:06 +08:00
士子☀️ 0f2670069f readme. 2023-03-25 12:15:38 +08:00
士子☀️ 0af3d32337 download list. 2023-03-25 12:13:30 +08:00
士子☀️ f5a22f8393 config page. 2023-03-25 11:39:40 +08:00
士子☀️ 769a82e7ed setting form. 2023-03-25 00:08:23 +08:00
caorushizi 3985af0042 something 2023-03-24 20:09:18 +08:00
士子☀️ dca0e0a84b add electron extensions. 2023-03-24 00:29:27 +08:00
士子☀️ 233296ba3e receive 2023-03-23 00:22:37 +08:00
士子☀️ 2bc4fe0592 readme 2023-03-22 00:13:24 +08:00
士子☀️ c22245e296 source extract. 2023-03-22 00:11:15 +08:00
士子☀️ 29de2fc81c source extract. 2023-03-20 01:09:08 +08:00
士子☀️ bd27aefe8a source extract. 2023-03-20 00:50:08 +08:00
士子☀️ 722cabba57 source extract. 2023-03-19 19:23:35 +08:00
士子☀️ 3468c8d5e6 new branch. 2023-03-19 12:16:37 +08:00
caorushizi b3cc83f8cd new ui 2023-01-14 12:34:26 +08:00
caorushizi f6a1ca03ac new ui 2023-01-13 11:48:44 +08:00
士子☀️ 516ac72c3e feature: 修改页面提示逻辑 2022-12-28 00:07:53 +08:00
士子☀️ c068bde0a8 feature: 新增插件 2022-12-26 23:38:04 +08:00
士子☀️ ca3ed53a59 feature: 样式交互优化 2022-12-25 23:59:01 +08:00
士子☀️ 04c05ee15e feture: 优化样式交互 2022-12-25 20:48:31 +08:00
士子☀️ 60d27be739 style: eslint 修正 2022-12-25 15:11:06 +08:00
士子☀️ 259fe5f447 style: eslint 修正 2022-12-25 14:30:24 +08:00
士子☀️ 8d9b7fc9dc style: eslint 修正 2022-12-25 13:22:18 +08:00
士子☀️ d5d282147d style: eslint 修正 2022-12-24 17:51:28 +08:00
士子☀️ 08f7f66154 revert: 删除mediago-node 2022-12-23 22:15:26 +08:00
士子☀️ f702f847e6 style: 修正代码提交规范 2022-12-23 22:11:12 +08:00
士子☀️ b9b87cf354 master 2022-12-22 23:14:59 +08:00
士子☀️ a81b9a37ab master 2022-12-22 16:09:58 +08:00
士子☀️ 64174ef374 master 2022-12-18 23:20:34 +08:00
士子☀️ a8b3a9ee1a master 2022-12-17 00:30:53 +08:00
diaozhenyuan 7be1a7907d master 2022-12-16 21:14:14 +08:00
diaozhenyuan 05d207f34d master 2022-12-16 18:49:58 +08:00
diaozhenyuan 26be46b038 master 2022-12-16 18:02:24 +08:00
士子☀️ 47826f1f72 master 2022-12-15 23:27:59 +08:00
士子☀️ f7428f811a master 2022-12-12 22:55:24 +08:00
士子☀️ 3aa8577a38 master 2022-12-11 19:10:44 +08:00
士子☀️ 8b7965dbcb master 2022-12-11 02:54:46 +08:00
士子☀️ 006cb4b13c master 2022-12-10 19:14:22 +08:00
士子☀️ ecb8d6b387 master 2022-12-10 18:52:10 +08:00
士子☀️ b57b05fe1d master 2022-12-10 18:23:47 +08:00
士子☀️ 1e9969857d Merge pull request #13 from caorushizi/dev
Dev
2022-12-10 18:01:03 +08:00
士子☀️ af89dd2694 dev 2022-12-06 23:04:38 +08:00
士子☀️ e418e05ab1 dev 2022-11-29 23:34:31 +08:00
士子☀️ a8d8a7aca7 dev 2022-11-29 23:31:30 +08:00
士子☀️ 4c7226cda1 dev 2022-11-26 00:15:27 +08:00
士子☀️ 91b5ee4423 dev 2022-11-26 00:15:05 +08:00
士子☀️ f8d7148b9e Dev 2022-11-08 00:07:41 +08:00
士子☀️ 0f0687b5c9 dev 2022-11-06 23:36:28 +08:00
士子☀️ 1384cd4c6e dev 2022-11-06 12:41:35 +08:00
士子☀️ 4c5c78d0e4 dev 2022-11-06 12:15:07 +08:00
士子☀️ 551abb4496 dev 2022-10-30 21:49:32 +08:00
士子☀️ 8af8824c3e dev 2022-10-30 20:20:32 +08:00
士子☀️ c01c085ac1 dev 2022-10-30 01:46:39 +08:00
士子☀️ 8668acdd6d dev 2022-10-27 00:13:10 +08:00
士子☀️ 03567ed36d 重构 2022-10-24 00:10:10 +08:00
caorushizi dcfea2cfb3 整理项目文件 2022-05-01 01:01:05 +08:00
caorushizi 3c4e6c8240 整理项目文件 2022-04-30 23:23:38 +08:00
caorushizi 9e93426c38 2 2022-04-20 23:53:45 +08:00
caorushizi 5c698e2e9b 1 2022-04-19 23:34:58 +08:00
caorushizi b174e14fbd process 2022-04-19 23:27:09 +08:00
caorushizi 19e84cd415 downloader 2022-04-19 01:13:12 +08:00
caorushizi 73a9b3fd72 downloader 2022-04-19 01:12:33 +08:00
caorushizi 64a938879d downloader 2022-04-17 23:15:38 +08:00
caorushizi 66b9a9677b 重构文件目录 2022-04-17 01:55:37 +08:00
士子☀️ 39616244d9 mono repo. 2022-04-11 23:14:48 +08:00
士子☀️ 990846515f Update README.md 2022-02-06 21:32:25 +08:00
caorushizi 94777aead3 update readme.md 2022-02-05 16:59:13 +08:00
caorushizi 5275d3bfd3 删除视频数据打点 2022-02-05 16:43:06 +08:00
士子☀️ 73ae0ad083 Update README.md 2022-01-27 11:38:36 +08:00
caorushizi 5ed6e84a14 Merge branch 'master' of https://github.com/caorushizi/m3u8-downloader 2022-01-27 00:22:22 +08:00
caorushizi ed45cd8d73 README.md 2022-01-27 00:21:36 +08:00
士子☀️ f393b99cb5 Update README.md 2022-01-27 00:07:56 +08:00
caorushizi 6638600ffa 修复开发环境中没有注入环境变量导致无法运行 2022-01-26 23:53:54 +08:00
士子☀️ 4d5cae3b0c Update build.js 2022-01-26 13:38:31 +08:00
caorushizi e846390d04 添加数据统计许可 2022-01-25 23:52:07 +08:00
caorushizi 6e6b7315ca 主进程代码优化 2022-01-24 23:39:43 +08:00
caorushizi 5760855516 主进程代码优化 2022-01-24 00:07:45 +08:00
caorushizi db956ecd89 主进程代码优化 2022-01-23 23:53:55 +08:00
caorushizi 56663aa26b 主进程代码优化 2022-01-23 19:34:57 +08:00
caorushizi 3358a19185 主进程代码优化 2022-01-23 14:27:14 +08:00
caorushizi 02d061be9f 主进程代码优化 2022-01-23 01:38:09 +08:00
caorushizi 90952299cc 主进程代码优化 2022-01-23 01:37:17 +08:00
caorushizi af21763eca feature: 修复一些问题 2022-01-08 17:41:44 +08:00
caorushizi 71739a3ffb feature: 修复一些问题 2022-01-08 17:19:45 +08:00
caorushizi db3becb071 feature: 修复一些问题 2022-01-08 13:28:37 +08:00
caorushizi a458f69990 feature: 清理代码。 2022-01-01 02:13:23 +08:00
caorushizi 82cf627488 feature: 自动升级。 2021-12-31 22:58:00 +08:00
caorushizi e00bd5dab0 feature: 修复一些问题 2021-12-31 01:41:50 +08:00
caorushizi 0a22fa4460 feature: 清空列表的问题 2021-12-30 00:33:12 +08:00
caorushizi 7d97a9d5f0 feature: 清理代码 2021-12-30 00:19:35 +08:00
caorushizi 4456130366 feature: 修复打包白屏;消息点击tab才消失;清空所有没反应; 2021-12-30 00:16:31 +08:00
caorushizi 24cfcb6c4c feature: 更换交互方式 2021-12-27 00:02:25 +08:00
caorushizi 82dadbf0da feature: 更换交互方式 2021-12-26 13:36:38 +08:00
caorushizi ef65fb879d fix: electron 16. 2021-12-12 19:39:29 +08:00
caorushizi b9d443d2f5 fix: electron 16. 2021-12-11 16:21:23 +08:00
caorushizi 6e1a90b6dd fix: electron 16. 2021-12-11 15:18:56 +08:00
caorushizi ad1f727caf fix: electron 16. 2021-12-11 00:53:30 +08:00
caorushizi ec9c461504 fix: react hooks. 2021-12-05 23:11:48 +08:00
caorushizi bcac2c605f fix: react hooks. 2021-12-05 22:38:01 +08:00
士子☀️ ea5be3343b feat: react hooks. 2021-12-05 22:19:32 +08:00
士子☀️ 00eaa3974a feat: react hooks. 2021-12-05 21:03:14 +08:00
caorushizi dc2fcc61c6 fix: react hooks. 2021-12-05 18:33:15 +08:00
caorushizi 3eba3ce0eb fix: react hooks. 2021-12-05 03:20:28 +08:00
caorushizi 195b17e54e fix: build script. 2021-08-23 23:12:27 +08:00
caorushizi 064d64c743 fix: build script. 2021-08-21 21:29:55 +08:00
caorushizi 5d4349fa88 fix: build script. 2021-08-21 15:27:22 +08:00
caorushizi a55a230be8 fix: 代理设置。 2021-08-21 00:15:09 +08:00
caorushizi 5e696f7f8f fix: 删除测试代码。 2021-08-19 22:43:27 +08:00
caorushizi 2330aadf7c fix: 删除 terminal 页面。 2021-08-16 01:39:27 +08:00
caorushizi 468ca63b39 fix: 调整目录结构 2021-08-15 15:30:12 +08:00
caorushizi 8286fe2591 terminal page. 2021-08-15 12:33:07 +08:00
caorushizi 03703f2631 fix: 调整目录结构 2021-08-15 01:19:06 +08:00
caorushizi 17b42f0f45 fix: 调整目录结构 2021-08-14 23:56:48 +08:00
caorushizi 7045790fe0 fix: 调整目录结构 2021-08-14 22:40:30 +08:00
caorushizi e122d1b820 fix: 调整目录结构 2021-08-14 17:15:41 +08:00
caorushizi 3fda15fd4a fix: clean up dep. 2021-05-11 00:40:37 +08:00
caorushizi f40b278024 fix: clean up code. 2021-05-09 02:18:11 +08:00
caorushizi e60994e277 fix: clean up code. 2021-05-06 23:09:44 +08:00
caorushizi 639d80f3d6 fix: 拖拽 m3u8 下载 2021-05-04 15:21:47 +08:00
diaozhenyuan ae262c311d fix: 添加todo 2021-05-03 13:21:43 +08:00
diaozhenyuan 16ccf321ba fix: 设置代理;设置日志输出; 2021-05-03 13:12:30 +08:00
diaozhenyuan 5a73070632 fix: 添加 mac 上关闭和最小化按钮 2021-05-03 00:58:23 +08:00
caorushizi 1af5afa7a7 fix: 没有收藏的时候样式 2021-05-02 23:11:50 +08:00
diaozhenyuan aa62389bea fix: mac 上使用 2021-05-02 13:07:21 +08:00
士子☀️ 40dc614927 Update README.md 2021-04-30 13:01:10 +08:00
caorushizi 143aeafd43 fix: 🛠 修复软件无法最小化的问题 2021-04-29 23:42:08 +08:00
caorushizi df8a1ba7e3 fix: 🛠 完成详情修改 2021-04-28 01:14:59 +08:00
caorushizi d649aed29f fix: 🛠 添加收藏不可用 2021-04-28 00:47:24 +08:00
caorushizi 8bae5ac9bd update: 🛠 添加埋点 2021-04-28 00:36:33 +08:00
caorushizi 3053d33167 Merge remote-tracking branch 'origin/master' 2021-04-28 00:07:27 +08:00
caorushizi 64f34daeb2 update: 新建下载时解析 headers,修复了一些问题 2021-04-28 00:07:09 +08:00
士子☀️ 240fb0e749 Update README.md 2021-04-27 13:06:27 +08:00
caorushizi f87ae3a54d update: 🥳 v1.0.3 2021-04-27 02:25:14 +08:00
caorushizi 4ad749f191 update: 🥳 修复若干问题 2021-04-27 02:18:50 +08:00
caorushizi fc12c35095 update: 🥳 修复若干问题 2021-04-27 01:52:10 +08:00
caorushizi a95176c2a7 update: 🛠 修复了一些问题 2021-04-26 00:53:57 +08:00
caorushizi 4dd0ae6415 update: 🛠 修复了一些问题 2021-04-26 00:33:08 +08:00
caorushizi 94ab7ef96d update: 🛠 修复了一些问题 2021-04-26 00:32:19 +08:00
caorushizi f115602f8d update: 🛠 修复了一些问题 2021-04-25 22:40:35 +08:00
caorushizi a994e43e54 update: 🛠 修复了一些问题 2021-04-24 23:41:59 +08:00
caorushizi 5aa66809aa update: 🛠 修复了一些问题 2021-04-24 23:07:10 +08:00
caorushizi c4b0026ccf update: 🛠 生产环境变量 2021-04-24 00:04:20 +08:00
caorushizi 78a5f0309f update: 🛠 删除无用的文件。 2021-04-23 22:38:27 +08:00
caorushizi 45a49ee245 update: 🛠 删除无用的文件。 2021-04-19 23:12:05 +08:00
caorushizi fcafd18a70 update: 🛠 修改 README.md 2021-04-19 00:28:40 +08:00
caorushizi 777f4d9af4 feat: 删除 devtools 2021-04-18 16:10:20 +08:00
caorushizi 2f306eb497 feat: 🛠 完成下载 2021-04-18 01:05:02 +08:00
caorushizi 9038e1d986 feat: 🛠 完成下载 2021-04-18 00:41:35 +08:00
caorushizi 9ecd915905 feat: 🛠 修复打包过程中的问题 2021-04-17 21:09:03 +08:00
caorushizi 468dd405d1 feat: 继续开发 2021-04-17 19:59:30 +08:00
caorushizi 579c142684 feat: 添加 ts 支持 2021-04-17 18:24:49 +08:00
caorushizi 217dbcf8ca feat: 添加 ts 支持 2021-04-17 12:41:26 +08:00
caorushizi c9c5a1f94f feat: 继续开发 2021-04-17 12:30:02 +08:00
caorushizi 556b8c460e feat: 继续开发 2021-04-17 01:32:15 +08:00
caorushizi caaad80a71 feat: 完成下载列表 2021-04-16 00:32:11 +08:00
caorushizi a7b195da98 feat: 完成下载列表 2021-04-16 00:25:11 +08:00
caorushizi 22642616de feat: 🎞 添加 mobx 2021-04-15 02:06:22 +08:00
caorushizi 1298990e24 feat: 🎞 完成下载 2021-04-15 00:39:17 +08:00
caorushizi c4222aecd8 feat: 🎞 完成下载 2021-04-14 00:38:46 +08:00
caorushizi e55e7ab87a feat: 🎞 更换页面交互逻辑 2021-04-12 00:04:25 +08:00
caorushizi 42198d5759 feat: 🎞 重新安装 eslint 2021-04-11 03:47:38 +08:00
caorushizi 62a28d6d11 feat: 🎞 重新安装 eslint 2021-04-11 03:46:27 +08:00
caorushizi dc5583ebf7 feat: 🥳 代码格式化 2021-04-11 03:06:01 +08:00
caorushizi 0b78c54db3 feat: 添加 ts 支持 2021-04-11 02:47:58 +08:00
caorushizi 8de04e2392 feat: 🥳 恢复原先的布局 2021-04-11 00:42:46 +08:00
caorushizi c8515580c4 feat: 🥳 恢复原先的布局 2021-04-10 15:41:51 +08:00
士子☀️ 9fada5c801 Merge pull request #6 from caorushizi/feat/vite
Feat/vite
2021-04-10 12:24:17 +08:00
caorushizi 3c400ec811 feat: 🥳 恢复原先的布局 2021-04-10 12:22:50 +08:00
caorushizi e95798b52f feat: ✈ 添加 plop 2021-04-06 23:45:52 +08:00
caorushizi 0ffab614e4 feat: ✈ 添加 plop 2021-04-05 23:23:36 +08:00
caorushizi 2bc22e183a feat: 🚄 重大修改版本 2021-04-05 01:27:36 +08:00
caorushizi 3fafd34377 feat: 🚄 重大修改版本 2021-04-04 00:06:33 +08:00
caorushizi 67c309c32e feat: ♥ 生产版本构建 2021-03-21 21:28:42 +08:00
caorushizi b8194808a4 feat: ♥ 生产版本构建 2021-03-21 20:58:49 +08:00
caorushizi a615ba3f66 feat: ♥ 生产版本构建 2021-03-21 20:53:18 +08:00
caorushizi 8aaf2b8a1b feat: ♥ 生产版本构建 2021-03-21 20:20:28 +08:00
士子☀️ 77dc7acc62 Create README.md 2021-03-21 12:14:11 +08:00
caorushizi a1d65c72e5 feat: 👓 调整目录结构 2021-03-21 11:57:55 +08:00
caorushizi 6ae207d992 feat: 📦 使用窗口管理 2021-03-21 11:15:52 +08:00
caorushizi d7aa452b90 feat: add env files. 2021-03-21 10:08:29 +08:00
caorushizi b94efad619 feat: add env files. 2021-03-20 21:39:15 +08:00
caorushizi 61c0ad6552 feat: add env files. 2021-03-20 20:28:38 +08:00
caorushizi 8ad8cdca4c feat: add env files. 2021-03-20 18:57:14 +08:00
caorushizi 3c4aebbbd1 feat: fix typescript error. 2021-03-20 17:46:53 +08:00
caorushizi d4202158ba feat: fix typescript error. 2021-03-20 17:46:15 +08:00
caorushizi 43a586ed89 feat: vite2 2021-03-20 17:12:44 +08:00
caorushizi 3f3efdace8 feat: vite2 2021-03-20 16:10:39 +08:00
士子☀️ 10f91f6371 Merge pull request #4 from caorushizi/pending
🚀 更新一个版本
2021-03-07 15:50:36 +08:00
caorushizi ddfed0c712 🚀 更新一个版本 2021-03-07 15:49:12 +08:00
士子☀️ 59221265d9 Merge pull request #3 from caorushizi/pending
Pending
2021-03-07 15:46:19 +08:00
caorushizi d8c1658ee9 🚀 更新一个版本 2021-03-07 15:45:34 +08:00
caorushizi 65d9f9589d 🚀 更新一个版本 2021-03-07 00:34:32 +08:00
caorushizi f34deaa251 🚀 更新一个版本 2021-03-06 23:05:08 +08:00
caorushizi eaa0e4e845 __bin__ 2021-02-22 00:19:29 +08:00
士子☀️ 59b4ca3c2d Merge pull request #2 from caorushizi/pending
Pending
2021-02-21 19:04:15 +08:00
caorushizi 44818dcd86 something 2021-02-21 19:02:27 +08:00
caorushizi b7e2604862 yarn.lock 2021-02-21 02:06:13 +08:00
caorushizi 9ed9db4aaa 环境变量 2021-02-21 02:04:37 +08:00
caorushizi a356e72e27 环境变量 2021-02-21 00:04:56 +08:00
士子☀️ 2c1bb4f0f2 Merge pull request #1 from caorushizi/pending
Pending
2021-02-18 23:51:38 +08:00
caorushizi 80d550f2ef 修改选择方式 2021-02-18 23:50:45 +08:00
caorushizi a6db4f5d81 修改选择方式 2021-02-18 23:07:49 +08:00
caorushizi 7d8a7297ed 修改选择方式 2021-02-18 23:04:34 +08:00
caorushizi 1505b6484b update README.md 2021-02-17 20:11:26 +08:00
caorushizi 3f76f79491 修复打包时出错 2021-02-14 20:49:21 +08:00
caorushizi d168f51214 修复打包时出错 2021-02-13 01:46:24 +08:00
caorushizi 384f0eb29d 优化 ffmpeg 下载 2021-02-13 01:09:25 +08:00
caorushizi e07aa5c453 优化 ffmpeg 下载 2021-02-12 23:38:34 +08:00
caorushizi 9cd290e60c 优化软件初始化过程,自动下载环境依赖的二进制 2021-02-11 21:46:13 +08:00
caorushizi d98ec3438c 调整页面结构 2021-02-06 02:11:46 +08:00
caorushizi 226211d610 清理无用的包 2021-02-05 23:27:36 +08:00
caorushizi 9d6755858e 优化下载流程,支持m3u8_DL 2021-02-05 17:47:56 +08:00
caorushizi 682084e7f4 添加埋点,修改样式 2021-02-05 11:23:27 +08:00
caorushizi a068e5cd45 新增浏览器窗口 2021-02-05 09:23:17 +08:00
caorushizi 5dae6a4efa README.md 2021-02-04 21:29:44 +08:00
caorushizi 7d0ab847a7 修改样式 2021-02-04 18:34:10 +08:00
caorushizi b66a8d8ada 添加 talkingdata ,使用西瓜播放器 2021-02-04 00:02:38 +08:00
caorushizi 60f7e9ea9d 添加下载时 headers 2021-02-03 01:03:55 +08:00
caorushizi 06faf8cd83 使用 fluent ui 2021-02-02 10:37:30 +08:00
caorushizi d126bd0c7e webview 2021-02-01 07:16:11 +08:00
caorushizi 280dff1ed2 koa 2021-01-31 18:37:25 +08:00
caorushizi 633c103a76 exec 2021-01-31 07:51:51 +08:00
caorushizi e815e8bc72 first commit. 2021-01-31 06:03:24 +08:00
caorushizi a12632549c init. 2021-01-31 02:38:14 +08:00
97 changed files with 596 additions and 7623 deletions
-4
View File
@@ -16,7 +16,3 @@ 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/
-170
View File
@@ -1,170 +0,0 @@
<div align="center">
<h1>MediaGo</h1>
<a href="https://downloader.caorushizi.cn/en/guides.html?form=github">Quick Start</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://downloader.caorushizi.cn/en?form=github">Website</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<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>
<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>
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.
The app UI currently ships with English, Simplified Chinese, and Italian.
## ✨ What's inside
### 🌐 Browser extension for Chrome / Edge
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
npx clawhub@latest install mediago
```
### 🔌 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
docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0
```
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.
## 📷 Screenshots
![Home](./images/home_en.png)
![Home — dark mode](./images/home-dark_en.png)
![Settings](./images/settings_en.png)
![Resource extraction](./images/browser_en.png)
## 📥 Download
### 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 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.
## 📝 What's new in v3.5.0
- **🌐 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
## 🛠️ Built with
[![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)
## 🙏 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
> **This project is for educational and research purposes only. Do not use it for any commercial or illegal purposes.**
>
> 1. All code and functionality provided by this project are intended solely as a reference for learning about streaming media technologies. Users must comply with the laws and regulations of their jurisdiction.
> 2. Any content downloaded using this project remains the property of its original copyright holders. Users should delete downloaded content within 24 hours or obtain proper authorization.
> 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).
-177
View File
@@ -1,177 +0,0 @@
<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).
+9 -8
View File
@@ -7,19 +7,22 @@
<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>
<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>
<!-- 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">
@@ -36,8 +39,6 @@
ビルトインのスニッフィング機能を備えたクロスプラットフォームの動画ダウンローダー —— ページを開いて、欲しいリソースを選んで、保存するだけ。パケットキャプチャ不要、ブラウザ拡張の設定不要、コマンドラインの操作も不要です。
アプリ UI は現在、英語・簡体中国語・イタリア語に対応しています。
## ✨ 主な機能
### 🌐 ブラウザ拡張機能(Chrome / Edge
+83 -71
View File
@@ -1,31 +1,28 @@
<!-- WEHUB_ZH_README -->
> [!NOTE]
> 本文档由 WeHub 基于上游 README 翻译整理,属于社区翻译,非官方中文文档。
> [English](./README.en.md) · [原始项目](https://github.com/mediago-dev/mediago) · [上游 README](https://github.com/mediago-dev/mediago/blob/HEAD/README.md)
> 原作者、版权与许可证归属以原始项目及本仓库 LICENSE 文件为准。
<div align="center">
<h1>MediaGo</h1>
<a href="https://downloader.caorushizi.cn/guides.html?form=github">快速开始</a>
<a href="https://downloader.caorushizi.cn/en/guides.html?form=github">Quick Start</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://downloader.caorushizi.cn?form=github">官网</a>
<a href="https://downloader.caorushizi.cn/en?form=github">Website</a>
<span>&nbsp;&nbsp;•&nbsp;&nbsp;</span>
<a href="https://downloader.caorushizi.cn/documents.html?form=github">文档</a>
<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.md">English</a>
<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">
@@ -40,87 +37,105 @@
<hr />
</div>
跨平台视频下载器,内置嗅探 —— 打开网页、选一下想要的资源、保存完事。不用抓包、不用折腾浏览器插件、不用面对命令行。
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.
应用界面目前内置中文、英文和意大利语。
## ✨ What's inside
## ✨ 主打功能
### 🌐 Browser extension for Chrome / Edge
### 🌐 浏览器扩展(Chrome / Edge
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.
浏览网页时遇到想下的视频 → 点扩展图标 → 一键发到 MediaGo。自动识别页面里的可下载资源,工具栏图标显示检测到的数量,主流视频网站(包括 YouTube、Bilibili 等)都能覆盖。扩展随桌面端安装包一起打包,在 **设置 → 更多设置 → 浏览器扩展目录** 就能找到安装文件夹。
### 🎬 YouTube and 1000+ sites
### 🎬 支持 YouTube 和 1000+ 站点
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).
底层用的是 yt-dlp。支持 YouTube、Twitter/X、Instagram、Reddit 等 [一千多个视频站点](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md)。
### 🦞 AI assistants can download for you — OpenClaw Skill
### 🦞 让 AI 助手帮你下载 —— OpenClaw Skill
在用 Claude Code、Cursor 等 AI 编程助手?装上 MediaGo Skill 后直接跟 AI 说"帮我下载这个视频:&lt;链接&gt;"就行,剩下的交给 AI。
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
npx clawhub@latest install mediago
```
### 🔌 可以和其他工具联动
### 🔌 Works with other tools
MediaGo 提供一整套 HTTP 接口 —— 脚本、自动化工具、其他 App 都能直接调用 MediaGo 创建下载任务、查询进度、管理列表。浏览器扩展就是通过这套接口和桌面端对话的,你也可以接入自己的工作流。
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
下载完成后可以直接在 MediaGo 里转换格式、选画质,不用再打开别的软件。
After a download finishes, convert it to another format or quality
without leaving MediaGo. No more opening a separate tool for ffmpeg.
### 🐳 Docker 一键部署
### 🐳 One-line Docker deployment
服务器端一条命令部署,局域网内任意设备都能打开 Web 界面:
Headless install on your server, then access the web UI from anywhere on
the same network:
```shell
docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caorushizi/mediago:3.5.0
```
[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 界面。
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.
## 📷 软件截图
## 📷 Screenshots
![首页](./images/home.png)
![Home](./images/home.png)
![首页 — 深色模式](./images/home-dark.png)
![Home — dark mode](./images/home-dark.png)
![设置](./images/settings.png)
![Settings](./images/settings.png)
![资源提取](./images/browser.png)
![Resource extraction](./images/browser.png)
## 📥 下载
## 📥 Download
### v3.5.0(正式版)
### v3.5.0 (stable)
- [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)
- [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`
- [**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)
Browsing older releases? See the [GitHub Releases page](https://github.com/caorushizi/mediago/releases).
### 🪄 宝塔面板一键部署 Docker
### 🪄 One-click Docker deployment via BT Panel
1. 安装宝塔面板,前往 [宝塔面板官网](https://www.bt.cn/new/download.html?r=dk_mediago) 选择正式版的脚本下载安装
2. 登录宝塔面板,在菜单栏中点击 **Docker**,首次进入会提示安装 Docker 服务,点击立即安装并按提示完成
3. 在应用商店中找到 **MediaGo**,点击安装,配置域名等基本信息即可
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 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.
## 📝 v3.5.0 更新要点
## 📝 What's new in v3.5.0
- **🌐 浏览器扩展**:任意网站一键嗅探视频、一键发到 MediaGo
- **🎬 YouTube + 1000+ 站点**:集成 yt-dlp
- **🦞 OpenClaw Skill**:通过 AI 编程助手下载视频
- **🔌 开放 HTTP 接口**:接入脚本、自动化工具和其他应用
- **🎞️ 内置格式转换**:选输出格式和画质
- **🐳 Docker 部署简化**:挂载一个目录即可,多架构镜像已迁至 GHCR
- **⚡ 启动更快**:后端重写,资源占用更低,内置视频播放器
- **🌐 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
## 🛠️ 技术栈
## 🛠️ Built with
[![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)
@@ -131,7 +146,7 @@ docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caoru
[![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)
## 🙏 鸣谢
## 🙏 Acknowledgements
- [N_m3u8DL-RE](https://github.com/nilaoda/N_m3u8DL-RE)
- [BBDown](https://github.com/nilaoda/BBDown)
@@ -139,21 +154,18 @@ docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caoru
- [aria2](https://aria2.github.io/)
- [mediago-core](https://github.com/caorushizi/mediago-core)
## ⚖️ 免责声明
## ⚖️ Disclaimer
> **本项目仅供学习和研究使用,请勿用于任何商业或非法用途。**
> **This project is for educational and research purposes only. Do not use it for any commercial or illegal purposes.**
>
> 1. 本项目提供的所有代码和功能仅作为学习流媒体技术的参考,使用者需自行遵守所在地区的法律法规。
> 2. 使用本项目下载的任何内容,其版权归原始内容所有者所有。使用者应在下载后 24 小时内删除,或取得版权方授权。
> 3. 本项目开发者不对使用者的任何行为承担责任,包括但不限于:下载受版权保护的内容、对第三方平台造成的影响等。
> 4. 禁止将本项目用于大规模抓取、破坏平台服务或任何侵犯他人合法权益的行为。
> 5. 使用本项目即表示您已阅读并同意本免责声明。如不同意,请立即停止使用并删除本项目。
> 1. All code and functionality provided by this project are intended solely as a reference for learning about streaming media technologies. Users must comply with the laws and regulations of their jurisdiction.
> 2. Any content downloaded using this project remains the property of its original copyright holders. Users should delete downloaded content within 24 hours or obtain proper authorization.
> 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.
---
> 想从源码构建?见 [CONTRIBUTING.md](./CONTRIBUTING.md)(英文)。
> Building from source? See [CONTRIBUTING.md](./CONTRIBUTING.md).
>
> 想为 MediaGo 做翻译?见 [TRANSLATION.md](./TRANSLATION.md)(英文)。
尾注: 感谢[吾爱破解论坛](https://www.52pojie.cn/)
lp_Zain@www.52pojie.cn
> Translating MediaGo? See [TRANSLATION.md](./TRANSLATION.md).
-7
View File
@@ -1,7 +0,0 @@
# WeHub 来源说明
- 原始项目:`mediago-dev/mediago`
- 原始仓库:https://github.com/mediago-dev/mediago
- 导入方式:上游默认分支的最新快照
- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准
- 本文件仅用于记录来源,不代表 WeHub 是原项目作者
+9 -11
View File
@@ -7,19 +7,22 @@
<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">
@@ -36,8 +39,6 @@
跨平台视频下载器,内置嗅探 —— 打开网页、选一下想要的资源、保存完事。不用抓包、不用折腾浏览器插件、不用面对命令行。
应用界面目前内置中文、英文和意大利语。
## ✨ 主打功能
### 🌐 浏览器扩展(Chrome / Edge
@@ -148,6 +149,3 @@ docker run -d --name mediago -p 8899:8899 -v /path/to/mediago:/app/mediago caoru
> 想从源码构建?见 [CONTRIBUTING.md](./CONTRIBUTING.md)(英文)。
>
> 想为 MediaGo 做翻译?见 [TRANSLATION.md](./TRANSLATION.md)(英文)。
尾注: 感谢[吾爱破解论坛](https://www.52pojie.cn/)
lp_Zain@www.52pojie.cn
+12 -36
View File
@@ -16,8 +16,7 @@ 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).
2. Register the new locale (four small edits — 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.
@@ -25,9 +24,9 @@ pnpm dev:electron
## Where strings live
- **Main app UI** (desktop + self-hosted web):
`packages/shared/common/src/i18n/resources/{en,it,zh}.ts`
`packages/shared/common/src/i18n/resources/{en,zh}.ts`
- **Browser extension** (separate, smaller catalog):
`packages/mediago-extension/src/i18n/resources/{en,it,zh}.ts`
`packages/mediago-extension/src/i18n/resources/{en,zh}.ts`
Resources are plain TypeScript modules — each file exports a flat object of
`key: "translation"` pairs. Keys are shared across languages; only values
@@ -56,12 +55,12 @@ export const fr = {
```
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.
file (`en.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:
Three tiny edits:
**`packages/shared/common/src/i18n/resources/index.ts`** — import the new
locale and add it to both exports:
@@ -69,36 +68,26 @@ 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 };
export const i18nResources = { en, zh, fr } as const;
export const SUPPORTED_LANGUAGES = ["en", "zh", "fr"] as const;
export { en, 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"
) {
): "zh" | "en" | "fr" {
if (language === "zh" || language === "en" || 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:
@@ -111,11 +100,6 @@ export enum AppLanguage {
}
```
**`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**
@@ -133,15 +117,7 @@ options={[
### 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.
much smaller catalog and lives in its own `index.ts`.
## Live preview workflow
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "mediago-community",
"name": "mediago",
"version": "3.5.0",
"description": "A powerful and easy-to-use online video downloader",
"main": "main/index.js",
-56
View File
@@ -1,56 +0,0 @@
; ============================================================================
; 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,10 +1,7 @@
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";
@@ -17,22 +14,6 @@ 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,
});
@@ -175,52 +156,6 @@ 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 [];
},
};
}
+5 -12
View File
@@ -1,17 +1,10 @@
import i18n, { type InitOptions, type Resource } from "i18next";
import {
BASE_I18N_OPTIONS,
i18nResources,
SUPPORTED_LANGUAGES,
} from "@mediago/shared-common";
import { BASE_I18N_OPTIONS, i18nResources } from "@mediago/shared-common";
const nodeResources: Resource = SUPPORTED_LANGUAGES.reduce<Resource>(
(resources, language) => {
resources[language] = { translation: i18nResources[language] };
return resources;
},
{},
);
const nodeResources: Resource = {
en: { translation: i18nResources.en },
zh: { translation: i18nResources.zh },
};
const nodeI18nOptions: InitOptions = {
...BASE_I18N_OPTIONS,
+2 -18
View File
@@ -2,11 +2,9 @@ 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";
@@ -28,7 +26,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 type { Locale } from "antd/es/locale";
import { Locale } from "antd/es/locale";
const AppLayout = lazy(() => import("./layout/app-layout"));
const HomePage = lazy(() => import("./pages/home-page"));
@@ -44,20 +42,6 @@ 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();
@@ -72,7 +56,7 @@ const App: FC = () => {
const [adapterReady, setAdapterReady] = useState(false);
useEffect(() => {
setAppLocale(getAntdLocale(resolveAppLanguage(language)));
setAppLocale(resolveAppLanguage(language) === "zh" ? zhCN : enUS);
}, [language]);
const themeChange = useMemoizedFn((event: MediaQueryListEvent) => {
-1
View File
@@ -250,7 +250,6 @@ 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}
+1 -3
View File
@@ -111,8 +111,6 @@ export function getBrowserLang(): string {
return lang.toLowerCase();
}
export function resolveAppLanguage(
language: string | undefined,
): ReturnType<typeof sharedResolveAppLanguage> {
export function resolveAppLanguage(language: string | undefined): "zh" | "en" {
return sharedResolveAppLanguage(language, getBrowserLang());
}
+44 -371
View File
@@ -4,7 +4,6 @@ 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" }],
@@ -13,243 +12,12 @@ 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: "/" },
@@ -257,57 +25,29 @@ export default defineConfig({
{ text: "更新日志", link: "/changelog" },
],
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" },
],
},
],
},
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" },
],
},
],
socialLinks: [
{ icon: "github", link: "https://github.com/caorushizi/m3u8-downloader" },
@@ -326,55 +66,30 @@ export default defineConfig({
nav: [
{ text: "Home", link: "/en" },
{ text: "Guides", link: "/en/guides" },
{ text: "Blog", link: "/en/blog/" },
{ text: "Changelog", link: "/en/changelog" },
],
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" },
],
},
],
},
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" },
],
},
],
socialLinks: [
{
@@ -401,7 +116,6 @@ 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" },
@@ -417,47 +131,6 @@ 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",
+14 -55
View File
@@ -1,61 +1,21 @@
<script setup lang="ts">
import DefaultTheme from "vitepress/theme";
import { useData, inBrowser, useRoute } from "vitepress";
import { computed, watchEffect } from "vue";
import { useData, inBrowser } from "vitepress";
import { 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) {
const isBlogPage =
normalizedPath.value.startsWith("/blog/") ||
normalizedPath.value.startsWith("/en/blog/") ||
normalizedPath.value.startsWith("/jp/blog/") ||
normalizedPath.value.startsWith("/it/blog/");
locale.value = lang.value;
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),
);
}
});
@@ -64,15 +24,14 @@ const { Layout } = DefaultTheme;
<template>
<Layout>
<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 #layout-top>
<TopBanner />
</template>
<!-- <template #sidebar-nav-before>
<AdBanner />
</template> -->
<template #doc-footer-before>
<QrCode />
</template>
<template #doc-after>
<Comments />
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

@@ -0,0 +1,14 @@
<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>
+32 -2
View File
@@ -17,7 +17,18 @@
<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)]">
@@ -26,10 +37,29 @@
<ul class="list-none m-0 p-0">
<li class="mb-1">
<a
href="/blog/"
target="_blank"
href="https://mediago.pro/"
class="text-[var(--vp-c-text-2)] no-underline transition-colors hover:text-[var(--vp-c-text-1)] duration-300"
>
{{ t("blog") }}
{{ 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") }}
</a>
</li>
</ul>
@@ -0,0 +1,12 @@
<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>
@@ -0,0 +1,245 @@
<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>
+30 -3
View File
@@ -13,22 +13,49 @@ const i18n = createI18n({
slogan: "Easy to use, fast download",
articles: "Articles",
help: "Help",
blog: "Blog",
search: "intelligent search",
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: "ヘルプ",
blog: "ブログ",
search: "スマート検索",
privacy: "プライバシーポリシー",
links: "友情リンク",
"jiexi.im": "スマートビデオ解析",
banner: {
new: "新着",
title: "MediaGo Pro がリリースされました!",
desc: "- より高速なダウンロードと限定機能をお楽しみください",
action: "今すぐ試す",
close: "閉じる",
},
},
zh: {
slogan: "简单易用,快速下载",
articles: "文章",
help: "帮助",
blog: "博客",
search: "智能搜索",
privacy: "隐私政策",
links: "友情链接",
"jiexi.im": "智能视频解析",
banner: {
new: "全新上线",
title: "MediaGo Pro 正式发布!",
desc: "- 更快的下载速度,更多专属功能",
action: "立即体验",
close: "关闭",
},
},
},
});
+7 -57
View File
@@ -1,63 +1,13 @@
@import "tailwindcss";
/* 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;
/* Top Banner - 使用 VitePress 官方变量 */
:root {
--vp-layout-top-height: 60px;
}
.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;
/* 移动端横幅高度 */
@media (max-width: 768px) {
:root {
--vp-layout-top-height: 80px;
}
}
-302
View File
@@ -1,302 +0,0 @@
---
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
@@ -1,92 +0,0 @@
---
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)
@@ -1,43 +0,0 @@
---
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/)
@@ -1,41 +0,0 @@
---
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
@@ -1,93 +0,0 @@
---
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/)
@@ -1,103 +0,0 @@
---
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/)
@@ -1,39 +0,0 @@
---
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/)
@@ -1,105 +0,0 @@
---
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/)
@@ -1,91 +0,0 @@
---
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/)
@@ -1,48 +0,0 @@
---
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/)
@@ -1,39 +0,0 @@
---
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
@@ -1,99 +0,0 @@
---
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)
@@ -1,40 +0,0 @@
---
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)
@@ -1,100 +0,0 @@
---
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/)
@@ -1,146 +0,0 @@
---
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/)
@@ -1,89 +0,0 @@
---
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/)
@@ -1,78 +0,0 @@
---
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
@@ -1,84 +0,0 @@
---
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/)
@@ -1,44 +0,0 @@
---
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/)
@@ -1,52 +0,0 @@
---
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/)
@@ -1,45 +0,0 @@
---
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)
@@ -1,87 +0,0 @@
---
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/)
@@ -1,42 +0,0 @@
---
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/)
@@ -1,44 +0,0 @@
---
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
@@ -1,73 +0,0 @@
---
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/)
+1 -1
View File
@@ -25,7 +25,7 @@ outline: deep
### 3. 显示语言、
支持中文英文和意大利语
支持中文英文
### 4. 下载完成提示
-302
View File
@@ -1,302 +0,0 @@
---
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
@@ -1,26 +0,0 @@
---
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
+1 -1
View File
@@ -25,7 +25,7 @@ Supports light and dark modes.
### 3. Display Language
Supports Chinese, English, and Italian.
Supports Chinese and English.
### 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, 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.
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.
## Troubleshooting
+6 -8
View File
@@ -7,20 +7,18 @@ 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.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.5.0 (Released on April 22, 2026)
+18 -30
View File
@@ -3,46 +3,34 @@
layout: home
hero:
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."
name: "Online Video Downloader"
text: "Simple and Easy, Fast Downloading"
tagline: Simple to learn, no need for packet capture, no plugins required
image:
src: /home_en.png
alt: MediaGo home screen
src: /home.png
alt: home
actions:
- theme: brand
text: Quick Start
link: /en/guides
link: /guides
- theme: alt
text: User Guide
link: /en/documents
link: /documents
features:
- icon: ⏩
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
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.
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: 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.
title: Mobile Playback
details: Seamlessly switch between PC and mobile devices. After the download is complete, you can watch the video on your phone.
- 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.
- icon: 🦞
title: OpenClaw Skill
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.
details: Download videos using natural language in AI coding assistants (OpenClaw, Claude Code, etc.). Install with one command.
---
+1 -1
View File
@@ -46,7 +46,7 @@ MediaGo 尚未上架 Chrome Web Store,需以"加载已解压的扩展程序"
## 界面语言
扩展支持中文、英文和意大利语,默认跟随浏览器 UI 语言。也可以在设置页 **界面语言** 卡片强制切换到"跟随系统 / 中文 / English / Italiano"之一。
扩展支持中文,默认跟随浏览器 UI 语言(浏览器是中文即显示中文)。也可以在设置页 **界面语言** 卡片强制切换到"跟随系统 / 中文 / English"之一。
## 常见问题
+13 -40
View File
@@ -3,12 +3,12 @@
layout: home
hero:
name: "MediaGo"
text: "跨平台视频下载"
tagline: "内置嗅探,打开网页、选一下想要的资源、保存完事。不用抓包,不用折腾浏览器插件,不用碰命令行。"
name: "在线视频下载"
text: "简单易用,快速下载"
tagline: 简单易学,无需抓包,不需要安装插件
image:
src: /home.png
alt: MediaGo 首页
alt: home
actions:
- theme: brand
text: 快速开始
@@ -20,44 +20,17 @@ hero:
features:
- icon: ⏩
title: 无需抓包
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: 内置格式转换
details: 下载完成后直接在 MediaGo 里转换格式、选画质,不用再打开别的工具。
details: 使用软件自带浏览器可以轻松嗅探网页中的视频资源,通过嗅探到的资源列表选择自己想要下载的资源,简单快速
- icon: 📱
title: 移动播放
details: 桌面端同时监听局域网 IP,同一 Wi-Fi 下的手机、平板打开浏览器就能访问下载列表并直接播放
- icon: 🔌
title: 开放 HTTP 接口
details: 提供完整的 HTTP API,脚本、自动化工具、第三方应用都能创建任务、查询进度、管理下载列表
details: 可以轻松无缝的在PC和移动设备之前切换,下载完成后即可使用手机观看视频
- icon: ⚡️
title: 支持批量下载
details: 支持同时下载多个视频和直播资源,高速带宽不闲置
- icon: 🎉
title: 支持 docker 部署
details: 支持 docker 部署 web 端,方便快捷。
- icon: 🦞
title: OpenClaw Skill
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: 了解专题
details: 支持通过 AI 编程助手(OpenClaw、Claude Code 等)用自然语言下载视频,一键安装即可使用
---
-302
View File
@@ -1,302 +0,0 @@
---
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
@@ -1,36 +0,0 @@
---
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
@@ -1,151 +0,0 @@
---
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
@@ -1,152 +0,0 @@
---
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
@@ -1,70 +0,0 @@
---
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
@@ -1,111 +0,0 @@
---
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
@@ -1,21 +0,0 @@
---
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
@@ -1,48 +0,0 @@
---
# 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
@@ -1,22 +0,0 @@
---
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
@@ -1,10 +0,0 @@
---
layout: doc
outline: deep
---
# Privacy Policy
::: tip
Questa è la privacy policy del software.
:::
-16
View File
@@ -1,16 +0,0 @@
---
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
@@ -1,102 +0,0 @@
---
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
@@ -1,302 +0,0 @@
---
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` | 手動停止 |
+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 / Italiano)。
拡張機能は日本語表示はサポートしておらず、中国語英語のみ対応します。既定ではブラウザの UI 言語に追随します(中国語ブラウザでは中国語、それ以外は英語)。設定ページの **インターフェース言語** から強制切替も可能です(システムに従う / 中文 / English)。
## よくある質問
+7 -8
View File
@@ -7,16 +7,15 @@ outline: deep
この記事では、ソフトウェアの簡単な説明を行い、すぐに使用できるようにします。[OpenClaw Skill](/jp/skills) に対応し、AI アシスタントで自然言語を使って動画をダウンロードできます。
::: info
v3.5 が最新バージョンです。ご意見はできるだけこのバージョンでお寄せください。できるだけ早く対応します。
::: tip
皆さんがより便利にコミュニケーションできるよう、フィードバックグループに参加できます:
MediaGo QQフィードバックグループ 1 574209001
:::
::: tip
macOS での使用
- **【Intel チップ】** Release から x64 版をインストールしてください。インストール後、Mac のセキュリティ設定で「身元不明の開発元からの App」を許可する必要があります。
- **【Apple チップ】** Release から arm64 版をインストールしてください。インストール後、ターミナルで `sudo xattr -dr com.apple.quarantine /Applications/mediago-community.app` を実行する必要があります。
::: info
v3.5 が最新バージョンです。ご意見はできるだけこのバージョンでお寄せください。できるだけ早く対応します。
:::
## ダウンロードとインストール
+15 -27
View File
@@ -2,46 +2,34 @@
layout: home
hero:
name: "MediaGo"
text: "クロスプラットフォーム動画ダウンローダー"
tagline: "ビルトインのスニッフィング — ページを開いて、欲しいリソースを選んで、保存するだけ。パケットキャプチャ不要、プラグイン不要、コマンドライン不要。"
name: "オンライン動画ダウンロード"
text: "簡単に使えて、素早くダウンロー"
tagline: 簡単に学べ、パケットキャプチャ不要、プラグインのインストールも不要
image:
src: /home.png
alt: MediaGo ホーム画面
alt: home
actions:
- theme: brand
text: すぐに開始
link: /jp/guides
link: /guides
- theme: alt
text: 使用説明
link: /jp/documents
link: /documents
features:
- icon: ⏩
title: パケットキャプチャ不要
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: 内蔵フォーマット変換
details: ダウンロード完了後、MediaGo 内で他のフォーマットや画質に変換できます。ffmpeg を別途起動する必要はありません。
details: ソフトウェア内蔵ブラウザを使用して、ウェブページの動画リソースを簡単にスニッフし、スニッフしたリソースのリストからダウンロードしたいリソースを選択できます。シンプルで高速です。
- icon: 📱
title: モバイル再生
details: デスクトップ版は LAN IP でも待ち受けるため、同じ Wi-Fi のスマートフォンやタブレットから Web UI を開いてダウンロード一覧を参照し、直接再生できます。
- icon: 🔌
title: 開放 HTTP API
details: 完全な HTTP API を提供し、スクリプト、自動化ツール、サードパーティアプリからダウンロードタスクの作成、進捗の取得、リスト管理が可能です
details: PCとモバイルデバイス間でシームレスに切り替えができ、ダウンロードが完了するとすぐにスマホで動画を視聴できます。
- icon: ⚡️
title: バッチダウンロード対応
details: 複数の動画やライブストリーミングリソースを同時にダウンロードでき、高速な帯域幅が無駄に使われることはありません
- icon: 🎉
title: Dockerデプロイ対応
details: Web端をDockerでデプロイでき、簡単で迅速に設定できます。
- icon: 🦞
title: OpenClaw Skill
details: Claude Code や Cursor などの AI コーディングアシスタントに「この動画をダウンロードして」と伝えるだけで OK。ワンコマンドで Skill をインストール。
- icon: 🐳
title: Docker ワンライン展開
details: 1 コマンドで NAS / VPS にデプロイ、同じネットワーク内のブラウザから直接アクセス。Docker Hub と GHCR のマルチアーキテクチャイメージ対応。
details: AI コーディングアシスタント(OpenClaw、Claude Code など)で自然言語を使って動画をダウンロード。ワンコマンドでインストール。
---
Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

@@ -1,14 +0,0 @@
{
"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."
}
}
+2 -5
View File
@@ -17,15 +17,12 @@ export type ExtensionLanguage = "system" | SupportedLanguage;
export function resolveLanguage(
setting: ExtensionLanguage | undefined,
): SupportedLanguage {
if (setting === "zh" || setting === "en" || setting === "it") return setting;
if (setting === "zh" || setting === "en") return setting;
const uiLang =
(typeof chrome !== "undefined" && chrome.i18n?.getUILanguage?.()) ||
(typeof navigator !== "undefined" ? navigator.language : "") ||
"";
const normalizedUiLang = uiLang.toLowerCase();
if (normalizedUiLang.startsWith("zh")) return "zh";
if (normalizedUiLang.startsWith("it")) return "it";
return "en";
return uiLang.toLowerCase().startsWith("zh") ? "zh" : "en";
}
/**
@@ -33,7 +33,6 @@ const resource: ExtensionResources = {
system: "Follow system",
zh: "中文",
en: "English",
it: "Italiano",
},
server: {
title: "Dispatch Mode",
@@ -1,12 +1,10 @@
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;
@@ -1,115 +0,0 @@
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,7 +31,6 @@ const resource = {
system: "跟随系统",
zh: "中文",
en: "English",
it: "Italiano",
},
server: {
title: "调用方式",
@@ -22,7 +22,6 @@ 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` / `it` — hard-pinned.
* - `zh` / `en` — hard-pinned.
*
* This maps 1:1 to the language radio on the options
* This maps 1:1 to the "跟随系统 / 中文 / English" radio on the options
* page and is resolved to a concrete locale at i18n bootstrap time.
*/
export type ExtensionLanguage = "system" | "zh" | "en" | "it";
export type ExtensionLanguage = "system" | "zh" | "en";
/**
* Wire-format for localisable text produced in the service worker and
+4 -14
View File
@@ -6,10 +6,8 @@ export const BASE_I18N_OPTIONS = {
},
} as const;
export type ResolvedAppLanguage = "zh" | "en" | "it";
/**
* Resolve a stored AppStore.language value to a real i18n key.
* Resolve a stored AppStore.language value to a real i18n key ("zh" | "en").
*
* 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:
@@ -21,17 +19,9 @@ export type ResolvedAppLanguage = "zh" | "en" | "it";
export function resolveAppLanguage(
language: string | undefined,
systemLocale: string | undefined,
): ResolvedAppLanguage {
if (language === "zh" || language === "en" || language === "it") {
): "zh" | "en" {
if (language === "zh" || language === "en") {
return language;
}
const normalizedSystemLocale = (systemLocale ?? "").toLowerCase();
if (normalizedSystemLocale.startsWith("zh")) {
return "zh";
}
if (normalizedSystemLocale.startsWith("it")) {
return "it";
}
return "en";
return (systemLocale ?? "").toLowerCase().startsWith("zh") ? "zh" : "en";
}
-1
View File
@@ -9,6 +9,5 @@ export {
DEFAULT_FRONTEND_APP,
i18nResources,
en,
it,
zh,
} from "./resources";
@@ -57,7 +57,6 @@ export const en = {
displayLanguage: "Language",
chinese: "中文",
english: "English",
italian: "Italiano",
pleaseSelectLanguage: "Select a language",
downloadPrompt: "Download prompt",
browserSetting: "Browser",
@@ -1,15 +1,13 @@
import { en } from "./en";
import { it } from "./it";
import { zh } from "./zh";
export const i18nResources = {
en,
it,
zh,
} as const;
export const SUPPORTED_LANGUAGES = ["en", "it", "zh"] as const;
export const SUPPORTED_LANGUAGES = ["en", "zh"] as const;
export const DEFAULT_BACKEND_NAMESPACE = "backend" as const;
export const DEFAULT_FRONTEND_APP = "main" as const;
export { en, it, zh };
export { en, zh };
@@ -1,252 +0,0 @@
export const it = {
downloadList: "Download",
downloadComplete: "Download completato",
materialExtraction: "Estrazione",
setting: "Impostazioni",
refresh: "Aggiorna",
newDownload: "Nuovo download",
selectAll: "Seleziona tutto",
playOnMobile: "Riproduci su mobile",
openFolder: "Cartella download",
fileNotExist: "File non trovato",
downloadSuccess: "Download completato",
downloadFailed: "Download non riuscito",
downloadPause: "Download in pausa",
downloading: "Download",
liveResource: "Stream live",
more: "Altro",
convertToAudio: "Converti in audio",
edit: "Modifica",
convertSuccess: "Conversione completata",
addTaskSuccess: "Attività aggiunta",
download: "Download",
pause: "Pausa",
redownload: "Nuovo download",
pending: "In attesa",
continueDownload: "Riprendi",
playVideo: "Riproduci video",
scanToWatch: "Scansione per guardare (è richiesto lo stesso Wi-Fi)",
delete: "Elimina",
cancel: "Annulla",
selectedItems: "{{count}} selezionato",
help: "Aiuto",
openInNewWindow: "Apri in una nuova finestra",
switchToMobileMode: "Passa al modo mobile",
home: "Home",
back: "Indietro",
favorite: "Preferito",
cancelFavorite: "Rimuovi preferito",
pleaseEnterUrl: "Inserisci URL",
visit: "Vai",
mergeToMainWindow: "Unisci nella finestra principale",
loadFailed: "Impossibile caricare",
backToHome: "Torna a Home",
addShortcut: "Aggiungi scorciatoia",
siteName: "Nome sito",
pleaseEnterSiteName: "Inserisci nome sito",
siteUrl: "URL sito",
pleaseEnterSiteUrl: "Inserisci URL sito",
pleaseEnterCorrectUrl: "Inserisci una URL valida",
basicSetting: "Generale",
pleaseSelectDownloadDir: "Seleziona cartella download",
downloaderTheme: "Tema",
followSystem: "Sistema",
dark: "Scuro",
light: "Chiaro",
pleaseSelectTheme: "Seleziona tema",
displayLanguage: "Lingua",
chinese: "中文",
english: "English",
italian: "Italiano",
pleaseSelectLanguage: "Seleziona lingua interfaccia",
downloadPrompt: "Prompt download",
browserSetting: "Browser",
pleaseEnterProxy: "Inserisci l'indirizzo completo, es. http://127.0.0.1:8000",
proxySetting: "Proxy",
pleaseEnterProxyFirst: "Prima inserisci l'indirizzo proxy",
dockerUrl: "URL Docker",
pleaseEnterDockerUrl: "Inserisci la URL Docker",
blockAds: "Blocca pubblicità",
enterMobileMode: "Modo mobile",
downloadSetting: "Download",
dockerSetting: "Docker",
skillsSetting: "Skill",
skillsInstall: "Installa skill",
skillsInstallTooltip:
"Esegui questo comando nel terminale per installare la skill mediago da ClawHub",
skillsInstallCmd: "npx clawhub@latest install mediago",
skillsInit: "Inizializza",
skillsInitTooltip:
"Dopo l'installazione, per completare l'installazione, incolla questo comando nel codice Claude",
skillsCopy: "Copia",
skillsCopied: "Copiato negli appunti",
moreSettings: "Avanzate",
deleteSegments: "Dopo il download elimina segmenti",
moreAction: "Altre azioni",
configDir: "Cartella impostazioni",
clear: "Azzera",
clearCache: "Svuota cache",
clearCacheSuccess: "Cache azzerata",
clearCacheFailed: "Impossibile azzerare la cache",
binPath: "Percorso esecuzione",
localDir: "Cartella download",
extensionDir: "Cartella estensione browser",
currentVersion: "Versione",
selectFolder: "Seleziona cartella",
selectFile: "Seleziona file",
proxySwitch: "Proxy",
downloadProxySwitch: "Usa proxy per download",
proxyDescription:
"Il proxy si applica sia al browser integrato che ai download",
useImmersiveSniffing: "Sniffing immersivo",
immersiveSniffingDescription:
"Se abilitato, le risorse rilevate non verranno visualizzate direttamente nell'elenco dei download: tutto lo sniffing è gestito dall'estensione del browser",
maxRunner: "Download simultanei max",
maxRunnerDescription:
"Le registrazioni live non contano ai fini del limite download simultanei",
expand: "Espandi",
collapse: "Riduci",
editDownload: "Modifica download",
batchDownload: "Download batch",
videoLink: "Collegamento video",
pleaseEnterVideoLink: "Inserisci un collegamento video",
videoName: "Nome video",
pleaseEnterVideoName: "Inserisci un nome per il video",
pleaseEnterCorrectFormInfo: "Compila correttamente tutti i campi obbligatori",
additionalHeaders: "Intestazioni personalizzate",
pleaseEnterOnlineVideoUrl: "Inserisci URL video",
pleaseEnterCorrectVideoLink: "Inserisci una URL valida",
pleaseEnterOnlineVideoUrlOrDragM3U8Here: "Inserisci URL video",
videoLikeDescription:
"Inserisci i collegamenti video, uno per riga.\nFormato: nome URL (facoltativo) cartella (facoltativo)\n\nEsempi:\nhttp://eempio.com/xxx.m3u8 cartella film1\nhttp://esempio.com/xxx.m3u8 cartella film2\nhttp://esempio.com/xxx.m3u8",
additionalHeadersDescription:
"Inserisci intestazioni personalizzate, una per riga.\n\nEsempi:\nDSorgente: http://www.esempio.com\nRiferimento: http://www.esempio.com",
cancle: "Annulla",
terminal: "Apri terminale",
close: "Chiudi",
exportLog: "Esporta registro",
showTerminal: "Visualizza registro download",
autoUpgrade: "Aggiornamento automatico",
autoUpgradeTooltip: "Ha effetto alla prossima esecuzione",
consoleOutput: "Console",
downloadNow: "Download",
addToDownloadList: "Aggiungi a elenco",
videoType: "Tipo download",
pleaseSelectVideoType: "Seleziona tipo download",
numberOfEpisodes: "Episodi",
showNumberOfEpisodes: "Visualizza n. episodio",
canUseMouseWheelToAdjust: "Per modificare sua la rotellina del mouse",
audioMuted: "Audio OFF",
openBrowser: "Apri browser",
privacy: "Navigazione in incognito",
privacyTooltip: "Quando abilitato, il browser non salverà alcun dato di navigazione",
converter: "Conversione",
addFile: "Aggiungi file",
convertAll: "Converti tutto",
outputFormat: "Formato",
quality: "Qualità",
start: "Avvia",
stop: "Stop",
addFavorite: "Aggiungi preferito",
importFavorite: "Importa preferiti",
exportFavorite: "Esporta preferiti",
exportFavoriteSuccess: "Preferiti esportati",
exportFavoriteFailed: "Impossibile esportare i preferiti",
importFavoriteSuccess: "Preferiti importati",
importFavoriteFailed: "Impossibile importare i preferiti",
addFavoriteFailed: "Impossibile aggiungere i preferiti",
failToFetchVideoList: "Impossibile ottenere elenco video",
playList: "Playlist",
pleaseEnterCorrectBatchList: "Inserisci un elenco batch valido",
streamMedia: "Stream media (m3u8)",
bilibiliMedia: "Bilibili",
mediagoMedia: "MediaGo download",
youtubeMedia: "YouTube (yt-dlp)",
checkUpdate: "Controlla aggiornamenti",
allowBetaVersion: "Includi controllo versioni beta",
updateModal: "Aggiorna",
update: "Aggiorna",
install: "Installa",
checkingForUpdates: "Controllo aggiornamenti…",
updateAvailable: "È disponibile un aggiornamento",
updateNotAvailable: "Questa versione è aggiornata",
closeMainWindow: "Chiudi finestra",
minimizeToTray: "Minimizza nella barra sistema",
failReason: "Motivo errore",
viewDetails: "Visualizza dettagli",
exportDownloadList: "Esporta elenco download",
exportDownloadListFailed: "Impossibile esportare elenco download",
folder: "Cartella",
pleaseInputVideoFolder: "Inserisci nome cartella",
confirmChange: "Conferma",
createdAt: "Creato",
direct: "Download diretto (MP4)",
enableDocker: "Abilita Docker",
addToDocker: "Aggiungi a Docker",
addToDockerSuccess: "Aggiunto a Docker",
save: "Salva",
downloadLog: "Registro download",
processIPC: "Evento errore elaborazione IPC [{{channel}}]: ",
open: "Apri",
noMainWindow: "Finestra principale non trovata",
copyLinkAddress: "Copia indirizzo collegamento",
select: "Seleziona",
openFile: "Apri file",
noFileFound: "File non trovato",
exportFavorites: "Esporta preferiti",
copy: "Copia",
paste: "Incolla",
noTaskFound: "Nessuna attività trovata",
urlExist: "Questa URL esiste già",
videoExistsPleaseChangeName:
"Esiste già un video con questo nome: scegli un nome diverso",
videoNotExists: "Video non trovato",
unknownError: "Errore sconosciuto",
unsupportedDownloadType: "Tipo download non supportato",
captureVideoLinkInWindow: "Collegamento video catturato nella finestra: {{url}}",
browserViewNotFound: "Vista browser non trovata",
currentWindowNotFound: "Finestra attuale non trovata",
proxyNotAllowEmpty: "[Proxy] L'indirizzo non può essere vuoto",
enableProxy: "[Proxy] abilitato ({{proxy}})",
disableProxy: "[Proxy] disabilitato",
adBlockerEnableFailed: "[Blocco pubblicità] impossibile abilitare",
enableADBlocker: "[Blocco pubblicità] abilitato",
adBlockerDisableFailed: "[Blocco pubblicità] impossibile disabilitare",
disableADBlocker: "[Blocco pubblicità] disabilitato",
ua: '[UA] User-Agent: "{{ua}}"',
session: "[Sessione] modo {{mode}}",
currentEnvironmentIsDevelopment:
"Rilevato ambiente di sviluppo: caricamento strumenti di sviluppo",
loadDevToolsSuccess: "Strumenti di sviluppo caricati",
loadDevToolsFailed: "Impossibile caricare strumenti di sviluppo",
autoUpdateSuccess: "Aggiornamento scaricato",
nextTimeWillAutoInstall: "Verrà installato automaticamente al prossimo avvio",
videoDownloadSuccess: "{{name}} scaricato",
videoDownloadFailed: "{{name}} download fallito",
showMainWindow: "Visualizza finestra principale MediaGo",
exitApp: "Esci",
untitled: "Senza titolo",
noData: "Nessun dato",
addToList: "Aggiungi a elenco",
convertNow: "Converti",
filePath: "File",
pleaseSelectFile: "Seleziona file",
browse: "Sfoglia",
enableMobilePlayer: "Abilita riproduttore mobile",
adminPassword: "Password amministratore",
forgotPassword: "Password dimenticata?",
forgetPasswordDescription: "Se hai dimenticato la password dell'amministratore, puoi reimpostarla:\n1. Trova la cartella di archiviazione di MediaGo.\n2. Apri la cartella '.store' e modifica 'config.json'.\n3. Cancella il valore del campo apiKey.",
signin: "Accedi",
signinMediaGoServer: "Accedi al server MediaGo",
initializeMediaGoServer: "Imposta server MediaGo",
settingUpAdminPassword: "Crea password amministratore",
repeatPassword: "Conferma password",
pleaseEnterPassword: "Inserisci password",
passwordNotMatch: "Le password non corrispondono",
signinFailed: "Accesso fallito",
unauthorized: "Non autorizzato",
setup: "Impostazione",
apiKey: "Chiave API",
pleaseEnterApiKey: "Inserisci chiave API",
confirm: "Conferma",
};
@@ -52,7 +52,6 @@ export const zh = {
downloaderTheme: "下载器主题",
followSystem: "跟随系统",
english: "English",
italian: "Italiano",
pleaseSelectLanguage: "请选择显示语言",
downloadPrompt: "下载完成提示",
browserSetting: "浏览器设置",
@@ -105,7 +105,6 @@ export enum AppLanguage {
System = "system",
ZH = "zh",
EN = "en",
IT = "it",
}
export interface DownloadContext {