#!/usr/bin/env python3 """Read-only production check for nearby-card post media.""" import json import sys import urllib.request from urllib.parse import urlsplit, urlunsplit sys.path.insert(0, "/www/server/xingyu-im/ops") from baota_publish_test_users import database, env_values, query values = env_values() assert values["IM_ENV"] == "production" connection, _ = database(values) try: totals = query(connection, "SELECT COUNT(*),(SELECT COUNT(*) FROM post_media) FROM posts WHERE status=1 AND deleted_at IS NULL")[0] posts = query( connection, "SELECT post.id,user.public_id,profile.nickname,post.created_at,COUNT(media.id) " "FROM posts post JOIN users user ON user.id=post.user_id JOIN user_profiles profile ON profile.user_id=user.id " "LEFT JOIN post_media media ON media.post_id=post.id " "WHERE post.status=1 AND post.deleted_at IS NULL GROUP BY post.id,user.public_id,profile.nickname,post.created_at " "ORDER BY post.created_at DESC,post.id DESC LIMIT 20", ) media_rows = query( connection, "SELECT media.post_id,media.media_url FROM post_media media JOIN posts post ON post.id=media.post_id " "WHERE post.status=1 AND post.deleted_at IS NULL ORDER BY post.created_at DESC,media.sort_order,media.id LIMIT 12", ) checked = [] for post_id, raw_url in media_rows: parts = urlsplit(raw_url) public_url = urlunsplit((parts.scheme, parts.netloc, parts.path, "", "")) request = urllib.request.Request(raw_url, method="HEAD", headers={"User-Agent": "xingyu-media-audit/1"}) try: with urllib.request.urlopen(request, timeout=20) as response: checked.append({ "postId": post_id, "url": public_url, "status": response.status, "type": response.headers.get_content_type(), "bytes": int(response.headers.get("Content-Length") or 0), }) except Exception as error: checked.append({"postId": post_id, "url": public_url, "error": type(error).__name__}) print(json.dumps({ "publishedPosts": totals[0], "postMediaRows": totals[1], "recentPosts": [ {"id": row[0], "publicId": row[1], "nickname": row[2], "createdAt": str(row[3]), "mediaCount": row[4]} for row in posts ], "media": checked, }, ensure_ascii=False)) finally: connection.close()