@steipete/summarize 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -1
- package/README.md +63 -17
- package/dist/cli.js +1 -1
- package/dist/esm/cache-keys.js +75 -0
- package/dist/esm/cache-keys.js.map +1 -0
- package/dist/esm/cache-slides-cleanup.js +47 -0
- package/dist/esm/cache-slides-cleanup.js.map +1 -0
- package/dist/esm/cache.js +14 -91
- package/dist/esm/cache.js.map +1 -1
- package/dist/esm/config/env.js +49 -0
- package/dist/esm/config/env.js.map +1 -0
- package/dist/esm/config/model.js +193 -0
- package/dist/esm/config/model.js.map +1 -0
- package/dist/esm/config/parse-helpers.js +50 -0
- package/dist/esm/config/parse-helpers.js.map +1 -0
- package/dist/esm/config/read.js +83 -0
- package/dist/esm/config/read.js.map +1 -0
- package/dist/esm/config/sections.js +438 -0
- package/dist/esm/config/sections.js.map +1 -0
- package/dist/esm/config/types.js +2 -0
- package/dist/esm/config/types.js.map +1 -0
- package/dist/esm/config.js +24 -807
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/content/asset.js +2 -2
- package/dist/esm/content/asset.js.map +1 -1
- package/dist/esm/daemon/agent-model.js +235 -0
- package/dist/esm/daemon/agent-model.js.map +1 -0
- package/dist/esm/daemon/agent-request.js +87 -0
- package/dist/esm/daemon/agent-request.js.map +1 -0
- package/dist/esm/daemon/agent.js +42 -243
- package/dist/esm/daemon/agent.js.map +1 -1
- package/dist/esm/daemon/chat.js +69 -8
- package/dist/esm/daemon/chat.js.map +1 -1
- package/dist/esm/daemon/cli.js +21 -4
- package/dist/esm/daemon/cli.js.map +1 -1
- package/dist/esm/daemon/config.js +65 -9
- package/dist/esm/daemon/config.js.map +1 -1
- package/dist/esm/daemon/env-snapshot.js +4 -0
- package/dist/esm/daemon/env-snapshot.js.map +1 -1
- package/dist/esm/daemon/flow-context.js +8 -1
- package/dist/esm/daemon/flow-context.js.map +1 -1
- package/dist/esm/daemon/models.js +16 -0
- package/dist/esm/daemon/models.js.map +1 -1
- package/dist/esm/daemon/process-registry.js.map +1 -1
- package/dist/esm/daemon/server-admin-routes.js +134 -0
- package/dist/esm/daemon/server-admin-routes.js.map +1 -0
- package/dist/esm/daemon/server-agent-route.js +104 -0
- package/dist/esm/daemon/server-agent-route.js.map +1 -0
- package/dist/esm/daemon/server-http.js +89 -0
- package/dist/esm/daemon/server-http.js.map +1 -0
- package/dist/esm/daemon/server-session-routes.js +209 -0
- package/dist/esm/daemon/server-session-routes.js.map +1 -0
- package/dist/esm/daemon/server-session.js +118 -0
- package/dist/esm/daemon/server-session.js.map +1 -0
- package/dist/esm/daemon/server-sse.js +28 -0
- package/dist/esm/daemon/server-sse.js.map +1 -0
- package/dist/esm/daemon/server-summarize-execution.js +357 -0
- package/dist/esm/daemon/server-summarize-execution.js.map +1 -0
- package/dist/esm/daemon/server-summarize-request.js +119 -0
- package/dist/esm/daemon/server-summarize-request.js.map +1 -0
- package/dist/esm/daemon/server.js +72 -1121
- package/dist/esm/daemon/server.js.map +1 -1
- package/dist/esm/daemon/summarize-progress.js +1 -1
- package/dist/esm/daemon/summarize-progress.js.map +1 -1
- package/dist/esm/daemon/summarize.js.map +1 -1
- package/dist/esm/llm/cli-exec.js +75 -0
- package/dist/esm/llm/cli-exec.js.map +1 -0
- package/dist/esm/llm/cli-provider-output.js +191 -0
- package/dist/esm/llm/cli-provider-output.js.map +1 -0
- package/dist/esm/llm/cli.js +3 -212
- package/dist/esm/llm/cli.js.map +1 -1
- package/dist/esm/llm/generate-text-document.js +109 -0
- package/dist/esm/llm/generate-text-document.js.map +1 -0
- package/dist/esm/llm/generate-text-shared.js +102 -0
- package/dist/esm/llm/generate-text-shared.js.map +1 -0
- package/dist/esm/llm/generate-text-stream.js +258 -0
- package/dist/esm/llm/generate-text-stream.js.map +1 -0
- package/dist/esm/llm/generate-text.js +145 -480
- package/dist/esm/llm/generate-text.js.map +1 -1
- package/dist/esm/llm/model-id.js +21 -20
- package/dist/esm/llm/model-id.js.map +1 -1
- package/dist/esm/llm/provider-capabilities.js +2 -0
- package/dist/esm/llm/provider-capabilities.js.map +1 -0
- package/dist/esm/llm/provider-profile.js +142 -0
- package/dist/esm/llm/provider-profile.js.map +1 -0
- package/dist/esm/llm/providers/google.js +42 -5
- package/dist/esm/llm/providers/google.js.map +1 -1
- package/dist/esm/llm/providers/models.js +13 -0
- package/dist/esm/llm/providers/models.js.map +1 -1
- package/dist/esm/llm/providers/openai.js.map +1 -1
- package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
- package/dist/esm/model-auto-cli.js +89 -0
- package/dist/esm/model-auto-cli.js.map +1 -0
- package/dist/esm/model-auto-rules.js +86 -0
- package/dist/esm/model-auto-rules.js.map +1 -0
- package/dist/esm/model-auto.js +10 -245
- package/dist/esm/model-auto.js.map +1 -1
- package/dist/esm/model-spec.js +23 -17
- package/dist/esm/model-spec.js.map +1 -1
- package/dist/esm/refresh-free.js +1 -1
- package/dist/esm/refresh-free.js.map +1 -1
- package/dist/esm/run/attachments.js +1 -1
- package/dist/esm/run/attachments.js.map +1 -1
- package/dist/esm/run/bird/exec.js +23 -0
- package/dist/esm/run/bird/exec.js.map +1 -0
- package/dist/esm/run/bird/media.js +171 -0
- package/dist/esm/run/bird/media.js.map +1 -0
- package/dist/esm/run/bird/parse.js +82 -0
- package/dist/esm/run/bird/parse.js.map +1 -0
- package/dist/esm/run/bird/types.js +2 -0
- package/dist/esm/run/bird/types.js.map +1 -0
- package/dist/esm/run/bird.js +86 -144
- package/dist/esm/run/bird.js.map +1 -1
- package/dist/esm/run/cache-state.js.map +1 -1
- package/dist/esm/run/constants.js +2 -1
- package/dist/esm/run/constants.js.map +1 -1
- package/dist/esm/run/env.js +3 -0
- package/dist/esm/run/env.js.map +1 -1
- package/dist/esm/run/finish-line-labels.js +76 -0
- package/dist/esm/run/finish-line-labels.js.map +1 -0
- package/dist/esm/run/finish-line-lengths.js +96 -0
- package/dist/esm/run/finish-line-lengths.js.map +1 -0
- package/dist/esm/run/finish-line.js +3 -169
- package/dist/esm/run/finish-line.js.map +1 -1
- package/dist/esm/run/flows/asset/extract.js.map +1 -1
- package/dist/esm/run/flows/asset/input.js +1 -1
- package/dist/esm/run/flows/asset/input.js.map +1 -1
- package/dist/esm/run/flows/asset/media.js +19 -10
- package/dist/esm/run/flows/asset/media.js.map +1 -1
- package/dist/esm/run/flows/asset/output.js.map +1 -1
- package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
- package/dist/esm/run/flows/asset/summary-attempts.js +109 -0
- package/dist/esm/run/flows/asset/summary-attempts.js.map +1 -0
- package/dist/esm/run/flows/asset/summary.js +19 -107
- package/dist/esm/run/flows/asset/summary.js.map +1 -1
- package/dist/esm/run/flows/url/extract.js +7 -4
- package/dist/esm/run/flows/url/extract.js.map +1 -1
- package/dist/esm/run/flows/url/flow-progress.js +119 -0
- package/dist/esm/run/flows/url/flow-progress.js.map +1 -0
- package/dist/esm/run/flows/url/flow.js +22 -93
- package/dist/esm/run/flows/url/flow.js.map +1 -1
- package/dist/esm/run/flows/url/markdown.js +21 -3
- package/dist/esm/run/flows/url/markdown.js.map +1 -1
- package/dist/esm/run/flows/url/progress-status.js +56 -0
- package/dist/esm/run/flows/url/progress-status.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output-render.js +78 -0
- package/dist/esm/run/flows/url/slides-output-render.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output-state.js +86 -0
- package/dist/esm/run/flows/url/slides-output-state.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output-stream.js +271 -0
- package/dist/esm/run/flows/url/slides-output-stream.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output.js +29 -422
- package/dist/esm/run/flows/url/slides-output.js.map +1 -1
- package/dist/esm/run/flows/url/slides-text-markdown.js +431 -0
- package/dist/esm/run/flows/url/slides-text-markdown.js.map +1 -0
- package/dist/esm/run/flows/url/slides-text-transcript.js +199 -0
- package/dist/esm/run/flows/url/slides-text-transcript.js.map +1 -0
- package/dist/esm/run/flows/url/slides-text-types.js +2 -0
- package/dist/esm/run/flows/url/slides-text-types.js.map +1 -0
- package/dist/esm/run/flows/url/slides-text.js +2 -627
- package/dist/esm/run/flows/url/slides-text.js.map +1 -1
- package/dist/esm/run/flows/url/summary-finish.js +34 -0
- package/dist/esm/run/flows/url/summary-finish.js.map +1 -0
- package/dist/esm/run/flows/url/summary-json.js +32 -0
- package/dist/esm/run/flows/url/summary-json.js.map +1 -0
- package/dist/esm/run/flows/url/summary-prompt.js +147 -0
- package/dist/esm/run/flows/url/summary-prompt.js.map +1 -0
- package/dist/esm/run/flows/url/summary-resolution.js +320 -0
- package/dist/esm/run/flows/url/summary-resolution.js.map +1 -0
- package/dist/esm/run/flows/url/summary-timestamps.js +136 -0
- package/dist/esm/run/flows/url/summary-timestamps.js.map +1 -0
- package/dist/esm/run/flows/url/summary.js +49 -543
- package/dist/esm/run/flows/url/summary.js.map +1 -1
- package/dist/esm/run/help.js +9 -3
- package/dist/esm/run/help.js.map +1 -1
- package/dist/esm/run/markdown-transforms.js +89 -0
- package/dist/esm/run/markdown-transforms.js.map +1 -0
- package/dist/esm/run/markdown.js +1 -96
- package/dist/esm/run/markdown.js.map +1 -1
- package/dist/esm/run/run-env.js +28 -7
- package/dist/esm/run/run-env.js.map +1 -1
- package/dist/esm/run/run-settings-parse.js +73 -0
- package/dist/esm/run/run-settings-parse.js.map +1 -0
- package/dist/esm/run/run-settings.js +1 -72
- package/dist/esm/run/run-settings.js.map +1 -1
- package/dist/esm/run/runner-contexts.js +116 -0
- package/dist/esm/run/runner-contexts.js.map +1 -0
- package/dist/esm/run/runner-execution.js +62 -0
- package/dist/esm/run/runner-execution.js.map +1 -0
- package/dist/esm/run/runner-flags.js +97 -0
- package/dist/esm/run/runner-flags.js.map +1 -0
- package/dist/esm/run/runner-setup.js +109 -0
- package/dist/esm/run/runner-setup.js.map +1 -0
- package/dist/esm/run/runner-slides.js +38 -0
- package/dist/esm/run/runner-slides.js.map +1 -0
- package/dist/esm/run/runner.js +99 -390
- package/dist/esm/run/runner.js.map +1 -1
- package/dist/esm/run/slides-render.js +5 -2
- package/dist/esm/run/slides-render.js.map +1 -1
- package/dist/esm/run/stdin-temp-file.js +1 -1
- package/dist/esm/run/stdin-temp-file.js.map +1 -1
- package/dist/esm/run/streaming.js +1 -0
- package/dist/esm/run/streaming.js.map +1 -1
- package/dist/esm/run/summary-engine.js +26 -10
- package/dist/esm/run/summary-engine.js.map +1 -1
- package/dist/esm/run/summary-llm.js +2 -1
- package/dist/esm/run/summary-llm.js.map +1 -1
- package/dist/esm/run/terminal.js +4 -1
- package/dist/esm/run/terminal.js.map +1 -1
- package/dist/esm/run/transcriber-cli.js +1 -1
- package/dist/esm/run/transcriber-cli.js.map +1 -1
- package/dist/esm/slides/download.js +242 -0
- package/dist/esm/slides/download.js.map +1 -0
- package/dist/esm/slides/extract-finalize.js +98 -0
- package/dist/esm/slides/extract-finalize.js.map +1 -0
- package/dist/esm/slides/extract.js +64 -1621
- package/dist/esm/slides/extract.js.map +1 -1
- package/dist/esm/slides/frame-extraction.js +372 -0
- package/dist/esm/slides/frame-extraction.js.map +1 -0
- package/dist/esm/slides/ingest.js +167 -0
- package/dist/esm/slides/ingest.js.map +1 -0
- package/dist/esm/slides/ocr.js +91 -0
- package/dist/esm/slides/ocr.js.map +1 -0
- package/dist/esm/slides/process.js +218 -0
- package/dist/esm/slides/process.js.map +1 -0
- package/dist/esm/slides/scene-detection.js +387 -0
- package/dist/esm/slides/scene-detection.js.map +1 -0
- package/dist/esm/slides/source-id.js +42 -0
- package/dist/esm/slides/source-id.js.map +1 -0
- package/dist/esm/tty/progress/fetch-html.js.map +1 -1
- package/dist/esm/tty/progress/transcript.js +21 -8
- package/dist/esm/tty/progress/transcript.js.map +1 -1
- package/dist/esm/tty/spinner.js +8 -2
- package/dist/esm/tty/spinner.js.map +1 -1
- package/dist/esm/tty/website-progress.js +5 -3
- package/dist/esm/tty/website-progress.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/types/cache-keys.d.ts +44 -0
- package/dist/types/cache-slides-cleanup.d.ts +1 -0
- package/dist/types/cache.d.ts +1 -9
- package/dist/types/config/env.d.ts +6 -0
- package/dist/types/config/model.d.ts +3 -0
- package/dist/types/config/parse-helpers.d.ts +7 -0
- package/dist/types/config/read.d.ts +2 -0
- package/dist/types/config/sections.d.ts +33 -0
- package/dist/types/config/types.d.ts +230 -0
- package/dist/types/config.d.ts +3 -209
- package/dist/types/costs.d.ts +1 -1
- package/dist/types/daemon/agent-model.d.ts +40 -0
- package/dist/types/daemon/agent-request.d.ts +14 -0
- package/dist/types/daemon/chat.d.ts +3 -1
- package/dist/types/daemon/config.d.ts +13 -2
- package/dist/types/daemon/env-snapshot.d.ts +1 -1
- package/dist/types/daemon/flow-context.d.ts +1 -1
- package/dist/types/daemon/models.d.ts +1 -0
- package/dist/types/daemon/server-admin-routes.d.ts +22 -0
- package/dist/types/daemon/server-agent-route.d.ts +9 -0
- package/dist/types/daemon/server-http.d.ts +10 -0
- package/dist/types/daemon/server-session-routes.d.ts +11 -0
- package/dist/types/daemon/server-session.d.ts +52 -0
- package/dist/types/daemon/server-sse.d.ts +12 -0
- package/dist/types/daemon/server-summarize-execution.d.ts +70 -0
- package/dist/types/daemon/server-summarize-request.d.ts +36 -0
- package/dist/types/daemon/server.d.ts +3 -4
- package/dist/types/daemon/summarize.d.ts +1 -1
- package/dist/types/llm/cli-exec.d.ts +13 -0
- package/dist/types/llm/cli-provider-output.d.ts +16 -0
- package/dist/types/llm/generate-text-document.d.ts +34 -0
- package/dist/types/llm/generate-text-shared.d.ts +25 -0
- package/dist/types/llm/generate-text-stream.d.ts +26 -0
- package/dist/types/llm/generate-text.d.ts +6 -26
- package/dist/types/llm/html-to-markdown.d.ts +1 -1
- package/dist/types/llm/model-id.d.ts +1 -1
- package/dist/types/llm/provider-capabilities.d.ts +2 -0
- package/dist/types/llm/provider-profile.d.ts +31 -0
- package/dist/types/llm/providers/google.d.ts +6 -0
- package/dist/types/llm/providers/models.d.ts +5 -0
- package/dist/types/llm/transcript-to-markdown.d.ts +1 -1
- package/dist/types/model-auto-cli.d.ts +15 -0
- package/dist/types/model-auto-rules.d.ts +7 -0
- package/dist/types/model-auto.d.ts +5 -7
- package/dist/types/model-spec.d.ts +2 -2
- package/dist/types/run/attachments.d.ts +2 -2
- package/dist/types/run/bird/exec.d.ts +1 -0
- package/dist/types/run/bird/media.d.ts +3 -0
- package/dist/types/run/bird/parse.d.ts +3 -0
- package/dist/types/run/bird/types.d.ts +18 -0
- package/dist/types/run/bird.d.ts +12 -17
- package/dist/types/run/cache-state.d.ts +1 -1
- package/dist/types/run/constants.d.ts +2 -1
- package/dist/types/run/env.d.ts +1 -0
- package/dist/types/run/finish-line-labels.d.ts +29 -0
- package/dist/types/run/finish-line-lengths.d.ts +23 -0
- package/dist/types/run/finish-line.d.ts +2 -52
- package/dist/types/run/flows/asset/extract.d.ts +1 -1
- package/dist/types/run/flows/asset/input.d.ts +1 -1
- package/dist/types/run/flows/asset/preprocess.d.ts +1 -1
- package/dist/types/run/flows/asset/summary-attempts.d.ts +24 -0
- package/dist/types/run/flows/asset/summary.d.ts +6 -2
- package/dist/types/run/flows/url/flow-progress.d.ts +41 -0
- package/dist/types/run/flows/url/markdown.d.ts +2 -2
- package/dist/types/run/flows/url/progress-status.d.ts +16 -0
- package/dist/types/run/flows/url/slides-output-render.d.ts +43 -0
- package/dist/types/run/flows/url/slides-output-state.d.ts +21 -0
- package/dist/types/run/flows/url/slides-output-stream.d.ts +18 -0
- package/dist/types/run/flows/url/slides-output.d.ts +2 -17
- package/dist/types/run/flows/url/slides-text-markdown.d.ts +46 -0
- package/dist/types/run/flows/url/slides-text-transcript.d.ts +36 -0
- package/dist/types/run/flows/url/slides-text-types.d.ts +8 -0
- package/dist/types/run/flows/url/slides-text.d.ts +3 -87
- package/dist/types/run/flows/url/summary-finish.d.ts +16 -0
- package/dist/types/run/flows/url/summary-json.d.ts +51 -0
- package/dist/types/run/flows/url/summary-prompt.d.ts +22 -0
- package/dist/types/run/flows/url/summary-resolution.d.ts +31 -0
- package/dist/types/run/flows/url/summary-timestamps.d.ts +11 -0
- package/dist/types/run/flows/url/types.d.ts +4 -0
- package/dist/types/run/markdown-transforms.d.ts +3 -0
- package/dist/types/run/run-context.d.ts +4 -0
- package/dist/types/run/run-env.d.ts +4 -0
- package/dist/types/run/run-settings-parse.d.ts +5 -0
- package/dist/types/run/runner-contexts.d.ts +62 -0
- package/dist/types/run/runner-execution.d.ts +57 -0
- package/dist/types/run/runner-flags.d.ts +41 -0
- package/dist/types/run/runner-setup.d.ts +21 -0
- package/dist/types/run/runner-slides.d.ts +8 -0
- package/dist/types/run/streaming.d.ts +1 -1
- package/dist/types/run/summary-engine.d.ts +8 -4
- package/dist/types/run/summary-llm.d.ts +4 -3
- package/dist/types/run/terminal.d.ts +2 -0
- package/dist/types/run/types.d.ts +2 -2
- package/dist/types/slides/download.d.ts +29 -0
- package/dist/types/slides/extract-finalize.d.ts +57 -0
- package/dist/types/slides/extract.d.ts +1 -7
- package/dist/types/slides/frame-extraction.d.ts +38 -0
- package/dist/types/slides/ingest.d.ts +47 -0
- package/dist/types/slides/ocr.d.ts +5 -0
- package/dist/types/slides/process.d.ts +22 -0
- package/dist/types/slides/scene-detection.d.ts +75 -0
- package/dist/types/slides/source-id.d.ts +2 -0
- package/dist/types/version.d.ts +1 -1
- package/docs/_config.yml +1 -0
- package/docs/agent.md +3 -2
- package/docs/assets/site.css +134 -2
- package/docs/cache.md +2 -1
- package/docs/chrome-extension.md +12 -4
- package/docs/cli.md +2 -2
- package/docs/config.md +11 -4
- package/docs/index.html +5 -0
- package/docs/llm.md +5 -2
- package/docs/manual-tests.md +3 -0
- package/docs/media.md +3 -1
- package/docs/model-auto.md +2 -2
- package/docs/model-provider-resolution.md +57 -0
- package/docs/site/index.html +5 -0
- package/docs/slides-rendering-flow.md +46 -0
- package/docs/slides.md +5 -5
- package/docs/smoketest.md +1 -1
- package/docs/transcript-provider-flow.md +66 -0
- package/docs/website.md +1 -0
- package/docs/youtube.md +4 -2
- package/package.json +11 -11
package/dist/esm/run/bird.js
CHANGED
|
@@ -1,115 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { execTweetCli } from "./bird/exec.js";
|
|
2
|
+
import { parseBirdTweetPayload, parseXurlTweetPayload } from "./bird/parse.js";
|
|
2
3
|
import { BIRD_TIP, TWITTER_HOSTS } from "./constants.js";
|
|
3
|
-
import { hasBirdCli } from "./env.js";
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
const asString = (value) => (typeof value === "string" ? value : null);
|
|
8
|
-
const isLikelyVideoUrl = (url) => url.includes("video.twimg.com") || url.includes("/i/broadcasts/") || url.endsWith(".m3u8");
|
|
9
|
-
const addUrl = (set, value) => {
|
|
10
|
-
if (!value)
|
|
11
|
-
return;
|
|
12
|
-
if (!URL_PREFIX_PATTERN.test(value))
|
|
13
|
-
return;
|
|
14
|
-
set.add(value);
|
|
15
|
-
};
|
|
16
|
-
function extractMediaFromBirdRaw(raw) {
|
|
17
|
-
const root = asRecord(raw);
|
|
18
|
-
if (!root)
|
|
4
|
+
import { hasBirdCli, hasXurlCli } from "./env.js";
|
|
5
|
+
function parseTweetId(raw) {
|
|
6
|
+
const trimmed = raw.trim();
|
|
7
|
+
if (!trimmed)
|
|
19
8
|
return null;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const media = asRecord(entry);
|
|
30
|
-
const mediaType = asString(media?.type);
|
|
31
|
-
if (mediaType === "audio") {
|
|
32
|
-
kind = "audio";
|
|
33
|
-
}
|
|
34
|
-
if (mediaType !== "video" && mediaType !== "animated_gif" && mediaType !== "audio") {
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
const videoInfo = asRecord(media?.video_info);
|
|
38
|
-
const variants = asArray(videoInfo?.variants);
|
|
39
|
-
if (!variants)
|
|
40
|
-
continue;
|
|
41
|
-
for (const variant of variants) {
|
|
42
|
-
const variantRecord = asRecord(variant);
|
|
43
|
-
const url = asString(variantRecord?.url);
|
|
44
|
-
if (!url)
|
|
45
|
-
continue;
|
|
46
|
-
addUrl(urls, url);
|
|
47
|
-
const contentType = asString(variantRecord?.content_type) ?? "";
|
|
48
|
-
const bitrate = typeof variantRecord?.bitrate === "number" ? variantRecord.bitrate : -1;
|
|
49
|
-
if (contentType.includes("video/mp4") && bitrate >= preferredBitrate) {
|
|
50
|
-
preferredBitrate = bitrate;
|
|
51
|
-
preferredUrl = url;
|
|
52
|
-
}
|
|
53
|
-
else if (!preferredUrl) {
|
|
54
|
-
preferredUrl = url;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (urls.size > 0) {
|
|
59
|
-
return {
|
|
60
|
-
kind,
|
|
61
|
-
urls: Array.from(urls),
|
|
62
|
-
preferredUrl,
|
|
63
|
-
source: "extended_entities",
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
const card = asRecord(root.card);
|
|
68
|
-
const cardLegacy = asRecord(card?.legacy);
|
|
69
|
-
const bindings = asArray(cardLegacy?.binding_values);
|
|
70
|
-
if (bindings) {
|
|
71
|
-
const urls = new Set();
|
|
72
|
-
for (const binding of bindings) {
|
|
73
|
-
const record = asRecord(binding);
|
|
74
|
-
const key = asString(record?.key);
|
|
75
|
-
if (key !== "broadcast_url")
|
|
76
|
-
continue;
|
|
77
|
-
const value = asRecord(record?.value);
|
|
78
|
-
const url = asString(value?.string_value);
|
|
79
|
-
addUrl(urls, url);
|
|
80
|
-
}
|
|
81
|
-
if (urls.size > 0) {
|
|
82
|
-
const preferredUrl = urls.values().next().value ?? null;
|
|
83
|
-
return {
|
|
84
|
-
kind: "video",
|
|
85
|
-
urls: Array.from(urls),
|
|
86
|
-
preferredUrl,
|
|
87
|
-
source: "card",
|
|
88
|
-
};
|
|
89
|
-
}
|
|
9
|
+
if (/^\d+$/.test(trimmed))
|
|
10
|
+
return trimmed;
|
|
11
|
+
try {
|
|
12
|
+
const parsed = new URL(trimmed);
|
|
13
|
+
const host = parsed.hostname.toLowerCase().replace(/^www\./, "");
|
|
14
|
+
if (!TWITTER_HOSTS.has(host))
|
|
15
|
+
return null;
|
|
16
|
+
const match = parsed.pathname.match(/\/status\/(\d+)/);
|
|
17
|
+
return match?.[1] ?? null;
|
|
90
18
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (entityUrls) {
|
|
94
|
-
const urls = new Set();
|
|
95
|
-
for (const entity of entityUrls) {
|
|
96
|
-
const record = asRecord(entity);
|
|
97
|
-
const expanded = asString(record?.expanded_url);
|
|
98
|
-
if (!expanded || !isLikelyVideoUrl(expanded))
|
|
99
|
-
continue;
|
|
100
|
-
addUrl(urls, expanded);
|
|
101
|
-
}
|
|
102
|
-
if (urls.size > 0) {
|
|
103
|
-
const preferredUrl = urls.values().next().value ?? null;
|
|
104
|
-
return {
|
|
105
|
-
kind: "video",
|
|
106
|
-
urls: Array.from(urls),
|
|
107
|
-
preferredUrl,
|
|
108
|
-
source: "entities",
|
|
109
|
-
};
|
|
110
|
-
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
111
21
|
}
|
|
112
|
-
return null;
|
|
113
22
|
}
|
|
114
23
|
function isTwitterStatusUrl(raw) {
|
|
115
24
|
try {
|
|
@@ -123,45 +32,78 @@ function isTwitterStatusUrl(raw) {
|
|
|
123
32
|
return false;
|
|
124
33
|
}
|
|
125
34
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
maxBuffer: 1024 * 1024,
|
|
133
|
-
}, (error, stdout, stderr) => {
|
|
134
|
-
if (error) {
|
|
135
|
-
const detail = toText(stderr).trim();
|
|
136
|
-
const suffix = detail ? `: ${detail}` : "";
|
|
137
|
-
reject(new Error(`bird read failed${suffix}`));
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
const trimmed = toText(stdout).trim();
|
|
141
|
-
if (!trimmed) {
|
|
142
|
-
reject(new Error("bird read returned empty output"));
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
try {
|
|
146
|
-
const parsed = JSON.parse(trimmed);
|
|
147
|
-
const tweet = Array.isArray(parsed) ? parsed[0] : parsed;
|
|
148
|
-
if (!tweet || typeof tweet.text !== "string") {
|
|
149
|
-
reject(new Error("bird read returned invalid payload"));
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
const { _raw, ...rest } = tweet;
|
|
153
|
-
const media = extractMediaFromBirdRaw(_raw);
|
|
154
|
-
resolve({ ...rest, media });
|
|
155
|
-
}
|
|
156
|
-
catch (parseError) {
|
|
157
|
-
const message = parseError instanceof Error ? parseError.message : String(parseError);
|
|
158
|
-
reject(new Error(`bird read returned invalid JSON: ${message}`));
|
|
159
|
-
}
|
|
160
|
-
});
|
|
35
|
+
function buildXurlTweetEndpoint(tweetId) {
|
|
36
|
+
const params = new URLSearchParams({
|
|
37
|
+
expansions: "author_id,attachments.media_keys",
|
|
38
|
+
"tweet.fields": "created_at,attachments,entities,note_tweet,article",
|
|
39
|
+
"user.fields": "username,name",
|
|
40
|
+
"media.fields": "type,url,preview_image_url,variants",
|
|
161
41
|
});
|
|
42
|
+
return `/2/tweets/${tweetId}?${params.toString()}`;
|
|
43
|
+
}
|
|
44
|
+
export async function readTweetWithXurl(args) {
|
|
45
|
+
const tweetId = parseTweetId(args.url);
|
|
46
|
+
if (!tweetId) {
|
|
47
|
+
throw new Error("xurl read requires a tweet status URL or id");
|
|
48
|
+
}
|
|
49
|
+
const stdout = await execTweetCli("xurl", [buildXurlTweetEndpoint(tweetId)], args.timeoutMs, args.env);
|
|
50
|
+
if (!stdout) {
|
|
51
|
+
throw new Error("xurl read returned empty output");
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
return parseXurlTweetPayload(JSON.parse(stdout));
|
|
55
|
+
}
|
|
56
|
+
catch (parseError) {
|
|
57
|
+
if (parseError instanceof Error &&
|
|
58
|
+
(parseError.message.startsWith("xurl read returned") ||
|
|
59
|
+
parseError.message.startsWith("xurl API error"))) {
|
|
60
|
+
throw parseError;
|
|
61
|
+
}
|
|
62
|
+
const message = parseError instanceof Error ? parseError.message : String(parseError);
|
|
63
|
+
throw new Error(`xurl read returned invalid JSON: ${message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function readTweetWithBird(args) {
|
|
67
|
+
const stdout = await execTweetCli("bird", ["read", args.url, "--json-full"], args.timeoutMs, args.env);
|
|
68
|
+
if (!stdout) {
|
|
69
|
+
throw new Error("bird read returned empty output");
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
return parseBirdTweetPayload(JSON.parse(stdout));
|
|
73
|
+
}
|
|
74
|
+
catch (parseError) {
|
|
75
|
+
if (parseError instanceof Error && parseError.message.startsWith("bird read returned")) {
|
|
76
|
+
throw parseError;
|
|
77
|
+
}
|
|
78
|
+
const message = parseError instanceof Error ? parseError.message : String(parseError);
|
|
79
|
+
throw new Error(`bird read returned invalid JSON: ${message}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export async function readTweetWithPreferredClient(args) {
|
|
83
|
+
const attempts = [];
|
|
84
|
+
if (hasXurlCli(args.env)) {
|
|
85
|
+
attempts.push(["xurl", () => readTweetWithXurl(args)]);
|
|
86
|
+
}
|
|
87
|
+
if (hasBirdCli(args.env)) {
|
|
88
|
+
attempts.push(["bird", () => readTweetWithBird(args)]);
|
|
89
|
+
}
|
|
90
|
+
const errors = [];
|
|
91
|
+
for (const [client, run] of attempts) {
|
|
92
|
+
try {
|
|
93
|
+
const tweet = await run();
|
|
94
|
+
return { ...tweet, client };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
errors.push(`${client}: ${error instanceof Error ? error.message : String(error)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (errors.length > 0) {
|
|
101
|
+
throw new Error(errors.join("; "));
|
|
102
|
+
}
|
|
103
|
+
throw new Error("No X CLI available");
|
|
162
104
|
}
|
|
163
105
|
export function withBirdTip(error, url, env) {
|
|
164
|
-
if (!url || !isTwitterStatusUrl(url) || hasBirdCli(env)) {
|
|
106
|
+
if (!url || !isTwitterStatusUrl(url) || hasXurlCli(env) || hasBirdCli(env)) {
|
|
165
107
|
return error instanceof Error ? error : new Error(String(error));
|
|
166
108
|
}
|
|
167
109
|
const message = error instanceof Error ? error.message : String(error);
|
package/dist/esm/run/bird.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bird.js","sourceRoot":"","sources":["../../../src/run/bird.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bird.js","sourceRoot":"","sources":["../../../src/run/bird.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-state.js","sourceRoot":"","sources":["../../../src/run/cache-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cache-state.js","sourceRoot":"","sources":["../../../src/run/cache-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAEL,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,SAAS,EACT,MAAM,EACN,WAAW,GAAG,KAAK,EACnB,mBAAmB,GAAG,IAAI,GAM3B;IACC,MAAM,YAAY,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,gBAAgB,CAAC;QACjC,GAAG,EAAE,SAAS;QACd,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI;KACvC,CAAC,CAAC;IACH,MAAM,UAAU,GACd,OAAO,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACvF,MAAM,YAAY,GAChB,OAAO,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAC7F,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACnE,MAAM,SAAS,GACb,CAAC,YAAY,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,MAAM,UAAU,GACd,SAAS,KAAK,SAAS,IAAI,SAAS;QAClC,CAAC,CAAC,MAAM,gBAAgB,CAAC;YACrB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,aAAa;YACvB,mBAAmB;SACpB,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,aAAa;QACvB,IAAI,EAAE,SAAS;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,UAAU,EACV,mBAAmB,GAAG,IAAI,GAI3B;IACC,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,oFAAoF;QACpF,IAAI,UAAU;YAAE,OAAO,KAAK,CAAC;QAC7B,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,UAAU,CAAC,KAAK,GAAG,MAAM,gBAAgB,CAAC;QACxC,IAAI;QACJ,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,mBAAmB;KACpB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export const
|
|
1
|
+
export const TWITTER_CLI_TIP = "Tip: Install xurl (preferred) or bird for better X support: brew install --cask xdevplatform/tap/xurl";
|
|
2
|
+
export const BIRD_TIP = TWITTER_CLI_TIP;
|
|
2
3
|
export const UVX_TIP = "Tip: Install uv (uvx) for local Markdown conversion: brew install uv (or set UVX_PATH to your uvx binary).";
|
|
3
4
|
export const SUPPORT_URL = "https://github.com/steipete/summarize";
|
|
4
5
|
export const TWITTER_HOSTS = new Set(["x.com", "twitter.com", "mobile.twitter.com"]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/run/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/run/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAC1B,uGAAuG,CAAC;AAC1G,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,CAAC;AACxC,MAAM,CAAC,MAAM,OAAO,GAClB,4GAA4G,CAAC;AAC/G,MAAM,CAAC,MAAM,WAAW,GAAG,uCAAuC,CAAC;AACnE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvD,MAAM,CAAC,MAAM,cAAc,GAAgC;IACzD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE;YACL;gBACE,UAAU,EAAE;oBACV,iEAAiE;oBACjE,sCAAsC;oBACtC,yCAAyC;oBACzC,kCAAkC;oBAClC,yCAAyC;oBACzC,oCAAoC;oBACpC,8CAA8C;iBAC/C;aACF;SACF;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC"}
|
package/dist/esm/run/env.js
CHANGED
|
@@ -29,6 +29,9 @@ export function resolveExecutableInPath(binary, env) {
|
|
|
29
29
|
export function hasBirdCli(env) {
|
|
30
30
|
return resolveExecutableInPath("bird", env) !== null;
|
|
31
31
|
}
|
|
32
|
+
export function hasXurlCli(env) {
|
|
33
|
+
return resolveExecutableInPath("xurl", env) !== null;
|
|
34
|
+
}
|
|
32
35
|
export function hasUvxCli(env) {
|
|
33
36
|
if (typeof env.UVX_PATH === "string" && env.UVX_PATH.trim().length > 0) {
|
|
34
37
|
return true;
|
package/dist/esm/run/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/run/env.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/run/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { formatCompactCount } from "../tty/format.js";
|
|
2
|
+
export function buildExtractFinishLabel(args) {
|
|
3
|
+
const base = args.format === "markdown" ? "markdown" : "text";
|
|
4
|
+
const transcriptProvided = Boolean(args.extracted.diagnostics.transcript?.textProvided);
|
|
5
|
+
if (transcriptProvided) {
|
|
6
|
+
const provider = args.extracted.diagnostics.transcript?.provider;
|
|
7
|
+
return provider ? `${base} via transcript/${provider}` : `${base} via transcript`;
|
|
8
|
+
}
|
|
9
|
+
if (args.format === "markdown") {
|
|
10
|
+
const strategy = String(args.extracted.diagnostics.strategy ?? "");
|
|
11
|
+
const firecrawlUsed = strategy === "firecrawl" || Boolean(args.extracted.diagnostics.firecrawl?.used);
|
|
12
|
+
if (firecrawlUsed)
|
|
13
|
+
return `${base} via firecrawl`;
|
|
14
|
+
if (strategy === "html" && args.markdownMode === "readability") {
|
|
15
|
+
return `${base} via readability`;
|
|
16
|
+
}
|
|
17
|
+
const mdUsed = Boolean(args.extracted.diagnostics.markdown?.used);
|
|
18
|
+
const mdProvider = args.extracted.diagnostics.markdown.provider;
|
|
19
|
+
const mdNotes = args.extracted.diagnostics.markdown.notes ?? null;
|
|
20
|
+
if (mdUsed && mdProvider === "firecrawl") {
|
|
21
|
+
return `${base} via firecrawl`;
|
|
22
|
+
}
|
|
23
|
+
if (mdUsed && mdNotes && mdNotes.toLowerCase().includes("readability html used")) {
|
|
24
|
+
return `${base} via readability`;
|
|
25
|
+
}
|
|
26
|
+
if (mdUsed) {
|
|
27
|
+
if (args.markdownMode === "readability")
|
|
28
|
+
return `${base} via readability`;
|
|
29
|
+
if (args.hasMarkdownLlmCall)
|
|
30
|
+
return `${base} via llm`;
|
|
31
|
+
return `${base} via markitdown`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const strategy = String(args.extracted.diagnostics.strategy ?? "");
|
|
35
|
+
if (strategy === "firecrawl" || args.extracted.diagnostics.firecrawl?.used) {
|
|
36
|
+
return `${base} via firecrawl`;
|
|
37
|
+
}
|
|
38
|
+
if (strategy === "xurl")
|
|
39
|
+
return `${base} via xurl`;
|
|
40
|
+
if (strategy === "bird")
|
|
41
|
+
return `${base} via bird`;
|
|
42
|
+
if (strategy === "nitter")
|
|
43
|
+
return `${base} via nitter`;
|
|
44
|
+
return base;
|
|
45
|
+
}
|
|
46
|
+
export function buildSummaryFinishLabel(args) {
|
|
47
|
+
const strategy = String(args.extracted.diagnostics.strategy ?? "");
|
|
48
|
+
const sources = [];
|
|
49
|
+
if (strategy === "xurl")
|
|
50
|
+
sources.push("xurl");
|
|
51
|
+
if (strategy === "bird")
|
|
52
|
+
sources.push("bird");
|
|
53
|
+
if (strategy === "nitter")
|
|
54
|
+
sources.push("nitter");
|
|
55
|
+
if (strategy === "firecrawl" || args.extracted.diagnostics.firecrawl?.used) {
|
|
56
|
+
sources.push("firecrawl");
|
|
57
|
+
}
|
|
58
|
+
const transcriptProvided = Boolean(args.extracted.diagnostics.transcript?.textProvided);
|
|
59
|
+
const words = typeof args.extracted.wordCount === "number" && Number.isFinite(args.extracted.wordCount)
|
|
60
|
+
? args.extracted.wordCount
|
|
61
|
+
: 0;
|
|
62
|
+
const wordLabel = words > 0 ? `${formatCompactCount(words)} words` : null;
|
|
63
|
+
if (transcriptProvided) {
|
|
64
|
+
if (sources.length === 0)
|
|
65
|
+
return null;
|
|
66
|
+
return `via ${sources.join("+")}`;
|
|
67
|
+
}
|
|
68
|
+
if (sources.length === 0 && !wordLabel)
|
|
69
|
+
return null;
|
|
70
|
+
if (wordLabel && sources.length > 0)
|
|
71
|
+
return `${wordLabel} via ${sources.join("+")}`;
|
|
72
|
+
if (wordLabel)
|
|
73
|
+
return wordLabel;
|
|
74
|
+
return `via ${sources.join("+")}`;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=finish-line-labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish-line-labels.js","sourceRoot":"","sources":["../../../src/run/finish-line-labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAStD,MAAM,UAAU,uBAAuB,CAAC,IAKvC;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9D,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACxF,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC;QACjE,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,mBAAmB,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,iBAAiB,CAAC;IACpF,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,aAAa,GACjB,QAAQ,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClF,IAAI,aAAa;YAAE,OAAO,GAAG,IAAI,gBAAgB,CAAC;QAClD,IAAI,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;YAC/D,OAAO,GAAG,IAAI,kBAAkB,CAAC;QACnC,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;QAElE,IAAI,MAAM,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YACzC,OAAO,GAAG,IAAI,gBAAgB,CAAC;QACjC,CAAC;QACD,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACjF,OAAO,GAAG,IAAI,kBAAkB,CAAC;QACnC,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,IAAI,CAAC,YAAY,KAAK,aAAa;gBAAE,OAAO,GAAG,IAAI,kBAAkB,CAAC;YAC1E,IAAI,IAAI,CAAC,kBAAkB;gBAAE,OAAO,GAAG,IAAI,UAAU,CAAC;YACtD,OAAO,GAAG,IAAI,iBAAiB,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3E,OAAO,GAAG,IAAI,gBAAgB,CAAC;IACjC,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,GAAG,IAAI,WAAW,CAAC;IACnD,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,GAAG,IAAI,WAAW,CAAC;IACnD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,GAAG,IAAI,aAAa,CAAC;IACvD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAEvC;IACC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACxF,MAAM,KAAK,GACT,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QACvF,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS;QAC1B,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,IAAI,kBAAkB,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,SAAS,QAAQ,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACpF,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { formatCompactCount, formatDurationSecondsSmart, formatMinutesSmart, } from "../tty/format.js";
|
|
2
|
+
function inferMediaKindLabelForFinishLine(extracted) {
|
|
3
|
+
if (extracted.siteName === "YouTube" || /youtube\.com|youtu\.be/i.test(extracted.url)) {
|
|
4
|
+
return "video";
|
|
5
|
+
}
|
|
6
|
+
if (extracted.isVideoOnly || extracted.video) {
|
|
7
|
+
return "video";
|
|
8
|
+
}
|
|
9
|
+
const hasTranscript = typeof extracted.transcriptCharacters === "number" && extracted.transcriptCharacters > 0;
|
|
10
|
+
if (!hasTranscript)
|
|
11
|
+
return null;
|
|
12
|
+
return "audio";
|
|
13
|
+
}
|
|
14
|
+
function buildCompactTranscriptPart(extracted) {
|
|
15
|
+
const isYouTube = extracted.siteName === "YouTube" || /youtube\.com|youtu\.be/i.test(extracted.url);
|
|
16
|
+
if (!isYouTube && !extracted.transcriptCharacters)
|
|
17
|
+
return null;
|
|
18
|
+
const transcriptChars = extracted.transcriptCharacters;
|
|
19
|
+
if (typeof transcriptChars !== "number" || transcriptChars <= 0)
|
|
20
|
+
return null;
|
|
21
|
+
const wordEstimate = Math.max(0, Math.round(transcriptChars / 6));
|
|
22
|
+
const transcriptWords = extracted.transcriptWordCount ?? wordEstimate;
|
|
23
|
+
const minutesEstimate = Math.max(0.1, transcriptWords / 160);
|
|
24
|
+
const exactDurationSeconds = typeof extracted.mediaDurationSeconds === "number" && extracted.mediaDurationSeconds > 0
|
|
25
|
+
? extracted.mediaDurationSeconds
|
|
26
|
+
: null;
|
|
27
|
+
const duration = exactDurationSeconds != null
|
|
28
|
+
? formatDurationSecondsSmart(exactDurationSeconds)
|
|
29
|
+
: formatMinutesSmart(minutesEstimate);
|
|
30
|
+
const wordLabel = `${formatCompactCount(transcriptWords)} words`;
|
|
31
|
+
const mediaKind = inferMediaKindLabelForFinishLine(extracted);
|
|
32
|
+
const kindLabel = (() => {
|
|
33
|
+
if (isYouTube)
|
|
34
|
+
return "YouTube";
|
|
35
|
+
if (mediaKind === "audio")
|
|
36
|
+
return "podcast";
|
|
37
|
+
if (mediaKind === "video")
|
|
38
|
+
return "video";
|
|
39
|
+
return null;
|
|
40
|
+
})();
|
|
41
|
+
return kindLabel ? `${duration} ${kindLabel} · ${wordLabel}` : `${duration} · ${wordLabel}`;
|
|
42
|
+
}
|
|
43
|
+
function buildDetailedLengthPartsForExtracted(extracted) {
|
|
44
|
+
const parts = [];
|
|
45
|
+
const isYouTube = extracted.siteName === "YouTube" || /youtube\.com|youtu\.be/i.test(extracted.url);
|
|
46
|
+
if (!isYouTube && !extracted.transcriptCharacters)
|
|
47
|
+
return parts;
|
|
48
|
+
const transcriptChars = extracted.transcriptCharacters;
|
|
49
|
+
const shouldOmitInput = typeof transcriptChars === "number" &&
|
|
50
|
+
transcriptChars > 0 &&
|
|
51
|
+
extracted.totalCharacters > 0 &&
|
|
52
|
+
transcriptChars / extracted.totalCharacters >= 0.95;
|
|
53
|
+
if (!shouldOmitInput) {
|
|
54
|
+
parts.push(`input=${formatCompactCount(extracted.totalCharacters)} chars (~${formatCompactCount(extracted.wordCount)} words)`);
|
|
55
|
+
}
|
|
56
|
+
if (typeof extracted.transcriptCharacters === "number" && extracted.transcriptCharacters > 0) {
|
|
57
|
+
const wordEstimate = Math.max(0, Math.round(extracted.transcriptCharacters / 6));
|
|
58
|
+
const transcriptWords = extracted.transcriptWordCount ?? wordEstimate;
|
|
59
|
+
const minutesEstimate = Math.max(0.1, transcriptWords / 160);
|
|
60
|
+
const details = [
|
|
61
|
+
`~${formatCompactCount(transcriptWords)} words`,
|
|
62
|
+
`${formatCompactCount(extracted.transcriptCharacters)} chars`,
|
|
63
|
+
];
|
|
64
|
+
const durationPart = typeof extracted.mediaDurationSeconds === "number" && extracted.mediaDurationSeconds > 0
|
|
65
|
+
? formatDurationSecondsSmart(extracted.mediaDurationSeconds)
|
|
66
|
+
: formatMinutesSmart(minutesEstimate);
|
|
67
|
+
parts.push(`transcript=${durationPart} (${details.join(" · ")})`);
|
|
68
|
+
}
|
|
69
|
+
const hasTranscript = typeof extracted.transcriptCharacters === "number" && extracted.transcriptCharacters > 0;
|
|
70
|
+
if (hasTranscript && extracted.transcriptSource) {
|
|
71
|
+
const providerSuffix = extracted.transcriptSource === "whisper" &&
|
|
72
|
+
extracted.transcriptionProvider &&
|
|
73
|
+
extracted.transcriptionProvider.trim().length > 0
|
|
74
|
+
? `/${extracted.transcriptionProvider.trim()}`
|
|
75
|
+
: "";
|
|
76
|
+
const cacheStatus = extracted.diagnostics?.transcript?.cacheStatus;
|
|
77
|
+
const cachePart = typeof cacheStatus === "string" && cacheStatus !== "unknown" ? cacheStatus : null;
|
|
78
|
+
const txParts = [`tx=${extracted.transcriptSource}${providerSuffix}`];
|
|
79
|
+
if (cachePart)
|
|
80
|
+
txParts.push(`cache=${cachePart}`);
|
|
81
|
+
parts.push(txParts.join(" "));
|
|
82
|
+
}
|
|
83
|
+
return parts;
|
|
84
|
+
}
|
|
85
|
+
export function buildLengthPartsForFinishLine(extracted, detailed) {
|
|
86
|
+
const compactTranscript = buildCompactTranscriptPart(extracted);
|
|
87
|
+
if (!detailed)
|
|
88
|
+
return compactTranscript ? [`txc=${compactTranscript}`] : null;
|
|
89
|
+
const parts = buildDetailedLengthPartsForExtracted(extracted);
|
|
90
|
+
if (parts.length === 0 && !compactTranscript)
|
|
91
|
+
return null;
|
|
92
|
+
if (compactTranscript)
|
|
93
|
+
parts.unshift(`txc=${compactTranscript}`);
|
|
94
|
+
return parts;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=finish-line-lengths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish-line-lengths.js","sourceRoot":"","sources":["../../../src/run/finish-line-lengths.ts"],"names":[],"mappings":"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"}
|