A self-hosted open source photo management service.
This report summarizes scanner evidence for LibrePhotos/librephotos, a Python project with 8,102 GitHub stars. SynthScan examined 280,432 lines of code across 1747 source files, recording 4911 pattern matches distributed across 21 syntactic categories. The legacy adjusted pattern signal is 21.4 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 4326 finding(s).
Are imports declared and package/API names verified? 187 finding(s).
Are wrappers, guards, and repeated structures necessary? 4551 finding(s).
Which changes need focused human review? 4911 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 4911 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/api-client/src/endpoints/index.ts | 129 | export async function fetchPhotosWithoutTimestamp( | CODE |
| LOW | packages/api-client/src/endpoints/index.ts | 626 | export async function removePhotosFromUserAlbum( | CODE |
| LOW | packages/api-client/src/hooks/index.ts | 99 | export function useRecentlyAddedPhotosQuery() { | CODE |
| LOW | packages/api-client/src/hooks/index.ts | 182 | export function usePhotosWithoutTimestampQuery(page: number) { | CODE |
| LOW | packages/api-client/src/hooks/index.ts | 224 | export function useWorkerAvailabilityQuery(options?: { refetchInterval?: number; enabled?: boolean }) { | CODE |
| LOW | packages/api-client/src/hooks/index.ts | 245 | export function useSharedPhotosWithMeQuery(enabled = true) { | CODE |
| LOW | packages/api-client/src/hooks/index.ts | 263 | export function useSharedAlbumsWithMeQuery(enabled = true) { | CODE |
| LOW | apps/frontend/src/api_client/stacks/hooks.ts | 150 | export function useRemoveFromStackMutation() { | CODE |
| LOW | apps/frontend/src/api_client/stacks/hooks.ts | 178 | export function useCreateManualStackMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 21 | export function useUpdatePhotoMetadataMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 42 | export function useRevertMetadataEditMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 59 | export function useRevertAllMetadataEditsMutation() { | CODE |
| LOW | …c/api_client/photos/hooks/usePhotoMetadataMutations.ts | 76 | export function useBulkUpdateMetadataMutation() { | CODE |
| LOW | …pi_client/photos/hooks/useFetchMetadataHistoryQuery.ts | 14 | export function useFetchMetadataHistoryQuery( | CODE |
| LOW | …/api_client/photos/hooks/useFetchPhotoMetadataQuery.ts | 14 | export function useFetchPhotoMetadataQuery( | CODE |
| LOW | …src/api_client/albums/hooks/useFetchDateAlbumsQuery.ts | 107 | export function buildDateAlbumFilterParams(photosetType: Photoset, mediaType?: MediaType): DateAlbumFilterParams { | CODE |
| LOW | apps/frontend/src/util/dateUtils.ts | 31 | export function photoTimestampToPickerDate(timestamp: string): Date | null { | CODE |
| LOW | apps/frontend/src/util/dateUtils.ts | 65 | export function pickerDateToPhotoTimestamp(date: Date): string | null { | CODE |
| LOW | apps/frontend/src/util/recentlyTaggedPeople.ts | 15 | export function getRecentlyTaggedPeopleIds(): RecentlyTaggedPersonId[] { | CODE |
| LOW | apps/frontend/src/util/recentlyTaggedPeople.ts | 27 | export function subscribeToRecentlyTaggedPeople(listener: () => void) { | CODE |
| LOW | apps/frontend/src/util/recentlyTaggedPeople.ts | 44 | export function recordRecentlyTaggedPerson(personId: string | number | null | undefined) { | CODE |
| LOW | apps/frontend/src/util/recentlyTaggedPeople.ts | 62 | export function resolveRecentlyTaggedPeople(ids: RecentlyTaggedPersonId[], people: People | undefined): People { | CODE |
| LOW | apps/frontend/src/util/util.ts | 49 | export function getPhotosFlatFromSingleGroup(group: DatePhotosGroup) { | CODE |
| LOW | apps/frontend/src/util/util.ts | 53 | export function getPhotosFlatFromGroupedByDate(photosGroupedByDate: DatePhotosGroup[]) { | CODE |
| LOW | apps/frontend/src/util/util.ts | 84 | export function addTempElementsToFlatList(photosCount: number) { | CODE |
| LOW | …ntend/src/components/settings/ConfigBurstDetection.tsx | 36 | function isSavedBurstDetectionRule(entry: unknown): entry is SavedBurstDetectionRule { | CODE |
| LOW | apps/frontend/src/components/spotlight/Spotlight.tsx | 59 | export function ConfirmDeleteMissingPhotosModal({ opened, onClose }: { opened: boolean; onClose: () => void }) { | CODE |
| LOW | apps/frontend/src/components/react-pig/index.tsx | 83 | // export function addTempElementsToFlatList(photosCount: number): ImageItem[] { | COMMENT |
| LOW | …ps/frontend/src/components/charts/FaceClusterGraph.tsx | 44 | function extractPhotoHashFromFaceUrl(faceUrl: string): string | null { | CODE |
| LOW | …d/src/components/charts/LocationDurationStackedBar.tsx | 12 | export function LocationDurationStackedBar() { | CODE |
| LOW | …/components/modals/ModalNextcloudScanDirectoryEdit.tsx | 17 | export function ModalNextcloudScanDirectoryEdit(props: Props) { | CODE |
| LOW | …nd/src/components/modals/ModalConfigBurstDetection.tsx | 47 | export function ModalConfigBurstDetection({ opened, onClose, availableRules, onAddRules }: Props) { | CODE |
| LOW | …ps/frontend/src/components/photolist/timelineFilter.ts | 122 | export function timelineFilterToBulkQuery(filter: TimelineFilter): BulkPhotoQuery { | CODE |
| LOW | apps/frontend/src/service/notifications/albums.ts | 54 | function deleteAutogeneratedAlbums() { | CODE |
| LOW | apps/frontend/src/service/notifications/photos.ts | 187 | function copyPhotoToClipboardFailed() { | CODE |
| LOW | apps/frontend/src/routes/__root.tsx | 9 | function AppShellPublicWithoutHeader() { | CODE |
| LOW | apps/backend/nextcloud/server_address.py | 46 | def private_addresses_allowed() -> bool: | CODE |
| LOW⚡ | apps/backend/nextcloud/tests.py | 70 | def test_backslash_before_userinfo_is_judged_by_the_dialed_host(self): | CODE |
| LOW⚡ | apps/backend/nextcloud/tests.py | 74 | def test_userinfo_does_not_hide_a_loopback_host(self): | CODE |
| LOW⚡ | apps/backend/nextcloud/tests.py | 78 | def test_addresses_the_parsers_disagree_on_are_refused(self): | CODE |
| LOW⚡ | apps/backend/nextcloud/tests.py | 86 | def test_ordinary_addresses_still_pass(self): | CODE |
| LOW | apps/backend/nextcloud/tests.py | 103 | def test_redirect_hops_get_the_same_check(self): | CODE |
| LOW | apps/backend/nextcloud/tests.py | 116 | def test_a_location_the_url_splitter_rejects_is_refused(self): | CODE |
| LOW | apps/backend/nextcloud/tests.py | 149 | def test_address_cannot_be_saved(self): | CODE |
| LOW | apps/backend/nextcloud/tests.py | 162 | def test_stored_address_is_not_contacted(self): | CODE |
| LOW | apps/backend/librephotos/standalone.py | 360 | def _take_children_down_with_us(): | CODE |
| LOW | apps/backend/api/batch_jobs.py | 23 | def photos_missing_clip_embeddings(user): | CODE |
| LOW | apps/backend/api/batch_jobs.py | 34 | def photos_with_existing_thumbnail(objs): | CODE |
| LOW⚡ | apps/backend/api/batch_jobs.py | 92 | def _rebuild_index_while_converting(user): | CODE |
| LOW⚡ | apps/backend/api/batch_jobs.py | 100 | def batch_calculate_clip_embedding(user, wait_for_tags=False): | CODE |
| LOW | apps/backend/api/batch_jobs.py | 173 | def queue_semantic_search_conversion(): | CODE |
| LOW | apps/backend/api/user_deletion.py | 121 | def _drop_others_photos_from_albums(user): | CODE |
| LOW | apps/backend/api/stack_detection.py | 134 | def _detect_bursts_hard_criteria(user, hard_rules, progress_callback=None): | CODE |
| LOW | apps/backend/api/stack_detection.py | 204 | def _detect_bursts_soft_criteria( | CODE |
| LOW | apps/backend/api/image_similarity.py | 103 | def build_image_similarity_index(user): | CODE |
| LOW | apps/backend/api/date_time_extractor.py | 66 | def _extract_no_tz_datetime_from_str(x, regexp=REGEXP_NO_TZ, group_mapping=None): | CODE |
| LOW | apps/backend/api/date_time_extractor.py | 255 | def _check_condition_filename(self, path): | CODE |
| LOW | apps/backend/api/perceptual_hash.py | 32 | def calculate_perceptual_hash(image_path: str, hash_size: int = 8) -> str | None: | CODE |
| LOW⚡ | apps/backend/api/perceptual_hash.py | 58 | def calculate_hash_from_thumbnail(thumbnail_path: str) -> str | None: | CODE |
| LOW | apps/backend/api/screenshot_detection.py | 50 | def _matches_screenshot_prefix(basename: str) -> bool: | CODE |
| 4085 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/backend/librephotos/settings/production.py | 587 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | apps/backend/librephotos/settings/production.py | 589 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | apps/backend/api/util.py | 211 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | apps/backend/api/util.py | 213 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ests/infra/test_drf_queryset_optimization_metaclass.py | 59 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ests/infra/test_drf_queryset_optimization_metaclass.py | 61 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ests/infra/test_drf_queryset_optimization_metaclass.py | 136 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ests/infra/test_drf_queryset_optimization_metaclass.py | 138 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 57 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 59 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 73 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 75 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 108 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 110 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 161 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …/tests/users_and_auth/test_user_management_commands.py | 163 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …/tests/users_and_auth/test_user_management_commands.py | 254 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | …/tests/users_and_auth/test_user_management_commands.py | 256 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 62 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 64 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 108 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 110 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 204 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 206 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 229 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …end/api/tests/search/test_batch_clip_embeddings_job.py | 232 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …i/tests/ml_services/test_ml_model_download_pipeline.py | 102 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …i/tests/ml_services/test_ml_model_download_pipeline.py | 104 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …i/tests/ml_services/test_ml_model_download_pipeline.py | 501 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …i/tests/ml_services/test_ml_model_download_pipeline.py | 503 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 92 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 94 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 127 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 129 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 202 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 204 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 367 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/photos/test_document_classification.py | 369 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ckend/api/tests/photos/test_document_classification.py | 67 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ckend/api/tests/photos/test_document_classification.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ckend/api/tests/photos/test_document_classification.py | 303 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …ckend/api/tests/photos/test_document_classification.py | 305 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …/photos/test_photo_file_variant_download_and_rotate.py | 44 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …/photos/test_photo_file_variant_download_and_rotate.py | 46 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …/photos/test_photo_file_variant_download_and_rotate.py | 222 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …/photos/test_photo_file_variant_download_and_rotate.py | 224 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 48 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 50 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 102 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 104 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 186 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 188 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 265 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 267 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 323 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 325 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 371 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …d/api/tests/albums/test_album_auto_title_generation.py | 373 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/metadata/test_exif_service_get_tags.py | 86 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | …ckend/api/tests/metadata/test_exif_service_get_tags.py | 88 | # ------------------------------------------------------------------ | COMMENT |
| 37 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/nextcloud/directory_watcher.py | 37 | except Exception: | CODE |
| LOW | apps/backend/nextcloud/directory_watcher.py | 156 | except Exception as e: | CODE |
| LOW | apps/backend/librephotos/standalone.py | 507 | except Exception as error: | CODE |
| LOW | apps/backend/librephotos/standalone.py | 667 | except Exception as error: | CODE |
| LOW | apps/backend/scripts/build_ocr_bundle.py | 305 | except Exception as exc: # pragma: no cover - network dependent | CODE |
| LOW | apps/backend/scripts/build_exiftool_wheel.py | 34 | except Exception as error: # noqa: BLE001 | STRING |
| LOW | apps/backend/api/mail.py | 29 | except Exception: | CODE |
| LOW⚡ | apps/backend/api/batch_jobs.py | 88 | except Exception: | CODE |
| LOW⚡ | apps/backend/api/batch_jobs.py | 95 | except Exception as e: | CODE |
| LOW | apps/backend/api/batch_jobs.py | 153 | except Exception as e: | CODE |
| LOW | apps/backend/api/batch_jobs.py | 164 | except Exception as e: | CODE |
| MEDIUM | apps/backend/api/batch_jobs.py | 92 | def _rebuild_index_while_converting(user): | CODE |
| LOW | apps/backend/api/stack_detection.py | 171 | except Exception as e: | CODE |
| LOW | apps/backend/api/stack_detection.py | 370 | except Exception as e: | CODE |
| LOW | apps/backend/api/duplicate_detection.py | 506 | except Exception as e: | CODE |
| LOW | apps/backend/api/services.py | 59 | except Exception: | CODE |
| LOW | apps/backend/api/services.py | 162 | except Exception as e: | CODE |
| LOW | apps/backend/api/services.py | 331 | except Exception as e: | CODE |
| LOW | apps/backend/api/image_decoding.py | 78 | except Exception: | CODE |
| LOW | apps/backend/api/image_decoding.py | 121 | except Exception: | CODE |
| LOW⚡ | apps/backend/api/perceptual_hash.py | 53 | except Exception as e: | CODE |
| LOW | apps/backend/api/perceptual_hash.py | 99 | except Exception as e: | CODE |
| LOW | apps/backend/api/screenshot_detection.py | 81 | except Exception: | CODE |
| LOW | apps/backend/api/all_tasks.py | 70 | except Exception: | CODE |
| LOW | apps/backend/api/all_tasks.py | 82 | except Exception: | CODE |
| LOW | apps/backend/api/all_tasks.py | 178 | except Exception as e: | CODE |
| LOW | apps/backend/api/all_tasks.py | 208 | except Exception as e: | CODE |
| MEDIUM | apps/backend/api/all_tasks.py | 123 | def _remove_partial_zip(path): | CODE |
| LOW | apps/backend/api/util.py | 69 | except Exception: | CODE |
| LOW | apps/backend/api/util.py | 144 | except Exception: | CODE |
| MEDIUM | apps/backend/api/util.py | 140 | def is_number(s): | CODE |
| LOW | apps/backend/api/apps.py | 53 | except Exception: | CODE |
| LOW | apps/backend/api/photo_faces.py | 59 | except Exception as e: | CODE |
| LOW | apps/backend/api/autoalbum.py | 47 | except Exception as e: | CODE |
| LOW | apps/backend/api/autoalbum.py | 213 | except Exception as e: | CODE |
| LOW | apps/backend/api/autoalbum.py | 273 | except Exception as e: | CODE |
| LOW | apps/backend/api/sync_signals.py | 214 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 402 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 438 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 491 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 551 | except Exception: | CODE |
| LOW | apps/backend/api/stats.py | 569 | except Exception: | CODE |
| MEDIUM | apps/backend/api/stats.py | 399 | def _location_texts(geolocation_json): | CODE |
| LOW | apps/backend/api/api_util.py | 26 | except Exception: | CODE |
| MEDIUM | apps/backend/api/api_util.py | 23 | def has_hidden_attribute(filepath): | CODE |
| LOW | apps/backend/api/thumbnails.py | 281 | except Exception as e: | CODE |
| LOW | apps/backend/api/thumbnails.py | 323 | except Exception as e: | CODE |
| LOW | apps/backend/api/thumbnails.py | 408 | except Exception as e: | CODE |
| LOW⚡ | apps/backend/api/thumbnails.py | 435 | except Exception as e: | CODE |
| MEDIUM | apps/backend/api/thumbnails.py | 262 | def create_thumbnail( | CODE |
| MEDIUM | apps/backend/api/thumbnails.py | 374 | def _remove_partial(output): | CODE |
| MEDIUM | apps/backend/api/thumbnails.py | 413 | def create_thumbnail_for_video(input_path, output_path, hash, file_type, transfe | CODE |
| LOW | apps/backend/api/ml_models.py | 455 | except Exception: | CODE |
| LOW | apps/backend/api/ml_models.py | 478 | except Exception as error: | CODE |
| LOW | apps/backend/api/ml_models.py | 494 | except Exception as error: | CODE |
| LOW | apps/backend/api/ml_models.py | 546 | except Exception: | CODE |
| LOW | apps/backend/api/face_extractor.py | 94 | except Exception: | CODE |
| LOW | apps/backend/api/social_graph.py | 132 | except Exception: | STRING |
| MEDIUM | apps/backend/api/social_graph.py | 99 | def build_social_graph(user): | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 84 | except Exception as e: | CODE |
| 133 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | apps/backend/librephotos/settings/production.py | 71 | # Create the directory before anything in this module writes to it. secret.key | COMMENT |
| MEDIUM | apps/backend/api/directory_watcher/file_handlers.py | 378 | # Create the File record (File.create handles race conditions via unique path constraint) | COMMENT |
| MEDIUM | apps/backend/api/tests/utils.py | 176 | # Create the photo with remaining kwargs | COMMENT |
| MEDIUM⚡ | …/backend/api/tests/stacks/test_live_photo_detection.py | 299 | # Create a regular JPEG without embedded video | COMMENT |
| MEDIUM | …/backend/api/tests/stacks/test_live_photo_detection.py | 272 | # Create a fake motion photo file | COMMENT |
| MEDIUM | …/backend/api/tests/stacks/test_live_photo_detection.py | 431 | # Create a mock photo with existing stack | COMMENT |
| MEDIUM | …/backend/api/tests/stacks/test_live_photo_detection.py | 453 | # Create a test file | COMMENT |
| MEDIUM | …/backend/api/tests/stacks/test_live_photo_detection.py | 464 | # Create a test photo with required fields | COMMENT |
| MEDIUM | …/backend/api/tests/stacks/test_live_photo_detection.py | 483 | # Create a real video file to avoid foreign key issues | COMMENT |
| MEDIUM | …/backend/api/tests/stacks/test_live_photo_detection.py | 517 | # Create a real video file | COMMENT |
| MEDIUM | …s/backend/api/tests/stacks/test_stack_model_and_api.py | 200 | # Create a test stack | COMMENT |
| MEDIUM | …ackend/api/tests/scanning/test_file_path_uniqueness.py | 88 | # Create a temp directory for test files | COMMENT |
| MEDIUM | …api/tests/scanning/test_generate_tags_caption_query.py | 14 | # Create a photo without openclip_vitb32 captions | COMMENT |
| MEDIUM | …api/tests/scanning/test_generate_tags_caption_query.py | 43 | # Create a photo with openclip_vitb32 captions | COMMENT |
| MEDIUM | …end/api/tests/scanning/test_scan_progress_reporting.py | 150 | # Create a temporary empty directory for testing | COMMENT |
| MEDIUM | …pi/tests/search/test_search_term_example_generation.py | 127 | # Create a photo with captions and geolocation | COMMENT |
| MEDIUM | …pi/tests/search/test_search_term_example_generation.py | 159 | # Create a photo without captions | COMMENT |
| MEDIUM | …pi/tests/search/test_search_term_example_generation.py | 191 | # Create a photo with captions and geolocation | COMMENT |
| MEDIUM⚡ | …/backend/api/tests/photos/test_photo_related_models.py | 289 | # Create a photo with search data | COMMENT |
| MEDIUM⚡ | …/backend/api/tests/photos/test_photo_related_models.py | 310 | # Create a photo with search data | COMMENT |
| MEDIUM⚡ | …/backend/api/tests/photos/test_photo_related_models.py | 317 | # Create an album date and add the photo to it | COMMENT |
| MEDIUM⚡ | …pi/tests/photos/test_photo_delete_and_trash_cleanup.py | 533 | # Create a temp file to simulate a real file | COMMENT |
| MEDIUM⚡ | …pi/tests/photos/test_photo_delete_and_trash_cleanup.py | 539 | # Create a file that's only used by one photo | COMMENT |
| MEDIUM | …pi/tests/photos/test_photo_delete_and_trash_cleanup.py | 486 | # Create a shared file | COMMENT |
| MEDIUM | apps/backend/api/tests/photos/test_thumbnail_naming.py | 24 | # Create a photo with thumbnail | COMMENT |
| MEDIUM | apps/backend/api/tests/photos/test_thumbnail_naming.py | 53 | # Create a photo | COMMENT |
| MEDIUM | …s/backend/api/tests/photos/test_api_input_hardening.py | 42 | # Create a duplicate | COMMENT |
| MEDIUM | …nd_public/test_duplicates_and_stacks_user_isolation.py | 231 | # Create a stack for user1 | COMMENT |
| MEDIUM | apps/backend/api/tests/metadata/test_photo_metadata.py | 494 | # Create an edit | COMMENT |
| MEDIUM | …d/api/tests/duplicates/test_duplicate_model_and_api.py | 477 | # Create a duplicate and manually remove all but one photo | COMMENT |
| MEDIUM⚡ | …s/backend/api/tests/duplicates/test_perceptual_hash.py | 393 | # Create a horizontal gradient pattern | COMMENT |
| MEDIUM⚡ | …s/backend/api/tests/duplicates/test_perceptual_hash.py | 400 | # Create a vertical gradient pattern (different structure) | COMMENT |
| MEDIUM⚡ | …s/backend/api/tests/duplicates/test_perceptual_hash.py | 552 | # Create a large list of hashes | COMMENT |
| MEDIUM⚡ | …s/backend/api/tests/duplicates/test_perceptual_hash.py | 566 | # Create a CMYK image | COMMENT |
| MEDIUM | …nd/api/tests/duplicates/test_duplicate_list_filters.py | 272 | # Create a pending duplicate first | COMMENT |
| MEDIUM⚡ | …sts/duplicates/test_duplicate_and_stack_redetection.py | 500 | # Create a photo (create_test_photo adds its own file) | COMMENT |
| MEDIUM⚡ | …sts/duplicates/test_duplicate_and_stack_redetection.py | 509 | # Create a JPEG file | COMMENT |
| MEDIUM | …sts/duplicates/test_duplicate_and_stack_redetection.py | 276 | # Create a duplicate | COMMENT |
| MEDIUM | …sts/duplicates/test_duplicate_and_stack_redetection.py | 306 | # Create a manual stack | COMMENT |
| MEDIUM | …sts/duplicates/test_duplicate_and_stack_redetection.py | 330 | # Create a duplicate group | COMMENT |
| MEDIUM | …sts/duplicates/test_duplicate_and_stack_redetection.py | 363 | # Create a pending duplicate | COMMENT |
| MEDIUM⚡ | …nd/api/tests/stats/test_stats_endpoints_and_helpers.py | 292 | # Create a valid stack | COMMENT |
| MEDIUM⚡ | …nd/api/tests/stats/test_stats_endpoints_and_helpers.py | 300 | # Create an old duplicate-type stack (should be excluded) | COMMENT |
| MEDIUM⚡ | …/backend/api/tests/faces/test_social_graph_building.py | 24 | # Create a photo | COMMENT |
| MEDIUM⚡ | …/backend/api/tests/faces/test_social_graph_building.py | 31 | # Create a person | COMMENT |
| MEDIUM⚡ | …/backend/api/tests/faces/test_social_graph_building.py | 34 | # Create a face | COMMENT |
| MEDIUM | …/backend/api/tests/faces/test_social_graph_building.py | 51 | # Create a photo | COMMENT |
| MEDIUM | apps/backend/api/serializers/album_date.py | 112 | # This method is removed as we're directly including paginated photos in the response. | COMMENT |
| MEDIUM | apps/backend/api/views/photo_metadata.py | 169 | # Create a new edit record for the revert | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/backend/librephotos/standalone.py | 354 | except requests.RequestException: | CODE |
| HIGH | apps/backend/librephotos/asgi.py | 64 | except ClientDisconnected: | CODE |
| HIGH | apps/backend/scripts/build_standalone.py | 276 | except OSError: | CODE |
| HIGH | apps/backend/api/services.py | 314 | except psutil.NoSuchProcess: | CODE |
| HIGH | apps/backend/api/services.py | 328 | except psutil.NoSuchProcess: | CODE |
| HIGH | apps/backend/api/image_decoding.py | 116 | except pyvips.Error: | CODE |
| HIGH | apps/backend/api/all_tasks.py | 70 | except Exception: | CODE |
| HIGH | apps/backend/api/all_tasks.py | 126 | except FileNotFoundError: | CODE |
| HIGH | apps/backend/api/burst_detection_rules.py | 230 | except (ValueError, TypeError): | CODE |
| HIGH | apps/backend/api/drf_optimize.py | 111 | except ProgrammingError: | CODE |
| HIGH | apps/backend/api/sidecars.py | 160 | except ValueError: | CODE |
| HIGH | apps/backend/api/thumbnails.py | 377 | except FileNotFoundError: | CODE |
| HIGH | apps/backend/api/transcode_cache.py | 108 | except OSError: | CODE |
| HIGH | apps/backend/api/transcode_cache.py | 335 | except OSError: | CODE |
| HIGH | apps/backend/api/face_recognition.py | 72 | except ValueError: | CODE |
| HIGH | apps/backend/api/tests/infra/test_sidecar_client.py | 38 | except OSError: | CODE |
| HIGH | …nd/api/tests/stacks/test_stack_detection_edge_cases.py | 584 | except (TypeError, AttributeError): | CODE |
| HIGH | …nd/api/tests/stacks/test_stack_detection_edge_cases.py | 604 | except (KeyError, AttributeError): | CODE |
| HIGH | …ts/scanning/test_issue_169_dangling_symlink_skipped.py | 54 | except (OSError, NotImplementedError): | CODE |
| HIGH | …ts/scanning/test_issue_124_symlinked_scan_directory.py | 83 | except (OSError, NotImplementedError): | CODE |
| HIGH | …sts/jobs/test_issue_1066_nextcloud_scan_job_failure.py | 70 | except Exception: | CODE |
| HIGH | apps/backend/api/models/photo_search.py | 87 | except Exception: | CODE |
| HIGH | apps/backend/api/views/upload.py | 48 | except (TypeError, ValueError): | CODE |
| HIGH | apps/backend/api/views/server_info.py | 96 | except Exception: | CODE |
| HIGH | apps/backend/api/views/jobs.py | 80 | except Exception: | CODE |
| HIGH | apps/backend/api/views/public_albums.py | 110 | except Exception: | CODE |
| HIGH | apps/backend/api/views/photos.py | 58 | except (ValueError, AttributeError): | CODE |
| HIGH | apps/backend/service/_common.py | 165 | except (OSError, AttributeError): | CODE |
| HIGH | apps/backend/image_similarity/retrieval_index.py | 119 | except FileNotFoundError: | CODE |
| HIGH | apps/backend/image_similarity/retrieval_index.py | 79 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/docker/unified/entrypoint.sh | 91 | email = os.environ.get('ADMIN_EMAIL', 'admin@example.com') | CODE |
| LOW | apps/frontend/src/locales/sk/translation.json | 22 | "placeholder": "Minimálne hodnotenie" | CODE |
| LOW | apps/frontend/src/locales/sk/translation.json | 116 | "placeholder": "Výsledky sémantického vyhľadávania", | CODE |
| LOW | apps/frontend/src/locales/sk/translation.json | 182 | "placeholder": "Názov albumu", | CODE |
| LOW | apps/frontend/src/locales/pl/translation.json | 101 | "placeholder": "Wyniki wyszukiwania semantycznego", | CODE |
| LOW | apps/frontend/src/locales/pl/translation.json | 111 | "placeholder": "Minimalna ocena" | CODE |
| LOW | apps/frontend/src/locales/pl/translation.json | 421 | "placeholder": "Tytuł albumu", | CODE |
| LOW | apps/frontend/src/locales/sv/translation.json | 101 | "placeholder": "Lägsta betyg" | CODE |
| LOW | apps/frontend/src/locales/sv/translation.json | 115 | "placeholder": "Semantiska sökresultat", | CODE |
| LOW | apps/frontend/src/locales/sv/translation.json | 203 | "placeholder": "Albumtitel" | CODE |
| LOW | apps/frontend/src/locales/da/translation.json | 131 | "placeholder": "Semantisk søgning resultater", | CODE |
| LOW | apps/frontend/src/locales/da/translation.json | 141 | "placeholder": "Minimum vurdering" | CODE |
| LOW | apps/frontend/src/locales/pt_BR/translation.json | 78 | "placeholder": "Máximo de resultados de pesquisa semântica", | CODE |
| LOW | apps/frontend/src/locales/pt_BR/translation.json | 95 | "placeholder": "Classificação mínima" | CODE |
| LOW | apps/frontend/src/locales/pt_BR/translation.json | 272 | "placeholder": "Título do álbum", | CODE |
| LOW | apps/frontend/src/locales/ja/translation.json | 76 | "placeholder": "セマンティック検索結果", | CODE |
| LOW | apps/frontend/src/locales/ja/translation.json | 85 | "placeholder": "最小レート" | CODE |
| LOW | apps/frontend/src/locales/it/translation.json | 84 | "placeholder": "Minimo voto" | CODE |
| LOW | apps/frontend/src/locales/it/translation.json | 148 | "placeholder": "Risultati ricerca semantica", | CODE |
| LOW | apps/frontend/src/locales/it/translation.json | 340 | "placeholder": "Titolo album" | CODE |
| LOW | apps/frontend/src/locales/nb_NO/translation.json | 82 | "placeholder": "Semantiske søkeresultater", | CODE |
| LOW | apps/frontend/src/locales/nb_NO/translation.json | 100 | "placeholder": "Minimumsvurdering" | CODE |
| LOW | apps/frontend/src/locales/nb_NO/translation.json | 619 | "placeholder": "Albumsnavn", | CODE |
| LOW | apps/frontend/src/locales/cs/translation.json | 100 | "placeholder": "Výsledky sémantického vyhledávání", | CODE |
| LOW | apps/frontend/src/locales/cs/translation.json | 109 | "placeholder": "Minimální hodnocení" | CODE |
| LOW | apps/frontend/src/locales/cs/translation.json | 170 | "placeholder": "Název alba", | CODE |
| LOW | apps/frontend/src/locales/zh_Hans/translation.json | 85 | "placeholder": "语义化搜索结果", | CODE |
| LOW | apps/frontend/src/locales/zh_Hans/translation.json | 95 | "placeholder": "最低等级" | CODE |
| LOW | apps/frontend/src/locales/zh_Hans/translation.json | 646 | "placeholder": "相册标题", | CODE |
| LOW | apps/frontend/src/locales/ru/translation.json | 106 | "placeholder": "Результаты семантического поиска", | CODE |
| LOW | apps/frontend/src/locales/ru/translation.json | 116 | "placeholder": "Минимальный рейтинг" | CODE |
| LOW | apps/frontend/src/locales/ru/translation.json | 206 | "placeholder": "Название альбома", | CODE |
| LOW | apps/frontend/src/locales/zh_Hant/translation.json | 98 | "placeholder": "最低評級" | CODE |
| LOW | apps/frontend/src/locales/zh_Hant/translation.json | 163 | "placeholder": "相冊名稱" | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 47 | "placeholder": "Resultados da pesquisa semântica", | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 105 | "placeholder": "Classificação mínima" | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 323 | "placeholder": "Título do álbum", | CODE |
| LOW | apps/frontend/src/locales/pt/translation.json | 944 | "placeholder": "Procurar fotos, correr comandos...", | CODE |
| LOW | apps/frontend/src/locales/uk/translation.json | 108 | "placeholder": "Результати семантичного пошуку" | CODE |
| LOW | apps/frontend/src/locales/uk/translation.json | 140 | "placeholder": "Мінімальний рейтинг" | CODE |
| LOW | apps/frontend/src/locales/uk/translation.json | 234 | "placeholder": "Назва альбому", | CODE |
| LOW | apps/frontend/src/locales/nl/translation.json | 106 | "placeholder": "Semantische zoekresultaten", | CODE |
| LOW | apps/frontend/src/locales/nl/translation.json | 118 | "placeholder": "Minimale waardering" | CODE |
| LOW | apps/frontend/src/locales/nl/translation.json | 651 | "placeholder": "Albumnaam", | CODE |
| LOW | apps/frontend/src/locales/hi/translation.json | 145 | "placeholder": "सिमेंटिक खोज परिणाम" | CODE |
| LOW | apps/frontend/src/locales/hi/translation.json | 151 | "placeholder": "न्यूनतम रेटिंग" | CODE |
| LOW | apps/frontend/src/locales/hi/translation.json | 454 | "placeholder": "एल्बम का शीर्षक", | CODE |
| LOW | apps/frontend/src/locales/de/translation.json | 93 | "placeholder": "Anzahl der Resultate", | CODE |
| LOW | apps/frontend/src/locales/de/translation.json | 103 | "placeholder": "Minimale Bewertung" | CODE |
| LOW | apps/frontend/src/locales/de/translation.json | 661 | "placeholder": "Albumtitel", | CODE |
| LOW | apps/frontend/src/locales/ko/translation.json | 142 | "placeholder": "시맨틱(의미 기반) 검색 결과", | CODE |
| LOW | apps/frontend/src/locales/ko/translation.json | 152 | "placeholder": "최소 평점" | CODE |
| LOW | apps/frontend/src/locales/ko/translation.json | 239 | "placeholder": "앨범 제목", | CODE |
| LOW | apps/frontend/src/locales/fi/translation.json | 97 | "placeholder": "Semanttiset hakutulokset" | CODE |
| LOW | apps/frontend/src/locales/fi/translation.json | 114 | "placeholder": "Vähimmäisarvosana" | CODE |
| LOW | apps/frontend/src/locales/fi/translation.json | 163 | "placeholder": "Albumin otsikko", | CODE |
| LOW | apps/frontend/src/locales/eo/translation.json | 183 | "placeholder": "Titolo de albumo", | CODE |
| LOW | apps/frontend/src/locales/fr/translation.json | 93 | "placeholder": "Résultat recherche sémantique", | CODE |
| LOW | apps/frontend/src/locales/fr/translation.json | 103 | "placeholder": "Note minimale" | CODE |
| LOW | apps/frontend/src/locales/fr/translation.json | 632 | "placeholder": "Titre de l'album", | CODE |
| 36 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | apps/backend/api/photo_faces.py | 76 | api.models.face.Face.objects.filter(photo=photo).values_list( | CODE |
| CRITICAL | apps/backend/api/photo_faces.py | 129 | for existing_face in api.models.face.Face.objects.filter(photo=photo): | CODE |
| CRITICAL | …ests/photos/test_thumbnail_creation_and_orientation.py | 258 | self.pyvips.Image.thumbnail.return_value.write_to_file.assert_called_once_with( | CODE |
| CRITICAL⚡ | apps/backend/api/models/photo_caption.py | 195 | return api.models.album_thing.AlbumThing.objects.filter( | CODE |
| CRITICAL | apps/backend/api/serializers/person.py | 3 | from django.core.exceptions import ValidationError as DjangoValidationError | CODE |
| CRITICAL | apps/backend/api/views/password_reset.py | 6 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | apps/backend/api/views/public_albums.py | 1 | from django.core.exceptions import ValidationError | CODE |
| CRITICAL | apps/backend/api/geocode/photo_location.py | 33 | return api.models.album_place.AlbumPlace.objects.filter(Q(photos__in=[photo])).all() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/nextcloud/directory_watcher.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/nextcloud/views.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/mail.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/batch_jobs.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/stack_detection.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/image_similarity.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/duplicate_detection.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/services.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/date_time_extractor.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/perceptual_hash.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/all_tasks.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/util.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/photo_files.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/apps.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/photo_faces.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/autoalbum.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/video_color.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/stats.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/burst_detection_rules.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/ffmpeg_budget.py | 44 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/face_classify.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/api_util.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/thumbnails.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/transcode_cache.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/cluster_manager.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/filters.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/ml_models.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/face_extractor.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/social_graph.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/stacks/__init__.py | 22 | __all__ = [ | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 52 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/directory_watcher/processing_jobs.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/directory_watcher/__init__.py | 70 | __all__ = [ | CODE |
| LOW | apps/backend/api/directory_watcher/utils.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/directory_watcher/file_handlers.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/directory_watcher/repair_jobs.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | …/api/tests/users_and_auth/test_user_api_permissions.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | …nd/api/tests/photos/test_bulk_select_all_operations.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | …tests/sharing_and_public/test_authorization_scoping.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | …ests/sharing_and_public/test_photo_sharing_endpoint.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | …sts/sharing_and_public/test_photo_public_visibility.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | …d/api/management/commands/start_job_cleanup_service.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | …kend/api/management/commands/start_cleaning_service.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/photo_search.py | 5 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/thumbnail.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/__init__.py | 27 | __all__ = [ | CODE |
| LOW | apps/backend/api/models/file.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/cluster.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/photo_caption.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/album_auto.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/models/photo_metadata.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/serializers/user.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/serializers/person.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/serializers/album_user.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/serializers/photos.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/views/sharing.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/views/duplicates.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/views/user.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | apps/backend/api/views/media.py | 28 | logger = logging.getLogger(__name__) | CODE |
| 18 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/librephotos/settings/standalone.py | 12 | CODE | |
| LOW | apps/backend/librephotos/settings/production_noproxy.py | 27 | CODE | |
| LOW | apps/backend/librephotos/settings/development.py | 1 | CODE | |
| LOW | apps/backend/librephotos/settings/test.py | 5 | CODE | |
| LOW | apps/backend/librephotos/settings/dev_windows.py | 6 | CODE | |
| LOW | apps/backend/librephotos/settings/test_sqlite.py | 8 | CODE | |
| LOW | apps/backend/scripts/calibrate_openclip.py | 34 | CODE | |
| LOW | apps/backend/scripts/build_ocr_bundle.py | 38 | CODE | |
| LOW | apps/backend/scripts/build_openclip_onnx.py | 42 | CODE | |
| LOW | apps/backend/api/image_decoding.py | 10 | CODE | |
| LOW | apps/backend/api/face_classify.py | 1 | CODE | |
| LOW | apps/backend/api/thumbnails.py | 1 | CODE | |
| LOW | apps/backend/api/cluster_manager.py | 1 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/__init__.py | 14 | CODE | |
| LOW | apps/backend/api/stacks/live_photo.py | 29 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 16 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 23 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 23 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 23 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 23 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 23 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 32 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 32 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 32 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 32 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 32 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 32 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 42 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 54 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 59 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 59 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 59 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 59 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 59 | CODE | |
| LOW | apps/backend/api/directory_watcher/__init__.py | 68 | CODE | |
| LOW | …backend/api/tests/search/test_retrieval_index_build.py | 58 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 1 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 2 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 3 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 4 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 5 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 6 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 7 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 8 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 9 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 10 | CODE | |
| LOW | apps/backend/api/models/__init__.py | 11 | CODE | |
| 17 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/nextcloud/directory_watcher.py | 105 | CODE | |
| LOW | apps/backend/api/stack_detection.py | 204 | CODE | |
| LOW | apps/backend/api/date_time_extractor.py | 294 | CODE | |
| LOW | apps/backend/api/thumbnail_metadata.py | 155 | CODE | |
| LOW | apps/backend/api/autoalbum.py | 54 | CODE | |
| LOW | apps/backend/api/sync_signals.py | 142 | CODE | |
| LOW | apps/backend/api/sync_signals.py | 177 | CODE | |
| LOW | apps/backend/api/sync_signals.py | 143 | CODE | |
| LOW | apps/backend/api/admin.py | 30 | CODE | |
| LOW | apps/backend/api/stats.py | 475 | CODE | |
| LOW | apps/backend/api/burst_detection_rules.py | 235 | CODE | |
| LOW | apps/backend/api/ml_models.py | 263 | CODE | |
| LOW | apps/backend/api/stacks/live_photo.py | 89 | CODE | |
| LOW | apps/backend/api/stacks/live_photo.py | 314 | CODE | |
| LOW | apps/backend/api/directory_watcher/processing_jobs.py | 504 | CODE | |
| LOW | apps/backend/api/directory_watcher/processing_jobs.py | 644 | CODE | |
| LOW | apps/backend/api/directory_watcher/utils.py | 116 | CODE | |
| LOW | apps/backend/api/directory_watcher/repair_jobs.py | 46 | CODE | |
| LOW | apps/backend/api/tests/utils.py | 231 | CODE | |
| LOW | …/backend/api/tests/infra/test_logging_configuration.py | 330 | CODE | |
| LOW | …nd/api/tests/infra/test_requirements_windows_wheels.py | 24 | CODE | |
| LOW | apps/backend/api/tests/infra/test_sidecar_urls.py | 23 | CODE | |
| LOW | apps/backend/api/tests/infra/test_sidecar_urls.py | 47 | CODE | |
| LOW | apps/backend/api/tests/infra/test_sidecar_urls.py | 61 | CODE | |
| LOW | …sts/media_serving/test_thumbnail_serving_addressing.py | 84 | CODE | |
| LOW | …sts/media_serving/test_thumbnail_serving_addressing.py | 102 | CODE | |
| LOW | …sts/media_serving/test_thumbnail_serving_addressing.py | 164 | CODE | |
| LOW | …sts/media_serving/test_thumbnail_serving_addressing.py | 186 | CODE | |
| LOW | …l_services/test_ml_model_requirements_and_downloads.py | 292 | CODE | |
| LOW | …l_services/test_ml_model_requirements_and_downloads.py | 492 | CODE | |
| LOW | …i/tests/ml_services/test_ml_model_download_pipeline.py | 140 | CODE | |
| LOW | …i/tests/ml_services/test_ml_model_download_pipeline.py | 269 | CODE | |
| LOW | …i/tests/ml_services/test_ml_model_download_pipeline.py | 434 | CODE | |
| LOW | …i/tests/ml_services/test_ml_model_download_pipeline.py | 448 | CODE | |
| LOW | …i/tests/ml_services/test_ml_model_download_pipeline.py | 636 | CODE | |
| LOW | …i/tests/sharing_and_public/test_cross_tenant_writes.py | 510 | CODE | |
| LOW | …/api/tests/metadata/test_xmp_description_extraction.py | 53 | CODE | |
| LOW | …end/api/tests/metadata/test_iptc_keyword_extraction.py | 53 | CODE | |
| LOW | …s/backend/api/tests/duplicates/test_perceptual_hash.py | 580 | CODE | |
| LOW | …/backend/api/tests/faces/test_face_region_writeback.py | 94 | CODE | |
| LOW | apps/backend/api/models/photo_stack.py | 124 | CODE | |
| LOW | apps/backend/api/views/jobs.py | 51 | CODE | |
| LOW | apps/backend/api/views/exception_handler.py | 7 | CODE | |
| LOW | apps/backend/api/metadata/face_regions.py | 23 | CODE | |
| LOW | apps/backend/api/metadata/writer.py | 13 | CODE | |
| LOW | apps/backend/service/exif/main.py | 89 | CODE | |
| LOW | apps/backend/service/image_captioning/lfm2_vl.py | 195 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/CONTRIBUTING.md | 26 | ### Step 1: Clone the Monorepo | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 50 | ### Step 2: Configure Environment | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 72 | ### Step 3: Start the Development Environment | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 314 | ### Step 1: Fork the Repository | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 326 | ### Step 2: Create a Feature Branch | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 336 | ### Step 3: Make Your Changes | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 354 | ### Step 4: Push and Create Pull Request | COMMENT |
| LOW | apps/backend/CONTRIBUTING.md | 369 | ### Step 5: Respond to Review | COMMENT |
| LOW⚡ | …/backend/api/tests/faces/test_face_region_writeback.py | 230 | # Step 1: Convert pixel -> normalized (writeback path) | COMMENT |
| LOW⚡ | …/backend/api/tests/faces/test_face_region_writeback.py | 240 | # Step 2: Simulate read-back (face_extractor.py lines 82-90) | COMMENT |
| LOW | apps/docs/docs/user-guide/first-steps.md | 11 | ### Step 1: Create Your Admin Account | COMMENT |
| LOW | apps/docs/docs/user-guide/first-steps.md | 24 | ### Step 2: Site Settings | COMMENT |
| LOW | apps/docs/docs/user-guide/first-steps.md | 33 | ### Step 3: Configure Your Scan Directory | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 9 | ### Step 1: Download the Models Manually | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 31 | ### Step 2: Place the Models in the Correct Location | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 45 | ### Step 3: Verify Model Placement | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 70 | ### Step 4: Turn Off the Online Map Services | COMMENT |
| LOW | apps/docs/docs/user-guide/offline-setup.md | 77 | ### Step 5: Run LibrePhotos | COMMENT |
| LOW⚡ | apps/docs/docs/user-guide/places.md | 66 | ### Step 1: Configure Map Providers (Optional) | COMMENT |
| LOW⚡ | apps/docs/docs/user-guide/places.md | 74 | ### Step 2: Scan Your Photos | COMMENT |
| LOW⚡ | apps/docs/docs/user-guide/places.md | 82 | ### Step 3: View Your Places | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 27 | ### Step 1: Clone the Monorepo | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 51 | ### Step 2: Configure Environment | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 70 | ### Step 3: Start Development Environment | COMMENT |
| LOW | apps/docs/docs/development/dev-install.md | 82 | ### Step 4: Access LibrePhotos | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …backend/api/tests/infra/test_constance_admin_config.py | 47 | undefined, | CODE |
| HIGH | …s/scanning/test_issue_1030_nextcloud_listdir_errors.py | 31 | ``disabled={isNextcloudError || isNextcloudFetching || !nextcloud_server_address}``, | STRING |
| HIGH⚡ | …api/tests/search/test_search_list_media_type_filter.py | 74 | # Not null, as album details send: installed mobile apps parse this | COMMENT |
| HIGH | …ring_and_public/test_public_photo_detail_dimensions.py | 4 | sent as null, which the public client's schema rejects, so a visitor lost the | STRING |
| HIGH | apps/backend/api/views/sync.py | 10 | "next_cursor": "<b64>" | null, # null => caught up (stop looping) | STRING |
| HIGH | apps/backend/api/views/search.py | 19 | # null, but the web and mobile search schemas require a string here, and null | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/docker/unified/entrypoint.sh | 1 | #!/bin/bash | COMMENT |
| LOW | deploy/docker/backend-gpu/entrypoint.sh | 21 | # every font on each start. Keep it on our own volume instead; this is the same | COMMENT |
| LOW | deploy/k8s/ingress.yaml | 41 | # spec: | COMMENT |
| LOW | deploy/compose/docker-compose.e2e.yml | 1 | # End-to-end stack for the Playwright suite in apps/frontend/e2e. | COMMENT |
| LOW | apps/frontend/tsc-baseline.txt | 1 | # TypeScript error baseline for `yarn typecheck` (scripts/typecheck-ratchet.mjs). | COMMENT |
| LOW | apps/frontend/src/api_client/user/types.ts | 1 | import type { ManageUser, User } from "@librephotos/api-client"; | COMMENT |
| LOW | apps/frontend/src/util/maplibreWorker.ts | 1 | import { setWorkerUrl } from "maplibre-gl"; | COMMENT |
| LOW | apps/frontend/src/components/react-pig/index.tsx | 81 | // } | COMMENT |
| LOW | apps/frontend/src/components/react-pig/utils/getUrl.ts | 1 | // This is the default getUrl function, which you can overwrite using a prop; | COMMENT |
| LOW | apps/frontend/src/components/lightbox/MediaDisplay.tsx | 121 | COMMENT | |
| LOW | apps/backend/requirements.txt | 101 | # pyclipper: polygon offsetting for the PP-OCRv6 detector's DBPostProcess | COMMENT |
| LOW | apps/backend/pyproject.toml | 1 | [tool.ruff] | COMMENT |
| LOW | apps/backend/librephotos/settings/test.py | 1 | import tempfile | COMMENT |
| LOW | apps/backend/librephotos/settings/production.py | 21 | COMMENT | |
| LOW | apps/backend/librephotos/settings/production.py | 41 | # Set the size to 0 to switch caching off and keep only the live streaming. | COMMENT |
| LOW | apps/backend/librephotos/settings/production.py | 581 | ) | COMMENT |
| LOW | apps/backend/librephotos/settings/production.py | 621 | # would bypass the throttling and address-enumeration protections on | COMMENT |
| LOW | apps/backend/scripts/build_ocr_bundle.py | 401 | newline="\n", | COMMENT |
| LOW | apps/backend/api/autoalbum.py | 101 | job_id, | COMMENT |
| LOW | apps/backend/api/video_color.py | 41 | from api import ffmpeg_budget | COMMENT |
| LOW | apps/backend/api/video_color.py | 81 | COMMENT | |
| LOW | apps/backend/api/directory_watcher/scan_jobs.py | 421 | # | COMMENT |
| LOW | apps/backend/api/directory_watcher/file_handlers.py | 801 | COMMENT | |
| LOW | apps/backend/api/models/photo_stack.py | 41 | class StackType(models.TextChoices): | COMMENT |
| LOW | apps/backend/api/views/media.py | 81 | watching this one, so it should outrank the background work rather than | COMMENT |
| LOW | apps/backend/api/metadata/__init__.py | 1 | # api/metadata — organized metadata reading, writing, and tag constants. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deploy/docker/unified/entrypoint.sh | 36 | # Check if we should serve frontend | COMMENT |
| LOW | deploy/docker/unified/entrypoint.sh | 81 | # Check if we need to create a superuser | COMMENT |
| LOW | deploy/compose/build-unified.sh | 10 | # Check if we're in the right directory | COMMENT |
| LOW | apps/backend/api/photo_files.py | 53 | # Check if this file is used by other Photos (via files M2M or as main_file) | COMMENT |
| LOW | apps/backend/api/burst_detection_rules.py | 376 | # Check if same camera (if required) | COMMENT |
| LOW | apps/backend/api/face_classify.py | 287 | if len(encoding) == expected_shape: # Check if shape is consistent | CODE |
| LOW | apps/backend/api/stacks/live_photo.py | 272 | # Check if video is already a known photo/file | COMMENT |
| LOW | apps/backend/api/directory_watcher/file_handlers.py | 454 | # Check if a Photo already exists with any of these files. Matching on | COMMENT |
| LOW | …/api/tests/duplicates/test_duplicate_api_edge_cases.py | 409 | # Check if duplicate still exists (might be deleted due to Bug #12 fix) | COMMENT |
| LOW | apps/backend/api/models/file.py | 86 | # Check if a File with this path already exists | COMMENT |
| LOW | apps/backend/api/models/duplicate.py | 274 | # Check if any photo is already in a duplicate group of the same type | COMMENT |
| LOW | apps/backend/api/models/photo_stack.py | 216 | # Check if any photo is already in a stack of the same type | COMMENT |
| LOW | apps/backend/api/serializers/photos.py | 805 | # Check if this is the main file | COMMENT |
| LOW | apps/backend/api/views/stacks.py | 453 | # Check if any photo is already in a manual stack | COMMENT |
| LOW | apps/backend/image_similarity/retrieval_index.py | 173 | # Check if we have any embeddings to process | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | apps/backend/api/perceptual_hash.py | 50 | # More robust than average hash or difference hash | COMMENT |
| MEDIUM | apps/backend/api/screenshot_detection.py | 41 | """Lower-case and fold separators/apostrophes so prefix matching is robust | STRING |
| MEDIUM⚡ | …ps/backend/api/tests/search/test_photo_search_model.py | 183 | # Create comprehensive test data | COMMENT |
| MEDIUM | apps/backend/api/serializers/photos.py | 123 | # Use len() instead of .count() to leverage prefetched embedded_media | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/api/stats.py | 323 | CODE | |
| LOW | apps/backend/api/social_graph.py | 148 | CODE | |
| LOW | apps/backend/api/tests/utils.py | 55 | CODE | |
| LOW | …d/api/tests/scanning/test_scan_photos_orchestration.py | 82 | CODE | |
| LOW | apps/backend/api/serializers/person.py | 36 | CODE | |
| LOW | apps/backend/api/serializers/album_user.py | 80 | CODE | |
| LOW | apps/backend/api/serializers/album_thing.py | 33 | CODE | |
| LOW | apps/backend/api/serializers/album_place.py | 34 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/backend/api/models/user.py | 52 | "share_captions": False, # AI-generated or user captions | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | apps/backend/api/views/photo_filters.py | 16 | The user's own photos matching a select_all ``query`` payload. This is the write scope behind every server-side "Se | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …/backend/api/tests/faces/test_face_region_writeback.py | 230 | # Step 1: Convert pixel -> normalized (writeback path) | COMMENT |
| LOW⚡ | …/backend/api/tests/faces/test_face_region_writeback.py | 240 | # Step 2: Simulate read-back (face_extractor.py lines 82-90) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | …ests/infra/test_drf_queryset_optimization_metaclass.py | 319 | def helper(self): | CODE |
| LOW | apps/backend/api/tests/jobs/test_zip_photos_task.py | 113 | def run_task(self, photos, filename="download.zip", job=None): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | apps/backend/scripts/setup_test_env.sh | 5 | # Usage: | COMMENT |