karaoke-gen 0.103.1__py3-none-any.whl → 0.107.0__py3-none-any.whl

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.
Files changed (339) hide show
  1. backend/Dockerfile.base +1 -0
  2. backend/api/routes/admin.py +226 -3
  3. backend/api/routes/push.py +238 -0
  4. backend/api/routes/users.py +14 -3
  5. backend/config.py +12 -1
  6. backend/main.py +2 -1
  7. backend/models/job.py +4 -0
  8. backend/models/user.py +20 -2
  9. backend/services/encoding_interface.py +4 -0
  10. backend/services/gce_encoding/main.py +22 -8
  11. backend/services/job_manager.py +68 -11
  12. backend/services/job_notification_service.py +4 -21
  13. backend/services/push_notification_service.py +409 -0
  14. backend/services/stripe_service.py +2 -2
  15. backend/tests/conftest.py +2 -1
  16. backend/tests/test_admin_delete_outputs.py +352 -0
  17. backend/tests/test_gce_encoding_worker.py +229 -0
  18. backend/tests/test_impersonation.py +18 -3
  19. backend/tests/test_job_notification_service.py +24 -58
  20. backend/tests/test_push_notification_service.py +460 -0
  21. backend/tests/test_push_routes.py +357 -0
  22. backend/tests/test_stripe_service.py +205 -0
  23. backend/tests/test_video_worker_orchestrator.py +189 -0
  24. backend/workers/video_worker_orchestrator.py +23 -0
  25. karaoke_gen/instrumental_review/server.py +145 -35
  26. karaoke_gen/nextjs_frontend/__init__.py +98 -0
  27. karaoke_gen/nextjs_frontend/out/404/index.html +1 -0
  28. karaoke_gen/nextjs_frontend/out/404.html +1 -0
  29. karaoke_gen/nextjs_frontend/out/__next.__PAGE__.txt +9 -0
  30. karaoke_gen/nextjs_frontend/out/__next._full.txt +22 -0
  31. karaoke_gen/nextjs_frontend/out/__next._head.txt +8 -0
  32. karaoke_gen/nextjs_frontend/out/__next._index.txt +9 -0
  33. karaoke_gen/nextjs_frontend/out/__next._tree.txt +2 -0
  34. karaoke_gen/nextjs_frontend/out/_next/static/chunks/01a7f8fe40f1ff47.js +1 -0
  35. karaoke_gen/nextjs_frontend/out/_next/static/chunks/112f346e31f991df.js +4 -0
  36. karaoke_gen/nextjs_frontend/out/_next/static/chunks/16d1a4dd9d8a873a.js +3 -0
  37. karaoke_gen/nextjs_frontend/out/_next/static/chunks/1ab85c362b8b0e86.js +9 -0
  38. karaoke_gen/nextjs_frontend/out/_next/static/chunks/247eb132b7f7b574.js +1 -0
  39. karaoke_gen/nextjs_frontend/out/_next/static/chunks/2b80d15cc95e4818.js +1 -0
  40. karaoke_gen/nextjs_frontend/out/_next/static/chunks/32c7eba5cd46c1bc.js +7 -0
  41. karaoke_gen/nextjs_frontend/out/_next/static/chunks/483f26794eae53d0.js +1 -0
  42. karaoke_gen/nextjs_frontend/out/_next/static/chunks/550c3b02e85f196a.js +1 -0
  43. karaoke_gen/nextjs_frontend/out/_next/static/chunks/55c5ade44387bef8.js +1 -0
  44. karaoke_gen/nextjs_frontend/out/_next/static/chunks/5628d92b5893add2.css +1 -0
  45. karaoke_gen/nextjs_frontend/out/_next/static/chunks/56ebf7665e4341c8.js +7 -0
  46. karaoke_gen/nextjs_frontend/out/_next/static/chunks/5997132b61dec430.js +1 -0
  47. karaoke_gen/nextjs_frontend/out/_next/static/chunks/5ea55255bce3eb9e.js +5 -0
  48. karaoke_gen/nextjs_frontend/out/_next/static/chunks/5eda89a57490b3cd.js +1 -0
  49. karaoke_gen/nextjs_frontend/out/_next/static/chunks/692f5d9e0d700c76.js +3 -0
  50. karaoke_gen/nextjs_frontend/out/_next/static/chunks/71d7a05b14f9f0f4.js +1 -0
  51. karaoke_gen/nextjs_frontend/out/_next/static/chunks/81ac355749ef3302.js +1 -0
  52. karaoke_gen/nextjs_frontend/out/_next/static/chunks/95f7e5934dbb0e5d.js +1 -0
  53. karaoke_gen/nextjs_frontend/out/_next/static/chunks/9bce8f19eaa46940.js +1 -0
  54. karaoke_gen/nextjs_frontend/out/_next/static/chunks/a6dad97d9634a72d.js +1 -0
  55. karaoke_gen/nextjs_frontend/out/_next/static/chunks/a9ed54eed3e14c92.js +2 -0
  56. karaoke_gen/nextjs_frontend/out/_next/static/chunks/b35cd41238ecfb17.js +1 -0
  57. karaoke_gen/nextjs_frontend/out/_next/static/chunks/b5bc3c3d5ebd49eb.js +1 -0
  58. karaoke_gen/nextjs_frontend/out/_next/static/chunks/b5c078c08db5ae32.js +5 -0
  59. karaoke_gen/nextjs_frontend/out/_next/static/chunks/be9c44a178104187.js +1 -0
  60. karaoke_gen/nextjs_frontend/out/_next/static/chunks/c4c840e18cb4861c.js +1 -0
  61. karaoke_gen/nextjs_frontend/out/_next/static/chunks/c645af7d6b65f73e.js +1 -0
  62. karaoke_gen/nextjs_frontend/out/_next/static/chunks/d2c5e2575df784d4.js +1 -0
  63. karaoke_gen/nextjs_frontend/out/_next/static/chunks/d30af02b96d81462.js +1 -0
  64. karaoke_gen/nextjs_frontend/out/_next/static/chunks/d9bdf64f4ec1e9b7.js +7 -0
  65. karaoke_gen/nextjs_frontend/out/_next/static/chunks/dcde6ed684dacd0e.js +5 -0
  66. karaoke_gen/nextjs_frontend/out/_next/static/chunks/e422cbe931246000.js +1 -0
  67. karaoke_gen/nextjs_frontend/out/_next/static/chunks/e483af34fc792d38.js +1 -0
  68. karaoke_gen/nextjs_frontend/out/_next/static/chunks/e57422aad6b897da.js +1 -0
  69. karaoke_gen/nextjs_frontend/out/_next/static/chunks/ef02697fb404726a.js +1 -0
  70. karaoke_gen/nextjs_frontend/out/_next/static/chunks/ff1a16fafef87110.js +1 -0
  71. karaoke_gen/nextjs_frontend/out/_next/static/chunks/turbopack-2d9ca3017a9deedf.js +3 -0
  72. karaoke_gen/nextjs_frontend/out/_next/static/zpw_-rjFIDV5tlPPtnvRI/_buildManifest.js +11 -0
  73. karaoke_gen/nextjs_frontend/out/_next/static/zpw_-rjFIDV5tlPPtnvRI/_clientMiddlewareManifest.json +1 -0
  74. karaoke_gen/nextjs_frontend/out/_next/static/zpw_-rjFIDV5tlPPtnvRI/_ssgManifest.js +1 -0
  75. karaoke_gen/nextjs_frontend/out/_not-found/__next._full.txt +18 -0
  76. karaoke_gen/nextjs_frontend/out/_not-found/__next._head.txt +8 -0
  77. karaoke_gen/nextjs_frontend/out/_not-found/__next._index.txt +9 -0
  78. karaoke_gen/nextjs_frontend/out/_not-found/__next._not-found.__PAGE__.txt +5 -0
  79. karaoke_gen/nextjs_frontend/out/_not-found/__next._not-found.txt +4 -0
  80. karaoke_gen/nextjs_frontend/out/_not-found/__next._tree.txt +2 -0
  81. karaoke_gen/nextjs_frontend/out/_not-found/index.html +1 -0
  82. karaoke_gen/nextjs_frontend/out/_not-found/index.txt +18 -0
  83. karaoke_gen/nextjs_frontend/out/admin/__next._full.txt +25 -0
  84. karaoke_gen/nextjs_frontend/out/admin/__next._head.txt +8 -0
  85. karaoke_gen/nextjs_frontend/out/admin/__next._index.txt +9 -0
  86. karaoke_gen/nextjs_frontend/out/admin/__next._tree.txt +2 -0
  87. karaoke_gen/nextjs_frontend/out/admin/__next.admin.__PAGE__.txt +9 -0
  88. karaoke_gen/nextjs_frontend/out/admin/__next.admin.txt +7 -0
  89. karaoke_gen/nextjs_frontend/out/admin/beta/__next._full.txt +25 -0
  90. karaoke_gen/nextjs_frontend/out/admin/beta/__next._head.txt +8 -0
  91. karaoke_gen/nextjs_frontend/out/admin/beta/__next._index.txt +9 -0
  92. karaoke_gen/nextjs_frontend/out/admin/beta/__next._tree.txt +2 -0
  93. karaoke_gen/nextjs_frontend/out/admin/beta/__next.admin.beta.__PAGE__.txt +9 -0
  94. karaoke_gen/nextjs_frontend/out/admin/beta/__next.admin.beta.txt +4 -0
  95. karaoke_gen/nextjs_frontend/out/admin/beta/__next.admin.txt +7 -0
  96. karaoke_gen/nextjs_frontend/out/admin/beta/index.html +1 -0
  97. karaoke_gen/nextjs_frontend/out/admin/beta/index.txt +25 -0
  98. karaoke_gen/nextjs_frontend/out/admin/index.html +1 -0
  99. karaoke_gen/nextjs_frontend/out/admin/index.txt +25 -0
  100. karaoke_gen/nextjs_frontend/out/admin/jobs/__next._full.txt +25 -0
  101. karaoke_gen/nextjs_frontend/out/admin/jobs/__next._head.txt +8 -0
  102. karaoke_gen/nextjs_frontend/out/admin/jobs/__next._index.txt +9 -0
  103. karaoke_gen/nextjs_frontend/out/admin/jobs/__next._tree.txt +2 -0
  104. karaoke_gen/nextjs_frontend/out/admin/jobs/__next.admin.jobs.__PAGE__.txt +9 -0
  105. karaoke_gen/nextjs_frontend/out/admin/jobs/__next.admin.jobs.txt +4 -0
  106. karaoke_gen/nextjs_frontend/out/admin/jobs/__next.admin.txt +7 -0
  107. karaoke_gen/nextjs_frontend/out/admin/jobs/index.html +1 -0
  108. karaoke_gen/nextjs_frontend/out/admin/jobs/index.txt +25 -0
  109. karaoke_gen/nextjs_frontend/out/admin/rate-limits/__next._full.txt +25 -0
  110. karaoke_gen/nextjs_frontend/out/admin/rate-limits/__next._head.txt +8 -0
  111. karaoke_gen/nextjs_frontend/out/admin/rate-limits/__next._index.txt +9 -0
  112. karaoke_gen/nextjs_frontend/out/admin/rate-limits/__next._tree.txt +2 -0
  113. karaoke_gen/nextjs_frontend/out/admin/rate-limits/__next.admin.rate-limits.__PAGE__.txt +9 -0
  114. karaoke_gen/nextjs_frontend/out/admin/rate-limits/__next.admin.rate-limits.txt +4 -0
  115. karaoke_gen/nextjs_frontend/out/admin/rate-limits/__next.admin.txt +7 -0
  116. karaoke_gen/nextjs_frontend/out/admin/rate-limits/index.html +1 -0
  117. karaoke_gen/nextjs_frontend/out/admin/rate-limits/index.txt +25 -0
  118. karaoke_gen/nextjs_frontend/out/admin/searches/__next._full.txt +25 -0
  119. karaoke_gen/nextjs_frontend/out/admin/searches/__next._head.txt +8 -0
  120. karaoke_gen/nextjs_frontend/out/admin/searches/__next._index.txt +9 -0
  121. karaoke_gen/nextjs_frontend/out/admin/searches/__next._tree.txt +2 -0
  122. karaoke_gen/nextjs_frontend/out/admin/searches/__next.admin.searches.__PAGE__.txt +9 -0
  123. karaoke_gen/nextjs_frontend/out/admin/searches/__next.admin.searches.txt +4 -0
  124. karaoke_gen/nextjs_frontend/out/admin/searches/__next.admin.txt +7 -0
  125. karaoke_gen/nextjs_frontend/out/admin/searches/index.html +1 -0
  126. karaoke_gen/nextjs_frontend/out/admin/searches/index.txt +25 -0
  127. karaoke_gen/nextjs_frontend/out/admin/users/__next._full.txt +25 -0
  128. karaoke_gen/nextjs_frontend/out/admin/users/__next._head.txt +8 -0
  129. karaoke_gen/nextjs_frontend/out/admin/users/__next._index.txt +9 -0
  130. karaoke_gen/nextjs_frontend/out/admin/users/__next._tree.txt +2 -0
  131. karaoke_gen/nextjs_frontend/out/admin/users/__next.admin.txt +7 -0
  132. karaoke_gen/nextjs_frontend/out/admin/users/__next.admin.users.__PAGE__.txt +9 -0
  133. karaoke_gen/nextjs_frontend/out/admin/users/__next.admin.users.txt +4 -0
  134. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next._full.txt +25 -0
  135. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next._head.txt +8 -0
  136. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next._index.txt +9 -0
  137. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next._tree.txt +2 -0
  138. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next.admin.txt +7 -0
  139. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next.admin.users.detail.__PAGE__.txt +9 -0
  140. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next.admin.users.detail.txt +4 -0
  141. karaoke_gen/nextjs_frontend/out/admin/users/detail/__next.admin.users.txt +4 -0
  142. karaoke_gen/nextjs_frontend/out/admin/users/detail/index.html +1 -0
  143. karaoke_gen/nextjs_frontend/out/admin/users/detail/index.txt +25 -0
  144. karaoke_gen/nextjs_frontend/out/admin/users/index.html +1 -0
  145. karaoke_gen/nextjs_frontend/out/admin/users/index.txt +25 -0
  146. karaoke_gen/nextjs_frontend/out/app/__next._full.txt +22 -0
  147. karaoke_gen/nextjs_frontend/out/app/__next._head.txt +8 -0
  148. karaoke_gen/nextjs_frontend/out/app/__next._index.txt +9 -0
  149. karaoke_gen/nextjs_frontend/out/app/__next._tree.txt +2 -0
  150. karaoke_gen/nextjs_frontend/out/app/__next.app.__PAGE__.txt +9 -0
  151. karaoke_gen/nextjs_frontend/out/app/__next.app.txt +4 -0
  152. karaoke_gen/nextjs_frontend/out/app/index.html +1 -0
  153. karaoke_gen/nextjs_frontend/out/app/index.txt +22 -0
  154. karaoke_gen/nextjs_frontend/out/app/jobs/__next._full.txt +19 -0
  155. karaoke_gen/nextjs_frontend/out/app/jobs/__next._head.txt +8 -0
  156. karaoke_gen/nextjs_frontend/out/app/jobs/__next._index.txt +9 -0
  157. karaoke_gen/nextjs_frontend/out/app/jobs/__next._tree.txt +2 -0
  158. karaoke_gen/nextjs_frontend/out/app/jobs/__next.app.jobs.$oc$slug.__PAGE__.txt +6 -0
  159. karaoke_gen/nextjs_frontend/out/app/jobs/__next.app.jobs.$oc$slug.txt +4 -0
  160. karaoke_gen/nextjs_frontend/out/app/jobs/__next.app.jobs.txt +4 -0
  161. karaoke_gen/nextjs_frontend/out/app/jobs/__next.app.txt +4 -0
  162. karaoke_gen/nextjs_frontend/out/app/jobs/index.html +1 -0
  163. karaoke_gen/nextjs_frontend/out/app/jobs/index.txt +19 -0
  164. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next._full.txt +19 -0
  165. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next._head.txt +8 -0
  166. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next._index.txt +9 -0
  167. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next._tree.txt +2 -0
  168. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next.app.jobs.$oc$slug.__PAGE__.txt +6 -0
  169. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next.app.jobs.$oc$slug.txt +4 -0
  170. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next.app.jobs.txt +4 -0
  171. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/__next.app.txt +4 -0
  172. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/index.html +1 -0
  173. karaoke_gen/nextjs_frontend/out/app/jobs/local/instrumental/index.txt +19 -0
  174. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next._full.txt +19 -0
  175. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next._head.txt +8 -0
  176. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next._index.txt +9 -0
  177. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next._tree.txt +2 -0
  178. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next.app.jobs.$oc$slug.__PAGE__.txt +6 -0
  179. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next.app.jobs.$oc$slug.txt +4 -0
  180. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next.app.jobs.txt +4 -0
  181. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/__next.app.txt +4 -0
  182. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/index.html +1 -0
  183. karaoke_gen/nextjs_frontend/out/app/jobs/local/review/index.txt +19 -0
  184. karaoke_gen/nextjs_frontend/out/auth/verify/__next._full.txt +22 -0
  185. karaoke_gen/nextjs_frontend/out/auth/verify/__next._head.txt +8 -0
  186. karaoke_gen/nextjs_frontend/out/auth/verify/__next._index.txt +9 -0
  187. karaoke_gen/nextjs_frontend/out/auth/verify/__next._tree.txt +2 -0
  188. karaoke_gen/nextjs_frontend/out/auth/verify/__next.auth.txt +4 -0
  189. karaoke_gen/nextjs_frontend/out/auth/verify/__next.auth.verify.__PAGE__.txt +9 -0
  190. karaoke_gen/nextjs_frontend/out/auth/verify/__next.auth.verify.txt +4 -0
  191. karaoke_gen/nextjs_frontend/out/auth/verify/index.html +1 -0
  192. karaoke_gen/nextjs_frontend/out/auth/verify/index.txt +22 -0
  193. karaoke_gen/nextjs_frontend/out/index.html +1 -0
  194. karaoke_gen/nextjs_frontend/out/index.txt +22 -0
  195. karaoke_gen/nextjs_frontend/out/manifest.webmanifest +31 -0
  196. karaoke_gen/nextjs_frontend/out/order/success/__next._full.txt +22 -0
  197. karaoke_gen/nextjs_frontend/out/order/success/__next._head.txt +8 -0
  198. karaoke_gen/nextjs_frontend/out/order/success/__next._index.txt +9 -0
  199. karaoke_gen/nextjs_frontend/out/order/success/__next._tree.txt +2 -0
  200. karaoke_gen/nextjs_frontend/out/order/success/__next.order.success.__PAGE__.txt +9 -0
  201. karaoke_gen/nextjs_frontend/out/order/success/__next.order.success.txt +4 -0
  202. karaoke_gen/nextjs_frontend/out/order/success/__next.order.txt +4 -0
  203. karaoke_gen/nextjs_frontend/out/order/success/index.html +1 -0
  204. karaoke_gen/nextjs_frontend/out/order/success/index.txt +22 -0
  205. karaoke_gen/nextjs_frontend/out/payment/success/__next._full.txt +22 -0
  206. karaoke_gen/nextjs_frontend/out/payment/success/__next._head.txt +8 -0
  207. karaoke_gen/nextjs_frontend/out/payment/success/__next._index.txt +9 -0
  208. karaoke_gen/nextjs_frontend/out/payment/success/__next._tree.txt +2 -0
  209. karaoke_gen/nextjs_frontend/out/payment/success/__next.payment.success.__PAGE__.txt +9 -0
  210. karaoke_gen/nextjs_frontend/out/payment/success/__next.payment.success.txt +4 -0
  211. karaoke_gen/nextjs_frontend/out/payment/success/__next.payment.txt +4 -0
  212. karaoke_gen/nextjs_frontend/out/payment/success/index.html +1 -0
  213. karaoke_gen/nextjs_frontend/out/payment/success/index.txt +22 -0
  214. karaoke_gen/nextjs_frontend/out/screenshots/email-action_reminder.png +0 -0
  215. karaoke_gen/nextjs_frontend/out/screenshots/email-beta_welcome.png +0 -0
  216. karaoke_gen/nextjs_frontend/out/screenshots/email-job_completion.png +0 -0
  217. karaoke_gen/nextjs_frontend/out/screenshots/example-output.avif +0 -0
  218. karaoke_gen/nextjs_frontend/out/screenshots/homepage-full.png +0 -0
  219. karaoke_gen/nextjs_frontend/out/screenshots/homepage-hero.png +0 -0
  220. karaoke_gen/nextjs_frontend/out/screenshots/instrumental-review.avif +0 -0
  221. karaoke_gen/nextjs_frontend/out/screenshots/instrumental-review.png +0 -0
  222. karaoke_gen/nextjs_frontend/out/screenshots/job-dashboard.avif +0 -0
  223. karaoke_gen/nextjs_frontend/out/screenshots/lyrics-review.avif +0 -0
  224. karaoke_gen/nextjs_frontend/out/screenshots/lyrics-review.png +0 -0
  225. karaoke_gen/nextjs_frontend/out/sw.js +183 -0
  226. karaoke_gen/utils/cli_args.py +3 -3
  227. karaoke_gen/utils/gen_cli.py +4 -0
  228. karaoke_gen/utils/remote_cli.py +8 -40
  229. {karaoke_gen-0.103.1.dist-info → karaoke_gen-0.107.0.dist-info}/METADATA +2 -1
  230. {karaoke_gen-0.103.1.dist-info → karaoke_gen-0.107.0.dist-info}/RECORD +244 -131
  231. {karaoke_gen-0.103.1.dist-info → karaoke_gen-0.107.0.dist-info}/WHEEL +1 -1
  232. lyrics_transcriber/correction/agentic/agent.py +83 -60
  233. lyrics_transcriber/correction/anchor_sequence.py +48 -3
  234. lyrics_transcriber/correction/corrector.py +92 -58
  235. lyrics_transcriber/review/server.py +165 -33
  236. lyrics_transcriber/utils/tracing.py +214 -0
  237. karaoke_gen/instrumental_review/static/index.html +0 -1695
  238. lyrics_transcriber/frontend/.gitignore +0 -24
  239. lyrics_transcriber/frontend/.yarn/releases/yarn-4.7.0.cjs +0 -935
  240. lyrics_transcriber/frontend/.yarnrc.yml +0 -3
  241. lyrics_transcriber/frontend/README.md +0 -50
  242. lyrics_transcriber/frontend/REPLACE_ALL_FUNCTIONALITY.md +0 -210
  243. lyrics_transcriber/frontend/__init__.py +0 -25
  244. lyrics_transcriber/frontend/e2e/agentic-corrections.spec.ts +0 -207
  245. lyrics_transcriber/frontend/e2e/fixtures/agentic-correction-data.json +0 -226
  246. lyrics_transcriber/frontend/eslint.config.js +0 -28
  247. lyrics_transcriber/frontend/index.html +0 -22
  248. lyrics_transcriber/frontend/package-lock.json +0 -4553
  249. lyrics_transcriber/frontend/package.json +0 -48
  250. lyrics_transcriber/frontend/playwright.config.ts +0 -69
  251. lyrics_transcriber/frontend/public/android-chrome-192x192.png +0 -0
  252. lyrics_transcriber/frontend/public/android-chrome-512x512.png +0 -0
  253. lyrics_transcriber/frontend/src/App.tsx +0 -243
  254. lyrics_transcriber/frontend/src/api.ts +0 -262
  255. lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +0 -111
  256. lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx +0 -114
  257. lyrics_transcriber/frontend/src/components/AgenticCorrectionMetrics.tsx +0 -204
  258. lyrics_transcriber/frontend/src/components/AppHeader.tsx +0 -65
  259. lyrics_transcriber/frontend/src/components/AudioPlayer.tsx +0 -180
  260. lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +0 -175
  261. lyrics_transcriber/frontend/src/components/CorrectionAnnotationModal.tsx +0 -359
  262. lyrics_transcriber/frontend/src/components/CorrectionDetailCard.tsx +0 -281
  263. lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx +0 -162
  264. lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx +0 -257
  265. lyrics_transcriber/frontend/src/components/EditActionBar.tsx +0 -94
  266. lyrics_transcriber/frontend/src/components/EditModal.tsx +0 -720
  267. lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +0 -592
  268. lyrics_transcriber/frontend/src/components/EditWordList.tsx +0 -431
  269. lyrics_transcriber/frontend/src/components/FileUpload.tsx +0 -77
  270. lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx +0 -467
  271. lyrics_transcriber/frontend/src/components/Header.tsx +0 -520
  272. lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +0 -1526
  273. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/SyncControls.tsx +0 -216
  274. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx +0 -721
  275. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/UpcomingWordsBar.tsx +0 -80
  276. lyrics_transcriber/frontend/src/components/LyricsSynchronizer/index.tsx +0 -999
  277. lyrics_transcriber/frontend/src/components/MetricsDashboard.tsx +0 -51
  278. lyrics_transcriber/frontend/src/components/ModeSelectionModal.tsx +0 -127
  279. lyrics_transcriber/frontend/src/components/ModeSelector.tsx +0 -67
  280. lyrics_transcriber/frontend/src/components/ModelSelector.tsx +0 -23
  281. lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx +0 -177
  282. lyrics_transcriber/frontend/src/components/ReferenceView.tsx +0 -268
  283. lyrics_transcriber/frontend/src/components/ReplaceAllLyricsModal.tsx +0 -336
  284. lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx +0 -354
  285. lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx +0 -64
  286. lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +0 -383
  287. lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx +0 -131
  288. lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +0 -266
  289. lyrics_transcriber/frontend/src/components/WordDivider.tsx +0 -191
  290. lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx +0 -466
  291. lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx +0 -56
  292. lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +0 -89
  293. lyrics_transcriber/frontend/src/components/shared/constants.ts +0 -30
  294. lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts +0 -180
  295. lyrics_transcriber/frontend/src/components/shared/styles.ts +0 -13
  296. lyrics_transcriber/frontend/src/components/shared/types.js +0 -2
  297. lyrics_transcriber/frontend/src/components/shared/types.ts +0 -135
  298. lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts +0 -177
  299. lyrics_transcriber/frontend/src/components/shared/utils/localStorage.ts +0 -78
  300. lyrics_transcriber/frontend/src/components/shared/utils/referenceLineCalculator.ts +0 -75
  301. lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts +0 -360
  302. lyrics_transcriber/frontend/src/components/shared/utils/timingUtils.ts +0 -110
  303. lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts +0 -22
  304. lyrics_transcriber/frontend/src/hooks/useManualSync.ts +0 -537
  305. lyrics_transcriber/frontend/src/main.tsx +0 -11
  306. lyrics_transcriber/frontend/src/theme.ts +0 -406
  307. lyrics_transcriber/frontend/src/types/global.d.ts +0 -9
  308. lyrics_transcriber/frontend/src/types.js +0 -2
  309. lyrics_transcriber/frontend/src/types.ts +0 -199
  310. lyrics_transcriber/frontend/src/validation.ts +0 -132
  311. lyrics_transcriber/frontend/src/vite-env.d.ts +0 -1
  312. lyrics_transcriber/frontend/tsconfig.app.json +0 -26
  313. lyrics_transcriber/frontend/tsconfig.json +0 -25
  314. lyrics_transcriber/frontend/tsconfig.node.json +0 -23
  315. lyrics_transcriber/frontend/tsconfig.tsbuildinfo +0 -1
  316. lyrics_transcriber/frontend/update_version.js +0 -11
  317. lyrics_transcriber/frontend/vite.config.d.ts +0 -2
  318. lyrics_transcriber/frontend/vite.config.js +0 -15
  319. lyrics_transcriber/frontend/vite.config.ts +0 -16
  320. lyrics_transcriber/frontend/web_assets/android-chrome-192x192.png +0 -0
  321. lyrics_transcriber/frontend/web_assets/android-chrome-512x512.png +0 -0
  322. lyrics_transcriber/frontend/web_assets/apple-touch-icon.png +0 -0
  323. lyrics_transcriber/frontend/web_assets/assets/index-BSMgOq4Z.js +0 -44465
  324. lyrics_transcriber/frontend/web_assets/assets/index-BSMgOq4Z.js.map +0 -1
  325. lyrics_transcriber/frontend/web_assets/favicon-16x16.png +0 -0
  326. lyrics_transcriber/frontend/web_assets/favicon-32x32.png +0 -0
  327. lyrics_transcriber/frontend/web_assets/favicon.ico +0 -0
  328. lyrics_transcriber/frontend/web_assets/index.html +0 -22
  329. lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.png +0 -0
  330. lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.svg +0 -5
  331. lyrics_transcriber/frontend/yarn.lock +0 -3711
  332. {lyrics_transcriber/frontend/public → karaoke_gen/nextjs_frontend/out}/apple-touch-icon.png +0 -0
  333. {lyrics_transcriber/frontend/public → karaoke_gen/nextjs_frontend/out}/favicon-16x16.png +0 -0
  334. {lyrics_transcriber/frontend/public → karaoke_gen/nextjs_frontend/out}/favicon-32x32.png +0 -0
  335. {lyrics_transcriber/frontend/public → karaoke_gen/nextjs_frontend/out}/favicon.ico +0 -0
  336. {lyrics_transcriber/frontend/public → karaoke_gen/nextjs_frontend/out}/nomad-karaoke-logo.svg +0 -0
  337. /lyrics_transcriber/frontend/public/nomad-karaoke-logo.png → /karaoke_gen/nextjs_frontend/out/nomad-logo.png +0 -0
  338. {karaoke_gen-0.103.1.dist-info → karaoke_gen-0.107.0.dist-info}/entry_points.txt +0 -0
  339. {karaoke_gen-0.103.1.dist-info → karaoke_gen-0.107.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,406 +0,0 @@
1
- import { createTheme, Theme } from '@mui/material/styles';
2
-
3
- // Dark theme colors (matching karaoke-gen's globals.css)
4
- const darkColors = {
5
- background: {
6
- default: '#0f0f0f',
7
- paper: '#1a1a1a',
8
- elevated: '#252525',
9
- },
10
- text: {
11
- primary: '#f8fafc',
12
- secondary: '#94a3b8',
13
- disabled: '#64748b',
14
- },
15
- divider: '#2a2a2a',
16
- action: {
17
- active: '#f8fafc',
18
- hover: 'rgba(248, 250, 252, 0.08)',
19
- selected: 'rgba(255, 122, 204, 0.16)',
20
- disabled: '#64748b',
21
- disabledBackground: 'rgba(100, 116, 139, 0.12)',
22
- },
23
- };
24
-
25
- // Light theme colors
26
- const lightColors = {
27
- background: {
28
- default: '#f8fafc',
29
- paper: '#ffffff',
30
- elevated: '#f1f5f9',
31
- },
32
- text: {
33
- primary: '#1e293b',
34
- secondary: '#64748b',
35
- disabled: '#94a3b8',
36
- },
37
- divider: '#e2e8f0',
38
- action: {
39
- active: '#1e293b',
40
- hover: 'rgba(30, 41, 59, 0.08)',
41
- selected: 'rgba(255, 122, 204, 0.16)',
42
- disabled: '#94a3b8',
43
- disabledBackground: 'rgba(148, 163, 184, 0.12)',
44
- },
45
- };
46
-
47
- // Shared colors - Nomad Karaoke brand palette
48
- // Primary: Brand Pink (#ff7acc), Secondary: Brand Purple (#8b5cf6)
49
- // See docs/BRAND-STYLE-GUIDE.md for full brand guidelines
50
- const sharedColors = {
51
- primary: {
52
- main: '#ff7acc',
53
- light: '#ff8fd4',
54
- dark: '#ff5bb8',
55
- contrastText: '#ffffff',
56
- },
57
- secondary: {
58
- main: '#8b5cf6',
59
- light: '#a78bfa',
60
- dark: '#7c3aed',
61
- contrastText: '#ffffff',
62
- },
63
- error: {
64
- main: '#ef4444',
65
- light: '#f87171',
66
- dark: '#dc2626',
67
- },
68
- warning: {
69
- main: '#f59e0b',
70
- light: '#fbbf24',
71
- dark: '#d97706',
72
- },
73
- success: {
74
- main: '#22c55e',
75
- light: '#4ade80',
76
- dark: '#16a34a',
77
- },
78
- info: {
79
- main: '#3b82f6',
80
- light: '#60a5fa',
81
- dark: '#2563eb',
82
- },
83
- };
84
-
85
- // Create theme based on mode
86
- export function createAppTheme(mode: 'dark' | 'light'): Theme {
87
- const colors = mode === 'dark' ? darkColors : lightColors;
88
-
89
- return createTheme({
90
- palette: {
91
- mode,
92
- background: colors.background,
93
- text: colors.text,
94
- primary: sharedColors.primary,
95
- secondary: sharedColors.secondary,
96
- error: sharedColors.error,
97
- warning: sharedColors.warning,
98
- success: sharedColors.success,
99
- info: sharedColors.info,
100
- divider: colors.divider,
101
- action: colors.action,
102
- },
103
- typography: {
104
- fontFamily: '"Inter", "system-ui", "sans-serif"',
105
- fontSize: 14,
106
- h1: { fontSize: '2.5rem', fontWeight: 600, color: colors.text.primary },
107
- h2: { fontSize: '2rem', fontWeight: 600, color: colors.text.primary },
108
- h3: { fontSize: '1.5rem', fontWeight: 600, color: colors.text.primary },
109
- h4: { fontSize: '1.2rem', fontWeight: 600, marginBottom: '0.5rem', color: colors.text.primary },
110
- h5: { fontSize: '1rem', fontWeight: 600, color: colors.text.primary },
111
- h6: { fontSize: '0.9rem', fontWeight: 600, marginBottom: '0.5rem', color: colors.text.primary },
112
- body1: { fontSize: '0.85rem', color: colors.text.primary },
113
- body2: { fontSize: '0.75rem', color: colors.text.secondary },
114
- button: { fontSize: '0.8rem', fontWeight: 500, textTransform: 'none' },
115
- caption: { fontSize: '0.7rem', color: colors.text.secondary },
116
- },
117
- shape: { borderRadius: 8 },
118
- components: {
119
- MuiCssBaseline: {
120
- styleOverrides: {
121
- body: {
122
- backgroundColor: colors.background.default,
123
- color: colors.text.primary,
124
- scrollbarColor: `${colors.background.elevated} ${colors.background.default}`,
125
- '&::-webkit-scrollbar': { width: '8px', height: '8px' },
126
- '&::-webkit-scrollbar-track': { background: colors.background.default },
127
- '&::-webkit-scrollbar-thumb': { background: colors.background.elevated, borderRadius: '4px' },
128
- '&::-webkit-scrollbar-thumb:hover': { background: mode === 'dark' ? '#475569' : '#94a3b8' },
129
- },
130
- },
131
- },
132
- MuiButton: {
133
- styleOverrides: {
134
- root: { padding: '3px 10px', minHeight: '30px', borderRadius: '6px' },
135
- sizeSmall: { padding: '1px 6px', minHeight: '24px' },
136
- contained: { boxShadow: 'none', '&:hover': { boxShadow: 'none' } },
137
- containedPrimary: {
138
- backgroundColor: sharedColors.primary.main,
139
- '&:hover': { backgroundColor: sharedColors.primary.dark },
140
- },
141
- outlined: {
142
- borderColor: colors.divider,
143
- '&:hover': {
144
- borderColor: sharedColors.primary.main,
145
- backgroundColor: 'rgba(255, 122, 204, 0.08)',
146
- },
147
- },
148
- },
149
- },
150
- MuiIconButton: {
151
- styleOverrides: {
152
- root: {
153
- padding: '4px',
154
- color: colors.text.secondary,
155
- '&:hover': { backgroundColor: colors.action.hover, color: colors.text.primary },
156
- },
157
- sizeSmall: { padding: '2px' },
158
- },
159
- },
160
- MuiTextField: {
161
- styleOverrides: {
162
- root: {
163
- '& .MuiInputBase-root': {
164
- minHeight: '32px',
165
- backgroundColor: colors.background.default,
166
- },
167
- '& .MuiOutlinedInput-root': {
168
- backgroundColor: colors.background.default,
169
- '& fieldset': { borderColor: colors.divider },
170
- '&:hover fieldset': { borderColor: colors.text.secondary },
171
- '&.Mui-focused fieldset': { borderColor: sharedColors.primary.main },
172
- },
173
- '& .MuiFilledInput-root': {
174
- backgroundColor: colors.background.default,
175
- '&:hover': { backgroundColor: colors.background.elevated },
176
- '&.Mui-focused': { backgroundColor: colors.background.default },
177
- },
178
- },
179
- },
180
- },
181
- MuiOutlinedInput: {
182
- styleOverrides: {
183
- root: {
184
- backgroundColor: colors.background.default,
185
- },
186
- input: {
187
- backgroundColor: 'transparent',
188
- },
189
- },
190
- },
191
- MuiInputBase: {
192
- styleOverrides: {
193
- root: {
194
- color: colors.text.primary,
195
- backgroundColor: colors.background.default,
196
- },
197
- input: {
198
- '&::placeholder': { color: colors.text.disabled, opacity: 1 },
199
- backgroundColor: 'transparent',
200
- },
201
- },
202
- },
203
- MuiDialog: {
204
- styleOverrides: {
205
- paper: {
206
- padding: '8px',
207
- backgroundColor: colors.background.paper,
208
- backgroundImage: 'none',
209
- border: `1px solid ${colors.divider}`,
210
- },
211
- },
212
- },
213
- MuiDialogTitle: {
214
- styleOverrides: { root: { padding: '8px 12px', color: colors.text.primary } },
215
- },
216
- MuiDialogContent: {
217
- styleOverrides: { root: { padding: '6px 12px' } },
218
- },
219
- MuiDialogActions: {
220
- styleOverrides: { root: { padding: '6px 12px' } },
221
- },
222
- MuiPaper: {
223
- styleOverrides: {
224
- root: { padding: '8px', backgroundColor: colors.background.paper, backgroundImage: 'none' },
225
- outlined: { borderColor: colors.divider },
226
- },
227
- },
228
- MuiList: {
229
- styleOverrides: { root: { padding: '2px 0' } },
230
- },
231
- MuiListItem: {
232
- styleOverrides: { root: { padding: '2px 8px' } },
233
- },
234
- MuiListItemButton: {
235
- styleOverrides: {
236
- root: {
237
- '&:hover': { backgroundColor: colors.action.hover },
238
- '&.Mui-selected': {
239
- backgroundColor: colors.action.selected,
240
- '&:hover': { backgroundColor: 'rgba(255, 122, 204, 0.24)' },
241
- },
242
- },
243
- },
244
- },
245
- MuiTableCell: {
246
- styleOverrides: {
247
- root: { padding: '4px 8px', borderBottomColor: colors.divider },
248
- head: { backgroundColor: colors.background.elevated, color: colors.text.primary, fontWeight: 600 },
249
- },
250
- },
251
- MuiTableRow: {
252
- styleOverrides: {
253
- root: { '&:hover': { backgroundColor: mode === 'dark' ? 'rgba(248, 250, 252, 0.04)' : 'rgba(30, 41, 59, 0.04)' } },
254
- },
255
- },
256
- MuiCard: {
257
- styleOverrides: {
258
- root: {
259
- padding: '8px',
260
- backgroundColor: colors.background.paper,
261
- backgroundImage: 'none',
262
- border: `1px solid ${colors.divider}`,
263
- },
264
- },
265
- },
266
- MuiCardContent: {
267
- styleOverrides: { root: { padding: '8px', '&:last-child': { paddingBottom: '8px' } } },
268
- },
269
- MuiCardHeader: {
270
- styleOverrides: {
271
- root: { padding: '8px' },
272
- title: { color: colors.text.primary },
273
- subheader: { color: colors.text.secondary },
274
- },
275
- },
276
- MuiCardActions: {
277
- styleOverrides: { root: { padding: '4px 8px' } },
278
- },
279
- MuiChip: {
280
- styleOverrides: {
281
- root: { backgroundColor: colors.background.elevated, color: colors.text.primary, borderColor: colors.divider },
282
- filled: {
283
- '&.MuiChip-colorPrimary': { backgroundColor: sharedColors.primary.main, color: sharedColors.primary.contrastText },
284
- },
285
- },
286
- },
287
- MuiAlert: {
288
- styleOverrides: {
289
- root: { borderRadius: '8px' },
290
- standardError: { backgroundColor: 'rgba(239, 68, 68, 0.15)', color: sharedColors.error.light },
291
- standardWarning: { backgroundColor: 'rgba(245, 158, 11, 0.15)', color: sharedColors.warning.light },
292
- standardSuccess: { backgroundColor: 'rgba(34, 197, 94, 0.15)', color: sharedColors.success.light },
293
- standardInfo: { backgroundColor: 'rgba(59, 130, 246, 0.15)', color: sharedColors.info.light },
294
- },
295
- },
296
- MuiTooltip: {
297
- styleOverrides: {
298
- tooltip: {
299
- backgroundColor: colors.background.elevated,
300
- color: colors.text.primary,
301
- border: `1px solid ${colors.divider}`,
302
- fontSize: '0.75rem',
303
- },
304
- arrow: { color: colors.background.elevated },
305
- },
306
- },
307
- MuiMenu: {
308
- styleOverrides: {
309
- paper: { backgroundColor: colors.background.paper, border: `1px solid ${colors.divider}` },
310
- },
311
- },
312
- MuiMenuItem: {
313
- styleOverrides: {
314
- root: {
315
- '&:hover': { backgroundColor: colors.action.hover },
316
- '&.Mui-selected': {
317
- backgroundColor: colors.action.selected,
318
- '&:hover': { backgroundColor: 'rgba(255, 122, 204, 0.24)' },
319
- },
320
- },
321
- },
322
- },
323
- MuiDivider: {
324
- styleOverrides: { root: { borderColor: colors.divider } },
325
- },
326
- MuiTabs: {
327
- styleOverrides: { indicator: { backgroundColor: sharedColors.primary.main } },
328
- },
329
- MuiTab: {
330
- styleOverrides: {
331
- root: { color: colors.text.secondary, '&.Mui-selected': { color: sharedColors.primary.main } },
332
- },
333
- },
334
- MuiSlider: {
335
- styleOverrides: {
336
- root: { color: sharedColors.primary.main },
337
- track: { backgroundColor: sharedColors.primary.main },
338
- rail: { backgroundColor: colors.background.elevated },
339
- thumb: { backgroundColor: sharedColors.primary.main },
340
- },
341
- },
342
- MuiSwitch: {
343
- styleOverrides: {
344
- root: {
345
- '& .MuiSwitch-switchBase.Mui-checked': {
346
- color: sharedColors.primary.main,
347
- '& + .MuiSwitch-track': { backgroundColor: sharedColors.primary.main },
348
- },
349
- },
350
- track: { backgroundColor: colors.background.elevated },
351
- },
352
- },
353
- MuiCheckbox: {
354
- styleOverrides: {
355
- root: { color: colors.text.secondary, '&.Mui-checked': { color: sharedColors.primary.main } },
356
- },
357
- },
358
- MuiRadio: {
359
- styleOverrides: {
360
- root: { color: colors.text.secondary, '&.Mui-checked': { color: sharedColors.primary.main } },
361
- },
362
- },
363
- MuiLinearProgress: {
364
- styleOverrides: {
365
- root: { backgroundColor: colors.background.elevated, borderRadius: '4px' },
366
- bar: { backgroundColor: sharedColors.primary.main, borderRadius: '4px' },
367
- },
368
- },
369
- MuiCircularProgress: {
370
- styleOverrides: { root: { color: sharedColors.primary.main } },
371
- },
372
- MuiSelect: {
373
- styleOverrides: {
374
- select: { backgroundColor: colors.background.default },
375
- icon: { color: colors.text.secondary },
376
- },
377
- },
378
- MuiAccordion: {
379
- styleOverrides: {
380
- root: { backgroundColor: colors.background.paper, '&:before': { backgroundColor: colors.divider } },
381
- },
382
- },
383
- MuiAccordionSummary: {
384
- styleOverrides: { root: { '&:hover': { backgroundColor: colors.action.hover } } },
385
- },
386
- MuiBadge: {
387
- styleOverrides: { colorPrimary: { backgroundColor: sharedColors.primary.main } },
388
- },
389
- MuiAppBar: {
390
- styleOverrides: {
391
- root: { backgroundColor: colors.background.paper, backgroundImage: 'none', borderBottom: `1px solid ${colors.divider}` },
392
- },
393
- },
394
- MuiDrawer: {
395
- styleOverrides: {
396
- paper: { backgroundColor: colors.background.paper, backgroundImage: 'none', borderColor: colors.divider },
397
- },
398
- },
399
- },
400
- spacing: (factor: number) => `${0.6 * factor}rem`,
401
- });
402
- }
403
-
404
- // Default dark theme for backwards compatibility
405
- const theme = createAppTheme('dark');
406
- export default theme;
@@ -1,9 +0,0 @@
1
- declare global {
2
- interface Window {
3
- toggleAudioPlayback?: () => void;
4
- seekAndPlayAudio?: (startTime: number) => void;
5
- isAudioPlaying?: boolean;
6
- }
7
- }
8
-
9
- export {}
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,199 +0,0 @@
1
- export interface Word {
2
- id: string
3
- text: string
4
- start_time: number | null
5
- end_time: number | null
6
- confidence?: number
7
- created_during_correction?: boolean
8
- }
9
-
10
- export interface LyricsSegment {
11
- id: string
12
- text: string
13
- words: Word[]
14
- start_time: number | null
15
- end_time: number | null
16
- }
17
-
18
- export interface WordCorrection {
19
- id?: string
20
- handler: string
21
- original_word: string
22
- corrected_word: string
23
- segment_id?: string
24
- word_id: string
25
- corrected_word_id: string | null
26
- source: string
27
- confidence: number
28
- reason: string
29
- alternatives: Record<string, number>
30
- is_deletion: boolean
31
- split_index?: number | null
32
- split_total?: number | null
33
- reference_positions?: Record<string, number>
34
- length: number
35
- }
36
-
37
- export interface PhraseScore {
38
- phrase_type: string
39
- natural_break_score: number
40
- length_score: number
41
- total_score: number
42
- }
43
-
44
- export interface AnchorSequence {
45
- id: string
46
- transcribed_word_ids: string[]
47
- transcription_position: number
48
- reference_positions: Record<string, number>
49
- reference_word_ids: {
50
- [source: string]: string[]
51
- }
52
- confidence: number
53
- phrase_score?: PhraseScore
54
- total_score?: number
55
- }
56
-
57
- export interface GapSequence {
58
- id: string
59
- transcribed_word_ids: string[]
60
- transcription_position: number
61
- preceding_anchor_id: string | null
62
- following_anchor_id: string | null
63
- reference_word_ids: {
64
- [source: string]: string[]
65
- }
66
- }
67
-
68
- export interface ReferenceSource {
69
- segments: LyricsSegment[]
70
- metadata: {
71
- source: string
72
- track_name: string | null
73
- artist_names: string | null
74
- album_name: string | null
75
- duration_ms: number | null
76
- explicit: boolean | null
77
- language: string | null
78
- is_synced: boolean
79
- lyrics_provider: string
80
- lyrics_provider_id: string
81
- provider_metadata: Record<string, unknown>
82
- }
83
- source: string
84
- }
85
-
86
- export interface CorrectionStep {
87
- handler_name: string
88
- affected_word_ids: string[]
89
- affected_segment_ids: string[]
90
- corrections: WordCorrection[]
91
- segments_before: LyricsSegment[]
92
- segments_after: LyricsSegment[]
93
- created_word_ids: string[]
94
- deleted_word_ids: string[]
95
- }
96
-
97
- export interface CorrectionHandler {
98
- id: string
99
- name: string
100
- description: string
101
- enabled: boolean
102
- }
103
-
104
- export interface CorrectionData {
105
- original_segments: LyricsSegment[]
106
- reference_lyrics: Record<string, ReferenceSource>
107
- anchor_sequences: AnchorSequence[]
108
- gap_sequences: GapSequence[]
109
- resized_segments: LyricsSegment[]
110
- corrections_made: number
111
- confidence: number
112
- corrections: WordCorrection[]
113
- corrected_segments: LyricsSegment[]
114
- metadata: {
115
- anchor_sequences_count: number
116
- gap_sequences_count: number
117
- total_words: number
118
- correction_ratio: number
119
- audio_filepath?: string
120
- audio_hash?: string
121
- available_handlers?: CorrectionHandler[]
122
- enabled_handlers?: string[]
123
- }
124
- correction_steps: CorrectionStep[]
125
- word_id_map: Record<string, string>
126
- segment_id_map: Record<string, string>
127
- }
128
-
129
- export interface HighlightInfo {
130
- type: 'single' | 'gap' | 'anchor' | 'correction'
131
- sequence?: AnchorSequence | GapSequence
132
- transcribed_words: Word[]
133
- reference_words?: {
134
- [source: string]: Word[]
135
- }
136
- correction?: WordCorrection
137
- }
138
-
139
- export type InteractionMode = 'highlight' | 'edit' | 'delete_word'
140
-
141
- // Correction Annotation Types
142
- export type CorrectionAnnotationType =
143
- | 'PUNCTUATION_ONLY'
144
- | 'SOUND_ALIKE'
145
- | 'BACKGROUND_VOCALS'
146
- | 'EXTRA_WORDS'
147
- | 'REPEATED_SECTION'
148
- | 'COMPLEX_MULTI_ERROR'
149
- | 'AMBIGUOUS'
150
- | 'NO_ERROR'
151
- | 'MANUAL_EDIT'
152
-
153
- export type CorrectionAction =
154
- | 'NO_ACTION'
155
- | 'REPLACE'
156
- | 'DELETE'
157
- | 'INSERT'
158
- | 'MERGE'
159
- | 'SPLIT'
160
- | 'FLAG'
161
-
162
- export interface CorrectionAnnotation {
163
- annotation_id: string
164
- audio_hash: string
165
- gap_id: string | null
166
- annotation_type: CorrectionAnnotationType
167
- action_taken: CorrectionAction
168
- original_text: string
169
- corrected_text: string
170
- confidence: number // 1-5 scale
171
- reasoning: string
172
- word_ids_affected: string[]
173
- agentic_proposal: {
174
- action: string
175
- replacement_text?: string
176
- confidence: number
177
- reason: string
178
- gap_category?: string
179
- } | null
180
- agentic_category: string | null
181
- agentic_agreed: boolean
182
- reference_sources_consulted: string[]
183
- artist: string
184
- title: string
185
- session_id: string
186
- timestamp?: string
187
- }
188
-
189
- export interface CorrectionActionEvent {
190
- type: 'revert' | 'edit' | 'accept' | 'reject'
191
- correctionId: string
192
- wordId: string
193
- }
194
-
195
- export interface GapCategoryMetric {
196
- category: string
197
- count: number
198
- avgConfidence: number
199
- }