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

File without changes
endoreg_db/utils/paths.py CHANGED
@@ -8,19 +8,12 @@ It provides a unified dictionary 'data_paths' for accessing all path objects.
8
8
  from logging import getLogger
9
9
  logger = getLogger(__name__)
10
10
 
11
- import os
12
11
  from pathlib import Path
13
12
  from typing import Dict
14
- import dotenv
15
13
 
16
- # Only load .env in non-pytest contexts to avoid leaking dev settings into tests
17
- if not os.environ.get("PYTEST_CURRENT_TEST"):
18
- dotenv.load_dotenv()
19
- else:
20
- logger.debug("Skipping .env load under pytest")
14
+ from endoreg_db.config.env import env_path
21
15
 
22
- # Define BASE_DIR as the project root (endoreg_db/utils -> endoreg_db -> repo root)
23
- STORAGE_DIR = Path(os.getenv("STORAGE_DIR"))
16
+ STORAGE_DIR = env_path("STORAGE_DIR", "storage")
24
17
 
25
18
  # Resolve STORAGE_DIR from env or default under BASE_DIR
26
19
  #def _resolve_storage_dir() -> Path:
@@ -36,7 +29,6 @@ STORAGE_DIR = Path(os.getenv("STORAGE_DIR"))
36
29
  STORAGE_DIR.mkdir(parents=True, exist_ok=True)
37
30
 
38
31
  PREFIX_RAW = "raw_"
39
- STORAGE_DIR_NAME = "data"
40
32
  IMPORT_DIR_NAME = "import"
41
33
  EXPORT_DIR_NAME = "export"
42
34
 
@@ -1,6 +1,8 @@
1
+ import os
1
2
  import subprocess
2
3
  import json
3
4
  import logging
5
+ from functools import lru_cache
4
6
  from pathlib import Path
5
7
  from typing import List, Dict, Optional, Tuple
6
8
  import cv2
@@ -13,6 +15,67 @@ logger = logging.getLogger("ffmpeg_wrapper")
13
15
  _nvenc_available = None
14
16
  _preferred_encoder = None
15
17
 
18
+
19
+ @lru_cache(maxsize=1)
20
+ def _resolve_ffmpeg_executable() -> Optional[str]:
21
+ """Locate the ffmpeg executable using multiple discovery strategies."""
22
+ # 1) Explicit overrides via env vars
23
+ env_candidates = [
24
+ os.environ.get("FFMPEG_EXECUTABLE"),
25
+ os.environ.get("FFMPEG_BINARY"),
26
+ os.environ.get("FFMPEG_PATH"),
27
+ ]
28
+
29
+ # 2) Django settings overrides (if Django is configured)
30
+ try:
31
+ from django.conf import settings # type: ignore
32
+
33
+ env_candidates.extend(
34
+ getattr(settings, attr)
35
+ for attr in ("FFMPEG_EXECUTABLE", "FFMPEG_BINARY", "FFMPEG_PATH")
36
+ if hasattr(settings, attr)
37
+ )
38
+ except Exception:
39
+ # Django might not be configured for every consumer
40
+ pass
41
+
42
+ # Normalize and verify explicit candidates
43
+ for candidate in env_candidates:
44
+ if not candidate:
45
+ continue
46
+ candidate_path = Path(candidate)
47
+ if candidate_path.is_dir():
48
+ candidate_path = candidate_path / "ffmpeg"
49
+ if candidate_path.exists() and os.access(candidate_path, os.X_OK):
50
+ logger.debug("Using ffmpeg executable override at %s", candidate_path)
51
+ return str(candidate_path)
52
+
53
+ # 3) PATH lookup (shutil.which)
54
+ via_path = shutil.which("ffmpeg")
55
+ if via_path:
56
+ return via_path
57
+
58
+ # 4) Common fallback locations (useful for Nix-based environments)
59
+ nix_store = Path("/nix/store")
60
+ if nix_store.exists():
61
+ patterns = (
62
+ "*-ffmpeg-*/bin/ffmpeg",
63
+ "*-ffmpeg-headless-*/bin/ffmpeg",
64
+ "*-ffmpeg-headless*/bin/ffmpeg",
65
+ )
66
+ for pattern in patterns:
67
+ matches = sorted(nix_store.glob(pattern))
68
+ if matches:
69
+ logger.debug("Discovered ffmpeg in nix store at %s", matches[-1])
70
+ return str(matches[-1])
71
+
72
+ # 5) Final fallback to standard Unix locations
73
+ for fallback in (Path("/usr/bin/ffmpeg"), Path("/usr/local/bin/ffmpeg")):
74
+ if fallback.exists() and os.access(fallback, os.X_OK):
75
+ return str(fallback)
76
+
77
+ return None
78
+
16
79
  def _detect_nvenc_support() -> bool:
17
80
  """
18
81
  Detect if NVIDIA NVENC hardware acceleration is available.
@@ -163,7 +226,7 @@ def is_ffmpeg_available() -> bool:
163
226
  Returns:
164
227
  True if FFmpeg is found in the PATH; otherwise, False.
165
228
  """
166
- return shutil.which("ffmpeg") is not None
229
+ return _resolve_ffmpeg_executable() is not None
167
230
 
168
231
  def check_ffmpeg_availability():
169
232
  """
@@ -607,8 +670,8 @@ def extract_frames(
607
670
  Returns:
608
671
  A list of Path objects for the extracted frames.
609
672
  """
