From cb7f2068b8c4f574ddd3b98d8890d12a86635acc Mon Sep 17 00:00:00 2001 From: Christian Bager Bach Houmann Date: Tue, 16 Jul 2024 14:07:36 +0200 Subject: [PATCH] feat: transcribe with OpenAI's Whisper --- bun.lockb | Bin 0 -> 301115 bytes docs/docs/commands.md | 13 +- docs/docs/transcripts.md | 26 ++ docs/mkdocs.yml | 1 + esbuild.config.mjs | 2 +- package-lock.json | 529 +++++++++++++++++++++++-- package.json | 4 +- src/TemplateEngine.ts | 41 +- src/constants.ts | 26 +- src/downloadEpisode.ts | 74 ++-- src/main.ts | 83 +--- src/services/TranscriptionService.ts | 213 ++++++++++ src/types/IPodNotesSettings.ts | 7 +- src/ui/settings/PodNotesSettingsTab.ts | 68 +++- 14 files changed, 935 insertions(+), 152 deletions(-) create mode 100755 bun.lockb create mode 100644 docs/docs/transcripts.md create mode 100644 src/services/TranscriptionService.ts diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..4bcf8eda90f29b5367b090ff2de47e2bb19a134a GIT binary patch literal 301115 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∨atf9VH+C>-t_^WEEma!4VO))vHOmbdK3 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.9.0" } }, + "node_modules/@biomejs/biome": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.8.3", + "@biomejs/cli-darwin-x64": "1.8.3", + "@biomejs/cli-linux-arm64": "1.8.3", + "@biomejs/cli-linux-arm64-musl": "1.8.3", + "@biomejs/cli-linux-x64": "1.8.3", + "@biomejs/cli-linux-x64-musl": "1.8.3", + "@biomejs/cli-win32-arm64": "1.8.3", + "@biomejs/cli-win32-x64": "1.8.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@codemirror/state": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.0.tgz", @@ -1791,8 +1957,17 @@ "node_modules/@types/node": { "version": "16.11.43", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.43.tgz", - "integrity": "sha512-GqWykok+3uocgfAJM8imbozrqLnPyTrpFlrryURQlw1EesPUCx5XxTiucWDSFF9/NUEXDuD4bnvHm8xfVGWTpQ==", - "dev": true + "integrity": "sha512-GqWykok+3uocgfAJM8imbozrqLnPyTrpFlrryURQlw1EesPUCx5XxTiucWDSFF9/NUEXDuD4bnvHm8xfVGWTpQ==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -2056,6 +2231,18 @@ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -2109,6 +2296,18 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -2240,8 +2439,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.5", @@ -2605,7 +2803,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3127,7 +3324,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -4138,6 +4334,15 @@ "node": ">=0.10.0" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4389,7 +4594,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4399,6 +4603,34 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -4899,6 +5131,15 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6361,7 +6602,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -6370,7 +6610,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -6467,8 +6706,7 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mute-stream": { "version": "0.0.7", @@ -6507,6 +6745,25 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -6520,7 +6777,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9116,6 +9372,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.52.7", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.52.7.tgz", + "integrity": "sha512-dgxA6UZHary6NXUHEDj5TWt8ogv0+ibH+b4pT5RrWMjiRZVylNwLcw/2ubDrX5n0oUmHX/ZgudMJeemxzOvz7A==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + }, + "bin": { + "openai": "bin/cli" + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -10774,8 +11058,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/traverse": { "version": "0.6.6", @@ -10924,6 +11207,12 @@ "node": ">=0.8.0" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -11514,11 +11803,19 @@ "node": ">=12" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/whatwg-encoding": { "version": "2.0.0", @@ -11557,7 +11854,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12185,6 +12481,78 @@ "to-fast-properties": "^2.0.0" } }, + "@biomejs/biome": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", + "dev": true, + "requires": { + "@biomejs/cli-darwin-arm64": "1.8.3", + "@biomejs/cli-darwin-x64": "1.8.3", + "@biomejs/cli-linux-arm64": "1.8.3", + "@biomejs/cli-linux-arm64-musl": "1.8.3", + "@biomejs/cli-linux-x64": "1.8.3", + "@biomejs/cli-linux-x64-musl": "1.8.3", + "@biomejs/cli-win32-arm64": "1.8.3", + "@biomejs/cli-win32-x64": "1.8.3" + } + }, + "@biomejs/cli-darwin-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", + "dev": true, + "optional": true + }, + "@biomejs/cli-darwin-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-arm64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "dev": true, + "optional": true + }, + "@biomejs/cli-linux-x64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "dev": true, + "optional": true + }, + "@biomejs/cli-win32-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "dev": true, + "optional": true + }, + "@biomejs/cli-win32-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "dev": true, + "optional": true + }, "@codemirror/state": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.0.tgz", @@ -13238,8 +13606,16 @@ "@types/node": { "version": "16.11.43", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.43.tgz", - "integrity": "sha512-GqWykok+3uocgfAJM8imbozrqLnPyTrpFlrryURQlw1EesPUCx5XxTiucWDSFF9/NUEXDuD4bnvHm8xfVGWTpQ==", - "dev": true + "integrity": "sha512-GqWykok+3uocgfAJM8imbozrqLnPyTrpFlrryURQlw1EesPUCx5XxTiucWDSFF9/NUEXDuD4bnvHm8xfVGWTpQ==" + }, + "@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "requires": { + "@types/node": "*", + "form-data": "^4.0.0" + } }, "@types/normalize-package-data": { "version": "2.4.1", @@ -13414,6 +13790,14 @@ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -13453,6 +13837,14 @@ "debug": "4" } }, + "agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "requires": { + "humanize-ms": "^1.2.1" + } + }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -13559,8 +13951,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "available-typed-arrays": { "version": "1.0.5", @@ -13831,7 +14222,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -14241,8 +14631,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "deprecation": { "version": "2.3.1", @@ -14904,6 +15293,11 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -15112,13 +15506,33 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, + "form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "requires": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "dependencies": { + "web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==" + } + } + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -15486,6 +15900,14 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "requires": { + "ms": "^2.0.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -16569,14 +16991,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -16651,8 +17071,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "mute-stream": { "version": "0.0.7", @@ -16685,6 +17104,11 @@ "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", "dev": true }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, "node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -16698,7 +17122,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, "requires": { "whatwg-url": "^5.0.0" } @@ -18509,6 +18932,31 @@ "mimic-fn": "^2.1.0" } }, + "openai": { + "version": "4.52.7", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.52.7.tgz", + "integrity": "sha512-dgxA6UZHary6NXUHEDj5TWt8ogv0+ibH+b4pT5RrWMjiRZVylNwLcw/2ubDrX5n0oUmHX/ZgudMJeemxzOvz7A==", + "requires": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + }, + "dependencies": { + "@types/node": { + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "requires": { + "undici-types": "~5.26.4" + } + } + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -19723,8 +20171,7 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "traverse": { "version": "0.6.6", @@ -19819,6 +20266,11 @@ "dev": true, "optional": true }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -20130,11 +20582,15 @@ "xml-name-validator": "^4.0.0" } }, + "web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==" + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-encoding": { "version": "2.0.0", @@ -20166,7 +20622,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index 5edb185..f9e0b90 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "author": "Christian Bager Bach Houmann", "license": "MIT", "devDependencies": { + "@biomejs/biome": "^1.8.3", "@semantic-release/git": "^10.0.1", "@sveltejs/vite-plugin-svelte": "^1.1.0", "@testing-library/jest-dom": "^5.16.5", @@ -95,6 +96,7 @@ ] }, "dependencies": { - "fuse.js": "^6.6.2" + "fuse.js": "^6.6.2", + "openai": "^4.52.7" } } diff --git a/src/TemplateEngine.ts b/src/TemplateEngine.ts index fd6c56d..8f93a7e 100644 --- a/src/TemplateEngine.ts +++ b/src/TemplateEngine.ts @@ -195,9 +195,48 @@ export function DownloadPathTemplateEngine(template: string, episode: Episode) { return replacer(templateWithoutExtension); } +export function TranscriptTemplateEngine(template: string, episode: Episode, transcription: string) { + const [replacer, addTag] = useTemplateEngine(); + + addTag("title", (whitespaceReplacement?: string) => { + const legalTitle = replaceIllegalFileNameCharactersInString(episode.title); + if (whitespaceReplacement) { + return legalTitle.replace(/\s+/g, whitespaceReplacement); + } + return legalTitle; + }); + addTag("podcast", (whitespaceReplacement?: string) => { + const legalName = replaceIllegalFileNameCharactersInString(episode.podcastName); + if (whitespaceReplacement) { + return legalName.replace(/\s+/g, whitespaceReplacement); + } + return legalName; + }); + addTag("date", (format?: string) => + episode.episodeDate + ? window.moment(episode.episodeDate).format(format ?? "YYYY-MM-DD") + : "" + ); + addTag("transcript", transcription); + addTag("description", (prependToLines?: string) => { + if (prependToLines) { + return htmlToMarkdown(episode.description) + .split("\n") + .map((str) => `${prependToLines}${str}`) + .join("\n"); + } + + return htmlToMarkdown(episode.description); + }); + addTag("url", episode.url); + addTag("artwork", episode.artworkUrl ?? ""); + + return replacer(template); +} + function replaceIllegalFileNameCharactersInString(string: string) { return string .replace(/[\\,#%&{}/*<>$'":@\u2023|?]*/g, "") // Replace illegal file name characters with empty string .replace(/\n/, " ") // replace newlines with spaces .replace(" ", " "); // replace multiple spaces with single space to make sure we don't have double spaces in the file name -} +} \ No newline at end of file diff --git a/src/constants.ts b/src/constants.ts index 43f61a4..5042ab4 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,30 +1,33 @@ -import { IPodNotesSettings } from "src/types/IPodNotesSettings"; -import { Playlist } from "./types/Playlist"; +import type { IPodNotesSettings } from "src/types/IPodNotesSettings"; +import type { Playlist } from "./types/Playlist"; export const VIEW_TYPE = "podcast_player_view"; -type PlaylistSettings = Pick; +type PlaylistSettings = Pick< + Playlist, + "icon" | "name" | "shouldEpisodeRemoveAfterPlay" | "shouldRepeat" +>; export const FAVORITES_SETTINGS: PlaylistSettings = { icon: "lucide-star", name: "Favorites", shouldEpisodeRemoveAfterPlay: false, shouldRepeat: false, -} +}; export const QUEUE_SETTINGS: PlaylistSettings = { icon: "list-ordered", name: "Queue", shouldEpisodeRemoveAfterPlay: true, shouldRepeat: false, -} +}; export const LOCAL_FILES_SETTINGS: PlaylistSettings = { icon: "folder", name: "Local Files", shouldEpisodeRemoveAfterPlay: false, shouldRepeat: false, -} +}; export const DEFAULT_SETTINGS: IPodNotesSettings = { savedFeeds: {}, @@ -60,6 +63,11 @@ export const DEFAULT_SETTINGS: IPodNotesSettings = { localFiles: { ...LOCAL_FILES_SETTINGS, episodes: [], - } -} - + }, + openAIApiKey: "", + transcript: { + path: "transcripts/{{podcast}}/{{title}}.md", + template: + "# {{title}}\n\nPodcast: {{podcast}}\nDate: {{date}}\n\n{{transcript}}", + }, +}; diff --git a/src/downloadEpisode.ts b/src/downloadEpisode.ts index 1701bfb..8b477d0 100644 --- a/src/downloadEpisode.ts +++ b/src/downloadEpisode.ts @@ -1,4 +1,4 @@ -import { Notice, requestUrl } from "obsidian"; +import { Notice, TFile, requestUrl } from "obsidian"; import { downloadedEpisodes } from "./store"; import { DownloadPathTemplateEngine } from "./TemplateEngine"; import { Episode } from "./types/Episode"; @@ -174,27 +174,55 @@ async function createEpisodeFile({ export async function downloadEpisode( episode: Episode, downloadPathTemplate: string -) { - try { - const { blob, responseUrl } = await downloadFile(episode.streamUrl); - - const fileExtension = getUrlExtension(responseUrl); - - if (!blob.type.contains("audio") || !fileExtension) { - throw new Error("Not an audio file."); - } +): Promise { + const basename = DownloadPathTemplateEngine(downloadPathTemplate, episode); + const fileExtension = await getFileExtension(episode.streamUrl); + const filePath = `${basename}.${fileExtension}`; + + // Check if the file already exists + const existingFile = app.vault.getAbstractFileByPath(filePath); + if (existingFile instanceof TFile) { + return filePath; // Return the existing file path + } + + try { + const { blob, responseUrl } = await downloadFile(episode.streamUrl); + + if (!blob.type.includes("audio") && !fileExtension) { + throw new Error("Not an audio file."); + } + + await createEpisodeFile({ + episode, + downloadPathTemplate, + blob, + extension: fileExtension, + }); + + return filePath; + } catch (error) { + throw new Error( + `Failed to download ${episode.title}: ${error.message}` + ); + } +} - await createEpisodeFile({ - episode, - downloadPathTemplate, - blob, - extension: fileExtension, - }); - } catch (error) { - throw new Error( - `Failed to download ${episode.title}: ${error.message}` - ); - } +async function getFileExtension(url: string): Promise { + const urlExtension = getUrlExtension(url); + if (urlExtension) return urlExtension; + + // If URL doesn't have an extension, fetch headers to determine content type + const response = await fetch(url, { method: 'HEAD' }); + const contentType = response.headers.get('content-type'); + + if (contentType?.includes('audio/mpeg')) return 'mp3'; + if (contentType?.includes('audio/mp4')) return 'm4a'; + if (contentType?.includes('audio/ogg')) return 'ogg'; + if (contentType?.includes('audio/wav')) return 'wav'; + if (contentType?.includes('audio/x-m4a')) return 'm4a'; + + // Default to mp3 if we can't determine the type + return 'mp3'; } interface AudioSignature { @@ -203,7 +231,7 @@ interface AudioSignature { fileExtension: string; } -async function detectAudioFileExtension(blob: Blob): Promise { +export async function detectAudioFileExtension(blob: Blob): Promise { const audioSignatures: AudioSignature[] = [ { signature: [0xff, 0xe0], mask: [0xff, 0xe0], fileExtension: "mp3" }, { signature: [0x49, 0x44, 0x33], fileExtension: "mp3" }, @@ -265,4 +293,4 @@ async function detectAudioFileExtension(blob: Blob): Promise { ) ); }); -} +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index ce108a5..99a5e41 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,7 +8,7 @@ import { queue, savedFeeds, } from "src/store"; -import { Plugin, requestUrl, TFile, WorkspaceLeaf } from "obsidian"; +import { Notice, Plugin, requestUrl, TFile, WorkspaceLeaf } from "obsidian"; import { API } from "src/API/API"; import { IAPI } from "src/API/IAPI"; import { DEFAULT_SETTINGS, VIEW_TYPE } from "src/constants"; @@ -39,6 +39,7 @@ import podNotesURIHandler from "./URIHandler"; import getContextMenuHandler from "./getContextMenuHandler"; import getUniversalPodcastLink from "./getUniversalPodcastLink"; import { IconType } from "./types/IconType"; +import { TranscriptionService } from "./services/TranscriptionService"; export default class PodNotes extends Plugin implements IPodNotes { public api: IAPI; @@ -63,6 +64,7 @@ export default class PodNotes extends Plugin implements IPodNotes { private downloadedEpisodesController: StoreController<{ [podcastName: string]: DownloadedEpisode[]; }>; + private transcriptionService: TranscriptionService; async onload() { plugin.set(this); @@ -107,6 +109,8 @@ export default class PodNotes extends Plugin implements IPodNotes { this ).on(); + this.transcriptionService = new TranscriptionService(this); + this.addCommand({ id: "podnotes-show-leaf", name: "Show PodNotes", @@ -266,79 +270,8 @@ export default class PodNotes extends Plugin implements IPodNotes { this.addCommand({ id: "podnotes-transcribe", - name: "Transcribe episode", - callback: async () => { - const podcastFile = app.vault.getAbstractFileByPath( - `podcasts/The Daily Stoic - The Best New Ideas Come From Old Books..mp3` - ); - if (!podcastFile || !(podcastFile instanceof TFile)) return; - - const file = await app.vault.readBinary(podcastFile); - - // https://stackoverflow.com/questions/74276173/how-to-send-multipart-form-data-payload-with-typescript-obsidian-library - const N = 16; // The length of our random boundry string - const randomBoundryString = - "podnotesboundary" + - Array(N + 1) - .join( - ( - Math.random().toString(36) + "00000000000000000" - ).slice(2, 18) - ) - .slice(0, N); - - // Construct the form data payload as a string - const pre_string = `------${randomBoundryString}\r\nContent-Disposition: form-data; name="audio_file"; filename="blob"\r\nContent-Type: "application/octet-stream"\r\n\r\n`; - const post_string = `\r\n------${randomBoundryString}--`; - - const pre_string_encoded = new TextEncoder().encode(pre_string); - const post_string_encoded = new TextEncoder().encode( - post_string - ); - const jsonWrapper = new TextEncoder().encode(`{"fileg: "`); - const jsonWrapperEnd = new TextEncoder().encode(`", "model": "whisper-1"}`); - const concatenated = await new Blob([ - pre_string_encoded, - jsonWrapper, - file, - jsonWrapperEnd, - post_string_encoded, - ]).arrayBuffer(); - - console.log("uploading") - const accountId = "FW25b6X"; - const publicApiKey = "public_FW25b6XFQL3GddxZrqMriDPdBkN8"; - const url = new URL(`https://api.upload.io/v2/accounts/${accountId}/uploads/binary`); - url.searchParams.append("fileName", podcastFile.name); - url.searchParams.append("folderPath", "/uploads"); - const response = await requestUrl({ - url: url.toString(), - method: "POST", - headers: { - Authorization: `Bearer ${publicApiKey}`, - }, - contentType: `multipart/form-data; boundary=----${randomBoundryString}`, - body: concatenated, - }); - - const { fileUrl } = response.json; - console.log(`Uploaded to ${fileUrl}`) - console.log(`Transcribing...`) - const openAiResponse = await requestUrl({ - url: "https://api.openai.com/v1/audio/transcriptions", - method: "POST", - headers: { - "Authorization": `Bearer ${"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"}`, - 'Content-Type': `multipart/form-data; boundary=----${randomBoundryString}` - }, - body: JSON.stringify({ - file: concatenated, - model: "whisper-1" - }) - }); - - console.log(openAiResponse.json); - }, + name: "Transcribe current episode", + callback: () => this.transcriptionService.transcribeCurrentEpisode(), }); this.addSettingTab(new PodNotesSettingsTab(this.app, this)); @@ -390,4 +323,4 @@ export default class PodNotes extends Plugin implements IPodNotes { async saveSettings() { await this.saveData(this.settings); } -} +} \ No newline at end of file diff --git a/src/services/TranscriptionService.ts b/src/services/TranscriptionService.ts new file mode 100644 index 0000000..77b1574 --- /dev/null +++ b/src/services/TranscriptionService.ts @@ -0,0 +1,213 @@ +import { Notice, TFile } from "obsidian"; +import { OpenAI } from "openai"; +import PodNotes from "../main"; +import { downloadEpisode } from "../downloadEpisode"; +import { FilePathTemplateEngine, TranscriptTemplateEngine } from "../TemplateEngine"; +import { Episode } from "src/types/Episode"; + +function TimerNotice(heading: string, initialMessage: string) { + let currentMessage = initialMessage; + const startTime = Date.now(); + let stopTime: number; + const notice = new Notice(initialMessage, 0); + + function formatMsg(message: string): string { + return `${heading} (${getTime()}):\n\n${message}`; + } + + function update(message: string) { + currentMessage = message; + notice.setMessage(formatMsg(currentMessage)); + } + + const interval = setInterval(() => { + notice.setMessage(formatMsg(currentMessage)); + }, 1000); + + function getTime(): string { + return formatTime(stopTime ? stopTime - startTime : Date.now() - startTime); + } + + return { + update, + hide: () => notice.hide(), + stop: () => { + stopTime = Date.now(); + clearInterval(interval); + }, + }; +} + +function formatTime(ms: number): string { + const seconds = Math.floor(ms / 1000); + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + return `${hours.toString().padStart(2, '0')}:${(minutes % 60).toString().padStart(2, '0')}:${(seconds % 60).toString().padStart(2, '0')}`; + } + +export class TranscriptionService { + private plugin: PodNotes; + private client: OpenAI; + private MAX_RETRIES = 3; + private isTranscribing = false; + + constructor(plugin: PodNotes) { + this.plugin = plugin; + this.client = new OpenAI({ + apiKey: this.plugin.settings.openAIApiKey, + dangerouslyAllowBrowser: true + }); + } + + async transcribeCurrentEpisode(): Promise { + if (this.isTranscribing) { + new Notice("A transcription is already in progress."); + return; + } + + const currentEpisode = this.plugin.api.podcast; + if (!currentEpisode) { + new Notice("No episode is currently playing."); + return; + } + + // Check if transcription file already exists + const transcriptPath = FilePathTemplateEngine(this.plugin.settings.transcript.path, currentEpisode); + const existingFile = this.plugin.app.vault.getAbstractFileByPath(transcriptPath); + if (existingFile instanceof TFile) { + new Notice(`You've already transcribed this episode - found ${transcriptPath}.`); + return; + } + + this.isTranscribing = true; + const notice = TimerNotice("Transcription", "Preparing to transcribe..."); + + try { + notice.update("Downloading episode..."); + const downloadPath = await downloadEpisode(currentEpisode, this.plugin.settings.download.path); + const podcastFile = this.plugin.app.vault.getAbstractFileByPath(downloadPath); + if (!podcastFile || !(podcastFile instanceof TFile)) { + throw new Error("Failed to download or locate the episode."); + } + + notice.update("Preparing audio for transcription..."); + const fileBuffer = await this.plugin.app.vault.readBinary(podcastFile); + const fileExtension = podcastFile.extension; + const mimeType = this.getMimeType(fileExtension); + + const chunks = this.chunkFile(fileBuffer); + const files = this.createChunkFiles(chunks, podcastFile.basename, fileExtension, mimeType); + + notice.update("Starting transcription..."); + const transcription = await this.transcribeChunks(files, notice.update); + + notice.update("Saving transcription..."); + await this.saveTranscription(currentEpisode, transcription); + + notice.stop(); + notice.update(`Transcription completed and saved.`); + } catch (error) { + console.error("Transcription error:", error); + notice.update(`Transcription failed: ${error.message}`); + } finally { + this.isTranscribing = false; + setTimeout(() => notice.hide(), 5000); + } + } + + private chunkFile(fileBuffer: ArrayBuffer): ArrayBuffer[] { + const CHUNK_SIZE_MB = 20; + const chunkSizeBytes = CHUNK_SIZE_MB * 1024 * 1024; // Convert MB to bytes + const chunks: ArrayBuffer[] = []; + for (let i = 0; i < fileBuffer.byteLength; i += chunkSizeBytes) { + chunks.push(fileBuffer.slice(i, i + chunkSizeBytes)); + } + return chunks; + } + + private createChunkFiles(chunks: ArrayBuffer[], fileName: string, fileExtension: string, mimeType: string): File[] { + return chunks.map((chunk, index) => + new File([chunk], `${fileName}.part${index}.${fileExtension}`, { type: mimeType }) + ); + } + + private getMimeType(fileExtension: string): string { + switch (fileExtension.toLowerCase()) { + case 'mp3': + return 'audio/mp3'; + case 'm4a': + return 'audio/mp4'; + case 'ogg': + return 'audio/ogg'; + case 'wav': + return 'audio/wav'; + case 'flac': + return 'audio/flac'; + default: + return 'audio/mpeg'; + } + } + + private async transcribeChunks(files: File[], updateNotice: (message: string) => void): Promise { + const transcriptions: string[] = new Array(files.length); + let completedChunks = 0; + + const updateProgress = () => { + const progress = ((completedChunks / files.length) * 100).toFixed(1); + updateNotice(`Transcribing... ${completedChunks}/${files.length} chunks completed (${progress}%)`); + }; + + updateProgress(); + + await Promise.all(files.map(async (file, index) => { + let retries = 0; + while (retries < this.MAX_RETRIES) { + try { + const result = await this.client.audio.transcriptions.create({ + model: "whisper-1", + file, + }); + transcriptions[index] = result.text; + completedChunks++; + updateProgress(); + break; + } catch (error) { + retries++; + if (retries >= this.MAX_RETRIES) { + console.error(`Failed to transcribe chunk ${index} after ${this.MAX_RETRIES} attempts:`, error); + transcriptions[index] = `[Error transcribing chunk ${index}]`; + completedChunks++; + updateProgress(); + } else { + await new Promise(resolve => setTimeout(resolve, 1000 * retries)); // Exponential backoff + } + } + } + })); + + return transcriptions.join(' '); + } + + private async saveTranscription(episode: Episode, transcription: string): Promise { + const transcriptPath = FilePathTemplateEngine(this.plugin.settings.transcript.path, episode); + const formattedTranscription = transcription.replace(/\.\s+/g, '.\n\n'); + const transcriptContent = TranscriptTemplateEngine(this.plugin.settings.transcript.template, episode, formattedTranscription); + + const vault = this.plugin.app.vault; + + // Ensure the directory exists + const directory = transcriptPath.substring(0, transcriptPath.lastIndexOf("/")); + if (directory && !vault.getAbstractFileByPath(directory)) { + await vault.createFolder(directory); + } + + const file = vault.getAbstractFileByPath(transcriptPath); + + if (!file) { + const newFile = await vault.create(transcriptPath, transcriptContent); + await this.plugin.app.workspace.getLeaf().openFile(newFile); + } else { + throw new Error("Expected a file but got a folder"); + } + } +} \ No newline at end of file diff --git a/src/types/IPodNotesSettings.ts b/src/types/IPodNotesSettings.ts index 8cb1770..6306d86 100644 --- a/src/types/IPodNotesSettings.ts +++ b/src/types/IPodNotesSettings.ts @@ -31,4 +31,9 @@ export interface IPodNotesSettings { path: string, } downloadedEpisodes: { [podcastName: string]: DownloadedEpisode[] }, -} + openAIApiKey: string, + transcript: { + path: string; + template: string; + } +} \ No newline at end of file diff --git a/src/ui/settings/PodNotesSettingsTab.ts b/src/ui/settings/PodNotesSettingsTab.ts index b2c2331..d787aa5 100644 --- a/src/ui/settings/PodNotesSettingsTab.ts +++ b/src/ui/settings/PodNotesSettingsTab.ts @@ -12,6 +12,7 @@ import PlaylistManager from "./PlaylistManager.svelte"; import { DownloadPathTemplateEngine, TimestampTemplateEngine, + TranscriptTemplateEngine, } from "../../TemplateEngine"; import { FilePathTemplateEngine } from "../../TemplateEngine"; import { episodeCache, savedFeeds } from "src/store"; @@ -70,6 +71,7 @@ export class PodNotesSettingsTab extends PluginSettingTab { this.addDownloadSettings(settingsContainer); this.addImportSettings(settingsContainer); this.addExportSettings(settingsContainer); + this.addTranscriptSettings(settingsContainer); } hide(): void { @@ -342,6 +344,70 @@ export class PodNotesSettingsTab extends PluginSettingTab { }) ); } + + private addTranscriptSettings(container: HTMLDivElement) { + container.createEl("h4", { text: "Transcript settings" }); + + const randomEpisode = getRandomEpisode(); + + new Setting(container) + .setName("OpenAI API Key") + .setDesc("Enter your OpenAI API key for transcription functionality.") + .addText(text => { + text + .setPlaceholder("Enter your OpenAI API key") + .setValue(this.plugin.settings.openAIApiKey) + .onChange(async (value) => { + this.plugin.settings.openAIApiKey = value; + await this.plugin.saveSettings(); + }) + text.inputEl.type = "password"; + + }); + + const transcriptFilePathSetting = new Setting(container) + .setName("Transcript file path") + .setDesc("The path where transcripts will be saved. Use {{}} for dynamic values.") + .addText((text) => { + text.setPlaceholder("transcripts/{{podcast}}/{{title}}.md") + .setValue(this.plugin.settings.transcript.path) + .onChange(async (value) => { + this.plugin.settings.transcript.path = value; + await this.plugin.saveSettings(); + updateTranscriptPathDemo(value); + }); + }); + + const transcriptPathDemoEl = container.createDiv(); + + const updateTranscriptPathDemo = (value: string) => { + const demoVal = FilePathTemplateEngine(value, randomEpisode); + transcriptPathDemoEl.empty(); + transcriptPathDemoEl.createEl("p", { text: `Example: ${demoVal}` }); + }; + + updateTranscriptPathDemo(this.plugin.settings.transcript.path); + + const transcriptTemplateSetting = new Setting(container) + .setName("Transcript template") + .setDesc("The template for the transcript file content.") + .setHeading() + .addTextArea((text) => { + text.setPlaceholder("# {{title}}\n\nPodcast: {{podcast}}\nDate: {{date}}\nURL: {{url}}\n\n## Description\n\n{{description}}\n\n## Transcript\n\n{{transcript}}") + .setValue(this.plugin.settings.transcript.template) + .onChange(async (value) => { + this.plugin.settings.transcript.template = value; + await this.plugin.saveSettings(); + }); + text.inputEl.style.width = "100%"; + text.inputEl.style.height = "25vh"; + }); + + + transcriptTemplateSetting.settingEl.style.flexDirection = "column"; + transcriptTemplateSetting.settingEl.style.alignItems = "unset"; + transcriptTemplateSetting.settingEl.style.gap = "10px"; + } } function getRandomEpisode(): Episode { @@ -368,4 +434,4 @@ function getRandomEpisode(): Episode { randomFeed[Math.floor(Math.random() * randomFeed.length)]; return randomEpisode; -} +} \ No newline at end of file