endoreg-db 0.8.6.4__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.
- endoreg_db/__init__.py +0 -0
- endoreg_db/admin.py +92 -0
- endoreg_db/api/serializers/finding_descriptions.py +0 -0
- endoreg_db/api/views/finding_descriptions.py +0 -0
- endoreg_db/api_urls.py +4 -0
- endoreg_db/apps.py +18 -0
- endoreg_db/assets/dummy_model.ckpt +1 -0
- endoreg_db/codemods/readme.md +88 -0
- endoreg_db/codemods/rename_datetime_fields.py +92 -0
- endoreg_db/config/__init__.py +0 -0
- endoreg_db/config/env.py +101 -0
- endoreg_db/data/__init__.py +144 -0
- endoreg_db/data/ai_model/data.yaml +7 -0
- endoreg_db/data/ai_model_label/label/data.yaml +88 -0
- endoreg_db/data/ai_model_label/label/polyp_classification.yaml +52 -0
- endoreg_db/data/ai_model_label/label-set/data.yaml +40 -0
- endoreg_db/data/ai_model_label/label-set/polyp_classifications.yaml +25 -0
- endoreg_db/data/ai_model_label/label-type/data.yaml +7 -0
- endoreg_db/data/ai_model_meta/default_multilabel_classification.yaml +27 -0
- endoreg_db/data/ai_model_type/data.yaml +7 -0
- endoreg_db/data/ai_model_video_segmentation_label/base_segmentation.yaml +176 -0
- endoreg_db/data/ai_model_video_segmentation_labelset/data.yaml +20 -0
- endoreg_db/data/case_template/rule/00_patient_lab_sample_add_default_value.yaml +167 -0
- endoreg_db/data/case_template/rule/01_patient-set-age.yaml +8 -0
- endoreg_db/data/case_template/rule/01_patient-set-gender.yaml +9 -0
- endoreg_db/data/case_template/rule/11_create_patient_lab_sample.yaml +23 -0
- endoreg_db/data/case_template/rule/12_create-patient_medication-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/13_create-patient_medication_schedule-anticoagulation.yaml +19 -0
- endoreg_db/data/case_template/rule/19_create_patient.yaml +17 -0
- endoreg_db/data/case_template/rule_type/base_types.yaml +35 -0
- endoreg_db/data/case_template/rule_value/.init +0 -0
- endoreg_db/data/case_template/rule_value_type/base_types.yaml +59 -0
- endoreg_db/data/case_template/template/base.yaml +8 -0
- endoreg_db/data/case_template/template_type/pre_endoscopy.yaml +3 -0
- endoreg_db/data/case_template/tmp/_rule_value +13 -0
- endoreg_db/data/case_template/tmp/rule/01_atrial_fibrillation.yaml +21 -0
- endoreg_db/data/case_template/tmp/rule/02_create_object.yaml +10 -0
- endoreg_db/data/case_template/tmp/template/atrial_fibrillation_low_risk.yaml +7 -0
- endoreg_db/data/center/data.yaml +91 -0
- endoreg_db/data/center_resource/green_endoscopy_dashboard_CenterResource.yaml +144 -0
- endoreg_db/data/center_shift/ukw.yaml +9 -0
- endoreg_db/data/center_waste/green_endoscopy_dashboard_CenterWaste.yaml +48 -0
- endoreg_db/data/contraindication/bleeding.yaml +11 -0
- endoreg_db/data/db_summary.csv +58 -0
- endoreg_db/data/db_summary.xlsx +0 -0
- endoreg_db/data/disease/cardiovascular.yaml +37 -0
- endoreg_db/data/disease/hepatology.yaml +5 -0
- endoreg_db/data/disease/misc.yaml +5 -0
- endoreg_db/data/disease/renal.yaml +5 -0
- endoreg_db/data/disease_classification/chronic_kidney_disease.yaml +6 -0
- endoreg_db/data/disease_classification/coronary_vessel_disease.yaml +6 -0
- endoreg_db/data/disease_classification_choice/chronic_kidney_disease.yaml +41 -0
- endoreg_db/data/disease_classification_choice/coronary_vessel_disease.yaml +20 -0
- endoreg_db/data/distribution/date/patient.yaml +7 -0
- endoreg_db/data/distribution/multiple_categorical/.init +0 -0
- endoreg_db/data/distribution/numeric/data.yaml +14 -0
- endoreg_db/data/distribution/single_categorical/patient.yaml +7 -0
- endoreg_db/data/emission_factor/green_endoscopy_dashboard_EmissionFactor.yaml +132 -0
- endoreg_db/data/endoscope/data.yaml +93 -0
- endoreg_db/data/endoscope_type/data.yaml +11 -0
- endoreg_db/data/endoscopy_processor/data.yaml +50 -0
- endoreg_db/data/event/cardiology.yaml +15 -0
- endoreg_db/data/event/neurology.yaml +14 -0
- endoreg_db/data/event/surgery.yaml +13 -0
- endoreg_db/data/event/thrombembolism.yaml +20 -0
- endoreg_db/data/examination/examinations/data.yaml +72 -0
- endoreg_db/data/examination/time/data.yaml +48 -0
- endoreg_db/data/examination/time-type/data.yaml +8 -0
- endoreg_db/data/examination/type/data.yaml +17 -0
- endoreg_db/data/examination_indication/endoscopy.yaml +424 -0
- endoreg_db/data/examination_indication_classification/endoscopy.yaml +160 -0
- endoreg_db/data/examination_indication_classification_choice/endoscopy.yaml +101 -0
- endoreg_db/data/examination_requirement_set/colonoscopy.yaml +15 -0
- endoreg_db/data/finding/anatomy_colon.yaml +128 -0
- endoreg_db/data/finding/colonoscopy.yaml +40 -0
- endoreg_db/data/finding/colonoscopy_bowel_prep.yaml +56 -0
- endoreg_db/data/finding/complication.yaml +16 -0
- endoreg_db/data/finding/data.yaml +105 -0
- endoreg_db/data/finding/examination_setting.yaml +16 -0
- endoreg_db/data/finding/medication_related.yaml +18 -0
- endoreg_db/data/finding/outcome.yaml +12 -0
- endoreg_db/data/finding_classification/colonoscopy_bowel_preparation.yaml +95 -0
- endoreg_db/data/finding_classification/colonoscopy_jnet.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_kudo.yaml +25 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_circularity.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_planarity.yaml +24 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_size.yaml +68 -0
- endoreg_db/data/finding_classification/colonoscopy_lesion_surface.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_location.yaml +80 -0
- endoreg_db/data/finding_classification/colonoscopy_lst.yaml +21 -0
- endoreg_db/data/finding_classification/colonoscopy_nice.yaml +20 -0
- endoreg_db/data/finding_classification/colonoscopy_paris.yaml +26 -0
- endoreg_db/data/finding_classification/colonoscopy_sano.yaml +22 -0
- endoreg_db/data/finding_classification/colonoscopy_summary.yaml +53 -0
- endoreg_db/data/finding_classification/complication_generic.yaml +25 -0
- endoreg_db/data/finding_classification/examination_setting_generic.yaml +40 -0
- endoreg_db/data/finding_classification/histology_colo.yaml +51 -0
- endoreg_db/data/finding_classification/intervention_required.yaml +26 -0
- endoreg_db/data/finding_classification/medication_related.yaml +23 -0
- endoreg_db/data/finding_classification/visualized.yaml +33 -0
- endoreg_db/data/finding_classification_choice/bowel_preparation.yaml +78 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_circularity_default.yaml +32 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_jnet.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_kudo.yaml +23 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_lst.yaml +15 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_nice.yaml +17 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_paris.yaml +57 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_planarity_default.yaml +49 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_sano.yaml +14 -0
- endoreg_db/data/finding_classification_choice/colon_lesion_surface_intact_default.yaml +36 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_location.yaml +229 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_not_complete_reason.yaml +19 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_size.yaml +82 -0
- endoreg_db/data/finding_classification_choice/colonoscopy_summary_worst_finding.yaml +15 -0
- endoreg_db/data/finding_classification_choice/complication_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/examination_setting_generic_types.yaml +15 -0
- endoreg_db/data/finding_classification_choice/histology.yaml +24 -0
- endoreg_db/data/finding_classification_choice/histology_polyp.yaml +20 -0
- endoreg_db/data/finding_classification_choice/outcome.yaml +19 -0
- endoreg_db/data/finding_classification_choice/yes_no_na.yaml +11 -0
- endoreg_db/data/finding_classification_type/colonoscopy_basic.yaml +48 -0
- endoreg_db/data/finding_intervention/endoscopy.yaml +43 -0
- endoreg_db/data/finding_intervention/endoscopy_colonoscopy.yaml +168 -0
- endoreg_db/data/finding_intervention/endoscopy_egd.yaml +128 -0
- endoreg_db/data/finding_intervention/endoscopy_ercp.yaml +32 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_lower.yaml +9 -0
- endoreg_db/data/finding_intervention/endoscopy_eus_upper.yaml +36 -0
- endoreg_db/data/finding_intervention_type/endoscopy.yaml +15 -0
- endoreg_db/data/finding_morphology_classification_type/colonoscopy.yaml +79 -0
- endoreg_db/data/finding_type/data.yaml +43 -0
- endoreg_db/data/gender/data.yaml +42 -0
- endoreg_db/data/information_source/annotation.yaml +6 -0
- endoreg_db/data/information_source/data.yaml +30 -0
- endoreg_db/data/information_source/endoscopy_guidelines.yaml +7 -0
- endoreg_db/data/information_source/medication.yaml +6 -0
- endoreg_db/data/information_source/prediction.yaml +7 -0
- endoreg_db/data/information_source_type/data.yaml +8 -0
- endoreg_db/data/lab_value/cardiac_enzymes.yaml +37 -0
- endoreg_db/data/lab_value/coagulation.yaml +54 -0
- endoreg_db/data/lab_value/electrolytes.yaml +228 -0
- endoreg_db/data/lab_value/gastrointestinal_function.yaml +133 -0
- endoreg_db/data/lab_value/hematology.yaml +184 -0
- endoreg_db/data/lab_value/hormones.yaml +59 -0
- endoreg_db/data/lab_value/lipids.yaml +53 -0
- endoreg_db/data/lab_value/misc.yaml +76 -0
- endoreg_db/data/lab_value/renal_function.yaml +12 -0
- endoreg_db/data/log_type/data.yaml +57 -0
- endoreg_db/data/lx_client_tag/base.yaml +54 -0
- endoreg_db/data/lx_client_type/base.yaml +30 -0
- endoreg_db/data/lx_permission/base.yaml +24 -0
- endoreg_db/data/lx_permission/endoreg.yaml +52 -0
- endoreg_db/data/material/material.yaml +91 -0
- endoreg_db/data/medication/anticoagulation.yaml +65 -0
- endoreg_db/data/medication/tah.yaml +70 -0
- endoreg_db/data/medication_indication/anticoagulation.yaml +115 -0
- endoreg_db/data/medication_indication_type/data.yaml +11 -0
- endoreg_db/data/medication_indication_type/thrombembolism.yaml +41 -0
- endoreg_db/data/medication_intake_time/base.yaml +31 -0
- endoreg_db/data/medication_schedule/apixaban.yaml +95 -0
- endoreg_db/data/medication_schedule/ass.yaml +12 -0
- endoreg_db/data/medication_schedule/enoxaparin.yaml +26 -0
- endoreg_db/data/names_first/first_names.yaml +54 -0
- endoreg_db/data/names_last/last_names.yaml +51 -0
- endoreg_db/data/network_device/data.yaml +59 -0
- endoreg_db/data/network_device_type/data.yaml +12 -0
- endoreg_db/data/organ/data.yaml +29 -0
- endoreg_db/data/patient_lab_sample_type/generic.yaml +6 -0
- endoreg_db/data/pdf_type/data.yaml +46 -0
- endoreg_db/data/product/green_endoscopy_dashboard_Product.yaml +66 -0
- endoreg_db/data/product_group/green_endoscopy_dashboard_ProductGroup.yaml +33 -0
- endoreg_db/data/product_material/green_endoscopy_dashboard_ProductMaterial.yaml +308 -0
- endoreg_db/data/product_weight/green_endoscopy_dashboard_ProductWeight.yaml +88 -0
- endoreg_db/data/profession/data.yaml +70 -0
- endoreg_db/data/qualification/endoscopy.yaml +36 -0
- endoreg_db/data/qualification/m2.yaml +39 -0
- endoreg_db/data/qualification/outpatient_clinic.yaml +35 -0
- endoreg_db/data/qualification/sonography.yaml +36 -0
- endoreg_db/data/qualification_type/base.yaml +29 -0
- endoreg_db/data/reference_product/green_endoscopy_dashboard_ReferenceProduct.yaml +55 -0
- endoreg_db/data/report_reader_flag/rkh-histology-generic.yaml +10 -0
- endoreg_db/data/report_reader_flag/ukw-examination-generic.yaml +30 -0
- endoreg_db/data/report_reader_flag/ukw-histology-generic.yaml +24 -0
- endoreg_db/data/requirement/age.yaml +26 -0
- endoreg_db/data/requirement/colonoscopy_baseline_austria.yaml +45 -0
- endoreg_db/data/requirement/disease_cardiovascular.yaml +79 -0
- endoreg_db/data/requirement/disease_classification_choice_cardiovascular.yaml +41 -0
- endoreg_db/data/requirement/disease_hepatology.yaml +12 -0
- endoreg_db/data/requirement/disease_misc.yaml +12 -0
- endoreg_db/data/requirement/disease_renal.yaml +96 -0
- endoreg_db/data/requirement/endoscopy_bleeding_risk.yaml +59 -0
- endoreg_db/data/requirement/event_cardiology.yaml +251 -0
- endoreg_db/data/requirement/event_requirements.yaml +145 -0
- endoreg_db/data/requirement/finding_colon_polyp.yaml +50 -0
- endoreg_db/data/requirement/gender.yaml +25 -0
- endoreg_db/data/requirement/lab_value.yaml +441 -0
- endoreg_db/data/requirement/medication.yaml +93 -0
- endoreg_db/data/requirement_operator/age.yaml +13 -0
- endoreg_db/data/requirement_operator/lab_operators.yaml +129 -0
- endoreg_db/data/requirement_operator/model_operators.yaml +96 -0
- endoreg_db/data/requirement_set/01_endoscopy_generic.yaml +48 -0
- endoreg_db/data/requirement_set/colonoscopy_austria_screening.yaml +57 -0
- endoreg_db/data/requirement_set/endoscopy_bleeding_risk.yaml +52 -0
- endoreg_db/data/requirement_set_type/data.yaml +20 -0
- endoreg_db/data/requirement_type/requirement_types.yaml +165 -0
- endoreg_db/data/resource/green_endoscopy_dashboard_Resource.yaml +15 -0
- endoreg_db/data/risk/bleeding.yaml +26 -0
- endoreg_db/data/risk/thrombosis.yaml +37 -0
- endoreg_db/data/risk_type/data.yaml +27 -0
- endoreg_db/data/setup_config.yaml +38 -0
- endoreg_db/data/shift/endoscopy.yaml +21 -0
- endoreg_db/data/shift/m2.yaml +0 -0
- endoreg_db/data/shift_type/base.yaml +35 -0
- endoreg_db/data/tag/requirement_set_tags.yaml +11 -0
- endoreg_db/data/tmp/chronic_kidney_disease.yaml +0 -0
- endoreg_db/data/tmp/congestive_heart_failure.yaml +0 -0
- endoreg_db/data/transport_route/green_endoscopy_dashboard_TransportRoute.yaml +12 -0
- endoreg_db/data/unit/concentration.yaml +115 -0
- endoreg_db/data/unit/data.yaml +17 -0
- endoreg_db/data/unit/length.yaml +31 -0
- endoreg_db/data/unit/misc.yaml +20 -0
- endoreg_db/data/unit/rate.yaml +6 -0
- endoreg_db/data/unit/time.yaml +48 -0
- endoreg_db/data/unit/volume.yaml +35 -0
- endoreg_db/data/unit/weight.yaml +38 -0
- endoreg_db/data/waste/data.yaml +12 -0
- endoreg_db/exceptions.py +19 -0
- endoreg_db/factories/__init__.py +0 -0
- endoreg_db/forms/__init__.py +5 -0
- endoreg_db/forms/examination_form.py +11 -0
- endoreg_db/forms/patient_finding_intervention_form.py +18 -0
- endoreg_db/forms/patient_form.py +27 -0
- endoreg_db/forms/questionnaires/__init__.py +1 -0
- endoreg_db/forms/questionnaires/tto_questionnaire.py +23 -0
- endoreg_db/forms/settings/__init__.py +8 -0
- endoreg_db/forms/unit.py +6 -0
- endoreg_db/helpers/__init__.py +0 -0
- endoreg_db/helpers/count_db.py +45 -0
- endoreg_db/helpers/data_loader.py +208 -0
- endoreg_db/helpers/default_objects.py +378 -0
- endoreg_db/helpers/download_segmentation_model.py +31 -0
- endoreg_db/helpers/interact.py +6 -0
- endoreg_db/helpers/test_video_helper.py +119 -0
- endoreg_db/logger_conf.py +140 -0
- endoreg_db/management/__init__.py +1 -0
- endoreg_db/management/commands/__init__.py +1 -0
- endoreg_db/management/commands/anonymize_video.py +0 -0
- endoreg_db/management/commands/check_auth.py +125 -0
- endoreg_db/management/commands/create_model_meta_from_huggingface.py +115 -0
- endoreg_db/management/commands/create_multilabel_model_meta.py +214 -0
- endoreg_db/management/commands/fix_missing_patient_data.py +172 -0
- endoreg_db/management/commands/fix_video_paths.py +165 -0
- endoreg_db/management/commands/import_fallback_video.py +203 -0
- endoreg_db/management/commands/import_report.py +298 -0
- endoreg_db/management/commands/import_video.py +423 -0
- endoreg_db/management/commands/import_video_with_classification.py +367 -0
- endoreg_db/management/commands/init_default_ai_model.py +112 -0
- endoreg_db/management/commands/load_ai_model_data.py +77 -0
- endoreg_db/management/commands/load_ai_model_label_data.py +59 -0
- endoreg_db/management/commands/load_base_db_data.py +192 -0
- endoreg_db/management/commands/load_center_data.py +68 -0
- endoreg_db/management/commands/load_contraindication_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_choices_data.py +41 -0
- endoreg_db/management/commands/load_disease_classification_data.py +41 -0
- endoreg_db/management/commands/load_disease_data.py +62 -0
- endoreg_db/management/commands/load_distribution_data.py +66 -0
- endoreg_db/management/commands/load_endoscope_data.py +68 -0
- endoreg_db/management/commands/load_event_data.py +41 -0
- endoreg_db/management/commands/load_examination_data.py +75 -0
- endoreg_db/management/commands/load_examination_indication_data.py +86 -0
- endoreg_db/management/commands/load_finding_data.py +128 -0
- endoreg_db/management/commands/load_gender_data.py +44 -0
- endoreg_db/management/commands/load_green_endoscopy_wuerzburg_data.py +132 -0
- endoreg_db/management/commands/load_information_source.py +51 -0
- endoreg_db/management/commands/load_lab_value_data.py +50 -0
- endoreg_db/management/commands/load_medication_data.py +103 -0
- endoreg_db/management/commands/load_name_data.py +37 -0
- endoreg_db/management/commands/load_organ_data.py +43 -0
- endoreg_db/management/commands/load_pdf_type_data.py +61 -0
- endoreg_db/management/commands/load_profession_data.py +44 -0
- endoreg_db/management/commands/load_qualification_data.py +59 -0
- endoreg_db/management/commands/load_report_reader_flag_data.py +46 -0
- endoreg_db/management/commands/load_requirement_data.py +180 -0
- endoreg_db/management/commands/load_risk_data.py +56 -0
- endoreg_db/management/commands/load_shift_data.py +60 -0
- endoreg_db/management/commands/load_tag_data.py +57 -0
- endoreg_db/management/commands/load_unit_data.py +46 -0
- endoreg_db/management/commands/load_user_groups.py +28 -0
- endoreg_db/management/commands/register_ai_model.py +64 -0
- endoreg_db/management/commands/reset_celery_schedule.py +9 -0
- endoreg_db/management/commands/setup_endoreg_db.py +381 -0
- endoreg_db/management/commands/start_filewatcher.py +106 -0
- endoreg_db/management/commands/storage_management.py +548 -0
- endoreg_db/management/commands/summarize_db_content.py +189 -0
- endoreg_db/management/commands/validate_video.py +204 -0
- endoreg_db/management/commands/validate_video_files.py +161 -0
- endoreg_db/management/commands/video_validation.py +22 -0
- endoreg_db/mermaid/Overall_flow_patient_finding_intervention.md +10 -0
- endoreg_db/mermaid/anonymized_image_annotation.md +20 -0
- endoreg_db/mermaid/binary_classification_annotation.md +50 -0
- endoreg_db/mermaid/classification.md +8 -0
- endoreg_db/mermaid/examination.md +8 -0
- endoreg_db/mermaid/findings.md +7 -0
- endoreg_db/mermaid/image_classification.md +28 -0
- endoreg_db/mermaid/interventions.md +8 -0
- endoreg_db/mermaid/morphology.md +8 -0
- endoreg_db/mermaid/patient_creation.md +14 -0
- endoreg_db/mermaid/video_segmentation_annotation.md +17 -0
- endoreg_db/migrations/0001_initial.py +1857 -0
- endoreg_db/migrations/0002_add_video_correction_models.py +52 -0
- endoreg_db/migrations/0003_add_center_display_name.py +30 -0
- endoreg_db/migrations/__init__.py +0 -0
- endoreg_db/models/__init__.py +359 -0
- endoreg_db/models/administration/__init__.py +116 -0
- endoreg_db/models/administration/ai/__init__.py +9 -0
- endoreg_db/models/administration/ai/active_model.py +35 -0
- endoreg_db/models/administration/ai/ai_model.py +156 -0
- endoreg_db/models/administration/ai/model_type.py +41 -0
- endoreg_db/models/administration/case/__init__.py +19 -0
- endoreg_db/models/administration/case/case.py +114 -0
- endoreg_db/models/administration/case/case_template/__init__.py +15 -0
- endoreg_db/models/administration/case/case_template/case_template.py +125 -0
- endoreg_db/models/administration/case/case_template/case_template_rule.py +269 -0
- endoreg_db/models/administration/case/case_template/case_template_rule_value.py +86 -0
- endoreg_db/models/administration/case/case_template/case_template_type.py +26 -0
- endoreg_db/models/administration/center/__init__.py +13 -0
- endoreg_db/models/administration/center/center.py +67 -0
- endoreg_db/models/administration/center/center_product.py +64 -0
- endoreg_db/models/administration/center/center_resource.py +49 -0
- endoreg_db/models/administration/center/center_shift.py +88 -0
- endoreg_db/models/administration/center/center_waste.py +30 -0
- endoreg_db/models/administration/permissions/__init__.py +44 -0
- endoreg_db/models/administration/person/__init__.py +24 -0
- endoreg_db/models/administration/person/employee/__init__.py +3 -0
- endoreg_db/models/administration/person/employee/employee.py +35 -0
- endoreg_db/models/administration/person/employee/employee_qualification.py +39 -0
- endoreg_db/models/administration/person/employee/employee_type.py +42 -0
- endoreg_db/models/administration/person/examiner/__init__.py +4 -0
- endoreg_db/models/administration/person/examiner/examiner.py +54 -0
- endoreg_db/models/administration/person/names/__init__.py +0 -0
- endoreg_db/models/administration/person/names/first_name.py +18 -0
- endoreg_db/models/administration/person/names/last_name.py +19 -0
- endoreg_db/models/administration/person/patient/__init__.py +5 -0
- endoreg_db/models/administration/person/patient/patient.py +460 -0
- endoreg_db/models/administration/person/person.py +31 -0
- endoreg_db/models/administration/person/profession/__init__.py +24 -0
- endoreg_db/models/administration/person/user/__init__.py +5 -0
- endoreg_db/models/administration/person/user/portal_user_information.py +37 -0
- endoreg_db/models/administration/product/__init__.py +14 -0
- endoreg_db/models/administration/product/product.py +97 -0
- endoreg_db/models/administration/product/product_group.py +39 -0
- endoreg_db/models/administration/product/product_material.py +54 -0
- endoreg_db/models/administration/product/product_weight.py +47 -0
- endoreg_db/models/administration/product/reference_product.py +130 -0
- endoreg_db/models/administration/qualification/__init__.py +7 -0
- endoreg_db/models/administration/qualification/qualification.py +37 -0
- endoreg_db/models/administration/qualification/qualification_type.py +35 -0
- endoreg_db/models/administration/shift/__init__.py +9 -0
- endoreg_db/models/administration/shift/scheduled_days.py +69 -0
- endoreg_db/models/administration/shift/shift.py +51 -0
- endoreg_db/models/administration/shift/shift_type.py +108 -0
- endoreg_db/models/label/__init__.py +24 -0
- endoreg_db/models/label/annotation/__init__.py +12 -0
- endoreg_db/models/label/annotation/image_classification.py +84 -0
- endoreg_db/models/label/annotation/video_segmentation_annotation.py +66 -0
- endoreg_db/models/label/label.py +83 -0
- endoreg_db/models/label/label_set.py +53 -0
- endoreg_db/models/label/label_type.py +29 -0
- endoreg_db/models/label/label_video_segment/__init__.py +3 -0
- endoreg_db/models/label/label_video_segment/_create_from_video.py +41 -0
- endoreg_db/models/label/label_video_segment/label_video_segment.py +511 -0
- endoreg_db/models/label/video_segmentation_label.py +31 -0
- endoreg_db/models/label/video_segmentation_labelset.py +27 -0
- endoreg_db/models/media/__init__.py +16 -0
- endoreg_db/models/media/frame/__init__.py +3 -0
- endoreg_db/models/media/frame/frame.py +111 -0
- endoreg_db/models/media/pdf/__init__.py +11 -0
- endoreg_db/models/media/pdf/raw_pdf.py +757 -0
- endoreg_db/models/media/pdf/report_file.py +162 -0
- endoreg_db/models/media/pdf/report_reader/__init__.py +7 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_config.py +77 -0
- endoreg_db/models/media/pdf/report_reader/report_reader_flag.py +20 -0
- endoreg_db/models/media/video/__init__.py +8 -0
- endoreg_db/models/media/video/create_from_file.py +358 -0
- endoreg_db/models/media/video/pipe_1.py +213 -0
- endoreg_db/models/media/video/pipe_2.py +105 -0
- endoreg_db/models/media/video/refactor_plan.md +0 -0
- endoreg_db/models/media/video/video_file.py +825 -0
- endoreg_db/models/media/video/video_file_ai.py +443 -0
- endoreg_db/models/media/video/video_file_anonymize.py +349 -0
- endoreg_db/models/media/video/video_file_frames/__init__.py +47 -0
- endoreg_db/models/media/video/video_file_frames/_bulk_create_frames.py +22 -0
- endoreg_db/models/media/video/video_file_frames/_create_frame_object.py +23 -0
- endoreg_db/models/media/video/video_file_frames/_delete_frames.py +104 -0
- endoreg_db/models/media/video/video_file_frames/_extract_frames.py +174 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame.py +28 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_number.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_path.py +20 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_get_frame_range.py +34 -0
- endoreg_db/models/media/video/video_file_frames/_get_frames.py +27 -0
- endoreg_db/models/media/video/video_file_frames/_initialize_frames.py +129 -0
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py +141 -0
- endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py +65 -0
- endoreg_db/models/media/video/video_file_frames.py +0 -0
- endoreg_db/models/media/video/video_file_io.py +168 -0
- endoreg_db/models/media/video/video_file_meta/__init__.py +22 -0
- endoreg_db/models/media/video/video_file_meta/get_crop_template.py +45 -0
- endoreg_db/models/media/video/video_file_meta/get_endo_roi.py +39 -0
- endoreg_db/models/media/video/video_file_meta/get_fps.py +147 -0
- endoreg_db/models/media/video/video_file_meta/initialize_video_specs.py +143 -0
- endoreg_db/models/media/video/video_file_meta/text_meta.py +134 -0
- endoreg_db/models/media/video/video_file_meta/video_meta.py +70 -0
- endoreg_db/models/media/video/video_file_segments.py +209 -0
- endoreg_db/models/media/video/video_metadata.py +65 -0
- endoreg_db/models/media/video/video_processing.py +152 -0
- endoreg_db/models/medical/__init__.py +146 -0
- endoreg_db/models/medical/contraindication/__init__.py +17 -0
- endoreg_db/models/medical/disease.py +156 -0
- endoreg_db/models/medical/event.py +137 -0
- endoreg_db/models/medical/examination/__init__.py +9 -0
- endoreg_db/models/medical/examination/examination.py +148 -0
- endoreg_db/models/medical/examination/examination_indication.py +278 -0
- endoreg_db/models/medical/examination/examination_time.py +49 -0
- endoreg_db/models/medical/examination/examination_time_type.py +41 -0
- endoreg_db/models/medical/examination/examination_type.py +48 -0
- endoreg_db/models/medical/finding/__init__.py +18 -0
- endoreg_db/models/medical/finding/finding.py +96 -0
- endoreg_db/models/medical/finding/finding_classification.py +142 -0
- endoreg_db/models/medical/finding/finding_intervention.py +52 -0
- endoreg_db/models/medical/finding/finding_type.py +35 -0
- endoreg_db/models/medical/hardware/__init__.py +8 -0
- endoreg_db/models/medical/hardware/endoscope.py +65 -0
- endoreg_db/models/medical/hardware/endoscopy_processor.py +182 -0
- endoreg_db/models/medical/laboratory/__init__.py +5 -0
- endoreg_db/models/medical/laboratory/lab_value.py +419 -0
- endoreg_db/models/medical/medication/__init__.py +19 -0
- endoreg_db/models/medical/medication/medication.py +31 -0
- endoreg_db/models/medical/medication/medication_indication.py +50 -0
- endoreg_db/models/medical/medication/medication_indication_type.py +39 -0
- endoreg_db/models/medical/medication/medication_intake_time.py +44 -0
- endoreg_db/models/medical/medication/medication_schedule.py +45 -0
- endoreg_db/models/medical/organ/__init__.py +35 -0
- endoreg_db/models/medical/patient/__init__.py +56 -0
- endoreg_db/models/medical/patient/medication_examples.py +38 -0
- endoreg_db/models/medical/patient/patient_disease.py +63 -0
- endoreg_db/models/medical/patient/patient_event.py +75 -0
- endoreg_db/models/medical/patient/patient_examination.py +249 -0
- endoreg_db/models/medical/patient/patient_examination_indication.py +44 -0
- endoreg_db/models/medical/patient/patient_finding.py +357 -0
- endoreg_db/models/medical/patient/patient_finding_classification.py +207 -0
- endoreg_db/models/medical/patient/patient_finding_intervention.py +40 -0
- endoreg_db/models/medical/patient/patient_lab_sample.py +148 -0
- endoreg_db/models/medical/patient/patient_lab_value.py +222 -0
- endoreg_db/models/medical/patient/patient_medication.py +104 -0
- endoreg_db/models/medical/patient/patient_medication_schedule.py +136 -0
- endoreg_db/models/medical/risk/__init__.py +7 -0
- endoreg_db/models/medical/risk/risk.py +72 -0
- endoreg_db/models/medical/risk/risk_type.py +51 -0
- endoreg_db/models/metadata/__init__.py +19 -0
- endoreg_db/models/metadata/frame_ocr_result.py +0 -0
- endoreg_db/models/metadata/model_meta.py +206 -0
- endoreg_db/models/metadata/model_meta_logic.py +343 -0
- endoreg_db/models/metadata/pdf_meta.py +89 -0
- endoreg_db/models/metadata/sensitive_meta.py +288 -0
- endoreg_db/models/metadata/sensitive_meta_logic.py +1048 -0
- endoreg_db/models/metadata/video_meta.py +332 -0
- endoreg_db/models/metadata/video_prediction_logic.py +190 -0
- endoreg_db/models/metadata/video_prediction_meta.py +270 -0
- endoreg_db/models/other/__init__.py +40 -0
- endoreg_db/models/other/distribution/__init__.py +44 -0
- endoreg_db/models/other/distribution/base_value_distribution.py +20 -0
- endoreg_db/models/other/distribution/date_value_distribution.py +89 -0
- endoreg_db/models/other/distribution/multiple_categorical_value_distribution.py +32 -0
- endoreg_db/models/other/distribution/numeric_value_distribution.py +125 -0
- endoreg_db/models/other/distribution/single_categorical_value_distribution.py +22 -0
- endoreg_db/models/other/emission/__init__.py +5 -0
- endoreg_db/models/other/emission/emission_factor.py +94 -0
- endoreg_db/models/other/gender.py +27 -0
- endoreg_db/models/other/information_source.py +159 -0
- endoreg_db/models/other/material.py +28 -0
- endoreg_db/models/other/resource.py +22 -0
- endoreg_db/models/other/tag.py +27 -0
- endoreg_db/models/other/transport_route.py +33 -0
- endoreg_db/models/other/unit.py +32 -0
- endoreg_db/models/other/waste.py +27 -0
- endoreg_db/models/requirement/__init__.py +11 -0
- endoreg_db/models/requirement/requirement.py +767 -0
- endoreg_db/models/requirement/requirement_evaluation/__init__.py +6 -0
- endoreg_db/models/requirement/requirement_evaluation/get_values.py +40 -0
- endoreg_db/models/requirement/requirement_evaluation/operator_evaluation_models.py +9 -0
- endoreg_db/models/requirement/requirement_evaluation/requirement_type_parser.py +95 -0
- endoreg_db/models/requirement/requirement_operator.py +176 -0
- endoreg_db/models/requirement/requirement_set.py +287 -0
- endoreg_db/models/rule/__init__.py +13 -0
- endoreg_db/models/rule/rule.py +27 -0
- endoreg_db/models/rule/rule_applicator.py +224 -0
- endoreg_db/models/rule/rule_attribute_dtype.py +17 -0
- endoreg_db/models/rule/rule_type.py +20 -0
- endoreg_db/models/rule/ruleset.py +17 -0
- endoreg_db/models/state/__init__.py +12 -0
- endoreg_db/models/state/abstract.py +11 -0
- endoreg_db/models/state/audit_ledger.py +150 -0
- endoreg_db/models/state/label_video_segment.py +22 -0
- endoreg_db/models/state/raw_pdf.py +187 -0
- endoreg_db/models/state/sensitive_meta.py +46 -0
- endoreg_db/models/state/video.py +232 -0
- endoreg_db/models/upload_job.py +99 -0
- endoreg_db/models/utils.py +135 -0
- endoreg_db/queries/__init__.py +5 -0
- endoreg_db/queries/annotations/__init__.py +3 -0
- endoreg_db/queries/annotations/legacy.py +158 -0
- endoreg_db/queries/sanity/__init_.py +0 -0
- endoreg_db/renames.yml +8 -0
- endoreg_db/root_urls.py +9 -0
- endoreg_db/schemas/__init__.py +0 -0
- endoreg_db/schemas/examination_evaluation.py +27 -0
- endoreg_db/serializers/Frames_NICE_and_PARIS_classifications.py +775 -0
- endoreg_db/serializers/__init__.py +118 -0
- endoreg_db/serializers/_old/raw_pdf_meta_validation.py +223 -0
- endoreg_db/serializers/_old/raw_video_meta_validation.py +179 -0
- endoreg_db/serializers/_old/video.py +71 -0
- endoreg_db/serializers/administration/__init__.py +14 -0
- endoreg_db/serializers/administration/ai/__init__.py +10 -0
- endoreg_db/serializers/administration/ai/active_model.py +10 -0
- endoreg_db/serializers/administration/ai/ai_model.py +18 -0
- endoreg_db/serializers/administration/ai/model_type.py +10 -0
- endoreg_db/serializers/administration/center.py +9 -0
- endoreg_db/serializers/administration/gender.py +9 -0
- endoreg_db/serializers/anonymization.py +69 -0
- endoreg_db/serializers/evaluation/examination_evaluation.py +1 -0
- endoreg_db/serializers/examination/__init__.py +10 -0
- endoreg_db/serializers/examination/base.py +46 -0
- endoreg_db/serializers/examination/dropdown.py +21 -0
- endoreg_db/serializers/examination_serializer.py +12 -0
- endoreg_db/serializers/finding/__init__.py +5 -0
- endoreg_db/serializers/finding/finding.py +54 -0
- endoreg_db/serializers/finding_classification/__init__.py +7 -0
- endoreg_db/serializers/finding_classification/choice.py +19 -0
- endoreg_db/serializers/finding_classification/classification.py +13 -0
- endoreg_db/serializers/label/__init__.py +7 -0
- endoreg_db/serializers/label/image_classification_annotation.py +62 -0
- endoreg_db/serializers/label/label.py +15 -0
- endoreg_db/serializers/label_video_segment/__init__.py +7 -0
- endoreg_db/serializers/label_video_segment/_lvs_create.py +149 -0
- endoreg_db/serializers/label_video_segment/_lvs_update.py +138 -0
- endoreg_db/serializers/label_video_segment/_lvs_validate.py +149 -0
- endoreg_db/serializers/label_video_segment/label_video_segment.py +344 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_annotation.py +99 -0
- endoreg_db/serializers/label_video_segment/label_video_segment_update.py +163 -0
- endoreg_db/serializers/meta/__init__.py +19 -0
- endoreg_db/serializers/meta/pdf_file_meta_extraction.py +115 -0
- endoreg_db/serializers/meta/report_meta.py +53 -0
- endoreg_db/serializers/meta/sensitive_meta_detail.py +162 -0
- endoreg_db/serializers/meta/sensitive_meta_update.py +148 -0
- endoreg_db/serializers/meta/sensitive_meta_verification.py +59 -0
- endoreg_db/serializers/meta/video_meta.py +39 -0
- endoreg_db/serializers/misc/__init__.py +14 -0
- endoreg_db/serializers/misc/file_overview.py +182 -0
- endoreg_db/serializers/misc/sensitive_patient_data.py +120 -0
- endoreg_db/serializers/misc/stats.py +33 -0
- endoreg_db/serializers/misc/translatable_field_mix_in.py +44 -0
- endoreg_db/serializers/misc/upload_job.py +71 -0
- endoreg_db/serializers/patient/__init__.py +11 -0
- endoreg_db/serializers/patient/patient.py +86 -0
- endoreg_db/serializers/patient/patient_dropdown.py +27 -0
- endoreg_db/serializers/patient_examination/__init__.py +7 -0
- endoreg_db/serializers/patient_examination/patient_examination.py +141 -0
- endoreg_db/serializers/patient_finding/__init__.py +15 -0
- endoreg_db/serializers/patient_finding/patient_finding.py +31 -0
- endoreg_db/serializers/patient_finding/patient_finding_classification.py +39 -0
- endoreg_db/serializers/patient_finding/patient_finding_detail.py +53 -0
- endoreg_db/serializers/patient_finding/patient_finding_intervention.py +26 -0
- endoreg_db/serializers/patient_finding/patient_finding_list.py +41 -0
- endoreg_db/serializers/patient_finding/patient_finding_write.py +126 -0
- endoreg_db/serializers/pdf/__init__.py +5 -0
- endoreg_db/serializers/pdf/anony_text_validation.py +85 -0
- endoreg_db/serializers/report/__init__.py +9 -0
- endoreg_db/serializers/report/mixins.py +45 -0
- endoreg_db/serializers/report/report.py +105 -0
- endoreg_db/serializers/report/report_list.py +22 -0
- endoreg_db/serializers/report/secure_file_url.py +26 -0
- endoreg_db/serializers/requirements/requirement_schema.py +25 -0
- endoreg_db/serializers/requirements/requirement_sets.py +29 -0
- endoreg_db/serializers/sensitive_meta_serializer.py +282 -0
- endoreg_db/serializers/video/__init__.py +7 -0
- endoreg_db/serializers/video/segmentation.py +263 -0
- endoreg_db/serializers/video/video_file_brief.py +10 -0
- endoreg_db/serializers/video/video_file_detail.py +83 -0
- endoreg_db/serializers/video/video_file_list.py +67 -0
- endoreg_db/serializers/video/video_metadata.py +105 -0
- endoreg_db/serializers/video/video_processing_history.py +153 -0
- endoreg_db/serializers/video_examination.py +198 -0
- endoreg_db/services/__init__.py +5 -0
- endoreg_db/services/anonymization.py +223 -0
- endoreg_db/services/examination_evaluation.py +149 -0
- endoreg_db/services/finding_description_service.py +0 -0
- endoreg_db/services/lookup_service.py +411 -0
- endoreg_db/services/lookup_store.py +266 -0
- endoreg_db/services/pdf_import.py +1382 -0
- endoreg_db/services/polling_coordinator.py +288 -0
- endoreg_db/services/pseudonym_service.py +89 -0
- endoreg_db/services/requirements_object.py +147 -0
- endoreg_db/services/segment_sync.py +155 -0
- endoreg_db/services/storage_aware_video_processor.py +344 -0
- endoreg_db/services/video_import.py +1259 -0
- endoreg_db/tasks/upload_tasks.py +207 -0
- endoreg_db/tasks/video_ingest.py +157 -0
- endoreg_db/tasks/video_processing_tasks.py +327 -0
- endoreg_db/templates/admin/patient_finding_intervention.html +253 -0
- endoreg_db/templates/admin/start_examination.html +12 -0
- endoreg_db/templates/timeline.html +176 -0
- endoreg_db/urls/__init__.py +83 -0
- endoreg_db/urls/anonymization.py +32 -0
- endoreg_db/urls/auth.py +16 -0
- endoreg_db/urls/classification.py +39 -0
- endoreg_db/urls/examination.py +54 -0
- endoreg_db/urls/files.py +6 -0
- endoreg_db/urls/label_video_segment_validate.py +33 -0
- endoreg_db/urls/label_video_segments.py +46 -0
- endoreg_db/urls/media.py +227 -0
- endoreg_db/urls/patient.py +19 -0
- endoreg_db/urls/report.py +48 -0
- endoreg_db/urls/requirements.py +13 -0
- endoreg_db/urls/sensitive_meta.py +0 -0
- endoreg_db/urls/stats.py +46 -0
- endoreg_db/urls/upload.py +20 -0
- endoreg_db/urls/video.py +61 -0
- endoreg_db/urls.py +9 -0
- endoreg_db/utils/__init__.py +88 -0
- endoreg_db/utils/ai/__init__.py +9 -0
- endoreg_db/utils/ai/get.py +5 -0
- endoreg_db/utils/ai/inference_dataset.py +52 -0
- endoreg_db/utils/ai/multilabel_classification_net.py +159 -0
- endoreg_db/utils/ai/postprocess.py +63 -0
- endoreg_db/utils/ai/predict.py +291 -0
- endoreg_db/utils/ai/preprocess.py +68 -0
- endoreg_db/utils/calc_duration_seconds.py +24 -0
- endoreg_db/utils/case_generator/__init__.py +0 -0
- endoreg_db/utils/case_generator/case_generator.py +159 -0
- endoreg_db/utils/case_generator/lab_sample_factory.py +33 -0
- endoreg_db/utils/case_generator/utils.py +30 -0
- endoreg_db/utils/check_video_files.py +148 -0
- endoreg_db/utils/cropping.py +29 -0
- endoreg_db/utils/dataloader.py +175 -0
- endoreg_db/utils/dates.py +60 -0
- endoreg_db/utils/env.py +33 -0
- endoreg_db/utils/extract_specific_frames.py +72 -0
- endoreg_db/utils/file_operations.py +58 -0
- endoreg_db/utils/fix_video_path_direct.py +141 -0
- endoreg_db/utils/frame_anonymization_utils.py +463 -0
- endoreg_db/utils/hashs.py +153 -0
- endoreg_db/utils/links/__init__.py +0 -0
- endoreg_db/utils/links/requirement_link.py +193 -0
- endoreg_db/utils/mime_types.py +0 -0
- endoreg_db/utils/names.py +76 -0
- endoreg_db/utils/ocr.py +190 -0
- endoreg_db/utils/parse_and_generate_yaml.py +46 -0
- endoreg_db/utils/paths.py +95 -0
- endoreg_db/utils/permissions.py +143 -0
- endoreg_db/utils/pipelines/Readme.md +235 -0
- endoreg_db/utils/pipelines/__init__.py +0 -0
- endoreg_db/utils/pipelines/process_video_dir.py +120 -0
- endoreg_db/utils/product/__init__.py +0 -0
- endoreg_db/utils/product/sum_emissions.py +20 -0
- endoreg_db/utils/product/sum_weights.py +18 -0
- endoreg_db/utils/pydantic_models/__init__.py +6 -0
- endoreg_db/utils/pydantic_models/db_config.py +57 -0
- endoreg_db/utils/requirement_helpers.py +0 -0
- endoreg_db/utils/requirement_operator_logic/__init__.py +0 -0
- endoreg_db/utils/requirement_operator_logic/lab_value_operators.py +578 -0
- endoreg_db/utils/requirement_operator_logic/model_evaluators.py +368 -0
- endoreg_db/utils/setup_config.py +177 -0
- endoreg_db/utils/translation.py +27 -0
- endoreg_db/utils/uuid.py +4 -0
- endoreg_db/utils/validate_endo_roi.py +19 -0
- endoreg_db/utils/validate_subcategory_dict.py +91 -0
- endoreg_db/utils/validate_video_detailed.py +357 -0
- endoreg_db/utils/video/__init__.py +26 -0
- endoreg_db/utils/video/extract_frames.py +88 -0
- endoreg_db/utils/video/ffmpeg_wrapper.py +835 -0
- endoreg_db/utils/video/names.py +42 -0
- endoreg_db/utils/video/streaming_processor.py +312 -0
- endoreg_db/utils/video/video_splitter.py +94 -0
- endoreg_db/views/Frames_NICE_and_PARIS_classifications_views.py +238 -0
- endoreg_db/views/__init__.py +274 -0
- endoreg_db/views/anonymization/__init__.py +27 -0
- endoreg_db/views/anonymization/media_management.py +454 -0
- endoreg_db/views/anonymization/overview.py +216 -0
- endoreg_db/views/anonymization/validate.py +107 -0
- endoreg_db/views/auth/__init__.py +13 -0
- endoreg_db/views/auth/keycloak.py +113 -0
- endoreg_db/views/examination/__init__.py +33 -0
- endoreg_db/views/examination/examination.py +37 -0
- endoreg_db/views/examination/examination_manifest_cache.py +26 -0
- endoreg_db/views/examination/get_finding_classification_choices.py +59 -0
- endoreg_db/views/examination/get_finding_classifications.py +36 -0
- endoreg_db/views/examination/get_findings.py +41 -0
- endoreg_db/views/examination/get_instruments.py +18 -0
- endoreg_db/views/examination/get_interventions.py +14 -0
- endoreg_db/views/finding/__init__.py +9 -0
- endoreg_db/views/finding/finding.py +112 -0
- endoreg_db/views/finding/get_classifications.py +14 -0
- endoreg_db/views/finding/get_interventions.py +17 -0
- endoreg_db/views/finding_classification/__init__.py +13 -0
- endoreg_db/views/finding_classification/base.py +0 -0
- endoreg_db/views/finding_classification/finding_classification.py +42 -0
- endoreg_db/views/finding_classification/get_classification_choices.py +55 -0
- endoreg_db/views/label/__init__.py +5 -0
- endoreg_db/views/label/label.py +15 -0
- endoreg_db/views/label_video_segment/__init__.py +16 -0
- endoreg_db/views/label_video_segment/create_lvs_from_annotation.py +44 -0
- endoreg_db/views/label_video_segment/get_lvs_by_name_and_video.py +50 -0
- endoreg_db/views/label_video_segment/label_video_segment.py +77 -0
- endoreg_db/views/label_video_segment/label_video_segment_by_label.py +174 -0
- endoreg_db/views/label_video_segment/label_video_segment_detail.py +73 -0
- endoreg_db/views/label_video_segment/update_lvs_from_annotation.py +46 -0
- endoreg_db/views/label_video_segment/validate.py +226 -0
- endoreg_db/views/media/__init__.py +45 -0
- endoreg_db/views/media/pdf_media.py +388 -0
- endoreg_db/views/media/segments.py +71 -0
- endoreg_db/views/media/sensitive_metadata.py +314 -0
- endoreg_db/views/media/video_media.py +272 -0
- endoreg_db/views/media/video_segments.py +524 -0
- endoreg_db/views/meta/__init__.py +15 -0
- endoreg_db/views/meta/available_files_list.py +146 -0
- endoreg_db/views/meta/report_meta.py +53 -0
- endoreg_db/views/meta/sensitive_meta_detail.py +148 -0
- endoreg_db/views/meta/sensitive_meta_list.py +104 -0
- endoreg_db/views/meta/sensitive_meta_verification.py +71 -0
- endoreg_db/views/misc/__init__.py +63 -0
- endoreg_db/views/misc/center.py +13 -0
- endoreg_db/views/misc/csrf.py +7 -0
- endoreg_db/views/misc/gender.py +14 -0
- endoreg_db/views/misc/secure_file_serving_view.py +80 -0
- endoreg_db/views/misc/secure_file_url_view.py +84 -0
- endoreg_db/views/misc/secure_url_validate.py +79 -0
- endoreg_db/views/misc/stats.py +220 -0
- endoreg_db/views/misc/translation.py +182 -0
- endoreg_db/views/misc/upload_views.py +240 -0
- endoreg_db/views/patient/__init__.py +5 -0
- endoreg_db/views/patient/patient.py +210 -0
- endoreg_db/views/patient_examination/DEPRECATED_video_backup.py +164 -0
- endoreg_db/views/patient_examination/__init__.py +11 -0
- endoreg_db/views/patient_examination/patient_examination.py +140 -0
- endoreg_db/views/patient_examination/patient_examination_create.py +63 -0
- endoreg_db/views/patient_examination/patient_examination_detail.py +66 -0
- endoreg_db/views/patient_examination/patient_examination_list.py +68 -0
- endoreg_db/views/patient_examination/video.py +194 -0
- endoreg_db/views/patient_finding/__init__.py +7 -0
- endoreg_db/views/patient_finding/base.py +0 -0
- endoreg_db/views/patient_finding/patient_finding.py +64 -0
- endoreg_db/views/patient_finding/patient_finding_optimized.py +259 -0
- endoreg_db/views/patient_finding_classification/__init__.py +5 -0
- endoreg_db/views/patient_finding_classification/pfc_create.py +67 -0
- endoreg_db/views/patient_finding_location/__init__.py +5 -0
- endoreg_db/views/patient_finding_location/pfl_create.py +70 -0
- endoreg_db/views/patient_finding_morphology/__init__.py +5 -0
- endoreg_db/views/patient_finding_morphology/pfm_create.py +70 -0
- endoreg_db/views/pdf/__init__.py +8 -0
- endoreg_db/views/pdf/pdf_stream.py +186 -0
- endoreg_db/views/pdf/reimport.py +177 -0
- endoreg_db/views/report/__init__.py +9 -0
- endoreg_db/views/report/report_list.py +112 -0
- endoreg_db/views/report/report_with_secure_url.py +28 -0
- endoreg_db/views/report/start_examination.py +7 -0
- endoreg_db/views/requirement/__init__.py +10 -0
- endoreg_db/views/requirement/evaluate.py +279 -0
- endoreg_db/views/requirement/lookup.py +367 -0
- endoreg_db/views/requirement/lookup_store.py +252 -0
- endoreg_db/views/requirement_lookup/lookup.py +0 -0
- endoreg_db/views/requirement_lookup/lookup_store.py +0 -0
- endoreg_db/views/stats/__init__.py +13 -0
- endoreg_db/views/stats/stats_views.py +229 -0
- endoreg_db/views/video/__init__.py +59 -0
- endoreg_db/views/video/correction.py +530 -0
- endoreg_db/views/video/reimport.py +195 -0
- endoreg_db/views/video/segmentation.py +274 -0
- endoreg_db/views/video/task_status.py +49 -0
- endoreg_db/views/video/timeline.py +46 -0
- endoreg_db/views/video/video_analyze.py +52 -0
- endoreg_db/views/video/video_apply_mask.py +48 -0
- endoreg_db/views/video/video_correction.py +21 -0
- endoreg_db/views/video/video_download_processed.py +58 -0
- endoreg_db/views/video/video_examination_viewset.py +242 -0
- endoreg_db/views/video/video_meta.py +29 -0
- endoreg_db/views/video/video_processing_history.py +24 -0
- endoreg_db/views/video/video_remove_frames.py +48 -0
- endoreg_db/views/video/video_stream.py +306 -0
- endoreg_db/views.py +0 -0
- endoreg_db-0.8.6.4.dist-info/METADATA +383 -0
- endoreg_db-0.8.6.4.dist-info/RECORD +793 -0
- endoreg_db-0.8.6.4.dist-info/WHEEL +4 -0
- endoreg_db-0.8.6.4.dist-info/licenses/LICENSE +674 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from endoreg_db.models import Unit
|
|
2
|
+
|
|
3
|
+
def validate_subcategory_dict(self, subcategory_dict:dict=None):
|
|
4
|
+
if subcategory_dict is None:
|
|
5
|
+
return False
|
|
6
|
+
|
|
7
|
+
if not isinstance(subcategory_dict, dict):
|
|
8
|
+
return False
|
|
9
|
+
|
|
10
|
+
# check if key choices exists and is a list of strings
|
|
11
|
+
if "choices" not in subcategory_dict:
|
|
12
|
+
return False
|
|
13
|
+
|
|
14
|
+
if not isinstance(subcategory_dict["choices"], list):
|
|
15
|
+
return False
|
|
16
|
+
|
|
17
|
+
for choice in subcategory_dict["choices"]:
|
|
18
|
+
if not isinstance(choice, str):
|
|
19
|
+
return False
|
|
20
|
+
|
|
21
|
+
# check if key default exists and is a string
|
|
22
|
+
if "default" not in subcategory_dict:
|
|
23
|
+
return False
|
|
24
|
+
|
|
25
|
+
if not isinstance(subcategory_dict["default"], str):
|
|
26
|
+
return False
|
|
27
|
+
|
|
28
|
+
# check if default is in choices
|
|
29
|
+
if subcategory_dict["default"] not in subcategory_dict["choices"]:
|
|
30
|
+
return False
|
|
31
|
+
|
|
32
|
+
if not subcategory_dict["required"]:
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
return True
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def validate_numerical_descriptor(self, numerical_descriptor_dict:dict=None):
|
|
39
|
+
# Check if numerical_descriptor_dict is None
|
|
40
|
+
error_message = ""
|
|
41
|
+
if numerical_descriptor_dict is None:
|
|
42
|
+
error_message = "numerical_descriptor_dict is None"
|
|
43
|
+
return False, error_message
|
|
44
|
+
|
|
45
|
+
# Check if numerical_descriptor_dict is a dictionary
|
|
46
|
+
if not isinstance(numerical_descriptor_dict, dict):
|
|
47
|
+
error_message = "numerical_descriptor_dict is not a dictionary"
|
|
48
|
+
return False, error_message
|
|
49
|
+
|
|
50
|
+
# if key unit exists and is a string and Unit object with that name exists
|
|
51
|
+
if "unit" not in numerical_descriptor_dict:
|
|
52
|
+
error_message = "unit key does not exist in numerical_descriptor_dict"
|
|
53
|
+
return False, error_message
|
|
54
|
+
|
|
55
|
+
elif not isinstance(numerical_descriptor_dict["unit"], str):
|
|
56
|
+
error_message = "unit key is not a string"
|
|
57
|
+
return False, error_message
|
|
58
|
+
|
|
59
|
+
elif not Unit.objects.filter(name=numerical_descriptor_dict["unit"]).exists():
|
|
60
|
+
error_message = "Unit object with that name does not exist"
|
|
61
|
+
return False, error_message
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
if not "required" in numerical_descriptor_dict:
|
|
65
|
+
error_message = "required key does not exist in numerical_descriptor_dict"
|
|
66
|
+
return False, error_message
|
|
67
|
+
|
|
68
|
+
elif not isinstance(numerical_descriptor_dict["required"], bool):
|
|
69
|
+
error_message = "required key is not a boolean"
|
|
70
|
+
return False, error_message
|
|
71
|
+
|
|
72
|
+
# check if min, max, mean, std exist and are either None or float
|
|
73
|
+
for key in ["min", "max", "mean", "std", "default"]:
|
|
74
|
+
if key not in numerical_descriptor_dict:
|
|
75
|
+
error_message = f"{key} key does not exist in numerical_descriptor_dict"
|
|
76
|
+
return False, error_message
|
|
77
|
+
|
|
78
|
+
if numerical_descriptor_dict[key] is not None and not isinstance(numerical_descriptor_dict[key], float):
|
|
79
|
+
error_message = f"{key} key is not a float"
|
|
80
|
+
return False, error_message
|
|
81
|
+
|
|
82
|
+
# check if distribution exists and is either "normal" or "uniform"
|
|
83
|
+
if "distribution" not in numerical_descriptor_dict:
|
|
84
|
+
error_message = "distribution key does not exist in numerical_descriptor_dict"
|
|
85
|
+
return False, error_message
|
|
86
|
+
|
|
87
|
+
if numerical_descriptor_dict["distribution"] not in ["normal", "uniform"]:
|
|
88
|
+
error_message = "distribution key is not either 'normal' or 'uniform'"
|
|
89
|
+
return False, error_message
|
|
90
|
+
|
|
91
|
+
return True, None
|
|
@@ -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()
|
|
@@ -0,0 +1,26 @@
|
|
|
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,
|
|
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__
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
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",
|
|
24
|
+
"transcode_videofile_if_required",
|
|
25
|
+
"ffmpeg_extract_frames", # Use the alias if needed
|
|
26
|
+
]
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import shutil
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from icecream import ic
|
|
5
|
+
import subprocess
|
|
6
|
+
from django.db import transaction
|
|
7
|
+
from tqdm import tqdm
|
|
8
|
+
from typing import TYPE_CHECKING, Union, List, Optional
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from ...models.media import VideoFile
|
|
12
|
+
|
|
13
|
+
from django.core.files import File
|
|
14
|
+
import io
|
|
15
|
+
from .ffmpeg_wrapper import extract_frames as ffmpeg_extract_frames
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def prepare_bulk_frames(frame_paths: List[Path]):
|
|
19
|
+
"""
|
|
20
|
+
Reads the frame paths into memory as Django File objects.
|
|
21
|
+
This avoids 'seek of closed file' errors by using BytesIO for each frame.
|
|
22
|
+
"""
|
|
23
|
+
for path in frame_paths:
|
|
24
|
+
frame_number = int(path.stem.split("_")[1])
|
|
25
|
+
with open(path, "rb") as f:
|
|
26
|
+
content = f.read()
|
|
27
|
+
file_obj = File(io.BytesIO(content), name=path.name)
|
|
28
|
+
yield frame_number, file_obj
|
|
29
|
+
|
|
30
|
+
|
|
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)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def initialize_frame_objects(
|
|
39
|
+
video: "VideoFile", extracted_paths: List[Path]
|
|
40
|
+
):
|
|
41
|
+
"""
|
|
42
|
+
Initialize frame objects for the extracted frames and update state.
|
|
43
|
+
"""
|
|
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.")
|
|
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
|
+
|
|
54
|
+
video.frame_count = len(extracted_paths)
|
|
55
|
+
frames_to_create = []
|
|
56
|
+
batch_size = int(os.environ.get("DJANGO_FFMPEG_EXTRACT_FRAME_BATCHSIZE", "500"))
|
|
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)
|
|
70
|
+
frame_obj_instance = video.create_frame_object(
|
|
71
|
+
frame_number, image_file=relative_path, extracted=True
|
|
72
|
+
)
|
|
73
|
+
frames_to_create.append(frame_obj_instance)
|
|
74
|
+
|
|
75
|
+
if i % batch_size == 0:
|
|
76
|
+
with transaction.atomic():
|
|
77
|
+
video.bulk_create_frames(frames_to_create)
|
|
78
|
+
frames_to_create.clear()
|
|
79
|
+
|
|
80
|
+
if frames_to_create:
|
|
81
|
+
with transaction.atomic():
|
|
82
|
+
video.bulk_create_frames(frames_to_create)
|
|
83
|
+
|
|
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
|
|
88
|
+
|