610
- # Check if ffmpeg command exists
611
- ffmpeg_executable = shutil.which("ffmpeg")
673
+ # Resolve ffmpeg executable with multiple fallbacks
674
+ ffmpeg_executable = _resolve_ffmpeg_executable()
612
675
  if not ffmpeg_executable:
613
676
  error_msg = "ffmpeg command not found. Ensure FFmpeg is installed and in the system's PATH."
614
677
  logger.error(error_msg)
@@ -691,7 +754,7 @@ def extract_frame_range(
691
754
  logger.warning("extract_frame_range called with start_frame (%d) >= end_frame (%d). No frames to extract.", start_frame, end_frame)
692
755
  return []
693
756
 
694
- ffmpeg_executable = shutil.which("ffmpeg")
757
+ ffmpeg_executable = _resolve_ffmpeg_executable()
695
758
  if not ffmpeg_executable:
696
759
  error_msg = "ffmpeg command not found. Ensure FFmpeg is installed and in the system's PATH."
697
760
  logger.error(error_msg)
@@ -1,11 +1,18 @@
1
+ import logging
2
+ from typing import Any, Dict, cast
3
+
4
+ from django.db import transaction
1
5
  from rest_framework import status
2
6
  from rest_framework.response import Response
3
7
  from rest_framework.views import APIView
4
- from django.db import transaction
5
- from endoreg_db.models import VideoFile, RawPdfFile
8
+
9
+ from endoreg_db.models import RawPdfFile, VideoFile
6
10
  from endoreg_db.serializers.anonymization import SensitiveMetaValidateSerializer
7
11
 
8
12
 
13
+ logger = logging.getLogger(__name__)
14
+
15
+
9
16
  class AnonymizationValidateView(APIView):
10
17
  """
11
18
  POST /api/anonymization/<int:file_id>/validate/
@@ -32,35 +39,69 @@ class AnonymizationValidateView(APIView):
32
39
  # Serializer-Validierung mit deutscher Datums-Priorität
33
40
  serializer = SensitiveMetaValidateSerializer(data=request.data or {})
34
41
  serializer.is_valid(raise_exception=True)
35
- payload = serializer.validated_data
36
- payload.setdefault("is_verified", True)
37
-
38
- # Try Video first
39
- if payload.get("file_type") == "video" or not payload.get("file_type"):
40
- video = VideoFile.objects.filter(pk=file_id).first()
41
- if video:
42
- # Ensure center_name is in payload for hash calculation
43
- if video.center and not payload.get("center_name"):
44
- payload["center_name"] = video.center.name
45
-
46
- ok = video.validate_metadata_annotation(payload)
47
- #if ok:
48
- # video._cleanup_raw_assets()
49
- if not ok:
50
- return Response({"error": "Video validation failed."}, status=status.HTTP_400_BAD_REQUEST)
51
- return Response({"message": "Video validated."}, status=status.HTTP_200_OK)
52
-
53
- # Then PDF
54
- if payload.get("file_type") == "pdf" or not payload.get("file_type"):
55
- pdf = RawPdfFile.objects.filter(pk=file_id).first()
56
- if pdf:
57
- # Ensure center_name is in payload for hash calculation
58
- if pdf.center and not payload.get("center_name"):
59
- payload["center_name"] = pdf.center.name
60
-
61
- ok = pdf.validate_metadata_annotation(payload)
62
- if not ok:
63
- return Response({"error": "PDF validation failed."}, status=status.HTTP_400_BAD_REQUEST)
64
- return Response({"message": "PDF validated."}, status=status.HTTP_200_OK)
65
-
66
- return Response({"error": f"Item {file_id} not found as video or pdf."}, status=status.HTTP_404_NOT_FOUND)
42
+ validated_data = cast(Dict[str, Any], serializer.validated_data)
43
+ payload: Dict[str, Any] = dict(validated_data)
44
+ if "is_verified" not in payload:
45
+ payload["is_verified"] = True
46
+
47
+ file_type = payload.get("file_type")
48
+
49
+ # Try Video first (unless explicitly requesting PDF)
50
+ if file_type in (None, "video"):
51
+ video = VideoFile.objects.select_related("center").filter(pk=file_id).first()
52
+ if video is not None:
53
+ prepared_payload = self._prepare_payload(payload, video)
54
+ try:
55
+ ok = video.validate_metadata_annotation(prepared_payload)
56
+ except Exception: # pragma: no cover - defensive safety net
57
+ logger.exception("Video validation crashed for id=%s", file_id)
58
+ return Response(
59
+ {"error": "Video validation encountered an unexpected error."},
60
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
61
+ )
62
+
63
+ if not ok:
64
+ return Response({"error": "Video validation failed."}, status=status.HTTP_400_BAD_REQUEST)
65
+
66
+ return Response({"message": "Video validated."}, status=status.HTTP_200_OK)
67
+
68
+ if file_type == "video":
69
+ return Response({"error": f"Video {file_id} not found."}, status=status.HTTP_404_NOT_FOUND)
70
+
71
+ # Then PDF (unless explicitly requesting Video)
72
+ if file_type in (None, "pdf"):
73
+ pdf = RawPdfFile.objects.select_related("center").filter(pk=file_id).first()
74
+ if pdf is not None:
75
+ prepared_payload = self._prepare_payload(payload, pdf)
76
+ try:
77
+ ok = pdf.validate_metadata_annotation(prepared_payload)
78
+ except Exception: # pragma: no cover - defensive safety net
79
+ logger.exception("PDF validation crashed for id=%s", file_id)
80
+ return Response(
81
+ {"error": "PDF validation encountered an unexpected error."},
82
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR,
83
+ )
84
+
85
+ if not ok:
86
+ return Response({"error": "PDF validation failed."}, status=status.HTTP_400_BAD_REQUEST)
87
+
88
+ return Response({"message": "PDF validated."}, status=status.HTTP_200_OK)
89
+
90
+ if file_type == "pdf":
91
+ return Response({"error": f"PDF {file_id} not found."}, status=status.HTTP_404_NOT_FOUND)
92
+
93
+ return Response({"error": f"Item {file_id} not found as video or pdf."}, status=status.HTTP_404_NOT_FOUND)
94
+
95
+ @staticmethod
96
+ def _prepare_payload(base_payload: Dict[str, Any], file_obj: Any) -> Dict[str, Any]:
97
+ """Return a fresh payload tailored for the given file object."""
98
+
99
+ prepared = dict(base_payload)
100
+ prepared.pop("file_type", None)
101
+
102
+ center = getattr(file_obj, "center", None)
103
+ center_name = getattr(center, "name", None)
104
+ if center_name and not prepared.get("center_name"):
105
+ prepared["center_name"] = center_name
106
+
107
+ return prepared
@@ -64,15 +64,17 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
64
64
  return {'segments_updated': 0, 'segments_deleted': 0, 'segments_unchanged': 0}
65
65
 
66
66
  removed_frames = sorted(set(removed_frames)) # Ensure sorted and unique
67
- segments = LabelVideoSegment.objects.filter(video=video).order_by('start_frame')
67
+ segments = LabelVideoSegment.objects.filter(
68
+ video_file=video
69
+ ).order_by('start_frame_number')
68
70
 
69
71
  segments_updated = 0
70
72
  segments_deleted = 0
71
73
  segments_unchanged = 0
72
74
 
73
75
  for segment in segments:
74
- original_start = segment.start_frame
75
- original_end = segment.end_frame
76
+ original_start = segment.start_frame_number
77
+ original_end = segment.end_frame_number
76
78
 
77
79
  # Count frames removed before this segment
78
80
  frames_before = sum(1 for f in removed_frames if f < original_start)
@@ -99,9 +101,9 @@ def update_segments_after_frame_removal(video: VideoFile, removed_frames: list)
99
101
  f"{original_start}-{original_end} → {new_start}-{new_end} "
100
102
  f"(before: {frames_before}, within: {frames_within})"
101
103
  )
102
- segment.start_frame = new_start
103
- segment.end_frame = new_end
104
- segment.save()
104
+ segment.start_frame_number = new_start
105
+ segment.end_frame_number = new_end
106
+ segment.save(update_fields=["start_frame_number", "end_frame_number"])
105
107
  segments_updated += 1
106
108
  else:
107
109
  # No change needed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: endoreg-db
3
- Version: 0.8.2
3
+ Version: 0.8.2.2
4
4
  Summary: EndoReg Db Django App
5
5
  Project-URL: Homepage, https://info.coloreg.de
6
6
  Project-URL: Repository, https://github.com/wg-lux/endoreg-db
@@ -33,7 +33,7 @@ Requires-Dist: gunicorn>=23.0.0
33
33
  Requires-Dist: icecream>=2.1.4
34
34
  Requires-Dist: librosa==0.11.0
35
35
  Requires-Dist: llvmlite>=0.44.0
36
- Requires-Dist: lx-anonymizer[llm,ocr]>=0.8.2
36
+ Requires-Dist: lx-anonymizer[llm,ocr]>=0.8.2.2
37
37
  Requires-Dist: moviepy==2.2.1
38
38
  Requires-Dist: mypy>=1.16.0
39
39
  Requires-Dist: numpy>=2.2.3
@@ -13,6 +13,7 @@ endoreg_db/api/views/finding_descriptions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
13
13
  endoreg_db/assets/dummy_model.ckpt,sha256=NAw5JDdrpV5bpZgdHXhmlQeo6TocKwQ_LQRzmqIm2Dw,21
14
14
  endoreg_db/codemods/readme.md,sha256=mVOAevESOuN0WSTMI3tJPbuuGE3ROASp9s21bpf-LOs,3958
15
15
  endoreg_db/codemods/rename_datetime_fields.py,sha256=ulLfte1erPrde2ovOHXT9qubitPceu_JT9uCkxLlKc4,2900
16
+ endoreg_db/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
17
  endoreg_db/config/env.py,sha256=S244AQRkDP0PpP0MPaShgqeBJgI1BQknfER1_vUFMD4,2673
17
18
  endoreg_db/data/__init__.py,sha256=Wqu24f5-FVKE5pis0wGDYsMHOTkieN40b10S5zU5240,5932
18
19
  endoreg_db/data/db_summary.csv,sha256=K4PcufVHQ64H1i2MbCShMxReEa96I8cL6IfwCVpqF2M,1225
@@ -239,7 +240,7 @@ endoreg_db/forms/settings/__init__.py,sha256=xKCYyRS1tEAWsm5C9OrG0Btqgitzuh_s31O
239
240
  endoreg_db/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
240
241
  endoreg_db/helpers/count_db.py,sha256=IkdgvDPM5xq7DgFn8Bp1rgpXOtmLzPfLpZy-5cFTEPg,1951
241
242
  endoreg_db/helpers/data_loader.py,sha256=Kn5MyRRuul-bDtLtqg2gn4E2OKt1-5HkjjD3QcwWyPM,6324
242
- endoreg_db/helpers/default_objects.py,sha256=-YnfKSIt7ixwM-7r8fjSnwdRUbeXjc7YbvnFfZo1QCQ,13309
243
+ endoreg_db/helpers/default_objects.py,sha256=g1ZeSsqEEp9kbeMpCUr7MyNXVvcqnhdj3wWtgtJY5Cs,13928
243
244
  endoreg_db/helpers/download_segmentation_model.py,sha256=VZ8BU7QkYpZkr8kpkUrnuvDBkirmLhuf2rHC2jRBILM,1053
244
245
  endoreg_db/helpers/interact.py,sha256=EAiUP_5CXCauKcYYEoUo-Ot3FqE5n1Rm4UX6mkC06IY,174
245
246
  endoreg_db/helpers/test_video_helper.py,sha256=4iIjH3Xe-5krhLffQLJO16XtxKJpM9wplpWUocmwWeg,4695
@@ -252,7 +253,7 @@ endoreg_db/management/commands/fix_missing_patient_data.py,sha256=5TPUTOQwI2fVh3
252
253
  endoreg_db/management/commands/fix_video_paths.py,sha256=7LLwc38oX3B_tYWbLJA43Li_KBO3m5Lyw0CF6YqN5rU,7145
253
254
  endoreg_db/management/commands/import_fallback_video.py,sha256=PhSBqyHevGgOZieZsj3NBfPJ656wqEkdCWrp2NSb538,9590
254
255
  endoreg_db/management/commands/import_report.py,sha256=vFst-NeQdL-w62yoH4kDamq-2Hos5GW90vLTO2-hfYI,13168
255
- endoreg_db/management/commands/import_video.py,sha256=Y2L0LNd0tnx2dQcOonQQBwytb_6gnm2QhUZFhvLYbOs,17719
256
+ endoreg_db/management/commands/import_video.py,sha256=s6Eurpl-zy91-uGlM9vAVh22DzC_t_5F6k79MMXluOo,17999
256
257
  endoreg_db/management/commands/import_video_with_classification.py,sha256=ulZH5jvAWu_pJ1kI9B3hbIO1-p_BReY0zbIQDS_d9OI,14726
257
258
  endoreg_db/management/commands/init_default_ai_model.py,sha256=98yBigGZ5gkA-b1LPcvzS5x2jAms3pX58fU-TEAcjKw,4669
258
259
  endoreg_db/management/commands/load_ai_model_data.py,sha256=QDyWPjIC1ga13Ou67_mnE8HUGTAK0uF2LLQ12sE-95E,2747
@@ -307,6 +308,7 @@ endoreg_db/mermaid/patient_creation.md,sha256=P0U50Pejxn_AATzHTJ3U9iydoEVSnpRjGE
307
308
  endoreg_db/mermaid/video_segmentation_annotation.md,sha256=oouo5htDabP8m-W86C6aWXyIxi1A7zAoPqa3o5xr354,536
308
309
  endoreg_db/migrations/0001_initial.py,sha256=xfdlddGyRGvwKbm77E4gPRWsgJWZvXs6aw_G-f1Eszo,121558
309
310
  endoreg_db/migrations/0002_add_video_correction_models.py,sha256=EFnABa4FClf6DwytRiG15Ws-aZwZ1ZgACnl6r2dNUxs,3691
311
+ endoreg_db/migrations/0003_add_center_display_name.py,sha256=F13-IUe1q6XjVzE5-oMTAVx4oo_jvMcLpDiHtrTfQL4,873
310
312
  endoreg_db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
311
313
  endoreg_db/models/__init__.py,sha256=JyucmAkGkbzKiLrnZKKUTsJb0bk1DqJC6cRsKtNbfgQ,7086
312
314
  endoreg_db/models/upload_job.py,sha256=lSsyv2d5jZxI8jAKlBU7dXi4jhEIKYjJKt8gZlwRz94,3000
@@ -326,7 +328,7 @@ endoreg_db/models/administration/case/case_template/case_template_rule.py,sha256
326
328
  endoreg_db/models/administration/case/case_template/case_template_rule_value.py,sha256=TToGxdc2UVT-xrNvpCCfCd9ejsqpIwI3Vzyl13xF7Zg,2689
327
329
  endoreg_db/models/administration/case/case_template/case_template_type.py,sha256=tnwBNRGONl87gGbf0LGEso65wIEsKX2lDZixCfvpbqs,653
328
330
  endoreg_db/models/administration/center/__init__.py,sha256=VQj0PFNjzY_nwRlvOHnrA0Agle2YFCbRX0yrDeBHawY,299
329
- endoreg_db/models/administration/center/center.py,sha256=odbLPGFFWhP4GthoQZlXKHs3kqlWSdtCh4fUDRA8YS0,1884
331
+ endoreg_db/models/administration/center/center.py,sha256=o4F9dSqkWoH0a3XCvlwliRiMKTxYJjYq2X3OR7wjaOM,2133
330
332
  endoreg_db/models/administration/center/center_product.py,sha256=sMYntr_9j9Qp0DlO0G6DLNKtcPWuR2wwnwPM1ISVJTU,1947
331
333
  endoreg_db/models/administration/center/center_resource.py,sha256=y03EFO5sSlrjuU7w5vZzfZZSFzudUQgKH7gJohclYC0,2017
332
334
  endoreg_db/models/administration/center/center_shift.py,sha256=IC7OyexkA5fGvMD6g4gdpROlRXwjA2I7-tNmAufMY0w,2471
@@ -377,21 +379,21 @@ endoreg_db/models/media/__init__.py,sha256=HxAH8NMqf-ftRsQmVQj4VlSHiTsdECGYLdseM
377
379
  endoreg_db/models/media/frame/__init__.py,sha256=25WriZHocR82rbHr_IMIgBt5z-mkV2O0LVWUpJRnQ5E,45
378
380
  endoreg_db/models/media/frame/frame.py,sha256=6BvNKTAGsC_Q0S27nrvZ2cySDy3LSu5HCxrNcZwIEsA,4408
379
381
  endoreg_db/models/media/pdf/__init__.py,sha256=1fimtZK5LUuP_yqETN6pMj0hxKXuQqeLb1DP5wPmtT4,343
380
- endoreg_db/models/media/pdf/raw_pdf.py,sha256=jnlf-0IioHO7egDGycuO5Mm8kISrSjrI6vRCgCxrAbM,26423
382
+ endoreg_db/models/media/pdf/raw_pdf.py,sha256=sBm5C1Pr4N4n8oQw_nNMLN5cnl3efQ-WKWby2_xBauk,26185
381
383
  endoreg_db/models/media/pdf/report_file.py,sha256=6Vt_TJSB3qaF26qXbyjRSn-s_zN5y4e-PPrN8ZbYS9s,4296
382
384
  endoreg_db/models/media/pdf/report_reader/__init__.py,sha256=LiMooVstXRay5qcB-uZW0wxbcdUvPrfAs_xBwWiuuWc,166
383
385
  endoreg_db/models/media/pdf/report_reader/report_reader_config.py,sha256=wYVDmPSmNIuCTpaaWqoLVgVZFYW-dqGpnAyVBqRLqXE,3445
384
386
  endoreg_db/models/media/pdf/report_reader/report_reader_flag.py,sha256=j9tjbLRenxpWfeaseALl8rV2Dqem9YaM_duS1iJkARU,536
385
387
  endoreg_db/models/media/video/__init__.py,sha256=oHh-iHRrdh4AO4gISJj84k129AFLVvjbwKNd9Q3w4Vk,65
386
- endoreg_db/models/media/video/create_from_file.py,sha256=rD6PmThDXLB8pidaiLEEhK9bX3uwixNHhvCJDYsj_nM,14297
388
+ endoreg_db/models/media/video/create_from_file.py,sha256=3n4bbzFteEOFDUuEikP0x-StCKI5R5IhyKC7o3kLZ6Y,15128
387
389
  endoreg_db/models/media/video/pipe_1.py,sha256=hOII3BCiMpxgpDKpV5h52-O2XTqKlb4YArxuH2fWyck,9402
388
390
  endoreg_db/models/media/video/pipe_2.py,sha256=DnMxW0uOqSsf7-0n9Rlvn7u89U4Jpkv7n6hFpQfUjkQ,4964
389
391
  endoreg_db/models/media/video/refactor_plan.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
390
- endoreg_db/models/media/video/video_file.py,sha256=IXp341UwFRBkj7mWpQGlNMsKpu7vhipUy73nIQHsKIA,25245
392
+ endoreg_db/models/media/video/video_file.py,sha256=txlxR8d1OBgt3UEkWvLcGSyLarh0jXLw-z0SAV5KOok,26789
391
393
  endoreg_db/models/media/video/video_file_ai.py,sha256=3ABea52FOF1qlrlxHdYhz_M3Kmqfzqtgq7M0prl-FAo,18819
392
- endoreg_db/models/media/video/video_file_anonymize.py,sha256=5BDWxTI0LLXaomlmS4kb-UzdoPaFX7Af0V_FPq27now,15988
394
+ endoreg_db/models/media/video/video_file_anonymize.py,sha256=pet1UfSsbSHJJZxq6gDPifAfBWpGyEpD1jEQuSQi0Gg,16027
393
395
  endoreg_db/models/media/video/video_file_frames.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
394
- endoreg_db/models/media/video/video_file_io.py,sha256=FKP00KOtAkG_9t7Y7zKfoXh5a2ygpEdi2feesWgT_y0,7749
396
+ endoreg_db/models/media/video/video_file_io.py,sha256=9y3jBiIHA3Rw5pWczGbf13u-EcKiZQIuDserq2vOwuk,7921
395
397
  endoreg_db/models/media/video/video_file_meta.py,sha256=H0DvZ6pt5XUdkgDmHcBFCSsjOeW5q7McE1Zo3ArBF6s,443
396
398
  endoreg_db/models/media/video/video_file_segments.py,sha256=42oc2go3VWtNY1gsjp4kLbfQb5Qtl-aMbnAuKN3vum4,8647
397
399
  endoreg_db/models/media/video/video_file_frames/__init__.py,sha256=X1eX1o5X8PVaWwdejtQcSdkG_mvYGXXvlnzF8tE7Lck,2060
@@ -406,7 +408,7 @@ endoreg_db/models/media/video/video_file_frames/_get_frame_paths.py,sha256=tgdfN
406
408
  endoreg_db/models/media/video/video_file_frames/_get_frame_range.py,sha256=D9LDrRlNOVxguZ2Vdns4K1h6Iw9ggzEAAh8HUsz98B8,1258
407
409
  endoreg_db/models/media/video/video_file_frames/_get_frames.py,sha256=_sLvBwz1uRDJYDMDfFqwRy60tbjs48leqTyZkksXpAk,919
408
410
  endoreg_db/models/media/video/video_file_frames/_initialize_frames.py,sha256=mPkgI1V82aoFLcTf3TO8yq9fBYXKcxQ3Up14ktRzJjI,6638
409
- endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py,sha256=hnjqgOXNdF845ZprJZZubpSY02jPKSRdBg9aEkMWZB4,5759
411
+ endoreg_db/models/media/video/video_file_frames/_manage_frame_range.py,sha256=jN_jqEG9cLogdPmQDjZ2VH5FB2WPFkxe_4j-9dm7e_I,6055
410
412
  endoreg_db/models/media/video/video_file_frames/_mark_frames_extracted_status.py,sha256=ZyoJNKUEOtJctosfgRsRd5ZMAgQsM8slrqquxQ8-QY4,3432
411
413
  endoreg_db/models/media/video/video_file_meta/__init__.py,sha256=gERNjbOgaqtqMeUDb9E2TkuPt-1to7UzR1wf7yTgS10,645
412
414
  endoreg_db/models/media/video/video_file_meta/get_crop_template.py,sha256=du-okbn9KfLg4CB6HcqvIDmsHH-m5fjZSQXwkBMEBiM,1619
@@ -463,9 +465,9 @@ endoreg_db/models/metadata/frame_ocr_result.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQe
463
465
  endoreg_db/models/metadata/model_meta.py,sha256=aZH6Bz5Ss874Knvg1b3Kgq6gU8kVzPHXneunZJNF4yw,7111
464
466
  endoreg_db/models/metadata/model_meta_logic.py,sha256=yiIWbxxykUp6VB_7imRqSXcO0RS5GuoYP83O48TyKws,8987
465
467
  endoreg_db/models/metadata/pdf_meta.py,sha256=BTmpSgqxmPKi0apcNjyrZAS4AFKCPXVdBd6VBeyyv6E,3174
466
- endoreg_db/models/metadata/sensitive_meta.py,sha256=eORPGblrcFoMPPzqnc6QMs4cV63RL6nWWnb5f4bTQXs,12930
468
+ endoreg_db/models/metadata/sensitive_meta.py,sha256=yyaQ2AyaN1HUfh8JUv5cH2M0Cj03FFhItaz2Ng3IGMY,13020
467
469
  endoreg_db/models/metadata/sensitive_meta_logic.py,sha256=Oh7ssZQEPfKGfRMF5nXKJpOIxXx-Xibd3rpOu-bQilk,29988
468
- endoreg_db/models/metadata/video_meta.py,sha256=pbLU73CqSAZXN5_HgEK7e3kFKcA_VJFdpWKiWxz-bhs,14967
470
+ endoreg_db/models/metadata/video_meta.py,sha256=c6xWdLW3uNqJ5VPJXHCxXA3mbXw-b0uR54-TOS3qL2Q,14966
469
471
  endoreg_db/models/metadata/video_prediction_logic.py,sha256=j5N82mHtiomeeIaf1HA65kT5d0htQfJmbI2bJb8mpxQ,7677
470
472
  endoreg_db/models/metadata/video_prediction_meta.py,sha256=EyfctAAAVcW9L0gf76ZBc9-G8MLMcD-tc2kkjaaLH4w,10592
471
473
  endoreg_db/models/other/__init__.py,sha256=CC2sksOcwa6jPzKN_EXXk6B1dni_H1LXV0b79w4mkVE,894
@@ -593,14 +595,13 @@ endoreg_db/services/examination_evaluation.py,sha256=jx9IL2PIoBzjiITzs00c1XucE7A
593
595
  endoreg_db/services/finding_description_service.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
594
596
  endoreg_db/services/lookup_service.py,sha256=A2t07-qlQhFEeNvOhez0GU0sxi7mnN0MIlhYzxj4W1U,10581
595
597
  endoreg_db/services/lookup_store.py,sha256=8sB2HmJQrnzq5Vfqt-UdaJLHYMRZCxnui9BCCXscnJE,4856
596
- endoreg_db/services/ollama_api_docs.py,sha256=6uyep2jqjrvx87By_teEW8BX0cm14Pt2b-Hht-rrelQ,47259
597
- endoreg_db/services/pdf_import.py,sha256=SH68WgBKkxZ-5w87FIeabYYa1Wp8pOLOAzaxI7U9yhk,41407
598
+ endoreg_db/services/pdf_import.py,sha256=_ll_Vng1SpI7mEKxNRYuNttVnehuJFpKjQGDB8OX7no,47133
598
599
  endoreg_db/services/polling_coordinator.py,sha256=alnPB-kdMyxbYaxQN9fki9dKrwmAsY3s68bUHWDSNeI,10662
599
- endoreg_db/services/pseudonym_service.py,sha256=sjqPw-SBwdNfWKxciMiy7RJokcII15YgrmZeNVI593k,3149
600
+ endoreg_db/services/pseudonym_service.py,sha256=CJhbtRa6K6SPbphgCZgEMi8AFQtB18CUoBDttFnxEoM,3126
600
601
  endoreg_db/services/requirements_object.py,sha256=290zf8AEbVtCoHhW4Jr7_ud-RvrqYmb1Nz9UBHtTnc0,6164
601
602
  endoreg_db/services/segment_sync.py,sha256=YgHvIHkbW4mqCu0ACf3zjRSZnNfxWwt4gh5syUVXuE0,6400
602
603
  endoreg_db/services/storage_aware_video_processor.py,sha256=kKFK64vXLeBSVkp1YJonU3gFDTeXZ8C4qb9QZZB99SE,13420
603
- endoreg_db/services/video_import.py,sha256=po-amkVHVakG3-P_25d_oO4KIVmSwKfsZO9zDRfF9Wo,53810
604
+ endoreg_db/services/video_import.py,sha256=YjnkB5qja72WV2TsnYuD7VrIrhIZl_kDUshgnPMqqlc,52549
604
605
  endoreg_db/tasks/upload_tasks.py,sha256=OJq7DhNwcbWdXzHY8jz5c51BCVkPN5gSWOz-6Fx6W5M,7799
605
606
  endoreg_db/tasks/video_ingest.py,sha256=kxFuYkHijINV0VabQKCFVpJRv6eCAw07tviONurDgg8,5265
606
607
  endoreg_db/tasks/video_processing_tasks.py,sha256=KjcERRJ1TZzmavBpvr6OsvSTUViU0PR1ECWnEdzu2Js,14140
@@ -619,6 +620,7 @@ endoreg_db/urls/media.py,sha256=skIwOoHmDuHH-TFsZOHmFdu_whAk9qhTjLSpYgvRo1k,1088
619
620
  endoreg_db/urls/patient.py,sha256=VLKFbEiNgpfYLWFisbHidyoUnoQuEzj1U0SgZDpdPDM,588
620
621
  endoreg_db/urls/report.py,sha256=9i3sOSofB7_PHGByr3DMghZFtcbjKf_U5PVSlxu9d4I,1917
621
622
  endoreg_db/urls/requirements.py,sha256=5d-SD_7nsTA9YXlBeWdZuh-mXh26BkgH29fFBaTLjU8,455
623
+ endoreg_db/urls/sensitive_meta.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
622
624
  endoreg_db/urls/stats.py,sha256=2NQotfsHREF3gTOKQ5AT4XM1wvmEChSvDIrKMSFR2-Q,1796
623
625
  endoreg_db/urls/upload.py,sha256=H6O8lqvGlyQhwdO1OY1RNInDgh3b_CPkDf6lIYMNApY,365
624
626
  endoreg_db/urls/video.py,sha256=3yRDVGX5ZS5SuQTszoDsOqcUgboFNZj9BWCjd2pPcog,2874
@@ -638,7 +640,7 @@ endoreg_db/utils/mime_types.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
638
640
  endoreg_db/utils/names.py,sha256=6OKOSmXeAKv5XVs86_IjlQ7klyF3zLkvVQz9Bl7Lf0o,2745
639
641
  endoreg_db/utils/ocr.py,sha256=LvyABxX5OZhIeXw2pI6af8_xTj7nHQQoKGh5kNsrv7o,7136
640
642
  endoreg_db/utils/parse_and_generate_yaml.py,sha256=k7y0fl9Jbb_LNryeJYd6tebklRlu1-P70dJ-4sxvEZs,1626
641
- endoreg_db/utils/paths.py,sha256=hvhpmOWcdirTNEC54y7zXPzr-ciU_gzK5OxJlrnrqlA,3749
643
+ endoreg_db/utils/paths.py,sha256=1nquyA3mZB8b_EtFW3SSyG020tu8t0HGYNng4b-6B2k,3452
642
644
  endoreg_db/utils/permissions.py,sha256=IqxG9IqJBSZuxvT1ItVgGS8fMzkA2OLdDV6y8mKHSuo,5096
643
645
  endoreg_db/utils/requirement_helpers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
644
646
  endoreg_db/utils/translation.py,sha256=77Xel12pAGo0rQ0NxB7nfejvMb0GBjEmhC3I7mcU91I,1256
@@ -672,7 +674,7 @@ endoreg_db/utils/requirement_operator_logic/lab_value_operators.py,sha256=tL3I0x
672
674
  endoreg_db/utils/requirement_operator_logic/model_evaluators.py,sha256=eu1n2wLm_vH-ebEOqIS2y6sZ9tV7b5wIeMQt2SG9QEQ,16655
673
675
  endoreg_db/utils/video/__init__.py,sha256=EOAcatQ8bI1f3LhkE2E3YOzmm0FHqulk0O-jjZBgZFg,823
674
676
  endoreg_db/utils/video/extract_frames.py,sha256=Pj9_pyfiwy-CFWiT4qysXn6VLCC-dQ1HpXOyyGqq0zE,3180
675
- endoreg_db/utils/video/ffmpeg_wrapper.py,sha256=AtoHW4KiTBR7vQhwCw0tH6sLxVks8yX067i3h90B4Dk,31396
677
+ endoreg_db/utils/video/ffmpeg_wrapper.py,sha256=7O4W9uFcO581N-4EFjkvLuQRC-mQlUEEy409agXL3Cw,33585
676
678
  endoreg_db/utils/video/names.py,sha256=m268j2Ynt94OYH6dYxeL8gzU5ODtFJD4OmzS7l0nBPU,1449
677
679
  endoreg_db/utils/video/streaming_processor.py,sha256=C-39DtxhSnL7B2cObFE5k829VLXl_Fl0KQFrFP368JA,13747
678
680
  endoreg_db/utils/video/video_splitter.py,sha256=EZEnhNjaUva_9VxjcjScgRSrxsEuifhBjlwIMLX1qaA,3698
@@ -681,7 +683,7 @@ endoreg_db/views/__init__.py,sha256=pjQ1k1mptb0cL7yeaLOavfu0y27GVtnTLcObrmrYG5M,
681
683
  endoreg_db/views/anonymization/__init__.py,sha256=s1_r9j0jPJsKHy1-isjFAlRF3Cw0o8EXxyUP7Xv1Kqo,698
682
684
  endoreg_db/views/anonymization/media_management.py,sha256=ObiXjPa-KsSGs3IfmABE-TVzQZ2U6yJioFh64T7TtKY,16799
683
685
  endoreg_db/views/anonymization/overview.py,sha256=fA4a4tZ4tbnWf3BUP6heAtqmHvinixUnDoI3dqPjTE0,8320
684
- endoreg_db/views/anonymization/validate.py,sha256=WkwQvSzVQ7GCt_6x1l56AdjmdnerhBjPaRBtKGUa9aw,3101
686
+ endoreg_db/views/anonymization/validate.py,sha256=KTHUgGL9uei_qYGkMPVm_Zdh1W5TNB2tpmnZ-YCzsA4,4743
685
687
  endoreg_db/views/auth/__init__.py,sha256=i9KZEEKCb2sn2A1Gg0trTIbWzQ1cPiAIN-o7sBUaMtQ,214
686
688
  endoreg_db/views/auth/keycloak.py,sha256=tgjQVfZwdyrbY437oXrOjs1j-2FYcTmUxG7obV_-GW8,4188
687
689
  endoreg_db/views/examination/__init__.py,sha256=IBtbzExQB6VYy43AMCG6Fxq2uF5htyHXpYZxiI9C28Q,1206
@@ -768,7 +770,7 @@ endoreg_db/views/requirement_lookup/lookup_store.py,sha256=47DEQpj8HBSa-_TImW-5J
768
770
  endoreg_db/views/stats/__init__.py,sha256=VHxrW0-RAWYki_89jWWJ0TrD7Nb0D3m-VjYV6bvP2k4,259
769
771
  endoreg_db/views/stats/stats_views.py,sha256=v9ue1BKXdcApOgyolgNiT3hazx1xSVVvo26r91IozWY,8656
770
772
  endoreg_db/views/video/__init__.py,sha256=jKPKJMmucfVZeTbh2Fy-ynMR2y9CkJv4Q-wmHJk19zE,1361
771
- endoreg_db/views/video/correction.py,sha256=mxlcoixc5FUt-Q0Yoo4acw64NBpQPV3cAwmQZcwVnJM,25034
773
+ endoreg_db/views/video/correction.py,sha256=0ZaWqi4Fb-xJ9571d4-P2aJwohdka6djdlS8GFEs8as,25144
772
774
  endoreg_db/views/video/reimport.py,sha256=gSDBQ_Bam2xpJIj1SIMoLKnoBDBRgQ9V_TZdK9OICrI,8959
773
775
  endoreg_db/views/video/segmentation.py,sha256=jzsLB95rYnHALSX2E_QNpAM9BpE1pbteOBxcAr_EjZo,11758
774
776
  endoreg_db/views/video/task_status.py,sha256=PXaesTS4R7Uhu9WBaTL4lscpOschVqyR32zVDUuSbfw,1770
@@ -784,7 +786,7 @@ endoreg_db/views/video/video_processing_history.py,sha256=mhFuS8RG5GV8E-lTtuD0qr
784
786
  endoreg_db/views/video/video_remove_frames.py,sha256=2FmvNrSPM0fUXiBxINN6vBUUDCqDlBkNcGR3WsLDgKo,1696
785
787
  endoreg_db/views/video/video_reprocess.py,sha256=IVlt_ASldNy5BywOecgkl1OT7l2SRijf78PUutMansA,1294
786
788
  endoreg_db/views/video/video_stream.py,sha256=kLyuf0ORTmsLeYUQkTQ6iRYqlIQozWhMMR3Lhfe_trk,12148
787
- endoreg_db-0.8.2.dist-info/METADATA,sha256=uIS855dQ9XV_sCFysBeh1ngDFJRhzC7YQAwN9ZWJpj8,14768
788
- endoreg_db-0.8.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
789
- endoreg_db-0.8.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
790
- endoreg_db-0.8.2.dist-info/RECORD,,
789
+ endoreg_db-0.8.2.2.dist-info/METADATA,sha256=Ymaw-cCyIyl7E2OufDwxcQP47MKMWJPNlgbXdCG5F-w,14772
790
+ endoreg_db-0.8.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
791
+ endoreg_db-0.8.2.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
792
+ endoreg_db-0.8.2.2.dist-info/RECORD,,