endoreg-db 0.6.3__py3-none-any.whl → 0.8.1__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.

Potentially problematic release.


This version of endoreg-db might be problematic. Click here for more details.

Files changed (798) hide show
  1. endoreg_db/admin.py +26 -26
  2. endoreg_db/api_urls.py +4 -0
  3. endoreg_db/apps.py +12 -0
  4. endoreg_db/assets/dummy_model.ckpt +1 -0
  5. endoreg_db/codemods/readme.md +88 -0
  6. endoreg_db/codemods/rename_datetime_fields.py +92 -0
  7. endoreg_db/config/env.py +101 -0
  8. endoreg_db/data/__init__.py +26 -0
  9. endoreg_db/data/ai_model/data.yaml +1 -1
  10. endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
  11. endoreg_db/data/ai_model_label/label-set/data.yaml +20 -1
  12. endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
  13. endoreg_db/data/center/data.yaml +13 -12
  14. endoreg_db/data/center_shift/ukw.yaml +9 -0
  15. endoreg_db/data/db_summary.csv +58 -0
  16. endoreg_db/data/db_summary.xlsx +0 -0
  17. endoreg_db/data/disease/misc.yaml +1 -2
  18. endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +2 -2
  19. endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +6 -6
  20. endoreg_db/data/endoscopy_processor/data.yaml +3 -0
  21. endoreg_db/data/event/cardiology.yaml +0 -13
  22. endoreg_db/data/examination/examinations/data.yaml +34 -28
  23. endoreg_db/data/examination/type/data.yaml +12 -0
  24. endoreg_db/data/examination_indication/endoscopy.yaml +418 -2
  25. endoreg_db/data/examination_indication_classification/endoscopy.yaml +157 -5
  26. endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
  27. endoreg_db/data/finding/anatomy_colon.yaml +128 -0
  28. endoreg_db/data/finding/colonoscopy.yaml +40 -0
  29. endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
  30. endoreg_db/data/finding/complication.yaml +16 -0
  31. endoreg_db/data/finding/data.yaml +8 -44
  32. endoreg_db/data/finding/examination_setting.yaml +16 -0
  33. endoreg_db/data/finding/medication_related.yaml +18 -0
  34. endoreg_db/data/finding/outcome.yaml +12 -0
  35. endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
  36. endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
  37. endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
  38. endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
  39. endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
  40. endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
  41. endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
  42. endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
  43. endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
  44. endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
  45. endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
  46. endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
  47. endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
  48. endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
  49. endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
  50. endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
  51. endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
  52. endoreg_db/data/finding_classification/medication_related.yaml +23 -0
  53. endoreg_db/data/finding_classification/visualized.yaml +33 -0
  54. endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
  55. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_circularity_default.yaml +0 -2
  56. endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
  57. endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
  58. endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
  59. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_nice.yaml +4 -7
  60. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_paris.yaml +0 -8
  61. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_planarity_default.yaml +6 -13
  62. endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
  63. endoreg_db/data/{finding_morphology_classification_choice → finding_classification_choice}/colon_lesion_surface_intact_default.yaml +3 -6
  64. endoreg_db/data/{finding_location_classification_choice/colonoscopy.yaml → finding_classification_choice/colonoscopy_location.yaml} +11 -22
  65. endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
  66. endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
  67. endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
  68. endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
  69. endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
  70. endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
  71. endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
  72. endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
  73. endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
  74. endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
  75. endoreg_db/data/finding_intervention/endoscopy.yaml +26 -121
  76. endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
  77. endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
  78. endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
  79. endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
  80. endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
  81. endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +6 -6
  82. endoreg_db/data/finding_type/data.yaml +23 -10
  83. endoreg_db/data/gender/data.yaml +8 -1
  84. endoreg_db/data/information_source/annotation.yaml +6 -0
  85. endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
  86. endoreg_db/data/information_source/prediction.yaml +7 -0
  87. endoreg_db/data/information_source_type/data.yaml +8 -0
  88. endoreg_db/data/lab_value/misc.yaml +43 -0
  89. endoreg_db/data/medication/anticoagulation.yaml +5 -5
  90. endoreg_db/data/medication/tah.yaml +5 -5
  91. endoreg_db/data/medication_indication/anticoagulation.yaml +4 -4
  92. endoreg_db/data/medication_intake_time/base.yaml +4 -4
  93. endoreg_db/data/names_first/first_names.yaml +3 -0
  94. endoreg_db/data/pdf_type/data.yaml +27 -10
  95. endoreg_db/data/qualification/endoscopy.yaml +36 -0
  96. endoreg_db/data/qualification/m2.yaml +39 -0
  97. endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
  98. endoreg_db/data/qualification/sonography.yaml +36 -0
  99. endoreg_db/data/qualification_type/base.yaml +29 -0
  100. endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
  101. endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +5 -0
  102. endoreg_db/data/requirement/age.yaml +26 -0
  103. endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
  104. endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
  105. endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
  106. endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
  107. endoreg_db/data/requirement/disease_misc.yaml +12 -0
  108. endoreg_db/data/requirement/disease_renal.yaml +96 -0
  109. endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
  110. endoreg_db/data/requirement/event_cardiology.yaml +251 -0
  111. endoreg_db/data/requirement/event_requirements.yaml +145 -0
  112. endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
  113. endoreg_db/data/requirement/gender.yaml +25 -0
  114. endoreg_db/data/requirement/lab_value.yaml +441 -0
  115. endoreg_db/data/requirement/medication.yaml +93 -0
  116. endoreg_db/data/requirement_operator/age.yaml +13 -0
  117. endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
  118. endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
  119. endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
  120. endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
  121. endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
  122. endoreg_db/data/requirement_set_type/data.yaml +20 -0
  123. endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
  124. endoreg_db/data/risk/bleeding.yaml +26 -0
  125. endoreg_db/data/risk/thrombosis.yaml +37 -0
  126. endoreg_db/data/risk_type/data.yaml +27 -0
  127. endoreg_db/data/shift/endoscopy.yaml +21 -0
  128. endoreg_db/data/shift_type/base.yaml +35 -0
  129. endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
  130. endoreg_db/data/unit/concentration.yaml +23 -0
  131. endoreg_db/data/unit/time.yaml +36 -1
  132. endoreg_db/exceptions.py +19 -0
  133. endoreg_db/forms/patient_finding_intervention_form.py +4 -5
  134. endoreg_db/forms/patient_form.py +7 -6
  135. endoreg_db/forms/questionnaires/__init__.py +1 -1
  136. endoreg_db/forms/questionnaires/tto_questionnaire.py +19 -19
  137. endoreg_db/helpers/count_db.py +45 -0
  138. endoreg_db/helpers/data_loader.py +208 -0
  139. endoreg_db/helpers/default_objects.py +359 -0
  140. endoreg_db/helpers/interact.py +6 -0
  141. endoreg_db/helpers/test_video_helper.py +119 -0
  142. endoreg_db/logger_conf.py +140 -0
  143. endoreg_db/management/__init__.py +1 -0
  144. endoreg_db/management/commands/__init__.py +1 -0
  145. endoreg_db/management/commands/anonymize_video.py +0 -0
  146. endoreg_db/management/commands/check_auth.py +125 -0
  147. endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
  148. endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
  149. endoreg_db/management/commands/fix_video_paths.py +165 -0
  150. endoreg_db/management/commands/import_fallback_video.py +203 -0
  151. endoreg_db/management/commands/import_report.py +298 -0
  152. endoreg_db/management/commands/import_video.py +422 -0
  153. endoreg_db/management/commands/import_video_with_classification.py +367 -0
  154. endoreg_db/management/commands/init_default_ai_model.py +112 -0
  155. endoreg_db/management/commands/load_ai_model_data.py +2 -7
  156. endoreg_db/management/commands/load_base_db_data.py +15 -1
  157. endoreg_db/management/commands/load_center_data.py +46 -21
  158. endoreg_db/management/commands/load_endoscope_data.py +2 -2
  159. endoreg_db/management/commands/load_examination_indication_data.py +49 -28
  160. endoreg_db/management/commands/load_finding_data.py +49 -92
  161. endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +0 -1
  162. endoreg_db/management/commands/load_information_source.py +13 -7
  163. endoreg_db/management/commands/load_qualification_data.py +59 -0
  164. endoreg_db/management/commands/load_requirement_data.py +180 -0
  165. endoreg_db/management/commands/load_risk_data.py +56 -0
  166. endoreg_db/management/commands/load_shift_data.py +60 -0
  167. endoreg_db/management/commands/load_tag_data.py +57 -0
  168. endoreg_db/management/commands/register_ai_model.py +1 -1
  169. endoreg_db/management/commands/start_filewatcher.py +106 -0
  170. endoreg_db/management/commands/storage_management.py +548 -0
  171. endoreg_db/management/commands/summarize_db_content.py +189 -0
  172. endoreg_db/management/commands/validate_video.py +204 -0
  173. endoreg_db/management/commands/validate_video_files.py +161 -0
  174. endoreg_db/management/commands/video_validation.py +22 -0
  175. endoreg_db/migrations/0001_initial.py +625 -813
  176. endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
  177. endoreg_db/models/__init__.py +274 -291
  178. endoreg_db/models/administration/__init__.py +116 -0
  179. endoreg_db/models/{ai_model → administration/ai}/__init__.py +6 -1
  180. endoreg_db/models/administration/ai/active_model.py +35 -0
  181. endoreg_db/models/administration/ai/ai_model.py +156 -0
  182. endoreg_db/models/{ai_model → administration/ai}/model_type.py +6 -1
  183. endoreg_db/models/administration/case/__init__.py +19 -0
  184. endoreg_db/models/administration/case/case.py +114 -0
  185. endoreg_db/models/{case_template → administration/case/case_template}/case_template.py +3 -3
  186. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule.py +3 -10
  187. endoreg_db/models/{case_template → administration/case/case_template}/case_template_rule_value.py +2 -4
  188. endoreg_db/models/{case_template → administration/case/case_template}/case_template_type.py +1 -3
  189. endoreg_db/models/{center → administration/center}/__init__.py +3 -1
  190. endoreg_db/models/administration/center/center.py +61 -0
  191. endoreg_db/models/administration/center/center_product.py +64 -0
  192. endoreg_db/models/{center → administration/center}/center_resource.py +19 -3
  193. endoreg_db/models/administration/center/center_shift.py +88 -0
  194. endoreg_db/models/administration/center/center_waste.py +30 -0
  195. endoreg_db/models/administration/permissions/__init__.py +44 -0
  196. endoreg_db/models/administration/person/__init__.py +24 -0
  197. endoreg_db/models/administration/person/employee/__init__.py +3 -0
  198. endoreg_db/models/administration/person/employee/employee.py +35 -0
  199. endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
  200. endoreg_db/models/administration/person/employee/employee_type.py +42 -0
  201. endoreg_db/models/administration/person/examiner/__init__.py +4 -0
  202. endoreg_db/models/administration/person/examiner/examiner.py +54 -0
  203. endoreg_db/models/administration/person/names/__init__.py +0 -0
  204. endoreg_db/models/{persons → administration/person/names}/first_name.py +1 -1
  205. endoreg_db/models/{persons → administration/person/names}/last_name.py +2 -3
  206. endoreg_db/models/administration/person/patient/__init__.py +5 -0
  207. endoreg_db/models/administration/person/patient/patient.py +460 -0
  208. endoreg_db/models/administration/person/profession/__init__.py +24 -0
  209. endoreg_db/models/administration/person/user/__init__.py +5 -0
  210. endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
  211. endoreg_db/models/administration/product/product.py +97 -0
  212. endoreg_db/models/administration/product/product_group.py +39 -0
  213. endoreg_db/models/administration/product/product_material.py +54 -0
  214. endoreg_db/models/{product → administration/product}/product_weight.py +9 -0
  215. endoreg_db/models/{product → administration/product}/reference_product.py +26 -11
  216. endoreg_db/models/administration/qualification/__init__.py +7 -0
  217. endoreg_db/models/administration/qualification/qualification.py +37 -0
  218. endoreg_db/models/administration/qualification/qualification_type.py +35 -0
  219. endoreg_db/models/administration/shift/__init__.py +9 -0
  220. endoreg_db/models/administration/shift/scheduled_days.py +69 -0
  221. endoreg_db/models/administration/shift/shift.py +51 -0
  222. endoreg_db/models/administration/shift/shift_type.py +108 -0
  223. endoreg_db/models/label/__init__.py +24 -1
  224. endoreg_db/models/label/annotation/__init__.py +12 -0
  225. endoreg_db/models/label/annotation/image_classification.py +84 -0
  226. endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
  227. endoreg_db/models/label/label.py +45 -74
  228. endoreg_db/models/label/label_set.py +53 -0
  229. endoreg_db/models/label/label_type.py +29 -0
  230. endoreg_db/models/label/label_video_segment/__init__.py +3 -0
  231. endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
  232. endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
  233. endoreg_db/models/label/video_segmentation_label.py +31 -0
  234. endoreg_db/models/{annotation → label}/video_segmentation_labelset.py +7 -0
  235. endoreg_db/models/media/__init__.py +14 -0
  236. endoreg_db/models/media/frame/__init__.py +3 -0
  237. endoreg_db/models/media/frame/frame.py +111 -0
  238. endoreg_db/models/media/pdf/__init__.py +11 -0
  239. endoreg_db/models/media/pdf/raw_pdf.py +608 -0
  240. endoreg_db/models/media/pdf/report_file.py +162 -0
  241. endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
  242. endoreg_db/models/media/video/__init__.py +4 -0
  243. endoreg_db/models/media/video/create_from_file.py +336 -0
  244. endoreg_db/models/media/video/pipe_1.py +195 -0
  245. endoreg_db/models/media/video/pipe_2.py +105 -0
  246. endoreg_db/models/media/video/refactor_plan.md +0 -0
  247. endoreg_db/models/media/video/video_file.py +680 -0
  248. endoreg_db/models/media/video/video_file_ai.py +443 -0
  249. endoreg_db/models/media/video/video_file_anonymize.py +348 -0
  250. endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
  251. endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
  252. endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
  253. endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
  254. endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
  255. endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
  256. endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
  257. endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
  258. endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
  259. endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
  260. endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
  261. endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
  262. endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +129 -0
  263. endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
  264. endoreg_db/models/media/video/video_file_frames.py +0 -0
  265. endoreg_db/models/media/video/video_file_io.py +166 -0
  266. endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
  267. endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
  268. endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
  269. endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
  270. endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
  271. endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
  272. endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
  273. endoreg_db/models/media/video/video_file_meta.py +11 -0
  274. endoreg_db/models/media/video/video_file_segments.py +209 -0
  275. endoreg_db/models/medical/__init__.py +146 -0
  276. endoreg_db/models/{contraindication → medical/contraindication}/__init__.py +1 -5
  277. endoreg_db/models/medical/disease.py +156 -0
  278. endoreg_db/models/medical/event.py +137 -0
  279. endoreg_db/models/{examination → medical/examination}/__init__.py +1 -1
  280. endoreg_db/models/medical/examination/examination.py +148 -0
  281. endoreg_db/models/medical/examination/examination_indication.py +278 -0
  282. endoreg_db/models/{examination → medical/examination}/examination_time.py +0 -4
  283. endoreg_db/models/{examination → medical/examination}/examination_time_type.py +1 -8
  284. endoreg_db/models/{examination → medical/examination}/examination_type.py +18 -10
  285. endoreg_db/models/medical/finding/__init__.py +18 -0
  286. endoreg_db/models/medical/finding/finding.py +96 -0
  287. endoreg_db/models/medical/finding/finding_classification.py +142 -0
  288. endoreg_db/models/{finding → medical/finding}/finding_intervention.py +2 -10
  289. endoreg_db/models/medical/finding/finding_type.py +35 -0
  290. endoreg_db/models/medical/hardware/__init__.py +8 -0
  291. endoreg_db/models/{hardware → medical/hardware}/endoscope.py +28 -23
  292. endoreg_db/models/medical/laboratory/__init__.py +5 -0
  293. endoreg_db/models/medical/laboratory/lab_value.py +419 -0
  294. endoreg_db/models/{medication → medical/medication}/medication.py +1 -3
  295. endoreg_db/models/{medication → medical/medication}/medication_indication_type.py +8 -3
  296. endoreg_db/models/{medication → medical/medication}/medication_intake_time.py +21 -3
  297. endoreg_db/models/{medication → medical/medication}/medication_schedule.py +13 -5
  298. endoreg_db/models/{organ → medical/organ}/__init__.py +3 -6
  299. endoreg_db/models/medical/patient/__init__.py +56 -0
  300. endoreg_db/models/medical/patient/medication_examples.py +38 -0
  301. endoreg_db/models/medical/patient/patient_disease.py +63 -0
  302. endoreg_db/models/medical/patient/patient_event.py +75 -0
  303. endoreg_db/models/medical/patient/patient_examination.py +249 -0
  304. endoreg_db/models/{persons → medical}/patient/patient_examination_indication.py +21 -9
  305. endoreg_db/models/medical/patient/patient_finding.py +357 -0
  306. endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
  307. endoreg_db/models/{patient → medical/patient}/patient_finding_intervention.py +15 -1
  308. endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
  309. endoreg_db/models/{persons → medical}/patient/patient_lab_value.py +40 -15
  310. endoreg_db/models/medical/patient/patient_medication.py +104 -0
  311. endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
  312. endoreg_db/models/medical/risk/__init__.py +7 -0
  313. endoreg_db/models/medical/risk/risk.py +72 -0
  314. endoreg_db/models/medical/risk/risk_type.py +51 -0
  315. endoreg_db/models/{data_file/metadata → metadata}/__init__.py +6 -0
  316. endoreg_db/models/metadata/frame_ocr_result.py +0 -0
  317. endoreg_db/models/metadata/model_meta.py +193 -0
  318. endoreg_db/models/metadata/model_meta_logic.py +236 -0
  319. endoreg_db/models/{data_file/metadata → metadata}/pdf_meta.py +28 -13
  320. endoreg_db/models/metadata/sensitive_meta.py +288 -0
  321. endoreg_db/models/metadata/sensitive_meta_logic.py +643 -0
  322. endoreg_db/models/metadata/video_meta.py +332 -0
  323. endoreg_db/models/metadata/video_prediction_logic.py +190 -0
  324. endoreg_db/models/metadata/video_prediction_meta.py +270 -0
  325. endoreg_db/models/other/__init__.py +17 -0
  326. endoreg_db/models/other/distribution/date_value_distribution.py +0 -2
  327. endoreg_db/models/other/distribution/numeric_value_distribution.py +30 -2
  328. endoreg_db/models/{emission → other/emission}/emission_factor.py +15 -6
  329. endoreg_db/models/{persons → other}/gender.py +8 -3
  330. endoreg_db/models/other/information_source.py +159 -0
  331. endoreg_db/models/other/material.py +10 -2
  332. endoreg_db/models/other/resource.py +6 -2
  333. endoreg_db/models/other/tag.py +27 -0
  334. endoreg_db/models/other/transport_route.py +13 -2
  335. endoreg_db/models/{unit.py → other/unit.py} +16 -6
  336. endoreg_db/models/other/waste.py +10 -3
  337. endoreg_db/models/requirement/__init__.py +11 -0
  338. endoreg_db/models/requirement/requirement.py +767 -0
  339. endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
  340. endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
  341. endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
  342. endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
  343. endoreg_db/models/requirement/requirement_operator.py +176 -0
  344. endoreg_db/models/requirement/requirement_set.py +287 -0
  345. endoreg_db/models/rule/__init__.py +13 -0
  346. endoreg_db/models/{rules → rule}/rule.py +6 -3
  347. endoreg_db/models/{rules → rule}/rule_attribute_dtype.py +0 -2
  348. endoreg_db/models/{rules → rule}/rule_type.py +0 -2
  349. endoreg_db/models/{rules → rule}/ruleset.py +0 -2
  350. endoreg_db/models/state/__init__.py +12 -0
  351. endoreg_db/models/state/abstract.py +11 -0
  352. endoreg_db/models/state/audit_ledger.py +150 -0
  353. endoreg_db/models/state/label_video_segment.py +22 -0
  354. endoreg_db/models/state/raw_pdf.py +187 -0
  355. endoreg_db/models/state/sensitive_meta.py +46 -0
  356. endoreg_db/models/state/video.py +232 -0
  357. endoreg_db/models/upload_job.py +99 -0
  358. endoreg_db/models/utils.py +135 -0
  359. endoreg_db/models/video_metadata.py +66 -0
  360. endoreg_db/models/video_processing.py +153 -0
  361. endoreg_db/renames.yml +8 -0
  362. endoreg_db/root_urls.py +9 -0
  363. endoreg_db/schemas/__init__.py +0 -0
  364. endoreg_db/schemas/examination_evaluation.py +27 -0
  365. endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
  366. endoreg_db/serializers/__init__.py +147 -10
  367. endoreg_db/serializers/{raw_pdf_meta_validation.py → _old/raw_pdf_meta_validation.py} +3 -3
  368. endoreg_db/serializers/{raw_video_meta_validation.py → _old/raw_video_meta_validation.py} +18 -14
  369. endoreg_db/serializers/_old/video.py +71 -0
  370. endoreg_db/serializers/administration/__init__.py +14 -0
  371. endoreg_db/serializers/administration/ai/__init__.py +10 -0
  372. endoreg_db/serializers/administration/ai/active_model.py +10 -0
  373. endoreg_db/serializers/administration/ai/ai_model.py +18 -0
  374. endoreg_db/serializers/administration/ai/model_type.py +10 -0
  375. endoreg_db/serializers/administration/center.py +9 -0
  376. endoreg_db/serializers/administration/gender.py +9 -0
  377. endoreg_db/serializers/anonymization.py +66 -0
  378. endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
  379. endoreg_db/serializers/examination/__init__.py +10 -0
  380. endoreg_db/serializers/examination/base.py +46 -0
  381. endoreg_db/serializers/examination/dropdown.py +21 -0
  382. endoreg_db/serializers/examination_serializer.py +12 -0
  383. endoreg_db/serializers/finding/__init__.py +5 -0
  384. endoreg_db/serializers/finding/finding.py +54 -0
  385. endoreg_db/serializers/finding_classification/__init__.py +7 -0
  386. endoreg_db/serializers/finding_classification/choice.py +19 -0
  387. endoreg_db/serializers/finding_classification/classification.py +13 -0
  388. endoreg_db/serializers/label/__init__.py +7 -0
  389. endoreg_db/serializers/label/image_classification_annotation.py +62 -0
  390. endoreg_db/serializers/label/label.py +15 -0
  391. endoreg_db/serializers/label_video_segment/__init__.py +7 -0
  392. endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
  393. endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
  394. endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
  395. endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
  396. endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
  397. endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
  398. endoreg_db/serializers/meta/__init__.py +19 -0
  399. endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
  400. endoreg_db/serializers/meta/report_meta.py +53 -0
  401. endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
  402. endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
  403. endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
  404. endoreg_db/serializers/meta/video_meta.py +39 -0
  405. endoreg_db/serializers/misc/__init__.py +14 -0
  406. endoreg_db/serializers/misc/file_overview.py +152 -0
  407. endoreg_db/serializers/misc/stats.py +33 -0
  408. endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
  409. endoreg_db/serializers/misc/upload_job.py +71 -0
  410. endoreg_db/serializers/misc/vop_patient_data.py +120 -0
  411. endoreg_db/serializers/patient/__init__.py +11 -0
  412. endoreg_db/serializers/patient/patient.py +86 -0
  413. endoreg_db/serializers/patient/patient_dropdown.py +27 -0
  414. endoreg_db/serializers/patient_examination/__init__.py +7 -0
  415. endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
  416. endoreg_db/serializers/patient_finding/__init__.py +15 -0
  417. endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
  418. endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
  419. endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
  420. endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
  421. endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
  422. endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
  423. endoreg_db/serializers/pdf/__init__.py +5 -0
  424. endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
  425. endoreg_db/serializers/report/__init__.py +9 -0
  426. endoreg_db/serializers/report/mixins.py +45 -0
  427. endoreg_db/serializers/report/report.py +105 -0
  428. endoreg_db/serializers/report/report_list.py +22 -0
  429. endoreg_db/serializers/report/secure_file_url.py +26 -0
  430. endoreg_db/serializers/requirements/requirement_schema.py +25 -0
  431. endoreg_db/serializers/requirements/requirement_sets.py +29 -0
  432. endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
  433. endoreg_db/serializers/video/__init__.py +7 -0
  434. endoreg_db/serializers/video/segmentation.py +263 -0
  435. endoreg_db/serializers/video/video_file_brief.py +10 -0
  436. endoreg_db/serializers/video/video_file_detail.py +83 -0
  437. endoreg_db/serializers/video/video_file_list.py +67 -0
  438. endoreg_db/serializers/video/video_metadata.py +105 -0
  439. endoreg_db/serializers/video/video_processing_history.py +153 -0
  440. endoreg_db/services/__init__.py +5 -0
  441. endoreg_db/services/anonymization.py +223 -0
  442. endoreg_db/services/examination_evaluation.py +149 -0
  443. endoreg_db/services/finding_description_service.py +0 -0
  444. endoreg_db/services/lookup_service.py +241 -0
  445. endoreg_db/services/lookup_store.py +122 -0
  446. endoreg_db/services/ollama_api_docs.py +1528 -0
  447. endoreg_db/services/pdf_import.py +993 -0
  448. endoreg_db/services/polling_coordinator.py +288 -0
  449. endoreg_db/services/pseudonym_service.py +89 -0
  450. endoreg_db/services/requirements_object.py +147 -0
  451. endoreg_db/services/segment_sync.py +155 -0
  452. endoreg_db/services/storage_aware_video_processor.py +344 -0
  453. endoreg_db/services/video_import.py +915 -0
  454. endoreg_db/tasks/upload_tasks.py +207 -0
  455. endoreg_db/tasks/video_ingest.py +157 -0
  456. endoreg_db/tasks/video_processing_tasks.py +327 -0
  457. endoreg_db/urls/__init__.py +72 -0
  458. endoreg_db/urls/anonymization.py +32 -0
  459. endoreg_db/urls/auth.py +16 -0
  460. endoreg_db/urls/classification.py +39 -0
  461. endoreg_db/urls/examination.py +54 -0
  462. endoreg_db/urls/files.py +6 -0
  463. endoreg_db/urls/label_video_segment_validate.py +33 -0
  464. endoreg_db/urls/label_video_segments.py +44 -0
  465. endoreg_db/urls/media.py +32 -0
  466. endoreg_db/urls/patient.py +19 -0
  467. endoreg_db/urls/pdf.py +0 -0
  468. endoreg_db/urls/report.py +78 -0
  469. endoreg_db/urls/requirements.py +13 -0
  470. endoreg_db/urls/sensitive_meta.py +36 -0
  471. endoreg_db/urls/stats.py +46 -0
  472. endoreg_db/urls/upload.py +20 -0
  473. endoreg_db/urls/video.py +119 -0
  474. endoreg_db/urls.py +6 -269
  475. endoreg_db/utils/__init__.py +68 -16
  476. endoreg_db/utils/ai/__init__.py +9 -0
  477. endoreg_db/{models/ai_model/utils.py → utils/ai/get.py} +1 -4
  478. endoreg_db/{models/ai_model/lightning → utils/ai}/inference_dataset.py +0 -1
  479. endoreg_db/{models/ai_model/lightning → utils/ai}/multilabel_classification_net.py +14 -10
  480. endoreg_db/{models/ai_model/lightning → utils/ai}/postprocess.py +15 -5
  481. endoreg_db/utils/ai/predict.py +291 -0
  482. endoreg_db/{models/ai_model/lightning → utils/ai}/preprocess.py +1 -1
  483. endoreg_db/utils/calc_duration_seconds.py +24 -0
  484. endoreg_db/utils/case_generator/__init__.py +0 -0
  485. endoreg_db/utils/check_video_files.py +148 -0
  486. endoreg_db/utils/dataloader.py +88 -31
  487. endoreg_db/utils/dates.py +21 -0
  488. endoreg_db/utils/env.py +33 -0
  489. endoreg_db/utils/extract_specific_frames.py +72 -0
  490. endoreg_db/utils/file_operations.py +29 -1
  491. endoreg_db/utils/fix_video_path_direct.py +141 -0
  492. endoreg_db/utils/frame_anonymization_utils.py +463 -0
  493. endoreg_db/utils/hashs.py +1 -0
  494. endoreg_db/utils/links/__init__.py +0 -0
  495. endoreg_db/utils/links/requirement_link.py +193 -0
  496. endoreg_db/utils/mime_types.py +0 -0
  497. endoreg_db/utils/names.py +2 -0
  498. endoreg_db/utils/paths.py +104 -0
  499. endoreg_db/utils/permissions.py +143 -0
  500. endoreg_db/utils/pipelines/Readme.md +235 -0
  501. endoreg_db/utils/pipelines/__init__.py +0 -0
  502. endoreg_db/utils/pipelines/process_video_dir.py +120 -0
  503. endoreg_db/utils/product/__init__.py +0 -0
  504. endoreg_db/utils/product/sum_emissions.py +20 -0
  505. endoreg_db/utils/product/sum_weights.py +18 -0
  506. endoreg_db/utils/pydantic_models/db_config.py +1 -1
  507. endoreg_db/utils/requirement_helpers.py +0 -0
  508. endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
  509. endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
  510. endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
  511. endoreg_db/utils/translation.py +27 -0
  512. endoreg_db/utils/validate_video_detailed.py +357 -0
  513. endoreg_db/utils/video/__init__.py +19 -6
  514. endoreg_db/utils/video/extract_frames.py +37 -70
  515. endoreg_db/utils/video/ffmpeg_wrapper.py +772 -0
  516. endoreg_db/utils/video/names.py +42 -0
  517. endoreg_db/utils/video/streaming_processor.py +312 -0
  518. endoreg_db/utils/video/video_splitter.py +94 -0
  519. endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
  520. endoreg_db/views/__init__.py +282 -2
  521. endoreg_db/views/anonymization/__init__.py +27 -0
  522. endoreg_db/views/anonymization/media_management.py +454 -0
  523. endoreg_db/views/anonymization/overview.py +216 -0
  524. endoreg_db/views/anonymization/validate.py +63 -0
  525. endoreg_db/views/auth/__init__.py +13 -0
  526. endoreg_db/views/auth/keycloak.py +113 -0
  527. endoreg_db/views/examination/__init__.py +33 -0
  528. endoreg_db/views/examination/examination.py +37 -0
  529. endoreg_db/views/examination/examination_manifest_cache.py +26 -0
  530. endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
  531. endoreg_db/views/examination/get_finding_classifications.py +36 -0
  532. endoreg_db/views/examination/get_findings.py +41 -0
  533. endoreg_db/views/examination/get_instruments.py +18 -0
  534. endoreg_db/views/examination/get_interventions.py +14 -0
  535. endoreg_db/views/finding/__init__.py +9 -0
  536. endoreg_db/views/finding/finding.py +112 -0
  537. endoreg_db/views/finding/get_classifications.py +14 -0
  538. endoreg_db/views/finding/get_interventions.py +17 -0
  539. endoreg_db/views/finding_classification/__init__.py +13 -0
  540. endoreg_db/views/finding_classification/base.py +0 -0
  541. endoreg_db/views/finding_classification/finding_classification.py +42 -0
  542. endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
  543. endoreg_db/views/label/__init__.py +5 -0
  544. endoreg_db/views/label/label.py +15 -0
  545. endoreg_db/views/label_video_segment/__init__.py +16 -0
  546. endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
  547. endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
  548. endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
  549. endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
  550. endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
  551. endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
  552. endoreg_db/views/label_video_segment/validate.py +226 -0
  553. endoreg_db/views/media/__init__.py +9 -0
  554. endoreg_db/views/media/pdf_media.py +386 -0
  555. endoreg_db/views/media/video_media.py +272 -0
  556. endoreg_db/views/meta/__init__.py +15 -0
  557. endoreg_db/views/meta/available_files_list.py +146 -0
  558. endoreg_db/views/meta/report_meta.py +53 -0
  559. endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
  560. endoreg_db/views/meta/sensitive_meta_list.py +104 -0
  561. endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
  562. endoreg_db/views/misc/__init__.py +63 -0
  563. endoreg_db/views/misc/center.py +13 -0
  564. endoreg_db/views/misc/gender.py +14 -0
  565. endoreg_db/views/misc/secure_file_serving_view.py +80 -0
  566. endoreg_db/views/misc/secure_file_url_view.py +84 -0
  567. endoreg_db/views/misc/secure_url_validate.py +79 -0
  568. endoreg_db/views/misc/stats.py +220 -0
  569. endoreg_db/views/misc/translation.py +182 -0
  570. endoreg_db/views/misc/upload_views.py +240 -0
  571. endoreg_db/views/patient/__init__.py +5 -0
  572. endoreg_db/views/patient/patient.py +210 -0
  573. endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
  574. endoreg_db/views/patient_examination/__init__.py +11 -0
  575. endoreg_db/views/patient_examination/patient_examination.py +140 -0
  576. endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
  577. endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
  578. endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
  579. endoreg_db/views/patient_examination/video.py +194 -0
  580. endoreg_db/views/patient_finding/__init__.py +7 -0
  581. endoreg_db/views/patient_finding/base.py +0 -0
  582. endoreg_db/views/patient_finding/patient_finding.py +64 -0
  583. endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
  584. endoreg_db/views/patient_finding_classification/__init__.py +5 -0
  585. endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
  586. endoreg_db/views/patient_finding_location/__init__.py +5 -0
  587. endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
  588. endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
  589. endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
  590. endoreg_db/views/pdf/__init__.py +11 -0
  591. endoreg_db/views/pdf/pdf_media.py +239 -0
  592. endoreg_db/views/pdf/pdf_stream_views.py +127 -0
  593. endoreg_db/views/pdf/reimport.py +151 -0
  594. endoreg_db/views/report/__init__.py +9 -0
  595. endoreg_db/views/report/report_list.py +112 -0
  596. endoreg_db/views/report/report_with_secure_url.py +28 -0
  597. endoreg_db/views/report/start_examination.py +7 -0
  598. endoreg_db/views/requirement/__init__.py +10 -0
  599. endoreg_db/views/requirement/evaluate.py +279 -0
  600. endoreg_db/views/requirement/lookup.py +483 -0
  601. endoreg_db/views/requirement/lookup_store.py +252 -0
  602. endoreg_db/views/requirement_lookup/lookup.py +0 -0
  603. endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
  604. endoreg_db/views/stats/__init__.py +13 -0
  605. endoreg_db/views/stats/stats_views.py +229 -0
  606. endoreg_db/views/video/__init__.py +72 -0
  607. endoreg_db/views/video/correction.py +672 -0
  608. endoreg_db/views/video/media/__init__.py +23 -0
  609. endoreg_db/views/video/media/task_status.py +49 -0
  610. endoreg_db/views/video/media/video_analyze.py +52 -0
  611. endoreg_db/views/video/media/video_apply_mask.py +48 -0
  612. endoreg_db/views/video/media/video_correction.py +21 -0
  613. endoreg_db/views/video/media/video_download_processed.py +58 -0
  614. endoreg_db/views/video/media/video_media.py +158 -0
  615. endoreg_db/views/video/media/video_meta.py +29 -0
  616. endoreg_db/views/video/media/video_processing_history.py +24 -0
  617. endoreg_db/views/video/media/video_remove_frames.py +48 -0
  618. endoreg_db/views/video/media/video_reprocess.py +40 -0
  619. endoreg_db/views/video/reimport.py +192 -0
  620. endoreg_db/views/video/segmentation.py +274 -0
  621. endoreg_db/views/{views_for_timeline.py → video/timeline.py} +3 -3
  622. endoreg_db/views/video/video_examination_viewset.py +329 -0
  623. endoreg_db/views/video/video_stream.py +188 -0
  624. endoreg_db-0.8.1.dist-info/METADATA +384 -0
  625. endoreg_db-0.8.1.dist-info/RECORD +789 -0
  626. endoreg_db/data/agl_service/data.yaml +0 -19
  627. endoreg_db/data/finding_location_classification/colonoscopy.yaml +0 -46
  628. endoreg_db/data/finding_morphology_classification/colonoscopy.yaml +0 -48
  629. endoreg_db/data/finding_morphology_classification_choice/colonoscopy_size.yaml +0 -57
  630. endoreg_db/management/commands/_load_model_template.py +0 -41
  631. endoreg_db/management/commands/delete_all.py +0 -18
  632. endoreg_db/management/commands/fetch_legacy_image_dataset.py +0 -32
  633. endoreg_db/management/commands/fix_auth_permission.py +0 -20
  634. endoreg_db/management/commands/load_active_model_data.py +0 -45
  635. endoreg_db/management/commands/load_g_play_data.py +0 -113
  636. endoreg_db/management/commands/load_logging_data.py +0 -39
  637. endoreg_db/management/commands/load_lx_data.py +0 -64
  638. endoreg_db/management/commands/load_medication_indication_data.py +0 -63
  639. endoreg_db/management/commands/load_medication_indication_type_data.py +0 -41
  640. endoreg_db/management/commands/load_medication_intake_time_data.py +0 -41
  641. endoreg_db/management/commands/load_medication_schedule_data.py +0 -55
  642. endoreg_db/management/commands/load_network_data.py +0 -57
  643. endoreg_db/migrations/0002_alter_frame_image_alter_rawframe_image.py +0 -23
  644. endoreg_db/migrations/0003_alter_frame_image_alter_rawframe_image.py +0 -23
  645. endoreg_db/migrations/0004_alter_rawvideofile_file_alter_video_file.py +0 -25
  646. endoreg_db/migrations/0005_rawvideofile_frame_count_and_more.py +0 -33
  647. endoreg_db/migrations/0006_frame_extracted_rawframe_extracted.py +0 -23
  648. endoreg_db/migrations/0007_rename_pseudo_patient_video_patient_and_more.py +0 -24
  649. endoreg_db/migrations/0008_remove_reportfile_patient_examination_and_more.py +0 -48
  650. endoreg_db/models/ai_model/active_model.py +0 -9
  651. endoreg_db/models/ai_model/ai_model.py +0 -103
  652. endoreg_db/models/ai_model/lightning/__init__.py +0 -3
  653. endoreg_db/models/ai_model/lightning/predict.py +0 -172
  654. endoreg_db/models/ai_model/lightning/prediction_visualizer.py +0 -55
  655. endoreg_db/models/ai_model/lightning/run_visualizer.py +0 -21
  656. endoreg_db/models/ai_model/model_meta.py +0 -250
  657. endoreg_db/models/annotation/__init__.py +0 -32
  658. endoreg_db/models/annotation/anonymized_image_annotation.py +0 -115
  659. endoreg_db/models/annotation/binary_classification_annotation_task.py +0 -117
  660. endoreg_db/models/annotation/image_classification.py +0 -86
  661. endoreg_db/models/annotation/video_segmentation_annotation.py +0 -52
  662. endoreg_db/models/case/__init__.py +0 -1
  663. endoreg_db/models/case/case.py +0 -34
  664. endoreg_db/models/center/center.py +0 -51
  665. endoreg_db/models/center/center_product.py +0 -33
  666. endoreg_db/models/center/center_waste.py +0 -16
  667. endoreg_db/models/data_file/__init__.py +0 -39
  668. endoreg_db/models/data_file/base_classes/__init__.py +0 -7
  669. endoreg_db/models/data_file/base_classes/abstract_frame.py +0 -100
  670. endoreg_db/models/data_file/base_classes/abstract_pdf.py +0 -136
  671. endoreg_db/models/data_file/base_classes/abstract_video.py +0 -807
  672. endoreg_db/models/data_file/base_classes/frame_helpers.py +0 -17
  673. endoreg_db/models/data_file/base_classes/prepare_bulk_frames.py +0 -19
  674. endoreg_db/models/data_file/base_classes/utils.py +0 -80
  675. endoreg_db/models/data_file/frame.py +0 -29
  676. endoreg_db/models/data_file/import_classes/__init__.py +0 -18
  677. endoreg_db/models/data_file/import_classes/processing_functions/__init__.py +0 -35
  678. endoreg_db/models/data_file/import_classes/processing_functions/pdf.py +0 -28
  679. endoreg_db/models/data_file/import_classes/processing_functions/video.py +0 -260
  680. endoreg_db/models/data_file/import_classes/raw_pdf.py +0 -260
  681. endoreg_db/models/data_file/import_classes/raw_video.py +0 -288
  682. endoreg_db/models/data_file/metadata/sensitive_meta.py +0 -290
  683. endoreg_db/models/data_file/metadata/video_meta.py +0 -199
  684. endoreg_db/models/data_file/report_file.py +0 -56
  685. endoreg_db/models/data_file/video/__init__.py +0 -11
  686. endoreg_db/models/data_file/video/import_meta.py +0 -25
  687. endoreg_db/models/data_file/video/video.py +0 -196
  688. endoreg_db/models/data_file/video_segment.py +0 -214
  689. endoreg_db/models/disease.py +0 -79
  690. endoreg_db/models/event.py +0 -73
  691. endoreg_db/models/examination/examination.py +0 -67
  692. endoreg_db/models/examination/examination_indication.py +0 -170
  693. endoreg_db/models/finding/__init__.py +0 -11
  694. endoreg_db/models/finding/finding.py +0 -75
  695. endoreg_db/models/finding/finding_location_classification.py +0 -94
  696. endoreg_db/models/finding/finding_morphology_classification.py +0 -89
  697. endoreg_db/models/finding/finding_type.py +0 -22
  698. endoreg_db/models/hardware/__init__.py +0 -2
  699. endoreg_db/models/information_source.py +0 -29
  700. endoreg_db/models/laboratory/__init__.py +0 -1
  701. endoreg_db/models/laboratory/lab_value.py +0 -111
  702. endoreg_db/models/logging/__init__.py +0 -11
  703. endoreg_db/models/logging/agl_service.py +0 -19
  704. endoreg_db/models/logging/base.py +0 -22
  705. endoreg_db/models/logging/log_type.py +0 -23
  706. endoreg_db/models/logging/network_device.py +0 -27
  707. endoreg_db/models/lx/__init__.py +0 -4
  708. endoreg_db/models/lx/client.py +0 -57
  709. endoreg_db/models/lx/identity.py +0 -34
  710. endoreg_db/models/lx/permission.py +0 -18
  711. endoreg_db/models/lx/user.py +0 -16
  712. endoreg_db/models/network/__init__.py +0 -9
  713. endoreg_db/models/network/agl_service.py +0 -38
  714. endoreg_db/models/network/network_device.py +0 -58
  715. endoreg_db/models/network/network_device_type.py +0 -23
  716. endoreg_db/models/other/distribution.py +0 -5
  717. endoreg_db/models/patient/__init__.py +0 -24
  718. endoreg_db/models/patient/patient_examination.py +0 -182
  719. endoreg_db/models/patient/patient_finding.py +0 -143
  720. endoreg_db/models/patient/patient_finding_location.py +0 -120
  721. endoreg_db/models/patient/patient_finding_morphology.py +0 -166
  722. endoreg_db/models/permissions/__init__.py +0 -44
  723. endoreg_db/models/persons/__init__.py +0 -34
  724. endoreg_db/models/persons/examiner/__init__.py +0 -2
  725. endoreg_db/models/persons/examiner/examiner.py +0 -60
  726. endoreg_db/models/persons/examiner/examiner_type.py +0 -2
  727. endoreg_db/models/persons/patient/__init__.py +0 -8
  728. endoreg_db/models/persons/patient/patient.py +0 -389
  729. endoreg_db/models/persons/patient/patient_disease.py +0 -22
  730. endoreg_db/models/persons/patient/patient_event.py +0 -52
  731. endoreg_db/models/persons/patient/patient_lab_sample.py +0 -108
  732. endoreg_db/models/persons/patient/patient_medication.py +0 -59
  733. endoreg_db/models/persons/patient/patient_medication_schedule.py +0 -88
  734. endoreg_db/models/persons/portal_user_information.py +0 -27
  735. endoreg_db/models/prediction/__init__.py +0 -8
  736. endoreg_db/models/prediction/image_classification.py +0 -51
  737. endoreg_db/models/prediction/video_prediction_meta.py +0 -306
  738. endoreg_db/models/product/product.py +0 -110
  739. endoreg_db/models/product/product_group.py +0 -27
  740. endoreg_db/models/product/product_material.py +0 -28
  741. endoreg_db/models/questionnaires/__init__.py +0 -114
  742. endoreg_db/models/quiz/__init__.py +0 -9
  743. endoreg_db/models/quiz/quiz_answer.py +0 -41
  744. endoreg_db/models/quiz/quiz_question.py +0 -54
  745. endoreg_db/models/report_reader/report_reader_config.py +0 -53
  746. endoreg_db/models/rules/__init__.py +0 -5
  747. endoreg_db/queries/get/__init__.py +0 -6
  748. endoreg_db/queries/get/center.py +0 -42
  749. endoreg_db/queries/get/model.py +0 -13
  750. endoreg_db/queries/get/patient.py +0 -14
  751. endoreg_db/queries/get/patient_examination.py +0 -20
  752. endoreg_db/queries/get/report_file.py +0 -33
  753. endoreg_db/queries/get/video.py +0 -31
  754. endoreg_db/serializers/ai_model.py +0 -19
  755. endoreg_db/serializers/annotation.py +0 -14
  756. endoreg_db/serializers/center.py +0 -11
  757. endoreg_db/serializers/examination.py +0 -33
  758. endoreg_db/serializers/frame.py +0 -9
  759. endoreg_db/serializers/hardware.py +0 -21
  760. endoreg_db/serializers/label.py +0 -22
  761. endoreg_db/serializers/patient.py +0 -33
  762. endoreg_db/serializers/prediction.py +0 -10
  763. endoreg_db/serializers/raw_pdf_anony_text_validation.py +0 -137
  764. endoreg_db/serializers/report_file.py +0 -7
  765. endoreg_db/serializers/video.py +0 -20
  766. endoreg_db/serializers/video_segmentation.py +0 -587
  767. endoreg_db/tests.py +0 -3
  768. endoreg_db/utils/legacy_ocr.py +0 -201
  769. endoreg_db/utils/video/transcode_videofile.py +0 -111
  770. endoreg_db/views/patient_views.py +0 -90
  771. endoreg_db/views/raw_pdf_anony_text_validation_views.py +0 -95
  772. endoreg_db/views/raw_pdf_meta_validation_views.py +0 -111
  773. endoreg_db/views/raw_video_meta_validation_views.py +0 -148
  774. endoreg_db/views/report_views.py +0 -96
  775. endoreg_db/views/video_segmentation_views.py +0 -166
  776. endoreg_db-0.6.3.dist-info/METADATA +0 -161
  777. endoreg_db-0.6.3.dist-info/RECORD +0 -435
  778. /endoreg_db/{case_generator/__init__.py → api/serializers/finding_descriptions.py} +0 -0
  779. /endoreg_db/{queries/get/annotation.py → api/views/finding_descriptions.py} +0 -0
  780. /endoreg_db/{queries/get/prediction.py → data/shift/m2.yaml} +0 -0
  781. /endoreg_db/{queries/get/video_import_meta.py → factories/__init__.py} +0 -0
  782. /endoreg_db/{queries/get/video_prediction_meta.py → helpers/__init__.py} +0 -0
  783. /endoreg_db/models/{case_template → administration/case/case_template}/__init__.py +0 -0
  784. /endoreg_db/models/{persons → administration/person}/person.py +0 -0
  785. /endoreg_db/models/{product → administration/product}/__init__.py +0 -0
  786. /endoreg_db/models/{report_reader → media/pdf/report_reader}/__init__.py +0 -0
  787. /endoreg_db/models/{report_reader → media/pdf/report_reader}/report_reader_flag.py +0 -0
  788. /endoreg_db/models/{hardware → medical/hardware}/endoscopy_processor.py +0 -0
  789. /endoreg_db/models/{medication → medical/medication}/__init__.py +0 -0
  790. /endoreg_db/models/{medication → medical/medication}/medication_indication.py +0 -0
  791. /endoreg_db/models/{emission → other/emission}/__init__.py +0 -0
  792. /endoreg_db/models/{rules → rule}/rule_applicator.py +0 -0
  793. /endoreg_db/{case_generator → utils/case_generator}/case_generator.py +0 -0
  794. /endoreg_db/{case_generator → utils/case_generator}/lab_sample_factory.py +0 -0
  795. /endoreg_db/{case_generator → utils/case_generator}/utils.py +0 -0
  796. /endoreg_db/views/{csrf.py → misc/csrf.py} +0 -0
  797. {endoreg_db-0.6.3.dist-info → endoreg_db-0.8.1.dist-info}/WHEEL +0 -0
  798. {endoreg_db-0.6.3.dist-info → endoreg_db-0.8.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,357 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Comprehensive video file validation script for debugging streaming issues.
4
+ Tests file integrity, codec compatibility, and streaming capabilities.
5
+ """
6
+
7
+ import os
8
+ import sys
9
+ import subprocess
10
+ from pathlib import Path
11
+ import json
12
+ import logging
13
+
14
+ # Dynamically determine the Django project path
15
+ # previously resolved to "/home/admin/test/lx-annotate/endoreg-db" (endoreg-db project directory)
16
+ project_path = os.environ.get(
17
+ 'ENDOREG_DJANGO_PROJECT_PATH',
18
+ str(Path(__file__).resolve().parent.parent.parent)
19
+ )
20
+ sys.path.insert(0, project_path)
21
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dev.dev_settings')
22
+
23
+
24
+ import django
25
+ django.setup()
26
+
27
+ from endoreg_db.models import VideoFile
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ def check_ffmpeg_available():
33
+ """Check if FFmpeg is available for video analysis."""
34
+ try:
35
+ result = subprocess.run(['ffmpeg', '-version'],
36
+ capture_output=True, text=True, timeout=10)
37
+ return result.returncode == 0
38
+ except (subprocess.TimeoutExpired, FileNotFoundError):
39
+ return False
40
+
41
+
42
+ def analyze_video_with_ffmpeg(video_path):
43
+ """
44
+ Use FFmpeg to analyze video file integrity and get detailed information.
45
+ """
46
+ analysis_result = {
47
+ 'file_readable': False,
48
+ 'has_video_stream': False,
49
+ 'has_audio_stream': False,
50
+ 'duration': None,
51
+ 'codec': None,
52
+ 'resolution': None,
53
+ 'frame_count': None,
54
+ 'errors': [],
55
+ 'warnings': []
56
+ }
57
+
58
+ try:
59
+ # First, try to probe the file
60
+ print(f"📊 Analyzing video with FFprobe: {video_path}")
61
+ probe_cmd = [
62
+ 'ffprobe', '-v', 'quiet', '-print_format', 'json',
63
+ '-show_format', '-show_streams', str(video_path)
64
+ ]
65
+
66
+ result = subprocess.run(probe_cmd, capture_output=True, text=True, timeout=30)
67
+
68
+ if result.returncode == 0:
69
+ analysis_result['file_readable'] = True
70
+ probe_data = json.loads(result.stdout)
71
+
72
+ # Analyze streams
73
+ if 'streams' in probe_data:
74
+ for stream in probe_data['streams']:
75
+ if stream.get('codec_type') == 'video':
76
+ analysis_result['has_video_stream'] = True
77
+ analysis_result['codec'] = stream.get('codec_name')
78
+ analysis_result['resolution'] = f"{stream.get('width', '?')}x{stream.get('height', '?')}"
79
+ analysis_result['frame_count'] = stream.get('nb_frames')
80
+ elif stream.get('codec_type') == 'audio':
81
+ analysis_result['has_audio_stream'] = True
82
+
83
+ # Get format info
84
+ if 'format' in probe_data:
85
+ analysis_result['duration'] = float(probe_data['format'].get('duration', 0))
86
+ else:
87
+ analysis_result['errors'].append(f"FFprobe failed: {result.stderr}")
88
+
89
+ except subprocess.TimeoutExpired:
90
+ analysis_result['errors'].append("FFprobe timed out - file might be severely corrupted")
91
+ except json.JSONDecodeError:
92
+ analysis_result['errors'].append("FFprobe returned invalid JSON")
93
+ except Exception as e:
94
+ analysis_result['errors'].append(f"FFprobe analysis failed: {e}")
95
+
96
+ # Try to validate file integrity
97
+ try:
98
+ print("🔍 Testing video integrity...")
99
+ integrity_cmd = [
100
+ 'ffmpeg', '-v', 'error', '-i', str(video_path),
101
+ '-f', 'null', '-', '-t', '5' # Test first 5 seconds
102
+ ]
103
+
104
+ result = subprocess.run(integrity_cmd, capture_output=True, text=True, timeout=30)
105
+
106
+ if result.returncode == 0:
107
+ print("✅ Video integrity test passed")
108
+ else:
109
+ analysis_result['errors'].append(f"Integrity test failed: {result.stderr}")
110
+
111
+ except subprocess.TimeoutExpired:
112
+ analysis_result['errors'].append("Integrity test timed out")
113
+ except Exception as e:
114
+ analysis_result['errors'].append(f"Integrity test failed: {e}")
115
+
116
+ return analysis_result
117
+
118
+
119
+ def test_video_streaming_compatibility(video_path):
120
+ """
121
+ Test if video is compatible with web streaming (H.264 baseline profile recommended).
122
+ """
123
+ compatibility_result = {
124
+ 'web_compatible': False,
125
+ 'streaming_friendly': False,
126
+ 'needs_conversion': False,
127
+ 'recommendations': []
128
+ }
129
+
130
+ try:
131
+ # Check codec and profile
132
+ cmd = [
133
+ 'ffprobe', '-v', 'quiet', '-select_streams', 'v:0',
134
+ '-show_entries', 'stream=codec_name,profile,level,pix_fmt',
135
+ '-of', 'csv=p=0', str(video_path)
136
+ ]
137
+
138
+ result = subprocess.run(cmd, capture_output=True, text=True, timeout=15)
139
+
140
+ if result.returncode == 0:
141
+ codec_info = result.stdout.strip().split(',')
142
+ if len(codec_info) >= 1:
143
+ codec = codec_info[0]
144
+
145
+ if codec == 'h264':
146
+ compatibility_result['web_compatible'] = True
147
+
148
+ # Check if moov atom is at the beginning (for streaming)
149
+ moov_cmd = ['ffprobe', '-v', 'quiet', '-show_entries', 'format',
150
+ '-of', 'csv=p=0', str(video_path)]
151
+ moov_result = subprocess.run(moov_cmd, capture_output=True, text=True, timeout=10)
152
+
153
+ if 'mov,mp4' in moov_result.stdout:
154
+ compatibility_result['streaming_friendly'] = True
155
+ else:
156
+ compatibility_result['recommendations'].append(
157
+ "Consider re-encoding with 'faststart' flag for better streaming"
158
+ )
159
+
160
+ elif codec in ['hevc', 'h265']:
161
+ compatibility_result['recommendations'].append(
162
+ "HEVC/H.265 codec may not be supported in all browsers"
163
+ )
164
+ compatibility_result['needs_conversion'] = True
165
+ else:
166
+ compatibility_result['recommendations'].append(
167
+ f"Codec '{codec}' may not be web-compatible. Consider H.264"
168
+ )
169
+ compatibility_result['needs_conversion'] = True
170
+
171
+ except Exception as e:
172
+ compatibility_result['recommendations'].append(f"Could not analyze compatibility: {e}")
173
+
174
+ return compatibility_result
175
+
176
+
177
+ def test_django_video_access(video_id):
178
+ """
179
+ Test accessing the video through Django ORM and methods.
180
+ """
181
+ access_result = {
182
+ 'orm_accessible': False,
183
+ 'has_raw_file': False,
184
+ 'has_processed_file': False,
185
+ 'active_file_path': None,
186
+ 'file_size': 0,
187
+ 'errors': []
188
+ }
189
+
190
+ try:
191
+ video = VideoFile.objects.get(pk=video_id)
192
+ access_result['orm_accessible'] = True
193
+
194
+ # Check raw file
195
+ if hasattr(video, 'raw_file') and video.raw_file:
196
+ try:
197
+ raw_path = video.raw_file.path
198
+ if Path(raw_path).exists():
199
+ access_result['has_raw_file'] = True
200
+ access_result['active_file_path'] = raw_path
201
+ access_result['file_size'] = Path(raw_path).stat().st_size
202
+ except Exception as e:
203
+ access_result['errors'].append(f"Raw file access error: {e}")
204
+
205
+ # Check processed file
206
+ if hasattr(video, 'processed_file') and video.processed_file:
207
+ try:
208
+ processed_path = video.processed_file.path
209
+ if Path(processed_path).exists():
210
+ access_result['has_processed_file'] = True
211
+ if not access_result['active_file_path']:
212
+ access_result['active_file_path'] = processed_path
213
+ access_result['file_size'] = Path(processed_path).stat().st_size
214
+ except Exception as e:
215
+ access_result['errors'].append(f"Processed file access error: {e}")
216
+
217
+ # Test video streaming methods
218
+ try:
219
+ if hasattr(video, 'get_active_file_path'):
220
+ active_path = video.get_active_file_path()
221
+ if active_path and Path(active_path).exists():
222
+ access_result['active_file_path'] = str(active_path)
223
+ access_result['file_size'] = Path(active_path).stat().st_size
224
+ except Exception as e:
225
+ access_result['errors'].append(f"Active file path method error: {e}")
226
+
227
+ except VideoFile.DoesNotExist:
228
+ access_result['errors'].append(f"Video with ID {video_id} not found in database")
229
+ except Exception as e:
230
+ access_result['errors'].append(f"Django access error: {e}")
231
+
232
+ return access_result
233
+
234
+
235
+ def main():
236
+ import argparse
237
+
238
+ parser = argparse.ArgumentParser(description="Comprehensive video file validation script for debugging streaming issues.")
239
+ parser.add_argument('video_id', nargs='?', type=int, default=5, help='ID of the video to validate (default: 5)')
240
+ args = parser.parse_args()
241
+
242
+ video_id = args.video_id
243
+
244
+ print("🎬 COMPREHENSIVE VIDEO VALIDATION")
245
+ print("=" * 50)
246
+ print(f"Testing video ID: {video_id}")
247
+ print()
248
+
249
+ # Test Django access
250
+ print("1️⃣ Testing Django ORM Access...")
251
+ django_result = test_django_video_access(video_id)
252
+
253
+ if django_result['orm_accessible']:
254
+ print("✅ Video found in database")
255
+ print(f"📁 Active file path: {django_result['active_file_path']}")
256
+ print(f"📏 File size: {django_result['file_size'] / (1024*1024):.1f} MB")
257
+
258
+ if django_result['errors']:
259
+ for error in django_result['errors']:
260
+ print(f"⚠️ {error}")
261
+ else:
262
+ print("❌ Video not accessible through Django")
263
+ for error in django_result['errors']:
264
+ print(f"❌ {error}")
265
+ return
266
+
267
+ # Get video file path for further testing
268
+ video_path = django_result['active_file_path']
269
+ if not video_path or not Path(video_path).exists():
270
+ print("❌ No valid video file path found")
271
+ return
272
+
273
+ print("\n2️⃣ Testing File System Access...")
274
+ file_path = Path(video_path)
275
+ print(f"📁 Path: {file_path}")
276
+ print(f"✅ File exists: {file_path.exists()}")
277
+ print(f"📏 Size: {file_path.stat().st_size / (1024*1024):.1f} MB")
278
+ print(f"🔑 Readable: {os.access(file_path, os.R_OK)}")
279
+
280
+ # Check FFmpeg availability
281
+ print("\n3️⃣ Checking FFmpeg Availability...")
282
+ if not check_ffmpeg_available():
283
+ print("❌ FFmpeg not available - cannot perform detailed video analysis")
284
+ print("💡 Install FFmpeg: sudo apt-get install ffmpeg")
285
+ return
286
+ else:
287
+ print("✅ FFmpeg is available")
288
+
289
+ # Analyze video with FFmpeg
290
+ print("\n4️⃣ Video Analysis with FFmpeg...")
291
+ analysis = analyze_video_with_ffmpeg(video_path)
292
+
293
+ if analysis['file_readable']:
294
+ print("✅ File is readable by FFmpeg")
295
+ print(f"🎥 Has video stream: {analysis['has_video_stream']}")
296
+ print(f"🔊 Has audio stream: {analysis['has_audio_stream']}")
297
+ print(f"⏱️ Duration: {analysis['duration']:.2f}s" if analysis['duration'] else "⏱️ Duration: Unknown")
298
+ print(f"🎬 Codec: {analysis['codec'] or 'Unknown'}")
299
+ print(f"📐 Resolution: {analysis['resolution'] or 'Unknown'}")
300
+ print(f"🖼️ Frame count: {analysis['frame_count'] or 'Unknown'}")
301
+ else:
302
+ print("❌ File is NOT readable by FFmpeg")
303
+
304
+ if analysis['errors']:
305
+ print("\n❌ Errors found:")
306
+ for error in analysis['errors']:
307
+ print(f" • {error}")
308
+
309
+ if analysis['warnings']:
310
+ print("\n⚠️ Warnings:")
311
+ for warning in analysis['warnings']:
312
+ print(f" • {warning}")
313
+
314
+ # Test streaming compatibility
315
+ print("\n5️⃣ Testing Web Streaming Compatibility...")
316
+ compatibility = test_video_streaming_compatibility(video_path)
317
+
318
+ print(f"🌐 Web compatible: {compatibility['web_compatible']}")
319
+ print(f"📡 Streaming friendly: {compatibility['streaming_friendly']}")
320
+ print(f"🔄 Needs conversion: {compatibility['needs_conversion']}")
321
+
322
+ if compatibility['recommendations']:
323
+ print("\n💡 Recommendations:")
324
+ for rec in compatibility['recommendations']:
325
+ print(f" • {rec}")
326
+
327
+ # Final diagnosis
328
+ print("\n6️⃣ DIAGNOSIS")
329
+ print("=" * 30)
330
+
331
+ if not analysis['file_readable']:
332
+ print("🔴 CRITICAL: Video file is corrupted or unreadable")
333
+ print("📋 Action: Replace or re-encode the video file")
334
+ elif not analysis['has_video_stream']:
335
+ print("🔴 CRITICAL: No video stream found")
336
+ print("📋 Action: Check if file is actually a video")
337
+ elif not compatibility['web_compatible']:
338
+ print("🟡 WARNING: Video may not be web-compatible")
339
+ print("📋 Action: Consider re-encoding to H.264")
340
+ elif not compatibility['streaming_friendly']:
341
+ print("🟡 WARNING: Video not optimized for streaming")
342
+ print("📋 Action: Re-encode with faststart flag")
343
+ else:
344
+ print("🟢 GOOD: Video appears to be valid and web-compatible")
345
+ print("📋 Issue likely in Django streaming view or network connection")
346
+
347
+ print("\n🔧 Suggested fixes for streaming issues:")
348
+ print("1. Check Django VideoStreamView implementation")
349
+ print("2. Verify file permissions (readable by web server)")
350
+ print("3. Test with a different video file")
351
+ print("4. Check browser developer tools for specific errors")
352
+ print("5. Consider re-encoding the video:")
353
+ print(f" ffmpeg -i '{video_path}' -c:v libx264 -profile:v baseline -level 3.0 -movflags faststart output.mp4")
354
+
355
+
356
+ if __name__ == "__main__":
357
+ main()
@@ -1,13 +1,26 @@
1
- from .transcode_videofile import (
2
- transcode_videofile,
1
+ from .video_splitter import split_video
2
+ from .names import get_video_key, identify_video_key, get_video_key_regex_by_examination_alias
3
+
4
+ # Add necessary functions from ffmpeg_wrapper
5
+ from .ffmpeg_wrapper import (
6
+ get_stream_info,
7
+ assemble_video_from_frames,
8
+ transcode_video,
3
9
  transcode_videofile_if_required,
10
+ extract_frames as ffmpeg_extract_frames # Alias to avoid potential name clash if 'extract_frames' was used elsewhere directly from __init__
4
11
  )
5
12
 
6
- from .extract_frames import extract_frames, initialize_frame_objects
7
13
 
8
14
  __all__ = [
9
- "extract_frames",
10
- "initialize_frame_objects",
11
- "transcode_videofile",
15
+ # Keep existing
16
+ "split_video",
17
+ "get_video_key",
18
+ "identify_video_key",
19
+ "get_video_key_regex_by_examination_alias",
20
+ # Add from ffmpeg_wrapper
21
+ "get_stream_info",
22
+ "assemble_video_from_frames",
23
+ "transcode_video",
12
24
  "transcode_videofile_if_required",
25
+ "ffmpeg_extract_frames", # Use the alias if needed
13
26
  ]
@@ -5,13 +5,14 @@ from icecream import ic
5
5
  import subprocess
6
6
  from django.db import transaction
7
7
  from tqdm import tqdm
8
- from typing import TYPE_CHECKING, Union, List
8
+ from typing import TYPE_CHECKING, Union, List, Optional
9
9
 
10
10
  if TYPE_CHECKING:
11
- from endoreg_db.models import RawVideoFile, Video
11
+ from ...models.media import VideoFile
12
12
 
13
13
  from django.core.files import File
14
14
  import io
15
+ from .ffmpeg_wrapper import extract_frames as ffmpeg_extract_frames
15
16
 
16
17
 
17
18
  def prepare_bulk_frames(frame_paths: List[Path]):
@@ -27,80 +28,47 @@ def prepare_bulk_frames(frame_paths: List[Path]):
27
28
  yield frame_number, file_obj
28
29
 
29
30
 
30
- def extract_frames(
31
- video: Union["RawVideoFile", "Video"],
32
- quality: int = 2,
33
- overwrite: bool = False,
34
- ext="jpg",
35
- verbose=False,
36
- ) -> List[Path]:
37
- """
38
- Extract frames from the video file and save them to the frame_dir.
39
- For this, ffmpeg must be available in in the current environment.
40
- """
41
- frame_dir = Path(video.frame_dir)
42
- ic(f"Extracting frames to {frame_dir}")
43
- if not frame_dir.exists():
44
- frame_dir.mkdir(parents=True, exist_ok=True)
45
-
46
- if not overwrite and len(list(frame_dir.glob(f"*.{ext}"))) > 0:
47
- video.state_frames_extracted = True # Mark frames as extracted
48
- extracted_paths = sorted(frame_dir.glob(f"*.{ext}"))
49
- return extracted_paths
50
-
51
- video_path = Path(video.file.path).resolve().as_posix()
52
-
53
- frame_path_string = frame_dir.resolve().as_posix()
54
- command = [
55
- "ffmpeg",
56
- "-i",
57
- video_path, #
58
- "-q:v",
59
- str(quality),
60
- os.path.join(frame_path_string, f"frame_%07d.{ext}"),
61
- ]
62
-
63
- # Ensure FFmpeg is available
64
- if not shutil.which("ffmpeg"):
65
- raise EnvironmentError(
66
- "FFmpeg could not be found. Ensure it is installed and in your PATH."
67
- )
68
-
69
- # Extract frames from the video file
70
- # Execute the command
71
- process = subprocess.Popen(
72
- command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
73
- )
74
- stdout_data, stderr_data = process.communicate()
75
-
76
- if process.returncode != 0:
77
- raise Exception(f"Error extracting frames: {stderr_data}")
78
-
79
- if verbose and stdout_data:
80
- print(stdout_data)
81
-
82
- # After extracting frames with ffmpeg, parse frame filenames and batch-create
83
- extracted_paths = sorted(frame_dir.glob(f"*.{ext}"))
84
-
85
- return extracted_paths
31
+ def extract_frames(video_path: Path, output_dir: Path, quality: int, ext: str = "jpg", fps: Optional[float] = None) -> List[Path]:
32
+ """Extracts frames from a video file using ffmpeg_wrapper."""
33
+ # Ensure output directory exists
34
+ output_dir.mkdir(parents=True, exist_ok=True)
35
+ return ffmpeg_extract_frames(video_path, output_dir, quality, ext, fps)
86
36
 
87
37
 
88
38
  def initialize_frame_objects(
89
- video: Union["RawVideoFile", "Video"], extracted_paths: List[Path]
39
+ video: "VideoFile", extracted_paths: List[Path]
90
40
  ):
91
41
  """
92
- Initialize frame objects for the extracted frames.
42
+ Initialize frame objects for the extracted frames and update state.
93
43
  """
94
- if video.state_frames_initialized:
44
+ state = video.get_or_create_state()
45
+ # Check state before proceeding
46
+ if state.frames_initialized:
47
+ ic(f"Frames already initialized for video {video.uuid}, skipping.")
95
48
  return
49
+
50
+ if not extracted_paths:
51
+ ic(f"No extracted paths provided for video {video.uuid}, cannot initialize frames.")
52
+ return
53
+
96
54
  video.frame_count = len(extracted_paths)
97
55
  frames_to_create = []
98
56
  batch_size = int(os.environ.get("DJANGO_FFMPEG_EXTRACT_FRAME_BATCHSIZE", "500"))
99
- for i, (frame_number, file_obj) in tqdm(
100
- enumerate(prepare_bulk_frames(extracted_paths), start=1)
101
- ):
57
+
58
+ # Prepare frame data (relative paths for storage)
59
+ frame_dir = video.get_frame_dir_path()
60
+ if not frame_dir:
61
+ raise ValueError(f"Frame directory not set for video {video.uuid}")
62
+
63
+ storage_base_path = Path(video._meta.get_field('raw_file').storage.location) # Get storage root
64
+
65
+ for i, path in tqdm(enumerate(extracted_paths, start=1)):
66
+ frame_number = int(path.stem.split("_")[1]) - 1 # Assuming frame_0000001.jpg is frame_number 0
67
+ relative_path = path.relative_to(storage_base_path).as_posix() # Path relative to MEDIA_ROOT
68
+
69
+ # Create Frame instance (without saving yet)
102
70
  frame_obj_instance = video.create_frame_object(
103
- frame_number, image_file=file_obj, extracted=True
71
+ frame_number, image_file=relative_path, extracted=True
104
72
  )
105
73
  frames_to_create.append(frame_obj_instance)
106
74
 
@@ -113,9 +81,8 @@ def initialize_frame_objects(
113
81
  with transaction.atomic():
114
82
  video.bulk_create_frames(frames_to_create)
115
83
 
116
- video.set_frames_extracted(True)
117
- video.save()
84
+ # Update state and save VideoFile (to save frame_count)
85
+ state.frames_initialized = True
86
+ state.save(update_fields=['frames_initialized'])
87
+ video.save(update_fields=['frame_count']) # Save frame_count on VideoFile
118
88
 
119
- frame_dir = extracted_paths[0].parent
120
- ic(f"Removing frame directory: {frame_dir}")
121
- shutil.rmtree(frame_dir)