pulse-engine 0.2.12__tar.gz → 0.2.13__tar.gz

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 (178) hide show
  1. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/PKG-INFO +1 -1
  2. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/pyproject.toml +1 -1
  3. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/providers/youtube_captions.py +36 -25
  4. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/README.md +0 -0
  5. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/__init__.py +0 -0
  6. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/__init__.py +0 -0
  7. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/audio_transcription.py +0 -0
  8. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/batcher.py +0 -0
  9. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/digital_news.py +0 -0
  10. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/digital_news_metadata.py +0 -0
  11. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/exceptions.py +0 -0
  12. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/models.py +0 -0
  13. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/opensearch_storage.py +0 -0
  14. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/speech_content.py +0 -0
  15. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/speech_metadata.py +0 -0
  16. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/__init__.py +0 -0
  17. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/base.py +0 -0
  18. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/config.py +0 -0
  19. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/factory.py +0 -0
  20. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/providers/__init__.py +0 -0
  21. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/providers/deepgram.py +0 -0
  22. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/providers/openai_whisper.py +0 -0
  23. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/providers/selfhosted_job.py +0 -0
  24. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/service.py +0 -0
  25. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/transcription/source.py +0 -0
  26. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/twitter.py +0 -0
  27. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/youtube_downloader.py +0 -0
  28. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/adapters/youtube_metadata.py +0 -0
  29. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/api/__init__.py +0 -0
  30. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/api/v1/__init__.py +0 -0
  31. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/api/v1/auth.py +0 -0
  32. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/api/v1/health.py +0 -0
  33. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/api/v1/router.py +0 -0
  34. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/chain_recovery.py +0 -0
  35. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/__init__.py +0 -0
  36. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/main.py +0 -0
  37. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/cookiecutter.json +0 -0
  38. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/.gitignore +0 -0
  39. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/Dockerfile +0 -0
  40. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/pipeline.yaml +0 -0
  41. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/pyproject.toml +0 -0
  42. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/src/pulse_{{cookiecutter.product_slug}}/__init__.py +0 -0
  43. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/tests/__init__.py +0 -0
  44. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/tests/unit/__init__.py +0 -0
  45. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cli/templates/pulse-{{cookiecutter.product_name}}/tests/unit/test_manifest.py +0 -0
  46. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/client.py +0 -0
  47. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/config.py +0 -0
  48. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/core/__init__.py +0 -0
  49. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/core/error_handlers.py +0 -0
  50. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/core/exceptions.py +0 -0
  51. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/core/job_token.py +0 -0
  52. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/core/logging.py +0 -0
  53. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/core/scope.py +0 -0
  54. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/core/security.py +0 -0
  55. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/__init__.py +0 -0
  56. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/models.py +0 -0
  57. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/pipeline_sync.py +0 -0
  58. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/repository.py +0 -0
  59. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/router.py +0 -0
  60. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/runner.py +0 -0
  61. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/schemas.py +0 -0
  62. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/service.py +0 -0
  63. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/tasks.py +0 -0
  64. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/cron/translator.py +0 -0
  65. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/database.py +0 -0
  66. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/dependencies.py +0 -0
  67. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/__init__.py +0 -0
  68. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backend_deployment_repository.py +0 -0
  69. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backends/__init__.py +0 -0
  70. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backends/base.py +0 -0
  71. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backends/exceptions.py +0 -0
  72. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backends/native_lambda.py +0 -0
  73. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backends/prefect_ecs.py +0 -0
  74. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backends/prefect_k8s.py +0 -0
  75. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/backends/registry.py +0 -0
  76. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/infra_provisioner.py +0 -0
  77. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/job_launcher.py +0 -0
  78. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/models.py +0 -0
  79. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/repository.py +0 -0
  80. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/router.py +0 -0
  81. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/schemas.py +0 -0
  82. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/deployment/service.py +0 -0
  83. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/evolution/__init__.py +0 -0
  84. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/evolution/adapter.py +0 -0
  85. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/evolution/client.py +0 -0
  86. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/evolution/models.py +0 -0
  87. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/evolution/router.py +0 -0
  88. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/evolution/service.py +0 -0
  89. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/__init__.py +0 -0
  90. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/adapters/__init__.py +0 -0
  91. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/base.py +0 -0
  92. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/models.py +0 -0
  93. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/orchestrator/__init__.py +0 -0
  94. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/orchestrator/base.py +0 -0
  95. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/orchestrator/noop.py +0 -0
  96. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/orchestrator/prefect.py +0 -0
  97. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/repository.py +0 -0
  98. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/router.py +0 -0
  99. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/schemas.py +0 -0
  100. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/service.py +0 -0
  101. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/stage_models.py +0 -0
  102. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/extractor/stage_repository.py +0 -0
  103. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/main.py +0 -0
  104. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/__init__.py +0 -0
  105. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/__main__.py +0 -0
  106. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/server.py +0 -0
  107. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/tools_jobs.py +0 -0
  108. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/tools_kb.py +0 -0
  109. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/tools_modules.py +0 -0
  110. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/tools_pipelines.py +0 -0
  111. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/mcp/tools_processor.py +0 -0
  112. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/middleware/__init__.py +0 -0
  113. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/middleware/rate_limit.py +0 -0
  114. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/middleware/request_id.py +0 -0
  115. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/middleware/security_headers.py +0 -0
  116. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/middleware/tenant.py +0 -0
  117. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/notifications/__init__.py +0 -0
  118. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/notifications/apprise_notifier.py +0 -0
  119. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/__init__.py +0 -0
  120. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/config_parser.py +0 -0
  121. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/expression.py +0 -0
  122. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/models.py +0 -0
  123. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/repositories.py +0 -0
  124. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/router_modules.py +0 -0
  125. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/router_pipelines.py +0 -0
  126. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/schemas.py +0 -0
  127. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/service.py +0 -0
  128. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/translators/__init__.py +0 -0
  129. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/translators/airflow_status.py +0 -0
  130. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/translators/airflow_translator.py +0 -0
  131. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/translators/base.py +0 -0
  132. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/translators/prefect_status.py +0 -0
  133. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/pipeline/translators/prefect_translator.py +0 -0
  134. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/__init__.py +0 -0
  135. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/base.py +0 -0
  136. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/core/__init__.py +0 -0
  137. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/core/analysis.py +0 -0
  138. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/core/chunking.py +0 -0
  139. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/core/prompts.py +0 -0
  140. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/core/topic_splitter.py +0 -0
  141. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/defaults/__init__.py +0 -0
  142. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/defaults/core_processor.py +0 -0
  143. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/defaults/postprocessor.py +0 -0
  144. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/defaults/preprocessor.py +0 -0
  145. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/llm/__init__.py +0 -0
  146. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/llm/provider.py +0 -0
  147. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/ocr/gemini.py +0 -0
  148. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/pipeline.py +0 -0
  149. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/postprocessor/__init__.py +0 -0
  150. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/postprocessor/embeddings.py +0 -0
  151. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/postprocessor/tasks.py +0 -0
  152. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/preprocessor/__init__.py +0 -0
  153. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/preprocessor/tasks.py +0 -0
  154. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/router.py +0 -0
  155. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/processor/schemas.py +0 -0
  156. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/registry.py +0 -0
  157. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/runners/__init__.py +0 -0
  158. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/runners/lambda_runner.py +0 -0
  159. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/runners/pipeline_runner.py +0 -0
  160. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/runners/prefect_pipeline_flow.py +0 -0
  161. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/runners/prefect_runner.py +0 -0
  162. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/s3.py +0 -0
  163. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/secrets.py +0 -0
  164. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/services/__init__.py +0 -0
  165. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/services/bootstrap.py +0 -0
  166. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/services/opensearch.py +0 -0
  167. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/__init__.py +0 -0
  168. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/connectors/__init__.py +0 -0
  169. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/connectors/athena.py +0 -0
  170. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/connectors/base.py +0 -0
  171. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/connectors/opensearch.py +0 -0
  172. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/knowledge_base.py +0 -0
  173. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/router.py +0 -0
  174. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/storage/schemas.py +0 -0
  175. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/testing/__init__.py +0 -0
  176. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/testing/fixtures.py +0 -0
  177. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/testing/mocks.py +0 -0
  178. {pulse_engine-0.2.12 → pulse_engine-0.2.13}/src/pulse_engine/worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pulse-engine
