|
|
|
import requests |
|
import json |
|
from collections import Counter |
|
|
|
def get_model_counts(): |
|
|
|
url = "https://civitai.com/api/v1/models" |
|
|
|
|
|
params = { |
|
'limit': 100, |
|
'page': 1 |
|
} |
|
|
|
|
|
total_models = 0 |
|
|
|
|
|
allow_commercial_use = [] |
|
creator = [] |
|
|
|
|
|
nsfw_count = [] |
|
allow_derivatives = [] |
|
allow_no_credit = [] |
|
download_count = [] |
|
favorite_count = [] |
|
comment_count = [] |
|
rating_count = [] |
|
tipped_amount_count = [] |
|
ratings = [] |
|
failures = 0 |
|
total_pages = 1000 |
|
|
|
while True: |
|
|
|
try: |
|
response = requests.get(url, params=params) |
|
response.raise_for_status() |
|
data = response.json() |
|
|
|
|
|
models = data["items"] |
|
total_models += len(models) |
|
|
|
for model in models: |
|
allow_commercial_use.append(model["allowCommercialUse"]) |
|
creator.append(model["creator"]["username"]) |
|
nsfw_count.append(model["nsfw"]) |
|
allow_derivatives.append(model["allowDerivatives"]) |
|
allow_no_credit.append(model["allowNoCredit"]) |
|
download_count.append(model["stats"]["downloadCount"]) |
|
favorite_count.append(model["stats"]["favoriteCount"]) |
|
comment_count.append(model["stats"]["commentCount"]) |
|
rating_count.append(model["stats"]["ratingCount"]) |
|
tipped_amount_count.append(model["stats"]["tippedAmountCount"]) |
|
ratings.append(model["stats"]["rating"]) |
|
|
|
|
|
total_pages = int(data.get('metadata', {}).get('totalPages', 0)) |
|
|
|
if params['page'] >= 2: |
|
break |
|
|
|
|
|
params['page'] += 1 |
|
|
|
print(f"{params['page']} / {total_pages}") |
|
except: |
|
failures += 1 |
|
params["page"] += 1 |
|
|
|
return { |
|
'total_models': total_models, |
|
'allow_commercial_use': allow_commercial_use, |
|
'creator': creator, |
|
'nsfw_count': nsfw_count, |
|
'allow_derivatives': allow_derivatives, |
|
'allow_no_credit': allow_no_credit, |
|
'download_count': download_count, |
|
'favorite_count': favorite_count, |
|
'comment_count': comment_count, |
|
'rating_count': rating_count, |
|
'tipped_amount_count': tipped_amount_count, |
|
'ratings': ratings, |
|
'failures': failures, |
|
} |
|
|
|
outputs = get_model_counts() |
|
|
|
def map_fn(k, v): |
|
if k in ["total_models", 'failures']: |
|
return v |
|
elif k in ["creator", "allow_commercial_use"]: |
|
return Counter(v) |
|
elif k in ["ratings"]: |
|
return sum(v) / len(v) |
|
else: |
|
return { |
|
"sum": sum(v), |
|
"avg": round(sum(v) / len(v), 3) |
|
} |
|
|
|
stats = {k: map_fn(k, v) for k,v in outputs.items()} |
|
stats["num_creators"] = len(stats.pop("creator")) |
|
|
|
for k in ["total_models", "download_count", "comment_count", "rating_count", "tipped_amount_count", "favorite_count"]: |
|
if isinstance(stats[k], dict): |
|
stats[f"{k}_per_creator"] = round(stats[k]["sum"] / stats["num_creators"], 2) |
|
else: |
|
stats[f"{k}_per_creator"] = round(stats[k] / stats["num_creators"], 2) |
|
|
|
filename = "civitai_stats.json" |
|
with open(filename, 'w') as file: |
|
json.dump(stats, file, indent=4) |
|
|