Compare commits

..

1180 Commits

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

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

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

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

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

Closes #637

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Extend `workflow_dispatch` with two inputs:

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

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

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

    flag provided but not defined: -m3u8-bin

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

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

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

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

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

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

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

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

No product behaviour change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 14:14:28 +08:00
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
11 changed files with 667 additions and 657 deletions
-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).
+75 -64
View File
@@ -1,16 +1,10 @@
<!-- 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>
@@ -19,7 +13,7 @@
<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>
@@ -40,87 +34,107 @@
<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
### 🌐 浏览器扩展(Chrome / Edge
### 🌐 Browser extension for Chrome / Edge
浏览网页时遇到想下的视频 → 点扩展图标 → 一键发到 MediaGo。自动识别页面里的可下载资源,工具栏图标显示检测到的数量,主流视频网站(包括 YouTube、Bilibili 等)都能覆盖。扩展随桌面端安装包一起打包,在 **设置 → 更多设置 → 浏览器扩展目录** 就能找到安装文件夹。
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 1000+ 站点
### 🎬 YouTube and 1000+ sites
底层用的是 yt-dlp。支持 YouTubeTwitter/XInstagram、Reddit 等 [一千多个视频站点](https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md)。
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 助手帮你下载 —— OpenClaw Skill
### 🦞 AI assistants can download for you — OpenClaw Skill
在用 Claude CodeCursor 等 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_en.png)
![首页 — 深色模式](./images/home-dark.png)
![Home — dark mode](./images/home-dark_en.png)
![设置](./images/settings.png)
![Settings](./images/settings_en.png)
![资源提取](./images/browser.png)
![Resource extraction](./images/browser_en.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 +145,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 +153,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 是原项目作者
+130
View File
@@ -0,0 +1,130 @@
package main
import (
"context"
"fmt"
"os"
"os/signal"
"strings"
"github.com/google/uuid"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"caorushizi.cn/mediago/internal/app"
"caorushizi.cn/mediago/internal/core"
"caorushizi.cn/mediago/internal/logger"
)
func main() {
if err := newRootCommand().Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func newRootCommand() *cobra.Command {
cfg := app.DefaultConfig()
rootCmd := &cobra.Command{
Use: "mediago-cli",
Short: "MediaGo command-line interface",
Long: "MediaGo CLI directly uses the core downloader runtime without going through the HTTP API server.",
}
addConfigFlags(rootCmd.PersistentFlags(), cfg)
rootCmd.AddCommand(newDownloadCommand(cfg))
return rootCmd
}
func newDownloadCommand(cfg *app.AppConfig) *cobra.Command {
var id string
var typ string
var name string
var folder string
var headers []string
cmd := &cobra.Command{
Use: "download <url>",
Short: "Download a URL directly with MediaGo core",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
cfg.ApplyEnvAndDefaults()
if err := app.InitLogger(cfg); err != nil {
return err
}
defer logger.Sync()
if id == "" {
id = uuid.New().String()
}
if name == "" {
name = "download-" + uuid.New().String()[:8]
}
rt, err := app.NewRuntime(cfg)
if err != nil {
return err
}
defer rt.Close()
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
params := core.DownloadParams{
ID: core.TaskID(id),
Type: core.DownloadType(typ),
URL: args[0],
Name: core.SanitizeFilename(name),
Folder: folder,
Headers: headers,
}
lastPercent := -1
fmt.Printf("Starting %s download: %s\n", params.Type, params.Name)
err = rt.Downloader.Download(ctx, params, core.Callbacks{
OnProgress: func(e core.ProgressEvent) {
percent := int(e.Percent)
if percent != lastPercent {
lastPercent = percent
if e.Speed != "" {
fmt.Printf("\r%3d%% %s", percent, e.Speed)
} else {
fmt.Printf("\r%3d%%", percent)
}
}
},
OnMessage: func(e core.MessageEvent) {
if strings.TrimSpace(e.Message) != "" {
logger.Debugf("[%s] %s", e.ID, e.Message)
}
},
})
fmt.Println()
if err != nil {
return err
}
fmt.Println("Download completed")
return nil
},
}
cmd.Flags().StringVar(&id, "id", "", "Download task id")
cmd.Flags().StringVarP(&typ, "type", "t", string(core.TypeM3U8), "Download type (m3u8, bilibili, direct, mediago, youtube)")
cmd.Flags().StringVarP(&name, "name", "n", "", "Output file name")
cmd.Flags().StringVar(&folder, "folder", "", "Subdirectory under the download directory")
cmd.Flags().StringArrayVarP(&headers, "header", "H", nil, "HTTP header, can be repeated")
return cmd
}
func addConfigFlags(flags *pflag.FlagSet, cfg *app.AppConfig) {
flags.StringVar(&cfg.LogLevel, "log-level", cfg.LogLevel, "Log level (debug/info/warn/error)")
flags.StringVar(&cfg.LogDir, "log-dir", cfg.LogDir, "Log directory")
flags.StringVar(&cfg.DepsDir, "deps-dir", cfg.DepsDir, "Directory containing downloader tool binaries")
flags.StringVar(&cfg.SchemaPath, "schema-path", cfg.SchemaPath, "Path to the download schema config.json")
flags.StringVar(&cfg.LocalDir, "local-dir", cfg.LocalDir, "Default download directory")
flags.BoolVar(&cfg.DeleteSegments, "delete-segments", cfg.DeleteSegments, "Delete segments after download")
flags.StringVar(&cfg.Proxy, "proxy", cfg.Proxy, "Proxy for downloader")
flags.BoolVar(&cfg.UseProxy, "use-proxy", cfg.UseProxy, "Enable proxy")
flags.IntVar(&cfg.MaxRunner, "max-runner", cfg.MaxRunner, "Maximum concurrent download runners")
flags.StringVar(&cfg.DBPath, "db-path", cfg.DBPath, "Path to SQLite database file")
flags.StringVar(&cfg.ConfigDir, "config-dir", cfg.ConfigDir, "Directory for persistent config file")
}
-63
View File
@@ -1,63 +0,0 @@
package main
// AppStore holds all user-facing configuration options.
// Field names and defaults match the TypeScript AppStore interface
// in @mediago/shared-common.
type AppStore struct {
Local string `json:"local"`
PromptTone bool `json:"promptTone"`
Proxy string `json:"proxy"`
UseProxy bool `json:"useProxy"`
DeleteSegments bool `json:"deleteSegments"`
OpenInNewWindow bool `json:"openInNewWindow"`
BlockAds bool `json:"blockAds"`
Theme string `json:"theme"`
UseExtension bool `json:"useExtension"`
IsMobile bool `json:"isMobile"`
MaxRunner int `json:"maxRunner"`
Language string `json:"language"`
ShowTerminal bool `json:"showTerminal"`
Privacy bool `json:"privacy"`
MachineId string `json:"machineId"`
DownloadProxySwitch bool `json:"downloadProxySwitch"`
AutoUpgrade bool `json:"autoUpgrade"`
AllowBeta bool `json:"allowBeta"`
CloseMainWindow bool `json:"closeMainWindow"`
AudioMuted bool `json:"audioMuted"`
EnableDocker bool `json:"enableDocker"`
DockerUrl string `json:"dockerUrl"`
EnableMobilePlayer bool `json:"enableMobilePlayer"`
ApiKey string `json:"apiKey"`
PasswordHash string `json:"passwordHash"`
}
// defaultAppStore returns default config values matching the TS appStoreDefaults.
func defaultAppStore() AppStore {
return AppStore{
Local: "",
PromptTone: true,
Proxy: "",
UseProxy: false,
DeleteSegments: true,
OpenInNewWindow: false,
BlockAds: true,
Theme: "system",
UseExtension: false,
IsMobile: false,
MaxRunner: 2,
Language: "system",
ShowTerminal: false,
Privacy: false,
MachineId: "",
DownloadProxySwitch: false,
AutoUpgrade: true,
AllowBeta: false,
CloseMainWindow: false,
AudioMuted: true,
EnableDocker: false,
DockerUrl: "",
EnableMobilePlayer: false,
ApiKey: "",
PasswordHash: "",
}
}
+47 -352
View File
@@ -3,21 +3,15 @@ package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"runtime"
"github.com/google/uuid"
"caorushizi.cn/mediago/internal/api"
"caorushizi.cn/mediago/internal/api/handler"
"caorushizi.cn/mediago/internal/core"
"caorushizi.cn/mediago/internal/core/runner"
"caorushizi.cn/mediago/internal/core/schema"
"caorushizi.cn/mediago/internal/db"
"caorushizi.cn/mediago/internal/app"
"caorushizi.cn/mediago/internal/logger"
"caorushizi.cn/mediago/internal/tasklog"
"caorushizi.cn/mediago/pkg/conf"
"github.com/gin-gonic/gin"
)
@@ -48,227 +42,64 @@ import (
// @tag.name Events
// @tag.description Real-time event streaming endpoints
// AppConfig stores all startup configuration options (passed via command-line flags or environment variables).
type AppConfig struct {
GinMode string `json:"gin_mode"`
Host string `json:"host"`
Port string `json:"port"`
LogLevel string `json:"log_level"`
LogDir string `json:"log_dir"`
SchemaPath string `json:"schema_path"`
DepsDir string `json:"deps_dir"`
MaxRunner int `json:"max_runner"`
LocalDir string `json:"local_dir"`
DeleteSegments bool `json:"delete_segments"`
Proxy string `json:"proxy"`
UseProxy bool `json:"use_proxy"`
DBPath string `json:"db_path"`
ConfigDir string `json:"config_dir"`
EnableAuth bool `json:"enable_auth"`
StaticDir string `json:"static_dir"`
}
func (c *AppConfig) GetLocalDir() string {
return c.LocalDir
}
func (c *AppConfig) GetDeleteSegments() bool {
return c.DeleteSegments
}
func (c *AppConfig) GetProxy() string {
return c.Proxy
}
func (c *AppConfig) GetUseProxy() bool {
return c.UseProxy
}
func (c *AppConfig) SetLocalDir(dir string) {
c.LocalDir = dir
}
func (c *AppConfig) SetDeleteSegments(del bool) {
c.DeleteSegments = del
}
func (c *AppConfig) SetProxy(proxy string) {
c.Proxy = proxy
}
func (c *AppConfig) SetUseProxy(useProxy bool) {
c.UseProxy = useProxy
}
// getSystemDownloadsDir returns the system downloads directory.
// Prefers $HOME/Downloads; falls back to $HOME if it does not exist.
func getSystemDownloadsDir() string {
home, err := os.UserHomeDir()
if err != nil {
return "."
}
downloads := filepath.Join(home, "Downloads")
if info, err := os.Stat(downloads); err == nil && info.IsDir() {
return downloads
}
return home
}
func main() {
// 1. Initialize the logger with default config first so it is available during config parsing
// if err := logger.Init(logger.DefaultConfig()); err != nil {
// panic("Failed to initialize logger: " + err.Error())
// }
if err := run(os.Args[1:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
// 2. Initialize and parse configuration
cfg := initConfig()
func run(args []string) error {
cfg := app.DefaultConfig()
fs := flag.NewFlagSet("mediago-core server", flag.ContinueOnError)
registerConfigFlags(fs, cfg)
if err := fs.Parse(args); err != nil {
if err == flag.ErrHelp {
return nil
}
return err
}
cfg.ApplyEnvAndDefaults()
// 3. Re-initialize the logger using the resolved configuration
logCfg := logger.DefaultConfig()
logCfg.Level = cfg.LogLevel
logCfg.LogDir = cfg.LogDir
if err := logger.Init(logCfg); err != nil {
logger.Fatalf("Failed to reinitialize logger with config: %v", err)
if err := app.InitLogger(cfg); err != nil {
return err
}
defer logger.Sync()
logger.Info("MediaGo Downloader Service Starting...")
logger.Infof("Final Config: %+v", cfg)
// 4. Initialize AppStore configuration (user-level persistent config)
appStore, err := conf.New(conf.Options[AppStore]{
ConfigName: "config",
CWD: cfg.ConfigDir,
Defaults: defaultAppStore(),
})
rt, err := app.NewRuntime(cfg)
if err != nil {
logger.Fatalf("Failed to initialize app store: %v", err)
return err
}
logger.Infof("App store initialized at: %s", appStore.Path())
defer rt.Close()
// Ensure machineId is set (generate on first run)
if appStore.Store().MachineId == "" {
newId := uuid.New().String()
_ = appStore.Set("machineId", newId)
logger.Infof("Generated new machineId: %s", newId)
}
return runServer(rt)
}
// Sync appStore values back into cfg (so cfg reflects the final state of persistent config).
// Note: CLI arguments are no longer written into appStore to avoid overwriting settings
// saved by the user in the UI on every startup. CLI args serve only as initial defaults;
// appStore (user config) takes higher priority.
syncAppStoreToCfg(appStore, cfg)
func registerConfigFlags(fs *flag.FlagSet, cfg *app.AppConfig) {
fs.StringVar(&cfg.LogLevel, "log-level", cfg.LogLevel, "Log level (debug/info/warn/error)")
fs.StringVar(&cfg.LogDir, "log-dir", cfg.LogDir, "Log directory")
fs.StringVar(&cfg.DepsDir, "deps-dir", cfg.DepsDir, "Directory containing downloader tool binaries")
fs.StringVar(&cfg.SchemaPath, "schema-path", cfg.SchemaPath, "Path to the download schema config.json")
fs.StringVar(&cfg.Port, "port", cfg.Port, "Server port")
fs.StringVar(&cfg.LocalDir, "local-dir", cfg.LocalDir, "Default download directory")
fs.BoolVar(&cfg.DeleteSegments, "delete-segments", cfg.DeleteSegments, "Delete segments after download")
fs.StringVar(&cfg.Proxy, "proxy", cfg.Proxy, "Proxy for downloader")
fs.BoolVar(&cfg.UseProxy, "use-proxy", cfg.UseProxy, "Enable proxy")
fs.IntVar(&cfg.MaxRunner, "max-runner", cfg.MaxRunner, "Maximum concurrent download runners")
fs.StringVar(&cfg.DBPath, "db-path", cfg.DBPath, "Path to SQLite database file")
fs.StringVar(&cfg.ConfigDir, "config-dir", cfg.ConfigDir, "Directory for persistent config file")
fs.BoolVar(&cfg.EnableAuth, "enable-auth", cfg.EnableAuth, "Enable API key authentication")
fs.StringVar(&cfg.StaticDir, "static-dir", cfg.StaticDir, "Directory to serve static files from (SPA mode)")
}
// If the download directory is empty, is the default value, or does not exist, use the system downloads directory
{
needDefault := cfg.LocalDir == "" || cfg.LocalDir == "./downloads"
if !needDefault {
if info, err := os.Stat(cfg.LocalDir); err != nil || !info.IsDir() {
needDefault = true
}
}
if needDefault {
sysDownloads := getSystemDownloadsDir()
logger.Infof("Download dir %q unavailable, using system default: %s", cfg.LocalDir, sysDownloads)
cfg.LocalDir = sysDownloads
}
// Ensure appStore has the download directory (so UI can read it via /api/config)
if appStore.Store().Local == "" {
_ = appStore.Set("local", cfg.LocalDir)
}
}
// 5. Load JSON Schema configuration
logger.Infof("Loading schemas from: %s", cfg.SchemaPath)
schemas, err := schema.LoadSchemasFromJSON(cfg.SchemaPath)
if err != nil {
logger.Fatalf("Failed to load schemas: %v", err)
}
logger.Infof("Loaded %d download schemas", len(schemas.Schemas))
// 6. Configure downloader binary paths
binMap := getBinaryMap(cfg)
for dt, binPath := range binMap {
logger.Infof("%s downloader: %s", dt, binPath)
if binPath == "" {
continue
}
if info, err := os.Stat(binPath); err != nil {
logger.Warnf("%s binary not found: %v", dt, err)
} else if info.Mode()&0o111 == 0 {
logger.Warnf("%s binary is not executable: %s", dt, binPath)
}
}
// 7. Create core components
r := runner.NewPTYRunner()
downloader := core.NewDownloader(binMap, r, schemas, cfg)
queue := core.NewTaskQueue(downloader, cfg.MaxRunner)
taskLogs := tasklog.NewManager(filepath.Join(cfg.LogDir, "tasks"))
logger.Infof("Task queue initialized (maxRunner=%d)", cfg.MaxRunner)
logger.Infof("Task logs will be stored in %s", filepath.Join(cfg.LogDir, "tasks"))
// 8. Watch appStore changes and sync them to the downloader
appStore.OnDidChange("maxRunner", func(newVal, oldVal any) {
if v, ok := toInt(newVal); ok {
queue.SetMaxRunner(v)
logger.Infof("maxRunner updated to %d via config change", v)
}
})
appStore.OnDidChange("proxy", func(newVal, oldVal any) {
if v, ok := newVal.(string); ok {
cfg.SetProxy(v)
logger.Infof("proxy updated to %q via config change", v)
}
})
appStore.OnDidChange("useProxy", func(newVal, oldVal any) {
if v, ok := newVal.(bool); ok {
cfg.SetUseProxy(v)
logger.Infof("useProxy updated to %v via config change", v)
}
})
appStore.OnDidChange("deleteSegments", func(newVal, oldVal any) {
if v, ok := newVal.(bool); ok {
cfg.SetDeleteSegments(v)
logger.Infof("deleteSegments updated to %v via config change", v)
}
})
appStore.OnDidChange("local", func(newVal, oldVal any) {
if v, ok := newVal.(string); ok {
cfg.SetLocalDir(v)
logger.Infof("localDir updated to %q via config change", v)
}
})
// 9. Initialize database (optional)
var database *db.Database
if cfg.DBPath != "" {
// Ensure the database parent directory exists
if dir := filepath.Dir(cfg.DBPath); dir != "" {
if err := os.MkdirAll(dir, 0o755); err != nil {
logger.Fatalf("Failed to create database directory %s: %v", dir, err)
}
}
var dbErr error
database, dbErr = db.New(cfg.DBPath)
if dbErr != nil {
logger.Fatalf("Failed to open database: %v", dbErr)
}
defer database.Close()
logger.Infof("Database opened: %s", cfg.DBPath)
} else {
logger.Info("No database path provided, running without persistence")
}
// 10. Start HTTP server
confStore := handler.WrapConfStore[AppStore](appStore)
func runServer(rt *app.Runtime) error {
cfg := rt.Config
confStore := handler.WrapConfStore[app.AppStore](rt.AppStore)
execPath, _ := os.Executable()
server := api.NewServer(queue, taskLogs, database, confStore, api.ServerOptions{
server := api.NewServer(rt.Queue, rt.TaskLogs, rt.Database, confStore, api.ServerOptions{
EnableAuth: cfg.EnableAuth,
StaticDir: cfg.StaticDir,
FFmpegBin: getFFmpegBin(cfg),
FFmpegBin: app.FFmpegBinPath(cfg),
VideoRoot: cfg.LocalDir,
EnvPaths: handler.EnvPaths{
ConfigDir: cfg.ConfigDir,
@@ -280,141 +111,5 @@ func main() {
gin.SetMode(cfg.GinMode)
logger.Infof("Starting HTTP server on %s", addr)
if err := server.Run(addr); err != nil {
logger.Fatalf("Failed to start server: %v", err)
}
}
// syncAppStoreToCfg reads appStore values back into cfg.
// CLI flags take priority: if --local-dir was explicitly set (not the default),
// the CLI value is kept and written back to appStore.
func syncAppStoreToCfg(store *conf.Conf[AppStore], cfg *AppConfig) {
s := store.Store()
cliLocalDir := cfg.LocalDir
cliExplicit := cliLocalDir != "" && cliLocalDir != "./downloads"
if cliExplicit {
// CLI explicitly set --local-dir, use it and update appStore
_ = store.Set("local", cliLocalDir)
} else if s.Local != "" {
cfg.LocalDir = s.Local
}
cfg.Proxy = s.Proxy
cfg.UseProxy = s.UseProxy
cfg.DeleteSegments = s.DeleteSegments
if s.MaxRunner > 0 {
cfg.MaxRunner = s.MaxRunner
}
}
// initConfig initializes configuration following priority order: CLI flags > environment variables > JSON string > defaults.
func initConfig() *AppConfig {
// Default configuration
cfg := &AppConfig{
GinMode: "release",
Host: "0.0.0.0",
Port: "8080",
LogLevel: "info",
LogDir: "./logs",
SchemaPath: "", // computed later
DepsDir: "",
MaxRunner: 2,
LocalDir: "./downloads",
DeleteSegments: true,
Proxy: "",
UseProxy: false,
ConfigDir: "",
}
// 1. Define command-line flags
flag.StringVar(&cfg.LogLevel, "log-level", cfg.LogLevel, "Log level (debug/info/warn/error)")
flag.StringVar(&cfg.LogDir, "log-dir", cfg.LogDir, "Log directory")
flag.StringVar(&cfg.DepsDir, "deps-dir", cfg.DepsDir, "Directory containing downloader tool binaries")
flag.StringVar(&cfg.SchemaPath, "schema-path", cfg.SchemaPath, "Path to the download schema config.json")
flag.StringVar(&cfg.Port, "port", cfg.Port, "Server port")
flag.StringVar(&cfg.LocalDir, "local-dir", cfg.LocalDir, "Default download directory")
flag.BoolVar(&cfg.DeleteSegments, "delete-segments", cfg.DeleteSegments, "Delete segments after download")
flag.StringVar(&cfg.Proxy, "proxy", cfg.Proxy, "Proxy for downloader")
flag.BoolVar(&cfg.UseProxy, "use-proxy", cfg.UseProxy, "Enable proxy")
flag.IntVar(&cfg.MaxRunner, "max-runner", cfg.MaxRunner, "Maximum concurrent download runners")
flag.StringVar(&cfg.DBPath, "db-path", cfg.DBPath, "Path to SQLite database file")
flag.StringVar(&cfg.ConfigDir, "config-dir", cfg.ConfigDir, "Directory for persistent config file")
flag.BoolVar(&cfg.EnableAuth, "enable-auth", cfg.EnableAuth, "Enable API key authentication")
flag.StringVar(&cfg.StaticDir, "static-dir", cfg.StaticDir, "Directory to serve static files from (SPA mode)")
flag.Parse()
// 3. Load from environment variables (overrides JSON and defaults)
cfg.GinMode = getEnv("GIN_MODE", cfg.GinMode)
cfg.Host = getEnv("HOST", cfg.Host)
cfg.Port = getEnv("PORT", cfg.Port)
cfg.DBPath = getEnv("DB_PATH", cfg.DBPath)
// If SchemaPath is still empty, compute its default value
if cfg.SchemaPath == "" {
cfg.SchemaPath = getDefaultSchemaPath()
}
// If ConfigDir is empty, default to the LogDir path
if cfg.ConfigDir == "" {
cfg.ConfigDir = cfg.LogDir
}
return cfg
}
// getDefaultSchemaPath returns the default path for the schema config file.
func getDefaultSchemaPath() string {
// Default path: prefer config.json in the same directory as the executable
execPath, _ := os.Executable()
execDir := filepath.Dir(execPath)
localConfig := filepath.Join(execDir, "config.json")
if _, err := os.Stat(localConfig); err == nil {
return localConfig
}
// Fall back to the config file path inside the repository
return "configs/config.json"
}
// exeExt returns ".exe" on Windows, empty string otherwise.
func exeExt() string {
if runtime.GOOS == "windows" {
return ".exe"
}
return ""
}
// getBinaryMap builds the downloader binary path map from a single deps directory.
func getBinaryMap(cfg *AppConfig) map[core.DownloadType]string {
ext := exeExt()
m := make(map[core.DownloadType]string, len(core.BinaryNames))
for dt, name := range core.BinaryNames {
m[dt] = filepath.Join(cfg.DepsDir, name+ext)
}
return m
}
// getFFmpegBin returns the ffmpeg binary path derived from the deps directory.
func getFFmpegBin(cfg *AppConfig) string {
return filepath.Join(cfg.DepsDir, core.FFmpegBinaryName+exeExt())
}
func getEnv(key, def string) string {
if v := os.Getenv(key); v != "" {
return v
}
return def
}
// toInt converts a JSON-decoded number (float64) or int to int.
func toInt(v any) (int, bool) {
switch n := v.(type) {
case float64:
return int(n), true
case int:
return n, true
case int64:
return int(n), true
}
return 0, false
return server.Run(addr)
}
+4 -1
View File
@@ -9,10 +9,13 @@ require (
github.com/gin-gonic/gin v1.11.0
github.com/glebarez/sqlite v1.11.0
github.com/google/uuid v1.6.0
github.com/spf13/cobra v1.10.2
github.com/spf13/pflag v1.0.9
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.1
github.com/swaggo/swag v1.16.6
go.uber.org/zap v1.27.0
golang.org/x/crypto v0.43.0
golang.org/x/text v0.30.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gorm.io/gorm v1.31.1
@@ -43,6 +46,7 @@ require (
github.com/go-playground/validator/v10 v10.28.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/goccy/go-yaml v1.18.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/json-iterator/go v1.1.12 // indirect
@@ -61,7 +65,6 @@ require (
go.uber.org/multierr v1.10.0 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/arch v0.22.0 // indirect
golang.org/x/crypto v0.43.0 // indirect
golang.org/x/mod v0.29.0 // indirect
golang.org/x/net v0.46.0 // indirect
golang.org/x/sync v0.17.0 // indirect
+9
View File
@@ -10,6 +10,7 @@ github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZw
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -20,6 +21,7 @@ github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+m
github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0=
github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
github.com/gin-contrib/cors v1.7.6 h1:3gQ8GMzs1Ylpf70y8bMw4fVpycXIeX1ZemuSQIsnQQY=
github.com/gin-contrib/cors v1.7.6/go.mod h1:Ulcl+xN4jel9t1Ry8vqph23a60FwH9xVLd+3ykmTjOk=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
@@ -72,6 +74,8 @@ github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbu
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
@@ -106,6 +110,11 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+63
View File
@@ -0,0 +1,63 @@
package app
// AppStore holds all user-facing configuration options.
// Field names and defaults match the TypeScript AppStore interface
// in @mediago/shared-common.
type AppStore struct {
Local string `json:"local"`
PromptTone bool `json:"promptTone"`
Proxy string `json:"proxy"`
UseProxy bool `json:"useProxy"`
DeleteSegments bool `json:"deleteSegments"`
OpenInNewWindow bool `json:"openInNewWindow"`
BlockAds bool `json:"blockAds"`
Theme string `json:"theme"`
UseExtension bool `json:"useExtension"`
IsMobile bool `json:"isMobile"`
MaxRunner int `json:"maxRunner"`
Language string `json:"language"`
ShowTerminal bool `json:"showTerminal"`
Privacy bool `json:"privacy"`
MachineId string `json:"machineId"`
DownloadProxySwitch bool `json:"downloadProxySwitch"`
AutoUpgrade bool `json:"autoUpgrade"`
AllowBeta bool `json:"allowBeta"`
CloseMainWindow bool `json:"closeMainWindow"`
AudioMuted bool `json:"audioMuted"`
EnableDocker bool `json:"enableDocker"`
DockerUrl string `json:"dockerUrl"`
EnableMobilePlayer bool `json:"enableMobilePlayer"`
ApiKey string `json:"apiKey"`
PasswordHash string `json:"passwordHash"`
}
// DefaultAppStore returns default config values matching the TS appStoreDefaults.
func DefaultAppStore() AppStore {
return AppStore{
Local: "",
PromptTone: true,
Proxy: "",
UseProxy: false,
DeleteSegments: true,
OpenInNewWindow: false,
BlockAds: true,
Theme: "system",
UseExtension: false,
IsMobile: false,
MaxRunner: 2,
Language: "system",
ShowTerminal: false,
Privacy: false,
MachineId: "",
DownloadProxySwitch: false,
AutoUpgrade: true,
AllowBeta: false,
CloseMainWindow: false,
AudioMuted: true,
EnableDocker: false,
DockerUrl: "",
EnableMobilePlayer: false,
ApiKey: "",
PasswordHash: "",
}
}
+107
View File
@@ -0,0 +1,107 @@
package app
import (
"os"
"path/filepath"
)
// AppConfig stores startup configuration options passed by flags or environment.
type AppConfig struct {
GinMode string `json:"gin_mode"`
Host string `json:"host"`
Port string `json:"port"`
LogLevel string `json:"log_level"`
LogDir string `json:"log_dir"`
SchemaPath string `json:"schema_path"`
DepsDir string `json:"deps_dir"`
MaxRunner int `json:"max_runner"`
LocalDir string `json:"local_dir"`
DeleteSegments bool `json:"delete_segments"`
Proxy string `json:"proxy"`
UseProxy bool `json:"use_proxy"`
DBPath string `json:"db_path"`
ConfigDir string `json:"config_dir"`
EnableAuth bool `json:"enable_auth"`
StaticDir string `json:"static_dir"`
}
func DefaultConfig() *AppConfig {
return &AppConfig{
GinMode: "release",
Host: "0.0.0.0",
Port: "8080",
LogLevel: "info",
LogDir: "./logs",
SchemaPath: "",
DepsDir: "",
MaxRunner: 2,
LocalDir: "./downloads",
DeleteSegments: true,
Proxy: "",
UseProxy: false,
ConfigDir: "",
}
}
func (c *AppConfig) ApplyEnvAndDefaults() {
c.GinMode = getEnv("GIN_MODE", c.GinMode)
c.Host = getEnv("HOST", c.Host)
c.Port = getEnv("PORT", c.Port)
c.DBPath = getEnv("DB_PATH", c.DBPath)
if c.SchemaPath == "" {
c.SchemaPath = getDefaultSchemaPath()
}
if c.ConfigDir == "" {
c.ConfigDir = c.LogDir
}
}
func (c *AppConfig) GetLocalDir() string {
return c.LocalDir
}
func (c *AppConfig) GetDeleteSegments() bool {
return c.DeleteSegments
}
func (c *AppConfig) GetProxy() string {
return c.Proxy
}
func (c *AppConfig) GetUseProxy() bool {
return c.UseProxy
}
func (c *AppConfig) SetLocalDir(dir string) {
c.LocalDir = dir
}
func (c *AppConfig) SetDeleteSegments(del bool) {
c.DeleteSegments = del
}
func (c *AppConfig) SetProxy(proxy string) {
c.Proxy = proxy
}
func (c *AppConfig) SetUseProxy(useProxy bool) {
c.UseProxy = useProxy
}
func getDefaultSchemaPath() string {
execPath, _ := os.Executable()
execDir := filepath.Dir(execPath)
localConfig := filepath.Join(execDir, "config.json")
if _, err := os.Stat(localConfig); err == nil {
return localConfig
}
return "configs/config.json"
}
func getEnv(key, def string) string {
if v := os.Getenv(key); v != "" {
return v
}
return def
}
+232
View File
@@ -0,0 +1,232 @@
package app
import (
"fmt"
"os"
"path/filepath"
"runtime"
"github.com/google/uuid"
"caorushizi.cn/mediago/internal/core"
"caorushizi.cn/mediago/internal/core/runner"
"caorushizi.cn/mediago/internal/core/schema"
"caorushizi.cn/mediago/internal/db"
"caorushizi.cn/mediago/internal/logger"
"caorushizi.cn/mediago/internal/tasklog"
"caorushizi.cn/mediago/pkg/conf"
)
type Runtime struct {
Config *AppConfig
AppStore *conf.Conf[AppStore]
Downloader *core.DownloaderSvc
Queue *core.TaskQueue
TaskLogs *tasklog.Manager
Database *db.Database
}
func InitLogger(cfg *AppConfig) error {
logCfg := logger.DefaultConfig()
logCfg.Level = cfg.LogLevel
logCfg.LogDir = cfg.LogDir
if err := logger.Init(logCfg); err != nil {
return fmt.Errorf("failed to initialize logger: %w", err)
}
return nil
}
func NewRuntime(cfg *AppConfig) (*Runtime, error) {
logger.Info("MediaGo Downloader Core Starting...")
logger.Infof("Final Config: %+v", cfg)
appStore, err := conf.New(conf.Options[AppStore]{
ConfigName: "config",
CWD: cfg.ConfigDir,
Defaults: DefaultAppStore(),
})
if err != nil {
return nil, fmt.Errorf("failed to initialize app store: %w", err)
}
logger.Infof("App store initialized at: %s", appStore.Path())
if appStore.Store().MachineId == "" {
newId := uuid.New().String()
_ = appStore.Set("machineId", newId)
logger.Infof("Generated new machineId: %s", newId)
}
syncAppStoreToCfg(appStore, cfg)
ensureDownloadDir(appStore, cfg)
logger.Infof("Loading schemas from: %s", cfg.SchemaPath)
schemas, err := schema.LoadSchemasFromJSON(cfg.SchemaPath)
if err != nil {
return nil, fmt.Errorf("failed to load schemas: %w", err)
}
logger.Infof("Loaded %d download schemas", len(schemas.Schemas))
binMap := getBinaryMap(cfg)
for dt, binPath := range binMap {
logger.Infof("%s downloader: %s", dt, binPath)
if binPath == "" {
continue
}
if info, err := os.Stat(binPath); err != nil {
logger.Warnf("%s binary not found: %v", dt, err)
} else if info.Mode()&0o111 == 0 {
logger.Warnf("%s binary is not executable: %s", dt, binPath)
}
}
r := runner.NewPTYRunner()
downloader := core.NewDownloader(binMap, r, schemas, cfg)
queue := core.NewTaskQueue(downloader, cfg.MaxRunner)
taskLogs := tasklog.NewManager(filepath.Join(cfg.LogDir, "tasks"))
logger.Infof("Task queue initialized (maxRunner=%d)", cfg.MaxRunner)
logger.Infof("Task logs will be stored in %s", filepath.Join(cfg.LogDir, "tasks"))
appStore.OnDidChange("maxRunner", func(newVal, oldVal any) {
if v, ok := toInt(newVal); ok {
queue.SetMaxRunner(v)
logger.Infof("maxRunner updated to %d via config change", v)
}
})
appStore.OnDidChange("proxy", func(newVal, oldVal any) {
if v, ok := newVal.(string); ok {
cfg.SetProxy(v)
logger.Infof("proxy updated to %q via config change", v)
}
})
appStore.OnDidChange("useProxy", func(newVal, oldVal any) {
if v, ok := newVal.(bool); ok {
cfg.SetUseProxy(v)
logger.Infof("useProxy updated to %v via config change", v)
}
})
appStore.OnDidChange("deleteSegments", func(newVal, oldVal any) {
if v, ok := newVal.(bool); ok {
cfg.SetDeleteSegments(v)
logger.Infof("deleteSegments updated to %v via config change", v)
}
})
appStore.OnDidChange("local", func(newVal, oldVal any) {
if v, ok := newVal.(string); ok {
cfg.SetLocalDir(v)
logger.Infof("localDir updated to %q via config change", v)
}
})
var database *db.Database
if cfg.DBPath != "" {
if dir := filepath.Dir(cfg.DBPath); dir != "" {
if err := os.MkdirAll(dir, 0o755); err != nil {
return nil, fmt.Errorf("failed to create database directory %s: %w", dir, err)
}
}
var dbErr error
database, dbErr = db.New(cfg.DBPath)
if dbErr != nil {
return nil, fmt.Errorf("failed to open database: %w", dbErr)
}
logger.Infof("Database opened: %s", cfg.DBPath)
} else {
logger.Info("No database path provided, running without persistence")
}
return &Runtime{
Config: cfg,
AppStore: appStore,
Downloader: downloader,
Queue: queue,
TaskLogs: taskLogs,
Database: database,
}, nil
}
func (rt *Runtime) Close() {
if rt.Database != nil {
_ = rt.Database.Close()
}
}
func syncAppStoreToCfg(store *conf.Conf[AppStore], cfg *AppConfig) {
s := store.Store()
cliLocalDir := cfg.LocalDir
cliExplicit := cliLocalDir != "" && cliLocalDir != "./downloads"
if cliExplicit {
_ = store.Set("local", cliLocalDir)
} else if s.Local != "" {
cfg.LocalDir = s.Local
}
cfg.Proxy = s.Proxy
cfg.UseProxy = s.UseProxy
cfg.DeleteSegments = s.DeleteSegments
if s.MaxRunner > 0 {
cfg.MaxRunner = s.MaxRunner
}
}
func ensureDownloadDir(store *conf.Conf[AppStore], cfg *AppConfig) {
needDefault := cfg.LocalDir == "" || cfg.LocalDir == "./downloads"
if !needDefault {
if info, err := os.Stat(cfg.LocalDir); err != nil || !info.IsDir() {
needDefault = true
}
}
if needDefault {
sysDownloads := getSystemDownloadsDir()
logger.Infof("Download dir %q unavailable, using system default: %s", cfg.LocalDir, sysDownloads)
cfg.LocalDir = sysDownloads
}
if store.Store().Local == "" {
_ = store.Set("local", cfg.LocalDir)
}
}
func getSystemDownloadsDir() string {
home, err := os.UserHomeDir()
if err != nil {
return "."
}
downloads := filepath.Join(home, "Downloads")
if info, err := os.Stat(downloads); err == nil && info.IsDir() {
return downloads
}
return home
}
func exeExt() string {
if runtime.GOOS == "windows" {
return ".exe"
}
return ""
}
func getBinaryMap(cfg *AppConfig) map[core.DownloadType]string {
ext := exeExt()
m := make(map[core.DownloadType]string, len(core.BinaryNames))
for dt, name := range core.BinaryNames {
m[dt] = filepath.Join(cfg.DepsDir, name+ext)
}
return m
}
func FFmpegBinPath(cfg *AppConfig) string {
return filepath.Join(cfg.DepsDir, core.FFmpegBinaryName+exeExt())
}
func toInt(v any) (int, bool) {
switch n := v.(type) {
case float64:
return int(n), true
case int:
return n, true
case int64:
return int(n), true
}
return 0, false
}