3
- Version: 0.2.12
3
+ Version: 0.2.13
4
4
  Summary: Pulse Engine — Hybrid framework for building Pulse products
5
5
  Author: Pulse Team
6
6
  Requires-Python: >=3.11,<3.13
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pulse-engine"
3
- version = "0.2.12"
3
+ version = "0.2.13"
4
4
  description = "Pulse Engine — Hybrid framework for building Pulse products"
5
5
  authors = ["Pulse Team"]
6
6
  readme = "README.md"
@@ -107,21 +107,45 @@ class YouTubeCaptionsProvider(TranscriptionProvider):
107
107
 
108
108
  return await asyncio.to_thread(_sync)
109
109
 
110
- async def _fetch_subtitles(
111
- self, video_id: str, opts: dict[str, Any], tmp: Path
112
- ) -> Path | None:
113
- """Download subtitle file via yt-dlp; returns path to first .vtt or None."""
110
+ async def _fetch_subtitle_content(
111
+ self, video_id: str, base_opts: dict[str, Any], langs: list[str]
112
+ ) -> tuple[str, str] | None:
113
+ """Return (vtt_content, detected_lang) by extracting subtitle URLs directly.
114
+
115
+ Uses extract_info(process=True) to get signed subtitle URLs, then downloads
116
+ via urllib. Avoids ydl.download() which triggers format resolution and fails
117
+ with "Requested format is not available" on restricted format sets from
118
+ data-centre IPs (GCP/AWS) when using tv_embedded player client.
119
+ """
120
+
121
+ def _sync() -> tuple[str, str] | None:
122
+ import urllib.request
114
123
 
