media-optimization-engine 1.4.2__tar.gz → 1.4.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {media_optimization_engine-1.4.2/media_optimization_engine.egg-info → media_optimization_engine-1.4.3}/PKG-INFO +1 -1
- media_optimization_engine-1.4.3/media_engine/__init__.py +14 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/doctor.py +8 -1
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/backfill_registered_media.py +14 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_backfill_registered_media.py +6 -4
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3/media_optimization_engine.egg-info}/PKG-INFO +1 -1
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/pyproject.toml +1 -1
- media_optimization_engine-1.4.2/media_engine/__init__.py +0 -7
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/LICENSE +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/README.md +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/flutter/README.md +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/flutter/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/flutter/models.dart +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/flutter/standard_images.dart +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/marzipano/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/marzipano/manifest.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/pannellum/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/pannellum/manifest.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/threejs/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/adapters/threejs/manifest.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/admin.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/apps.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/auth.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/autoregister.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/control_plane.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/focal_detectors.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/health.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/image_ops.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/integration.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/locks.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/audit_media_engine.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/audit_panorama_media.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/backfill_panorama_media.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/backfill_responsive_images.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/cleanup_image_derivatives.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/media_engine_doctor.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/media_engine_node_report.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/rollback_media_engine_config.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/management/commands/sync_media_engine_hub.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/manifest.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/metrics.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/migrations/0001_initial.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/migrations/0002_panorama_multires.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/migrations/0003_panorama_cube_tiles.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/migrations/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/models.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/node.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/base.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/image/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/image/standard.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/panorama/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/panorama/cube_tiles.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/panorama/cubemap.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/panorama/detect.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/panorama/equirectangular.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/panorama/manifest.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/panorama/tiles.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/registry.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/profiles.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/queueing.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/registry.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/runtime_config.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/serializers.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/services.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/signals.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/spec/openapi.yaml +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/static/media_engine/adaptive-media.js +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/static/media_engine/media-cache-sw.js +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/storage_paths.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/system_views.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tasks.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/templatetags/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/templatetags/responsive_media.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/__init__.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_distributed_node.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_image_ops.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_panorama.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_paths.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_profiles.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_responsive_media.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_validators.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/urls.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/validators.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/views.py +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_optimization_engine.egg-info/SOURCES.txt +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_optimization_engine.egg-info/dependency_links.txt +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_optimization_engine.egg-info/entry_points.txt +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_optimization_engine.egg-info/requires.txt +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_optimization_engine.egg-info/top_level.txt +0 -0
- {media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: media-optimization-engine
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.3
|
|
4
4
|
Summary: Media Optimization Engineer for Django/Python: automatic model-field optimization, responsive picture/srcset rendering, AVIF/WebP derivatives, 360 media, autonomous nodes, and CDN-ready storage.
|
|
5
5
|
Author-email: Achille Kabasele <pepexykabasele@gmail.com>
|
|
6
6
|
Maintainer-email: Achille Kabasele <pepexykabasele@gmail.com>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
__version__ = version("media-optimization-engine")
|
|
5
|
+
except PackageNotFoundError:
|
|
6
|
+
__version__ = "0+unknown"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def register_model_image(*args, **kwargs):
|
|
10
|
+
from .registry import register_model_image as _register
|
|
11
|
+
return _register(*args, **kwargs)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
default_app_config = "media_engine.apps.MediaEngineConfig"
|
|
@@ -35,11 +35,18 @@ def _package_checks() -> list[Check]:
|
|
|
35
35
|
|
|
36
36
|
for module, label in [
|
|
37
37
|
("PIL", "Pillow"),
|
|
38
|
-
("PIL.AvifImagePlugin", "AVIF plugin"),
|
|
39
38
|
("rest_framework", "Django REST Framework"),
|
|
40
39
|
]:
|
|
41
40
|
found = importlib.util.find_spec(module) is not None
|
|
42
41
|
checks.append(Check(label, found, "installed" if found else "missing"))
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
import pillow_avif # noqa: F401
|
|
45
|
+
from PIL import Image
|
|
46
|
+
supported = "AVIF" in Image.registered_extensions().values() or ".avif" in Image.registered_extensions()
|
|
47
|
+
checks.append(Check("AVIF plugin", supported, "pillow-avif-plugin registered" if supported else "module imported but codec unavailable"))
|
|
48
|
+
except Exception as exc:
|
|
49
|
+
checks.append(Check("AVIF plugin", False, f"missing or unusable: {exc}"))
|
|
43
50
|
return checks
|
|
44
51
|
|
|
45
52
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from django.core.exceptions import ValidationError
|
|
2
2
|
from django.core.management.base import BaseCommand
|
|
3
|
+
from django.db import connection
|
|
3
4
|
from media_engine.integration import ingest_model_field
|
|
4
5
|
from media_engine.registry import entries
|
|
5
6
|
|
|
@@ -21,7 +22,20 @@ class Command(BaseCommand):
|
|
|
21
22
|
failed = 0
|
|
22
23
|
failures = []
|
|
23
24
|
|
|
25
|
+
available_tables = set(connection.introspection.table_names())
|
|
26
|
+
|
|
24
27
|
for entry in entries():
|
|
28
|
+
table_name = entry.model._meta.db_table
|
|
29
|
+
if table_name not in available_tables:
|
|
30
|
+
skipped += 1
|
|
31
|
+
self.stdout.write(
|
|
32
|
+
self.style.WARNING(
|
|
33
|
+
f'SKIP {entry.model._meta.label}.{entry.field_name}: '
|
|
34
|
+
f'table {table_name} is not available in the current database/schema'
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
continue
|
|
38
|
+
|
|
25
39
|
qs = entry.model._default_manager.all()
|
|
26
40
|
if options['limit']:
|
|
27
41
|
qs = qs[:options['limit']]
|
|
@@ -3,7 +3,7 @@ from unittest.mock import patch
|
|
|
3
3
|
|
|
4
4
|
from django.core.exceptions import ValidationError
|
|
5
5
|
from django.core.management import call_command
|
|
6
|
-
from django.test import
|
|
6
|
+
from django.test import TestCase
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class _Manager:
|
|
@@ -25,17 +25,19 @@ class _Manager:
|
|
|
25
25
|
return iter(self._objects)
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
class BackfillRegisteredMediaTests(
|
|
28
|
+
class BackfillRegisteredMediaTests(TestCase):
|
|
29
|
+
@patch("media_engine.management.commands.backfill_registered_media.connection")
|
|
29
30
|
@patch("media_engine.management.commands.backfill_registered_media.entries")
|
|
30
31
|
@patch("media_engine.management.commands.backfill_registered_media.ingest_model_field")
|
|
31
|
-
def test_invalid_image_does_not_abort_backfill(self, ingest, entries):
|
|
32
|
+
def test_invalid_image_does_not_abort_backfill(self, ingest, entries, connection):
|
|
32
33
|
model = SimpleNamespace(
|
|
33
34
|
_default_manager=_Manager([
|
|
34
35
|
SimpleNamespace(pk=1),
|
|
35
36
|
SimpleNamespace(pk=2),
|
|
36
37
|
]),
|
|
37
|
-
_meta=SimpleNamespace(label="demo.Photo"),
|
|
38
|
+
_meta=SimpleNamespace(label="demo.Photo", db_table="demo_photo"),
|
|
38
39
|
)
|
|
40
|
+
connection.introspection.table_names.return_value = ["demo_photo"]
|
|
39
41
|
entries.return_value = [
|
|
40
42
|
SimpleNamespace(
|
|
41
43
|
model=model,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: media-optimization-engine
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.3
|
|
4
4
|
Summary: Media Optimization Engineer for Django/Python: automatic model-field optimization, responsive picture/srcset rendering, AVIF/WebP derivatives, 360 media, autonomous nodes, and CDN-ready storage.
|
|
5
5
|
Author-email: Achille Kabasele <pepexykabasele@gmail.com>
|
|
6
6
|
Maintainer-email: Achille Kabasele <pepexykabasele@gmail.com>
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "media-optimization-engine"
|
|
7
|
-
version = "1.4.
|
|
7
|
+
version = "1.4.3"
|
|
8
8
|
description = "Media Optimization Engineer for Django/Python: automatic model-field optimization, responsive picture/srcset rendering, AVIF/WebP derivatives, 360 media, autonomous nodes, and CDN-ready storage."
|
|
9
9
|
requires-python = ">=3.11"
|
|
10
10
|
authors = [{ name = "Achille Kabasele", email = "pepexykabasele@gmail.com" }]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/autoregister.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/control_plane.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/focal_detectors.py
RENAMED
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/image_ops.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/manifest.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/processors/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/profiles.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/queueing.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/registry.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/runtime_config.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/serializers.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/services.py
RENAMED
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/spec/openapi.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/storage_paths.py
RENAMED
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/system_views.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/tests/test_paths.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{media_optimization_engine-1.4.2 → media_optimization_engine-1.4.3}/media_engine/validators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|