diff --git a/providers/facebook.py b/providers/facebook.py index cfcf2512..37065262 100644 --- a/providers/facebook.py +++ b/providers/facebook.py @@ -481,12 +481,12 @@ def get_post_metrics(self, access_token: str, post_id: str) -> PostMetrics: shares = self._share_count(fields) return PostMetrics( - reach=values.get("post_media_view", 0), + reach=values.get("post_total_media_view_unique", 0), clicks=values.get("post_clicks", 0), likes=0, comments=comments, shares=shares, - video_views=values.get("post_total_media_view_unique", 0), + video_views=values.get("post_media_view", 0), extra={ "reactions": reactions_total, "raw_fields": fields, diff --git a/providers/meta_insights.py b/providers/meta_insights.py index 5a086eed..286dcabb 100644 --- a/providers/meta_insights.py +++ b/providers/meta_insights.py @@ -25,14 +25,22 @@ def parse_insights_response(data: dict[str, Any]) -> dict[str, Any]: values: dict[str, Any] = {} + periods: dict[str, str] = {} for entry in data.get("data", []): name = entry.get("name", "") if not name: continue + period = entry.get("period", "") + if periods.get(name) == "lifetime" and period != "lifetime": + continue if "total_value" in entry: - values[name] = entry.get("total_value", {}).get("value", 0) + value = entry.get("total_value", {}).get("value", 0) + else: + value = entry.get("values", [{}])[0].get("value", 0) + if name not in values or period == "lifetime": + values[name] = value + periods[name] = period continue - values[name] = entry.get("values", [{}])[0].get("value", 0) return values diff --git a/tests/providers/test_facebook.py b/tests/providers/test_facebook.py index c7ef3599..ec794cd9 100644 --- a/tests/providers/test_facebook.py +++ b/tests/providers/test_facebook.py @@ -318,8 +318,8 @@ def test_get_post_metrics_uses_v25_media_view_metrics_and_object_counts(): metrics = provider.get_post_metrics("page-token", "page-1_post-1") - assert metrics.reach == 54 - assert metrics.video_views == 42 + assert metrics.reach == 42 + assert metrics.video_views == 54 assert metrics.clicks == 4 assert metrics.likes == 0 assert metrics.comments == 5 @@ -420,8 +420,8 @@ def test_get_post_metrics_resolves_photo_id_to_feed_post_for_comments_and_shares metrics = provider.get_post_metrics("page-token", "photo-1") - assert metrics.reach == 500 - assert metrics.video_views == 300 + assert metrics.reach == 300 + assert metrics.video_views == 500 assert metrics.clicks == 20 assert metrics.comments == 4 assert metrics.shares == 2 @@ -462,8 +462,8 @@ def test_get_post_metrics_tries_page_scoped_feed_id_for_numeric_object_id(): metrics = provider.get_post_metrics("page-token", "1668168861075953") - assert metrics.reach == 90 - assert metrics.video_views == 70 + assert metrics.reach == 70 + assert metrics.video_views == 90 assert metrics.comments == 6 assert metrics.shares == 8 assert metrics.extra["insight_post_id"] == "page-1_1668168861075953" @@ -501,8 +501,8 @@ def test_get_post_metrics_tries_next_candidate_when_feed_id_has_no_insights_edge metrics = provider.get_post_metrics("page-token", "1668168861075953") - assert metrics.reach == 12 - assert metrics.video_views == 10 + assert metrics.reach == 10 + assert metrics.video_views == 12 assert metrics.comments == 2 assert metrics.extra["insight_post_id"] == "1668168861075953" assert metrics.extra["attempted_insight_post_ids"] == ["page-1_1668168861075953", "1668168861075953"] diff --git a/tests/providers/test_instagram.py b/tests/providers/test_instagram.py index 1bf0393c..3d66d182 100644 --- a/tests/providers/test_instagram.py +++ b/tests/providers/test_instagram.py @@ -200,8 +200,8 @@ def test_instagram_media_metrics_use_current_metrics_and_field_fallbacks(): metrics = provider.get_post_metrics("page-token", "ig-media-1") - assert metrics.video_views == 400 - assert metrics.reach == 250 + assert metrics.video_views == 250 + assert metrics.reach == 400 assert metrics.likes == 12 assert metrics.comments == 3 assert metrics.saves == 5 diff --git a/tests/providers/test_meta_insights.py b/tests/providers/test_meta_insights.py index 12e55348..79a2ac75 100644 --- a/tests/providers/test_meta_insights.py +++ b/tests/providers/test_meta_insights.py @@ -3,7 +3,7 @@ import pytest from providers.exceptions import APIError -from providers.meta_insights import fetch_insights_safe +from providers.meta_insights import fetch_insights_safe, parse_insights_response def _resp(data): @@ -60,3 +60,35 @@ def test_fetch_insights_safe_reraises_permission_errors(): ) assert excinfo.value is permission_error + + +def test_parse_insights_response_prefers_lifetime_when_metric_name_repeats(): + values = parse_insights_response( + { + "data": [ + { + "name": "post_media_view", + "period": "lifetime", + "values": [{"value": 32741}], + }, + { + "name": "post_total_media_view_unique", + "period": "lifetime", + "values": [{"value": 21105}], + }, + { + "name": "post_total_media_view_unique", + "period": "day", + "values": [ + {"value": 0, "end_time": "2026-06-21T07:00:00+0000"}, + {"value": 0, "end_time": "2026-06-22T07:00:00+0000"}, + ], + }, + ] + } + ) + + assert values == { + "post_media_view": 32741, + "post_total_media_view_unique": 21105, + }