115
- def _sync() -> Path | None:
116
124
  try:
117
125
  import yt_dlp as _yt
118
126
  except ImportError:
119
127
  return None
120
128
  url = f"https://www.youtube.com/watch?v={video_id}"
121
- with _yt.YoutubeDL(opts) as ydl:
122
- ydl.download([url])
123
- vtt_files = sorted(tmp.glob(f"{video_id}.*.vtt"))
124
- return vtt_files[0] if vtt_files else None
129
+ # ignore_no_formats_error prevents DownloadError when tv_embedded
130
+ # returns a restricted format set from data-centre IPs with cookies.
131
+ fetch_opts = {**base_opts, "ignore_no_formats_error": True}
132
+ with _yt.YoutubeDL(fetch_opts) as ydl:
133
+ info = ydl.extract_info(url, download=False, process=True) or {}
134
+ for lang in langs:
135
+ for src in ("subtitles", "automatic_captions"):
136
+ entries = info.get(src, {}).get(lang, [])
137
+ vtt_entry = next(
138
+ (e for e in entries if e.get("ext") == "vtt" and e.get("url")),
139
+ None,
140
+ )
141
+ if not vtt_entry:
142
+ continue
143
+ req = urllib.request.Request(
144
+ vtt_entry["url"], headers={"User-Agent": "Mozilla/5.0"}
145
+ )
146
+ content = urllib.request.urlopen(req, timeout=30).read().decode("utf-8")
147
+ return content, lang
148
+ return None
125
149
 
126
150
  return await asyncio.to_thread(_sync)
127
151
 
@@ -182,30 +206,17 @@ class YouTubeCaptionsProvider(TranscriptionProvider):
182
206
  selected=selected,
183
207
  )
184
208
 
185
- opts = {
186
- **base_opts,
187
- "writesubtitles": True,
188
- "writeautomaticsub": True,
189
- "subtitleslangs": selected[:1],
190
- "subtitlesformat": "vtt",
191
- "outtmpl": str(tmp / "%(id)s"),
192
- }
193
-
194
209
  try:
195
- vtt_path = await self._fetch_subtitles(video_id, opts, tmp)
210
+ result = await self._fetch_subtitle_content(video_id, base_opts, selected)
196
211
  except Exception as exc:
197
212
  raise TranscriptionUnavailable(
198
213
  f"yt-dlp subtitle fetch failed for {video_id}: {exc}"
199
214
  ) from exc
200
215
 
201
- if not vtt_path:
216
+ if not result:
202
217
  raise TranscriptionUnavailable(f"no subtitles found for {video_id}")
203
218
 
204
- # Detect language from filename: {video_id}.{lang_code}.vtt
205
- stem = vtt_path.stem # e.g. "abc123.hi"
206
- detected = stem.rsplit(".", 1)[-1] if "." in stem else language
207
-
208
- content = vtt_path.read_text(encoding="utf-8")
219
+ content, detected = result
209
220
  segments = _parse_vtt(content)
210
221
 
211
222
  if not segments:
File without changes