Commit
Β·
1361a1e
0
Parent(s):
Initial commit
Browse files- Dockerfile +28 -0
- README.md +8 -0
- app.py +42 -0
- final_trend_insights.json +1717 -0
- requirements.txt +2 -0
- static/css/style.css +264 -0
- static/js/archetypes_chart.js +74 -0
- static/style.css +123 -0
- templates/dashboard.html +1055 -0
Dockerfile
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# ---- base image ----
|
2 |
+
FROM python:3.11-slim
|
3 |
+
|
4 |
+
# Make output unbuffered (logs show up immediately)
|
5 |
+
ENV PYTHONUNBUFFERED=1
|
6 |
+
|
7 |
+
# Create app directory
|
8 |
+
WORKDIR /app
|
9 |
+
|
10 |
+
# Install system deps only if you need them (uncomment as needed)
|
11 |
+
# RUN apt-get update && apt-get install -y --no-install-recommends \
|
12 |
+
# build-essential && \
|
13 |
+
# rm -rf /var/lib/apt/lists/*
|
14 |
+
|
15 |
+
# ---- python deps ----
|
16 |
+
# Install Python deps first for better layer caching
|
17 |
+
COPY requirements.txt /app/requirements.txt
|
18 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
19 |
+
|
20 |
+
# ---- app code ----
|
21 |
+
COPY . /app
|
22 |
+
|
23 |
+
# Hugging Face Spaces (Docker) expects your app to listen on 0.0.0.0:7860
|
24 |
+
EXPOSE 7860
|
25 |
+
|
26 |
+
# Start with gunicorn (Flask) or uvicorn (FastAPI)
|
27 |
+
# Assuming Flask app object is named `app` inside app.py
|
28 |
+
CMD ["gunicorn", "-b", "0.0.0.0:7860", "app:app"]
|
README.md
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Trend Discovery Engine
|
3 |
+
sdk: docker
|
4 |
+
app_port: 7860
|
5 |
+
---
|
6 |
+
|
7 |
+
# Trend Discovery Engine
|
8 |
+
A small Flask app serving `templates/dashboard.html` with static JS/CSS.
|
app.py
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json, os
|
2 |
+
from flask import Flask, render_template
|
3 |
+
|
4 |
+
app = Flask(__name__, template_folder="templates", static_folder="static")
|
5 |
+
|
6 |
+
|
7 |
+
def load_insights():
|
8 |
+
with open("final_trend_insights.json", "r", encoding="utf-8") as f:
|
9 |
+
return json.load(f)
|
10 |
+
|
11 |
+
@app.route("/")
|
12 |
+
def dashboard():
|
13 |
+
data = load_insights()
|
14 |
+
clusters = data.get("section_1_Cluster_Summary", [])
|
15 |
+
|
16 |
+
desired_order = [
|
17 |
+
"Explosive Viral Hit",
|
18 |
+
"Momentum Builder",
|
19 |
+
"Consistent Performer",
|
20 |
+
"Gradual Climber",
|
21 |
+
"Organic Riser",
|
22 |
+
]
|
23 |
+
order_index = {name: i for i, name in enumerate(desired_order)}
|
24 |
+
clusters.sort(key=lambda c: order_index.get(c.get("trend_archetype", ""), 999))
|
25 |
+
|
26 |
+
topics = data.get("section_2_Viral_Topics", [])
|
27 |
+
nascent = data.get("section_3_Nascent_Trends", {}) or {}
|
28 |
+
|
29 |
+
nt_summary = nascent.get("Nascent_Topics_summary", {}) or {}
|
30 |
+
nv_summary = nascent.get("Nascent_Videos_summary", {}) or {}
|
31 |
+
|
32 |
+
nt_list = nt_summary.get("Nascent_Topics", []) or []
|
33 |
+
nv_list = nv_summary.get("Nascent_Videos", []) or []
|
34 |
+
return render_template("dashboard.html", data=data,clusters=clusters, viral_topics=topics,nascent=nascent,
|
35 |
+
nt_summary=nt_summary,
|
36 |
+
nv_summary=nv_summary,
|
37 |
+
nt_list=nt_list,
|
38 |
+
nv_list=nv_list )
|
39 |
+
|
40 |
+
|
41 |
+
if __name__ == "__main__":
|
42 |
+
app.run(debug=True)
|
final_trend_insights.json
ADDED
@@ -0,0 +1,1717 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"section_1_Cluster_Summary": [
|
3 |
+
{
|
4 |
+
"trend_archetype": "Consistent Performer",
|
5 |
+
"delta_views_1_3h": 1064.56,
|
6 |
+
"delta_views_3_6h": 1249.62,
|
7 |
+
"delta_views_6_12h": 1625.86,
|
8 |
+
"delta_views_12h_1d": 2885.35,
|
9 |
+
"delta_views_1d_3d": 3159.52,
|
10 |
+
"velocity_1_3h": 532.28,
|
11 |
+
"velocity_3_6h": 416.54,
|
12 |
+
"velocity_6_12h": 270.98,
|
13 |
+
"velocity_12h_1d": 240.45,
|
14 |
+
"velocity_1d_3d": 65.82,
|
15 |
+
"acceleration_1_6h": -38.58,
|
16 |
+
"acceleration_6_12h": -48.52,
|
17 |
+
"acceleration_12h_1d": -5.09,
|
18 |
+
"acceleration_1d_3d": -3.64,
|
19 |
+
"engagement_ratio_3h": 1.62,
|
20 |
+
"engagement_ratio_6h": 1.24,
|
21 |
+
"engagement_ratio_1d": 0.75,
|
22 |
+
"engagement_ratio_3d": 0.68,
|
23 |
+
"like_comment_ratio_1d": 6.25,
|
24 |
+
"like_comment_ratio_3d": 6.06,
|
25 |
+
"view_growth_rate_1h_3d": 10.59,
|
26 |
+
"spike_index": 2.24,
|
27 |
+
"view_growth_std": 1402.74,
|
28 |
+
"video_count": 6121,
|
29 |
+
"description": "This archetype shows steady view growth over time, with a strong initial velocity that gradually declines, indicating sustained audience interest. Engagement ratios are relatively stable throughout its lifecycle.",
|
30 |
+
"strategic_recommendation": "Consistent Performers offer predictable, sustained reach, making them ideal for evergreen content or long-term brand building campaigns. Marketing managers can leverage these trends for educational series, 'how-to' guides, or ongoing brand storytelling that ensures continuous exposure and reinforces brand presence over weeks or months.",
|
31 |
+
"sample_videos": [
|
32 |
+
{
|
33 |
+
"video_id": "G7vSVwGAm5Y",
|
34 |
+
"title": "i phone 14pro max only 10000.. #smartphone #tech #unboxing #gadgets #iphone #shortsfeed #shorts",
|
35 |
+
"velocity_1_3h": 2132.5,
|
36 |
+
"velocity_3_6h": 2543.6666666666665,
|
37 |
+
"velocity_6_12h": 2667.1666666666665,
|
38 |
+
"velocity_12h_1d": 7261.333333333333,
|
39 |
+
"velocity_1d_3d": 10057.479166666666,
|
40 |
+
"acceleration_1_6h": 137.05555555555551,
|
41 |
+
"acceleration_6_12h": 41.166666666666664,
|
42 |
+
"engagement_ratio_1d": 0.012218163496662049,
|
43 |
+
"like_comment_ratio_1d": 207.0,
|
44 |
+
"spike_index": 3.029895249166605,
|
45 |
+
"view_growth_std": 39229.82744778944,
|
46 |
+
"composite_z_score": 1406.7267982499764,
|
47 |
+
"thumbnail_url": "https://img.youtube.com/vi/G7vSVwGAm5Y/0.jpg"
|
48 |
+
},
|
49 |
+
{
|
50 |
+
"video_id": "aOIjRwkUbK4",
|
51 |
+
"title": "She looked beautiful after putting on lipstick\ud83d\udc84\ud83d\udc8b#shorts",
|
52 |
+
"velocity_1_3h": 7927.0,
|
53 |
+
"velocity_3_6h": 11784.333333333334,
|
54 |
+
"velocity_6_12h": 33040.333333333336,
|
55 |
+
"velocity_12h_1d": 6217.5,
|
56 |
+
"velocity_1d_3d": 7389.270833333333,
|
57 |
+
"acceleration_1_6h": 1285.777777777778,
|
58 |
+
"acceleration_6_12h": 7085.333333333333,
|
59 |
+
"engagement_ratio_1d": 2.706359945872801e-05,
|
60 |
+
"like_comment_ratio_1d": 0.6666666666666666,
|
61 |
+
"spike_index": 2.4469865055135394,
|
62 |
+
"view_growth_std": 81882.37034256315,
|
63 |
+
"composite_z_score": 1131.5027726669764,
|
64 |
+
"thumbnail_url": "https://img.youtube.com/vi/aOIjRwkUbK4/0.jpg"
|
65 |
+
},
|
66 |
+
{
|
67 |
+
"video_id": "9GN_gMZ3i-o",
|
68 |
+
"title": "The GIRLIEST from the series \u2764\ufe0f #shorts #unboxing #asmrunboxing #popmart #labubu",
|
69 |
+
"velocity_1_3h": 6113.5,
|
70 |
+
"velocity_3_6h": 8804.666666666666,
|
71 |
+
"velocity_6_12h": 9967.0,
|
72 |
+
"velocity_12h_1d": 11122.916666666666,
|
73 |
+
"velocity_1d_3d": 6565.291666666667,
|
74 |
+
"acceleration_1_6h": 897.0555555555553,
|
75 |
+
"acceleration_6_12h": 387.4444444444446,
|
76 |
+
"engagement_ratio_1d": 0.11730684838498671,
|
77 |
+
"like_comment_ratio_1d": 1.3249097472924187,
|
78 |
+
"spike_index": 2.3021067790805008,
|
79 |
+
"view_growth_std": 54137.36871145475,
|
80 |
+
"composite_z_score": 973.8007632608297,
|
81 |
+
"thumbnail_url": "https://img.youtube.com/vi/9GN_gMZ3i-o/0.jpg"
|
82 |
+
},
|
83 |
+
{
|
84 |
+
"video_id": "yRdiHMHYNHA",
|
85 |
+
"title": "\"True heir of Ragnar Lothbrok.\" \ud83d\udc94\ud83d\udd25 | Vikings #shorts #vikings",
|
86 |
+
"velocity_1_3h": 1425.0,
|
87 |
+
"velocity_3_6h": 2280.3333333333335,
|
88 |
+
"velocity_6_12h": 2880.0,
|
89 |
+
"velocity_12h_1d": 3743.5833333333335,
|
90 |
+
"velocity_1d_3d": 5255.083333333333,
|
91 |
+
"acceleration_1_6h": 285.11111111111114,
|
92 |
+
"acceleration_6_12h": 199.88888888888883,
|
93 |
+
"engagement_ratio_1d": 0.042532106106269174,
|
94 |
+
"like_comment_ratio_1d": 75.4390243902439,
|
95 |
+
"spike_index": 2.499401897098539,
|
96 |
+
"view_growth_std": 18968.47648951632,
|
97 |
+
"composite_z_score": 739.0521686359557,
|
98 |
+
"thumbnail_url": "https://img.youtube.com/vi/yRdiHMHYNHA/0.jpg"
|
99 |
+
},
|
100 |
+
{
|
101 |
+
"video_id": "9FGq6uFZyOI",
|
102 |
+
"title": "Mending lu main trail bang #anakmotor #automobile #modifikasimotor #youtubeshorts",
|
103 |
+
"velocity_1_3h": 1810.0,
|
104 |
+
"velocity_3_6h": 1234.0,
|
105 |
+
"velocity_6_12h": 586.0,
|
106 |
+
"velocity_12h_1d": 1118.0,
|
107 |
+
"velocity_1d_3d": 4740.145833333333,
|
108 |
+
"acceleration_1_6h": -192.0,
|
109 |
+
"acceleration_6_12h": -216.0,
|
110 |
+
"engagement_ratio_1d": 0.8149149619876166,
|
111 |
+
"like_comment_ratio_1d": 0.88660074389912,
|
112 |
+
"spike_index": 2.2125834910179627,
|
113 |
+
"view_growth_std": 4902.25754117427,
|
114 |
+
"composite_z_score": 647.8388217194364,
|
115 |
+
"thumbnail_url": "https://img.youtube.com/vi/9FGq6uFZyOI/0.jpg"
|
116 |
+
}
|
117 |
+
]
|
118 |
+
},
|
119 |
+
{
|
120 |
+
"trend_archetype": "Explosive Viral Hit",
|
121 |
+
"delta_views_1_3h": 6716.25,
|
122 |
+
"delta_views_3_6h": 10794.6,
|
123 |
+
"delta_views_6_12h": 18618.03,
|
124 |
+
"delta_views_12h_1d": 37704.29,
|
125 |
+
"delta_views_1d_3d": 70536.14,
|
126 |
+
"velocity_1_3h": 3358.12,
|
127 |
+
"velocity_3_6h": 3598.2,
|
128 |
+
"velocity_6_12h": 3103.0,
|
129 |
+
"velocity_12h_1d": 3142.02,
|
130 |
+
"velocity_1d_3d": 1469.5,
|
131 |
+
"acceleration_1_6h": 80.03,
|
132 |
+
"acceleration_6_12h": -165.07,
|
133 |
+
"acceleration_12h_1d": 6.5,
|
134 |
+
"acceleration_1d_3d": -34.84,
|
135 |
+
"engagement_ratio_3h": 1.61,
|
136 |
+
"engagement_ratio_6h": 1.34,
|
137 |
+
"engagement_ratio_1d": 0.91,
|
138 |
+
"engagement_ratio_3d": 0.79,
|
139 |
+
"like_comment_ratio_1d": 7.25,
|
140 |
+
"like_comment_ratio_3d": 7.43,
|
141 |
+
"view_growth_rate_1h_3d": 18.61,
|
142 |
+
"spike_index": 2.3,
|
143 |
+
"view_growth_std": 15719.94,
|
144 |
+
"video_count": 8293,
|
145 |
+
"description": "Characterized by rapid, massive view growth within the first 12-24 hours, followed by a sharp but still significant velocity, indicating immense, short-lived popularity. High engagement ratios highlight strong immediate audience resonance.",
|
146 |
+
"strategic_recommendation": "Explosive Viral Hits are perfect for immediate, high-impact campaigns, product launches, or capitalizing on breaking cultural moments. Marketing managers should have rapid response strategies in place to quickly create reactive content or launch flash promotions that align with the trend, maximizing its immense, albeit brief, reach. For example, a brand could quickly produce a short video featuring their product in a viral challenge to ride the wave of a trending topic.",
|
147 |
+
"sample_videos": [
|
148 |
+
{
|
149 |
+
"video_id": "7pjkokRqKpA",
|
150 |
+
"title": "Baby Mookie Love \ud83d\udc76\ud83c\udffb #funny #shorts #newborn",
|
151 |
+
"velocity_1_3h": 482040.0,
|
152 |
+
"velocity_3_6h": 662570.0,
|
153 |
+
"velocity_6_12h": 728042.3333333334,
|
154 |
+
"velocity_12h_1d": 674847.9166666666,
|
155 |
+
"velocity_1d_3d": 413482.75,
|
156 |
+
"acceleration_1_6h": 60176.666666666664,
|
157 |
+
"acceleration_6_12h": 21824.111111111124,
|
158 |
+
"engagement_ratio_1d": 0.14463432653622776,
|
159 |
+
"like_comment_ratio_1d": 16.273000241088845,
|
160 |
+
"spike_index": 2.100936560830508,
|
161 |
+
"view_growth_std": 3168183.1463606367,
|
162 |
+
"composite_z_score": 61674.92673433547,
|
163 |
+
"thumbnail_url": "https://img.youtube.com/vi/7pjkokRqKpA/0.jpg"
|
164 |
+
},
|
165 |
+
{
|
166 |
+
"video_id": "wSTLUIRetk8",
|
167 |
+
"title": "Baby Mookie Love \ud83d\udc76\ud83c\udffb #funny #shorts #newborn",
|
168 |
+
"velocity_1_3h": 369499.5,
|
169 |
+
"velocity_3_6h": 471555.3333333333,
|
170 |
+
"velocity_6_12h": 469323.6666666667,
|
171 |
+
"velocity_12h_1d": 431724.5833333333,
|
172 |
+
"velocity_1d_3d": 356693.2708333333,
|
173 |
+
"acceleration_1_6h": 34018.6111111111,
|
174 |
+
"acceleration_6_12h": -743.888888888876,
|
175 |
+
"engagement_ratio_1d": 0.051187758327664847,
|
176 |
+
"like_comment_ratio_1d": 86.2274491538581,
|
177 |
+
"spike_index": 2.0415924570512125,
|
178 |
+
"view_growth_std": 1962937.5750937674,
|
179 |
+
"composite_z_score": 51960.01761522994,
|
180 |
+
"thumbnail_url": "https://img.youtube.com/vi/wSTLUIRetk8/0.jpg"
|
181 |
+
},
|
182 |
+
{
|
183 |
+
"video_id": "qAJPxxmO3WU",
|
184 |
+
"title": "Every kid has done \ud83d\ude01\ud83d\ude02 #shorts #relatable #fun y",
|
185 |
+
"velocity_1_3h": 405136.5,
|
186 |
+
"velocity_3_6h": 484286.3333333333,
|
187 |
+
"velocity_6_12h": 447126.1666666667,
|
188 |
+
"velocity_12h_1d": 447385.8333333333,
|
189 |
+
"velocity_1d_3d": 250910.25,
|
190 |
+
"acceleration_1_6h": 26383.27777777777,
|
191 |
+
"acceleration_6_12h": -12386.72222222221,
|
192 |
+
"engagement_ratio_1d": 2.16107106885187,
|
193 |
+
"like_comment_ratio_1d": 0.2874781987443031,
|
194 |
+
"spike_index": 2.0819700850802323,
|
195 |
+
"view_growth_std": 2015720.653266779,
|
196 |
+
"composite_z_score": 37702.89040506383,
|
197 |
+
"thumbnail_url": "https://img.youtube.com/vi/qAJPxxmO3WU/0.jpg"
|
198 |
+
},
|
199 |
+
{
|
200 |
+
"video_id": "0H7c_Hq7iYs",
|
201 |
+
"title": "From Small To Giant Watermelon \ud83c\udf49 #johnnybrush #viralshorts #tiktok",
|
202 |
+
"velocity_1_3h": 57492.0,
|
203 |
+
"velocity_3_6h": 37999.666666666664,
|
204 |
+
"velocity_6_12h": 655628.1666666666,
|
205 |
+
"velocity_12h_1d": 598779.5833333334,
|
206 |
+
"velocity_1d_3d": 230834.375,
|
207 |
+
"acceleration_1_6h": -6497.444444444445,
|
208 |
+
"acceleration_6_12h": 205876.16666666666,
|
209 |
+
"engagement_ratio_1d": 0.037548599687872976,
|
210 |
+
"like_comment_ratio_1d": 0.8323026352443033,
|
211 |
+
"spike_index": 2.532706115653463,
|
212 |
+
"view_growth_std": 3412486.8250188036,
|
213 |
+
"composite_z_score": 35745.50399771079,
|
214 |
+
"thumbnail_url": "https://img.youtube.com/vi/0H7c_Hq7iYs/0.jpg"
|
215 |
+
},
|
216 |
+
{
|
217 |
+
"video_id": "sUC2E-4Pmi4",
|
218 |
+
"title": "Did He Deserve The Ban?\ud83e\udd14(@..yessirskiii)",
|
219 |
+
"velocity_1_3h": 73994.0,
|
220 |
+
"velocity_3_6h": 142502.33333333334,
|
221 |
+
"velocity_6_12h": 213641.0,
|
222 |
+
"velocity_12h_1d": 316469.75,
|
223 |
+
"velocity_1d_3d": 214122.89583333334,
|
224 |
+
"acceleration_1_6h": 22836.111111111113,
|
225 |
+
"acceleration_6_12h": 23712.888888888887,
|
226 |
+
"engagement_ratio_1d": 0.055602986378848945,
|
227 |
+
"like_comment_ratio_1d": 68.44408109875735,
|
228 |
+
"spike_index": 2.6862258350057693,
|
229 |
+
"view_growth_std": 1660837.5988796537,
|
230 |
+
"composite_z_score": 31060.064722370927,
|
231 |
+
"thumbnail_url": "https://img.youtube.com/vi/sUC2E-4Pmi4/0.jpg"
|
232 |
+
}
|
233 |
+
]
|
234 |
+
},
|
235 |
+
{
|
236 |
+
"trend_archetype": "Gradual Climber",
|
237 |
+
"delta_views_1_3h": 1519.23,
|
238 |
+
"delta_views_3_6h": 1978.25,
|
239 |
+
"delta_views_6_12h": 2294.64,
|
240 |
+
"delta_views_12h_1d": 4121.34,
|
241 |
+
"delta_views_1d_3d": 4912.14,
|
242 |
+
"velocity_1_3h": 759.62,
|
243 |
+
"velocity_3_6h": 659.42,
|
244 |
+
"velocity_6_12h": 382.44,
|
245 |
+
"velocity_12h_1d": 343.45,
|
246 |
+
"velocity_1d_3d": 102.34,
|
247 |
+
"acceleration_1_6h": -33.4,
|
248 |
+
"acceleration_6_12h": -92.33,
|
249 |
+
"acceleration_12h_1d": -6.5,
|
250 |
+
"acceleration_1d_3d": -5.02,
|
251 |
+
"engagement_ratio_3h": 0.09,
|
252 |
+
"engagement_ratio_6h": 0.07,
|
253 |
+
"engagement_ratio_1d": 0.06,
|
254 |
+
"engagement_ratio_3d": 0.05,
|
255 |
+
"like_comment_ratio_1d": 20.24,
|
256 |
+
"like_comment_ratio_3d": 19.31,
|
257 |
+
"view_growth_rate_1h_3d": 9.76,
|
258 |
+
"spike_index": 89.29,
|
259 |
+
"view_growth_std": 2311.61,
|
260 |
+
"video_count": 11514,
|
261 |
+
"description": "This archetype exhibits slow but consistent view growth over an extended period, often with lower initial engagement ratios that remain modest. A high like-comment ratio suggests a dedicated, though smaller, audience.",
|
262 |
+
"strategic_recommendation": "Gradual Climbers are suitable for niche marketing, building a loyal community, or thought leadership content. Marketing managers can use these trends for in-depth tutorials, specialized content, or to foster deep engagement with a specific, highly interested audience segment, allowing content to slowly gain traction and build a strong, committed following over time.",
|
263 |
+
"sample_videos": [
|
264 |
+
{
|
265 |
+
"video_id": "NyOuB-6JjlE",
|
266 |
+
"title": "Homemade Butter \ud83e\uddc8 #butter #viralvideo #samayal",
|
267 |
+
"velocity_1_3h": 431.0,
|
268 |
+
"velocity_3_6h": 358.0,
|
269 |
+
"velocity_6_12h": 200.66666666666666,
|
270 |
+
"velocity_12h_1d": 3415.0833333333335,
|
271 |
+
"velocity_1d_3d": 22629.083333333332,
|
272 |
+
"acceleration_1_6h": -24.333333333333332,
|
273 |
+
"acceleration_6_12h": -52.44444444444445,
|
274 |
+
"engagement_ratio_1d": 0.013660113354587318,
|
275 |
+
"like_comment_ratio_1d": 87.28571428571429,
|
276 |
+
"spike_index": 3.7153283013789054,
|
277 |
+
"view_growth_std": 19967.664166096147,
|
278 |
+
"composite_z_score": 3071.25704770495,
|
279 |
+
"thumbnail_url": "https://img.youtube.com/vi/NyOuB-6JjlE/0.jpg"
|
280 |
+
},
|
281 |
+
{
|
282 |
+
"video_id": "ZY5QvvUgzaw",
|
283 |
+
"title": "How to curl using Straightener \u2705\u2764\ufe0f #curls #hairhacks #haircurls #trendingshorts #viralshorts #shorts",
|
284 |
+
"velocity_1_3h": 4173.5,
|
285 |
+
"velocity_3_6h": 6433.333333333333,
|
286 |
+
"velocity_6_12h": 6829.0,
|
287 |
+
"velocity_12h_1d": 7725.333333333333,
|
288 |
+
"velocity_1d_3d": 9619.708333333334,
|
289 |
+
"acceleration_1_6h": 753.2777777777777,
|
290 |
+
"acceleration_6_12h": 131.888888888889,
|
291 |
+
"engagement_ratio_1d": 0.01599019648667781,
|
292 |
+
"like_comment_ratio_1d": 167.0625,
|
293 |
+
"spike_index": 2.2985650084661753,
|
294 |
+
"view_growth_std": 37454.967604444675,
|
295 |
+
"composite_z_score": 1365.5181334493354,
|
296 |
+
"thumbnail_url": "https://img.youtube.com/vi/ZY5QvvUgzaw/0.jpg"
|
297 |
+
},
|
298 |
+
{
|
299 |
+
"video_id": "rVa87y9ow5Y",
|
300 |
+
"title": "True love #youtubeshorts #shorts #trending #ytshorts #viralvideo #neelamgaur",
|
301 |
+
"velocity_1_3h": 0.0,
|
302 |
+
"velocity_3_6h": 138.33333333333334,
|
303 |
+
"velocity_6_12h": 9.833333333333334,
|
304 |
+
"velocity_12h_1d": 466.0,
|
305 |
+
"velocity_1d_3d": 9691.166666666666,
|
306 |
+
"acceleration_1_6h": 46.111111111111114,
|
307 |
+
"acceleration_6_12h": -42.833333333333336,
|
308 |
+
"engagement_ratio_1d": 0.05753166262462948,
|
309 |
+
"like_comment_ratio_1d": 19.38095238095238,
|
310 |
+
"spike_index": 3.687438177588237,
|
311 |
+
"view_growth_std": 2723.177127303082,
|
312 |
+
"composite_z_score": 1309.9913194688418,
|
313 |
+
"thumbnail_url": "https://img.youtube.com/vi/rVa87y9ow5Y/0.jpg"
|
314 |
+
},
|
315 |
+
{
|
316 |
+
"video_id": "Ud0cHANCnHk",
|
317 |
+
"title": "The boys always got your back \ud83e\udd1d\ud83c\udffc\ud83e\udd79 #shorts",
|
318 |
+
"velocity_1_3h": 6353.0,
|
319 |
+
"velocity_3_6h": 10199.0,
|
320 |
+
"velocity_6_12h": 10422.833333333334,
|
321 |
+
"velocity_12h_1d": 12407.416666666666,
|
322 |
+
"velocity_1d_3d": 6843.5625,
|
323 |
+
"acceleration_1_6h": 1282.0,
|
324 |
+
"acceleration_6_12h": 74.61111111111131,
|
325 |
+
"engagement_ratio_1d": 0.03682706749935064,
|
326 |
+
"like_comment_ratio_1d": 154.3015873015873,
|
327 |
+
"spike_index": 2.3379984218155294,
|
328 |
+
"view_growth_std": 60428.23201878958,
|
329 |
+
"composite_z_score": 1025.9677903822808,
|
330 |
+
"thumbnail_url": "https://img.youtube.com/vi/Ud0cHANCnHk/0.jpg"
|
331 |
+
},
|
332 |
+
{
|
333 |
+
"video_id": "vQMqq54FPv4",
|
334 |
+
"title": "#funny #shortvideos #fypp #shortsviral #fy #automobile #comedy #mustseevideo #comedyvideos #shorts",
|
335 |
+
"velocity_1_3h": 952.5,
|
336 |
+
"velocity_3_6h": 1994.3333333333333,
|
337 |
+
"velocity_6_12h": 3121.8333333333335,
|
338 |
+
"velocity_12h_1d": 5079.25,
|
339 |
+
"velocity_1d_3d": 7077.958333333333,
|
340 |
+
"acceleration_1_6h": 347.27777777777777,
|
341 |
+
"acceleration_6_12h": 375.8333333333334,
|
342 |
+
"engagement_ratio_1d": 0.03588340999762661,
|
343 |
+
"like_comment_ratio_1d": 8.313782991202347,
|
344 |
+
"spike_index": 2.784104145128053,
|
345 |
+
"view_growth_std": 27007.245021783816,
|
346 |
+
"composite_z_score": 988.3286786384408,
|
347 |
+
"thumbnail_url": "https://img.youtube.com/vi/vQMqq54FPv4/0.jpg"
|
348 |
+
}
|
349 |
+
]
|
350 |
+
},
|
351 |
+
{
|
352 |
+
"trend_archetype": "Momentum Builder",
|
353 |
+
"delta_views_1_3h": 2263.56,
|
354 |
+
"delta_views_3_6h": 3635.05,
|
355 |
+
"delta_views_6_12h": 5399.75,
|
356 |
+
"delta_views_12h_1d": 10740.1,
|
357 |
+
"delta_views_1d_3d": 16723.17,
|
358 |
+
"velocity_1_3h": 1131.78,
|
359 |
+
"velocity_3_6h": 1211.68,
|
360 |
+
"velocity_6_12h": 899.96,
|
361 |
+
"velocity_12h_1d": 895.01,
|
362 |
+
"velocity_1d_3d": 348.4,
|
363 |
+
"acceleration_1_6h": 26.63,
|
364 |
+
"acceleration_6_12h": -103.91,
|
365 |
+
"acceleration_12h_1d": -0.83,
|
366 |
+
"acceleration_1d_3d": -11.39,
|
367 |
+
"engagement_ratio_3h": 0.14,
|
368 |
+
"engagement_ratio_6h": 0.11,
|
369 |
+
"engagement_ratio_1d": 0.08,
|
370 |
+
"engagement_ratio_3d": 0.07,
|
371 |
+
"like_comment_ratio_1d": 21.36,
|
372 |
+
"like_comment_ratio_3d": 20.7,
|
373 |
+
"view_growth_rate_1h_3d": 15.59,
|
374 |
+
"spike_index": 2.37,
|
375 |
+
"view_growth_std": 5171.76,
|
376 |
+
"video_count": 8808,
|
377 |
+
"description": "Begins with moderate view growth and velocity that accelerates significantly, particularly between 12 hours and 3 days, indicating a building buzz and increasing popularity. Engagement ratios are moderate and decline slowly.",
|
378 |
+
"strategic_recommendation": "Momentum Builders are ideal for campaigns that require a build-up of anticipation or sustained interest over several days. Marketing managers can use these trends for phased product reveals, user-generated content challenges, or ongoing campaigns that encourage participation, allowing the trend to gain traction and amplify its reach over time. For instance, a brand could launch a multi-day 'challenge' that encourages user submissions, building excitement and participation as the trend gains momentum.",
|
379 |
+
"sample_videos": [
|
380 |
+
{
|
381 |
+
"video_id": "zJn4qeae9Os",
|
382 |
+
"title": "what did you do in this\ud83d\ude31 #shortvideo #youtubeshorts",
|
383 |
+
"velocity_1_3h": 1033.0,
|
384 |
+
"velocity_3_6h": 3573.0,
|
385 |
+
"velocity_6_12h": 9118.5,
|
386 |
+
"velocity_12h_1d": 23651.75,
|
387 |
+
"velocity_1d_3d": 38994.791666666664,
|
388 |
+
"acceleration_1_6h": 846.6666666666666,
|
389 |
+
"acceleration_6_12h": 1848.5,
|
390 |
+
"engagement_ratio_1d": 0.0003581336122606758,
|
391 |
+
"like_comment_ratio_1d": 0.8676470588235294,
|
392 |
+
"spike_index": 3.231508865176106,
|
393 |
+
"view_growth_std": 132678.6974319917,
|
394 |
+
"composite_z_score": 5392.623974838586,
|
395 |
+
"thumbnail_url": "https://img.youtube.com/vi/zJn4qeae9Os/0.jpg"
|
396 |
+
},
|
397 |
+
{
|
398 |
+
"video_id": "QKaL6AWipDU",
|
399 |
+
"title": "Isso est\u00e1 proibido nessa ARTE! #arte #desenho #shorts",
|
400 |
+
"velocity_1_3h": 8888.5,
|
401 |
+
"velocity_3_6h": 14776.666666666666,
|
402 |
+
"velocity_6_12h": 20141.666666666668,
|
403 |
+
"velocity_12h_1d": 27645.25,
|
404 |
+
"velocity_1d_3d": 32923.958333333336,
|
405 |
+
"acceleration_1_6h": 1962.722222222222,
|
406 |
+
"acceleration_6_12h": 1788.333333333334,
|
407 |
+
"engagement_ratio_1d": 0.014241964850267012,
|
408 |
+
"like_comment_ratio_1d": 11.894827586206896,
|
409 |
+
"spike_index": 2.5781464930827425,
|
410 |
+
"view_growth_std": 142255.97665007494,
|
411 |
+
"composite_z_score": 4638.575533483655,
|
412 |
+
"thumbnail_url": "https://img.youtube.com/vi/QKaL6AWipDU/0.jpg"
|
413 |
+
},
|
414 |
+
{
|
415 |
+
"video_id": "bg8rmGwkVBg",
|
416 |
+
"title": "pemotor kena prank #vidio #funny #gudanghiburan #lucu #ngakak #comedy #humor #viral #trending",
|
417 |
+
"velocity_1_3h": 12667.0,
|
418 |
+
"velocity_3_6h": 8235.0,
|
419 |
+
"velocity_6_12h": 4193.666666666667,
|
420 |
+
"velocity_12h_1d": 12287.166666666666,
|
421 |
+
"velocity_1d_3d": 29576.625,
|
422 |
+
"acceleration_1_6h": -1477.3333333333333,
|
423 |
+
"acceleration_6_12h": -1347.111111111111,
|
424 |
+
"engagement_ratio_1d": 0.6237825114338997,
|
425 |
+
"like_comment_ratio_1d": 0.8890155535463921,
|
426 |
+
"spike_index": 2.6489645043023446,
|
427 |
+
"view_growth_std": 61190.075689744546,
|
428 |
+
"composite_z_score": 4064.515686672393,
|
429 |
+
"thumbnail_url": "https://img.youtube.com/vi/bg8rmGwkVBg/0.jpg"
|
430 |
+
},
|
431 |
+
{
|
432 |
+
"video_id": "pMVlZcfCEkE",
|
433 |
+
"title": "Checkmate Mahit Nahi Kuni Kela \ud83d\ude42\ud83e\udd1f\ud83c\udffb #nicklieans #comedy #youtubeshorts",
|
434 |
+
"velocity_1_3h": 12201.0,
|
435 |
+
"velocity_3_6h": 17658.0,
|
436 |
+
"velocity_6_12h": 20876.5,
|
437 |
+
"velocity_12h_1d": 24681.083333333332,
|
438 |
+
"velocity_1d_3d": 22332.770833333332,
|
439 |
+
"acceleration_1_6h": 1819.0,
|
440 |
+
"acceleration_6_12h": 1072.8333333333333,
|
441 |
+
"engagement_ratio_1d": 0.09768970266923474,
|
442 |
+
"like_comment_ratio_1d": 4.054878048780488,
|
443 |
+
"spike_index": 2.375046109907018,
|
444 |
+
"view_growth_std": 121939.34294558094,
|
445 |
+
"composite_z_score": 3202.6787230631644,
|
446 |
+
"thumbnail_url": "https://img.youtube.com/vi/pMVlZcfCEkE/0.jpg"
|
447 |
+
},
|
448 |
+
{
|
449 |
+
"video_id": "nGb8p2ffvnQ",
|
450 |
+
"title": "cute elephant and saving deer #shortsvideo",
|
451 |
+
"velocity_1_3h": 5875.5,
|
452 |
+
"velocity_3_6h": 11543.666666666666,
|
453 |
+
"velocity_6_12h": 16956.333333333332,
|
454 |
+
"velocity_12h_1d": 24177.416666666668,
|
455 |
+
"velocity_1d_3d": 20411.583333333332,
|
456 |
+
"acceleration_1_6h": 1889.3888888888887,
|
457 |
+
"acceleration_6_12h": 1804.222222222222,
|
458 |
+
"engagement_ratio_1d": 0.04658131299373468,
|
459 |
+
"like_comment_ratio_1d": 95.69158878504673,
|
460 |
+
"spike_index": 2.6480744964378875,
|
461 |
+
"view_growth_std": 126289.75010763938,
|
462 |
+
"composite_z_score": 2925.7280171359735,
|
463 |
+
"thumbnail_url": "https://img.youtube.com/vi/nGb8p2ffvnQ/0.jpg"
|
464 |
+
}
|
465 |
+
]
|
466 |
+
},
|
467 |
+
{
|
468 |
+
"trend_archetype": "Organic Riser",
|
469 |
+
"delta_views_1_3h": 1575.56,
|
470 |
+
"delta_views_3_6h": 1583.69,
|
471 |
+
"delta_views_6_12h": 1824.67,
|
472 |
+
"delta_views_12h_1d": 3222.11,
|
473 |
+
"delta_views_1d_3d": 3813.31,
|
474 |
+
"velocity_1_3h": 787.78,
|
475 |
+
"velocity_3_6h": 527.9,
|
476 |
+
"velocity_6_12h": 304.11,
|
477 |
+
"velocity_12h_1d": 268.51,
|
478 |
+
"velocity_1d_3d": 79.44,
|
479 |
+
"acceleration_1_6h": -86.63,
|
480 |
+
"acceleration_6_12h": -74.59,
|
481 |
+
"acceleration_12h_1d": -5.93,
|
482 |
+
"acceleration_1d_3d": -3.94,
|
483 |
+
"engagement_ratio_3h": 1.74,
|
484 |
+
"engagement_ratio_6h": 1.47,
|
485 |
+
"engagement_ratio_1d": 0.97,
|
486 |
+
"engagement_ratio_3d": 0.84,
|
487 |
+
"like_comment_ratio_1d": 2.51,
|
488 |
+
"like_comment_ratio_3d": 2.61,
|
489 |
+
"view_growth_rate_1h_3d": 14.46,
|
490 |
+
"spike_index": 711.75,
|
491 |
+
"view_growth_std": 1630.43,
|
492 |
+
"video_count": 9865,
|
493 |
+
"description": "This archetype shows steady, organic view growth over time, characterized by high initial engagement that remains strong and a high spike index, suggesting potential for unexpected surges in popularity.",
|
494 |
+
"strategic_recommendation": "Organic Risers are excellent for content that naturally resonates with the audience and can achieve sustained organic reach. Marketing managers should focus on creating authentic, relatable content that encourages natural sharing and virality. They should also monitor these trends closely and be prepared to amplify them with paid promotion or cross-platform sharing if an unexpected spike occurs, maximizing their natural growth potential.",
|
495 |
+
"sample_videos": [
|
496 |
+
{
|
497 |
+
"video_id": "ke80AP-eh9Y",
|
498 |
+
"title": "Bevi una Torre Piezometrica di Vodka?ECCO COSA SUCCEDE!\ud83e\udd2f #ytshorts #shorts (credits:zack.d.films)",
|
499 |
+
"velocity_1_3h": 3234.5,
|
500 |
+
"velocity_3_6h": 2227.6666666666665,
|
501 |
+
"velocity_6_12h": 1037.0,
|
502 |
+
"velocity_12h_1d": 3526.8333333333335,
|
503 |
+
"velocity_1d_3d": 8374.833333333334,
|
504 |
+
"acceleration_1_6h": -335.61111111111114,
|
505 |
+
"acceleration_6_12h": -396.88888888888886,
|
506 |
+
"engagement_ratio_1d": 0.5842607064707721,
|
507 |
+
"like_comment_ratio_1d": 0.8935264917434911,
|
508 |
+
"spike_index": 2.7439056014818526,
|
509 |
+
"view_growth_std": 17932.989284184237,
|
510 |
+
"composite_z_score": 1150.6585893329318,
|
511 |
+
"thumbnail_url": "https://img.youtube.com/vi/ke80AP-eh9Y/0.jpg"
|
512 |
+
},
|
513 |
+
{
|
514 |
+
"video_id": "qEKNbKt_jiM",
|
515 |
+
"title": "RC Plane Challenge \ud83d\ude0c\u2705 #challenge #shortsviral #shorts #malayalam #viralshorts #rcplane #mission #gta",
|
516 |
+
"velocity_1_3h": 3885.5,
|
517 |
+
"velocity_3_6h": 0.0,
|
518 |
+
"velocity_6_12h": 5068.5,
|
519 |
+
"velocity_12h_1d": 2543.9166666666665,
|
520 |
+
"velocity_1d_3d": 5583.145833333333,
|
521 |
+
"acceleration_1_6h": -1295.1666666666667,
|
522 |
+
"acceleration_6_12h": 1689.5,
|
523 |
+
"engagement_ratio_1d": 0.762657091561939,
|
524 |
+
"like_comment_ratio_1d": 0.6661903961450104,
|
525 |
+
"spike_index": 1.7771762067981094,
|
526 |
+
"view_growth_std": 15672.51756791699,
|
527 |
+
"composite_z_score": 779.5480529985412,
|
528 |
+
"thumbnail_url": "https://img.youtube.com/vi/qEKNbKt_jiM/0.jpg"
|
529 |
+
},
|
530 |
+
{
|
531 |
+
"video_id": "YLNlQkToC94",
|
532 |
+
"title": "Duda pimenta \ud83c\udf36\ufe0f #cabelocacheado #cachos #cacheadas #shortsvideo #cabelos #cacheada #hair #cabelo",
|
533 |
+
"velocity_1_3h": 5113.5,
|
534 |
+
"velocity_3_6h": 6229.333333333333,
|
535 |
+
"velocity_6_12h": 5903.5,
|
536 |
+
"velocity_12h_1d": 5014.083333333333,
|
537 |
+
"velocity_1d_3d": 3916.5833333333335,
|
538 |
+
"acceleration_1_6h": 371.94444444444434,
|
539 |
+
"acceleration_6_12h": -108.61111111111101,
|
540 |
+
"engagement_ratio_1d": 0.16740967365967366,
|
541 |
+
"like_comment_ratio_1d": 60.78225806451613,
|
542 |
+
"spike_index": 1.9330629291375265,
|
543 |
+
"view_growth_std": 22010.716471376698,
|
544 |
+
"composite_z_score": 577.3391899064537,
|
545 |
+
"thumbnail_url": "https://img.youtube.com/vi/YLNlQkToC94/0.jpg"
|
546 |
+
},
|
547 |
+
{
|
548 |
+
"video_id": "W_Hv4PUr8bw",
|
549 |
+
"title": "I Love Irritating Him\ud83e\udd23#shorts #youtubeshorts #funny",
|
550 |
+
"velocity_1_3h": 3012.5,
|
551 |
+
"velocity_3_6h": 4170.0,
|
552 |
+
"velocity_6_12h": 4416.0,
|
553 |
+
"velocity_12h_1d": 4880.0,
|
554 |
+
"velocity_1d_3d": 3969.2291666666665,
|
555 |
+
"acceleration_1_6h": 385.8333333333333,
|
556 |
+
"acceleration_6_12h": 82.0,
|
557 |
+
"engagement_ratio_1d": 0.39913140679115283,
|
558 |
+
"like_comment_ratio_1d": 0.6031722665881574,
|
559 |
+
"spike_index": 2.261200297235814,
|
560 |
+
"view_growth_std": 23390.4433530021,
|
561 |
+
"composite_z_score": 574.7152942071147,
|
562 |
+
"thumbnail_url": "https://img.youtube.com/vi/W_Hv4PUr8bw/0.jpg"
|
563 |
+
},
|
564 |
+
{
|
565 |
+
"video_id": "QQUvk3GwgB8",
|
566 |
+
"title": "When the boy mistook movie actors for real zombies \ud83e\udd23 #shorts",
|
567 |
+
"velocity_1_3h": 12050.0,
|
568 |
+
"velocity_3_6h": 8368.666666666666,
|
569 |
+
"velocity_6_12h": 3970.8333333333335,
|
570 |
+
"velocity_12h_1d": 2093.0,
|
571 |
+
"velocity_1d_3d": 3993.0833333333335,
|
572 |
+
"acceleration_1_6h": -1227.1111111111113,
|
573 |
+
"acceleration_6_12h": -1465.9444444444441,
|
574 |
+
"engagement_ratio_1d": 1.764473894750713,
|
575 |
+
"like_comment_ratio_1d": 0.9149301299338073,
|
576 |
+
"spike_index": 1.023607445932179,
|
577 |
+
"view_growth_std": 672.5361824219324,
|
578 |
+
"composite_z_score": 570.969137050305,
|
579 |
+
"thumbnail_url": "https://img.youtube.com/vi/QQUvk3GwgB8/0.jpg"
|
580 |
+
}
|
581 |
+
]
|
582 |
+
}
|
583 |
+
],
|
584 |
+
"section_2_Viral_Topics": [
|
585 |
+
{
|
586 |
+
"trend_archetype_cluster": "Consistent Performer",
|
587 |
+
"bertopic_topic": 22,
|
588 |
+
"topic_name": "diy_craft_paper_project",
|
589 |
+
"video_count": 211,
|
590 |
+
"median_views_3d": 3180.0,
|
591 |
+
"virality_consistency": 0.299,
|
592 |
+
"topic_viral_score": 0.785,
|
593 |
+
"signals": {
|
594 |
+
"z_velocity_1_3h": 1.112,
|
595 |
+
"z_velocity_3_6h": 1.097,
|
596 |
+
"z_acceleration_1_6h": -0.479,
|
597 |
+
"z_engagement_ratio_1d": 1.228,
|
598 |
+
"z_like_comment_ratio_1d": 0.943,
|
599 |
+
"z_spike_index": 0.269,
|
600 |
+
"z_view_growth_std": 1.446
|
601 |
+
},
|
602 |
+
"sample_videos": [
|
603 |
+
{
|
604 |
+
"video_id": "AUam3DHU36U",
|
605 |
+
"title": "Lampu kaka #diy #kreatif #viral #art #craft",
|
606 |
+
"viewCount_3d": 167857,
|
607 |
+
"engagement_ratio_1d": 2.8151126772570976,
|
608 |
+
"spike_index": 1.9051015837496812,
|
609 |
+
"viral_video_score": 3.41238578780253,
|
610 |
+
"thumbnail_url": "https://img.youtube.com/vi/AUam3DHU36U/0.jpg"
|
611 |
+
},
|
612 |
+
{
|
613 |
+
"video_id": "ZVibcUls2WY",
|
614 |
+
"title": "Beautiful Front Page Design: ART \ud83c\udfa8 #shorts #nhuandaocalligraphy #frontpage",
|
615 |
+
"viewCount_3d": 178380,
|
616 |
+
"engagement_ratio_1d": 1.91229169838015,
|
617 |
+
"spike_index": 1.8567799077391558,
|
618 |
+
"viral_video_score": 3.4057393974310055,
|
619 |
+
"thumbnail_url": "https://img.youtube.com/vi/ZVibcUls2WY/0.jpg"
|
620 |
+
},
|
621 |
+
{
|
622 |
+
"video_id": "p_zvbMcFkVA",
|
623 |
+
"title": "Simple DIY Front Page Design \ud83c\udf4e #shorts #frontpage #nhuandaocalligraphy",
|
624 |
+
"viewCount_3d": 106765,
|
625 |
+
"engagement_ratio_1d": 0.31956615086117784,
|
626 |
+
"spike_index": 2.08676079380078,
|
627 |
+
"viral_video_score": 3.3749681162570777,
|
628 |
+
"thumbnail_url": "https://img.youtube.com/vi/p_zvbMcFkVA/0.jpg"
|
629 |
+
}
|
630 |
+
],
|
631 |
+
"genai_summary": "This topic consistently performs well, demonstrating robust viewership and strong engagement, particularly in likes and comments. Its sustained virality is driven by the intrinsic appeal of creative, hands-on projects and the satisfaction of tangible results. The content fosters a highly active community eager for new ideas and tutorials. Brands in art supplies, stationery, or home decor should leverage this by sponsoring step-by-step guides or creative challenges with popular DIY creators to showcase product utility and inspire purchases."
|
632 |
+
},
|
633 |
+
{
|
634 |
+
"trend_archetype_cluster": "Consistent Performer",
|
635 |
+
"bertopic_topic": 17,
|
636 |
+
"topic_name": "fashion_outfit_showcase_dress",
|
637 |
+
"video_count": 266,
|
638 |
+
"median_views_3d": 2265.5,
|
639 |
+
"virality_consistency": 0.282,
|
640 |
+
"topic_viral_score": 0.764,
|
641 |
+
"signals": {
|
642 |
+
"z_velocity_1_3h": 0.892,
|
643 |
+
"z_velocity_3_6h": 1.115,
|
644 |
+
"z_acceleration_1_6h": -0.188,
|
645 |
+
"z_engagement_ratio_1d": 1.469,
|
646 |
+
"z_like_comment_ratio_1d": 1.06,
|
647 |
+
"z_spike_index": 0.039,
|
648 |
+
"z_view_growth_std": 1.034
|
649 |
+
},
|
650 |
+
"sample_videos": [
|
651 |
+
{
|
652 |
+
"video_id": "xX2fDbLGfTg",
|
653 |
+
"title": "things that make you chic\u2728\ud83d\uded0. #shorts #glowup",
|
654 |
+
"viewCount_3d": 98247,
|
655 |
+
"engagement_ratio_1d": 1.650011941724385,
|
656 |
+
"spike_index": 1.8419317914392215,
|
657 |
+
"viral_video_score": 3.4051564346010363,
|
658 |
+
"thumbnail_url": "https://img.youtube.com/vi/xX2fDbLGfTg/0.jpg"
|
659 |
+
},
|
660 |
+
{
|
661 |
+
"video_id": "Y-jrP7TuuQE",
|
662 |
+
"title": "Outfits I\u2019d wear as a teacher\ud83d\udc69\ud83c\udffc\u200d\ud83c\udfeb#shorts #shortsfeed #tiktok #adiaava #trending #school #outfits",
|
663 |
+
"viewCount_3d": 156264,
|
664 |
+
"engagement_ratio_1d": 1.3091831956130942,
|
665 |
+
"spike_index": 1.8554409938328495,
|
666 |
+
"viral_video_score": 3.2878284736894843,
|
667 |
+
"thumbnail_url": "https://img.youtube.com/vi/Y-jrP7TuuQE/0.jpg"
|
668 |
+
},
|
669 |
+
{
|
670 |
+
"video_id": "5Yu2moMhdOk",
|
671 |
+
"title": "hangi kombin? #ke\u015ffetoll #ke\u015ffetbeni\u00f6ne\u00e7\u0131kar #videomke\u015ffetolsun #viralvideo #ke\u015ffet\u00f6nec\u0131ks\u0131nvideom",
|
672 |
+
"viewCount_3d": 52084,
|
673 |
+
"engagement_ratio_1d": 1.170161122540974,
|
674 |
+
"spike_index": 1.857774463127068,
|
675 |
+
"viral_video_score": 3.1170550549847467,
|
676 |
+
"thumbnail_url": "https://img.youtube.com/vi/5Yu2moMhdOk/0.jpg"
|
677 |
+
}
|
678 |
+
],
|
679 |
+
"genai_summary": "A strong and consistent performer, this topic maintains high viewership and exceptional engagement, indicating a deeply interested audience. Its viral appeal stems from aspirational and relatable style inspiration, driving consistent demand for fresh outfit ideas and fashion showcases. The content thrives on visual appeal and personal expression. Fashion retailers, apparel brands, and stylists should collaborate with micro-influencers for 'haul' videos or styling tips, highlighting product versatility and encouraging direct sales through visual storytelling."
|
680 |
+
},
|
681 |
+
{
|
682 |
+
"trend_archetype_cluster": "Consistent Performer",
|
683 |
+
"bertopic_topic": 19,
|
684 |
+
"topic_name": "makeup_skincare_tutorial_application",
|
685 |
+
"video_count": 385,
|
686 |
+
"median_views_3d": 1769.0,
|
687 |
+
"virality_consistency": 0.192,
|
688 |
+
"topic_viral_score": 0.631,
|
689 |
+
"signals": {
|
690 |
+
"z_velocity_1_3h": 0.528,
|
691 |
+
"z_velocity_3_6h": 0.683,
|
692 |
+
"z_acceleration_1_6h": -0.289,
|
693 |
+
"z_engagement_ratio_1d": 1.355,
|
694 |
+
"z_like_comment_ratio_1d": 1.029,
|
695 |
+
"z_spike_index": 0.277,
|
696 |
+
"z_view_growth_std": 0.944
|
697 |
+
},
|
698 |
+
"sample_videos": [
|
699 |
+
{
|
700 |
+
"video_id": "QeUS_lXoLeg",
|
701 |
+
"title": "#youtube #youtubeshorts #makeuptutorial #lipcombo #lipstick",
|
702 |
+
"viewCount_3d": 138835,
|
703 |
+
"engagement_ratio_1d": 1.76455247448096,
|
704 |
+
"spike_index": 1.8548785270122106,
|
705 |
+
"viral_video_score": 3.4051305473718187,
|
706 |
+
"thumbnail_url": "https://img.youtube.com/vi/QeUS_lXoLeg/0.jpg"
|
707 |
+
},
|
708 |
+
{
|
709 |
+
"video_id": "pe_vhDRhcqE",
|
710 |
+
"title": "Makeup remove kar diya\ud83d\ude2e\ud83e\udd26\ud83c\udffc\u200d\u2640\ufe0f#viralvideos #viralshorts #tranding #trandingshorts",
|
711 |
+
"viewCount_3d": 85649,
|
712 |
+
"engagement_ratio_1d": 0.16470537211588504,
|
713 |
+
"spike_index": 2.397326290831665,
|
714 |
+
"viral_video_score": 3.4027317371352197,
|
715 |
+
"thumbnail_url": "https://img.youtube.com/vi/pe_vhDRhcqE/0.jpg"
|
716 |
+
},
|
717 |
+
{
|
718 |
+
"video_id": "I8h3fyursMY",
|
719 |
+
"title": "This gloss was flying off the shelves last restock\ud83d\ude4c\ud83c\udffc #lipgloss #shorts",
|
720 |
+
"viewCount_3d": 71587,
|
721 |
+
"engagement_ratio_1d": 1.4074416245493904,
|
722 |
+
"spike_index": 1.8780294496410104,
|
723 |
+
"viral_video_score": 3.2139478271869897,
|
724 |
+
"thumbnail_url": "https://img.youtube.com/vi/I8h3fyursMY/0.jpg"
|
725 |
+
}
|
726 |
+
],
|
727 |
+
"genai_summary": "This topic is a reliable performer with a large volume of content and strong engagement, particularly in likes and comments. Its consistent virality is fueled by the practical value of tutorials and product demonstrations, addressing common beauty needs and aspirations. Viewers are highly engaged, seeking solutions and inspiration. Beauty brands, cosmetic companies, and skincare lines should sponsor in-depth tutorials, product reviews, or 'get ready with me' content to demonstrate efficacy and build trust with a receptive audience."
|
728 |
+
},
|
729 |
+
{
|
730 |
+
"trend_archetype_cluster": "Explosive Viral Hit",
|
731 |
+
"bertopic_topic": 0,
|
732 |
+
"topic_name": "recipe_food_making_preparation",
|
733 |
+
"video_count": 234,
|
734 |
+
"median_views_3d": 2853.0,
|
735 |
+
"virality_consistency": 0.261,
|
736 |
+
"topic_viral_score": 0.597,
|
737 |
+
"signals": {
|
738 |
+
"z_velocity_1_3h": 0.986,
|
739 |
+
"z_velocity_3_6h": 1.144,
|
740 |
+
"z_acceleration_1_6h": -0.19,
|
741 |
+
"z_engagement_ratio_1d": -0.156,
|
742 |
+
"z_like_comment_ratio_1d": 1.448,
|
743 |
+
"z_spike_index": 0.163,
|
744 |
+
"z_view_growth_std": 1.403
|
745 |
+
},
|
746 |
+
"sample_videos": [
|
747 |
+
{
|
748 |
+
"video_id": "sTzhu3wzMvE",
|
749 |
+
"title": "#ChipotlePartner Trying the new @chipotle Adobo Ranch! #foodie #chipotle #eating #shorts",
|
750 |
+
"viewCount_3d": 1168186,
|
751 |
+
"engagement_ratio_1d": 0.12638091105990704,
|
752 |
+
"spike_index": 2.2385536069264975,
|
753 |
+
"viral_video_score": 3.4379940873070667,
|
754 |
+
"thumbnail_url": "https://img.youtube.com/vi/sTzhu3wzMvE/0.jpg"
|
755 |
+
},
|
756 |
+
{
|
757 |
+
"video_id": "CJa5Hc6zC6I",
|
758 |
+
"title": "OMG\ud83d\ude31 Your BUBBLE TEA\ud83e\uddcb if you\u2026\ud83e\udd2f\ud83d\udc96 #shorts #short",
|
759 |
+
"viewCount_3d": 1526203,
|
760 |
+
"engagement_ratio_1d": 0.09424689257062595,
|
761 |
+
"spike_index": 2.2434164700792927,
|
762 |
+
"viral_video_score": 3.433799701762739,
|
763 |
+
"thumbnail_url": "https://img.youtube.com/vi/CJa5Hc6zC6I/0.jpg"
|
764 |
+
},
|
765 |
+
{
|
766 |
+
"video_id": "B6f_MjloY4s",
|
767 |
+
"title": "99% wax and 1% jelly?!?!\ud83d\ude35 #shorts #candy",
|
768 |
+
"viewCount_3d": 1115897,
|
769 |
+
"engagement_ratio_1d": 0.02489137981632989,
|
770 |
+
"spike_index": 2.239936510058886,
|
771 |
+
"viral_video_score": 3.422535800140751,
|
772 |
+
"thumbnail_url": "https://img.youtube.com/vi/B6f_MjloY4s/0.jpg"
|
773 |
+
}
|
774 |
+
],
|
775 |
+
"genai_summary": "This topic is an explosive viral hit, characterized by rapid view growth and exceptionally high positive reactions, despite moderate overall engagement. Its virality is driven by visually compelling, quick-to-digest food content and innovative recipes that captivate audiences. The content's shareability fuels its rapid spread. Food brands, kitchen appliance manufacturers, and ingredient suppliers should focus on short-form, dynamic recipe videos or food hacks. Partner with popular food creators for sponsored content that seamlessly integrates product usage."
|
776 |
+
},
|
777 |
+
{
|
778 |
+
"trend_archetype_cluster": "Explosive Viral Hit",
|
779 |
+
"bertopic_topic": 6,
|
780 |
+
"topic_name": "animal_dog_cute_pet",
|
781 |
+
"video_count": 233,
|
782 |
+
"median_views_3d": 3407.0,
|
783 |
+
"virality_consistency": 0.245,
|
784 |
+
"topic_viral_score": 0.526,
|
785 |
+
"signals": {
|
786 |
+
"z_velocity_1_3h": 0.928,
|
787 |
+
"z_velocity_3_6h": 1.057,
|
788 |
+
"z_acceleration_1_6h": -0.489,
|
789 |
+
"z_engagement_ratio_1d": 0.044,
|
790 |
+
"z_like_comment_ratio_1d": 1.285,
|
791 |
+
"z_spike_index": 0.221,
|
792 |
+
"z_view_growth_std": 1.468
|
793 |
+
},
|
794 |
+
"sample_videos": [
|
795 |
+
{
|
796 |
+
"video_id": "wS6rHeKonGg",
|
797 |
+
"title": "Jangan terburu-buru menolong burung ini #shorts",
|
798 |
+
"viewCount_3d": 209928,
|
799 |
+
"engagement_ratio_1d": 0.05095492389849028,
|
800 |
+
"spike_index": 2.0174649021282014,
|
801 |
+
"viral_video_score": 2.954095907034081,
|
802 |
+
"thumbnail_url": "https://img.youtube.com/vi/wS6rHeKonGg/0.jpg"
|
803 |
+
},
|
804 |
+
{
|
805 |
+
"video_id": "VF-fnFvW8G4",
|
806 |
+
"title": "Incoming Danger \ud83e\udd23 #funny #cat #shorts #dog #shortsfeed #animals #dubbingdappa #catvideos #dogshorts",
|
807 |
+
"viewCount_3d": 1165228,
|
808 |
+
"engagement_ratio_1d": 0.10487518450921289,
|
809 |
+
"spike_index": 2.0944968254164227,
|
810 |
+
"viral_video_score": 2.911880908329994,
|
811 |
+
"thumbnail_url": "https://img.youtube.com/vi/VF-fnFvW8G4/0.jpg"
|
812 |
+
},
|
813 |
+
{
|
814 |
+
"video_id": "PbvZzCVFk3g",
|
815 |
+
"title": "Baby x Gorilla\ud83d\udc76\ud83c\udffb\ud83e\udd8d #shorts",
|
816 |
+
"viewCount_3d": 580500,
|
817 |
+
"engagement_ratio_1d": 0.3693744854120242,
|
818 |
+
"spike_index": 2.8140037833210365,
|
819 |
+
"viral_video_score": 2.7839294835341275,
|
820 |
+
"thumbnail_url": "https://img.youtube.com/vi/PbvZzCVFk3g/0.jpg"
|
821 |
+
}
|
822 |
+
],
|
823 |
+
"genai_summary": "An explosive viral hit, this topic achieves high viewership and rapid growth, propelled by the universal appeal of cute and entertaining pets. While overall engagement is moderate, the strong positive reactions indicate content that deeply resonates emotionally and is highly shareable. The lighthearted and heartwarming nature drives its viral behavior. Pet food, accessory brands, or animal welfare organizations should create short, humorous, or heartwarming content featuring pets. Collaborate with popular pet influencers to showcase products or promote adoption campaigns."
|
824 |
+
},
|
825 |
+
{
|
826 |
+
"trend_archetype_cluster": "Explosive Viral Hit",
|
827 |
+
"bertopic_topic": 15,
|
828 |
+
"topic_name": "informational_facts_fact_educational",
|
829 |
+
"video_count": 286,
|
830 |
+
"median_views_3d": 3328.5,
|
831 |
+
"virality_consistency": 0.203,
|
832 |
+
"topic_viral_score": 0.483,
|
833 |
+
"signals": {
|
834 |
+
"z_velocity_1_3h": 0.596,
|
835 |
+
"z_velocity_3_6h": 0.917,
|
836 |
+
"z_acceleration_1_6h": -0.172,
|
837 |
+
"z_engagement_ratio_1d": -0.252,
|
838 |
+
"z_like_comment_ratio_1d": 1.744,
|
839 |
+
"z_spike_index": 0.34,
|
840 |
+
"z_view_growth_std": 1.206
|
841 |
+
},
|
842 |
+
"sample_videos": [
|
843 |
+
{
|
844 |
+
"video_id": "NteDdzbTMAg",
|
845 |
+
"title": "Pupil color represents different abilities.\ud83d\ude33#shorts",
|
846 |
+
"viewCount_3d": 2294748,
|
847 |
+
"engagement_ratio_1d": 0.14846049995097535,
|
848 |
+
"spike_index": 2.266846755425305,
|
849 |
+
"viral_video_score": 3.4458809716505963,
|
850 |
+
"thumbnail_url": "https://img.youtube.com/vi/NteDdzbTMAg/0.jpg"
|
851 |
+
},
|
852 |
+
{
|
853 |
+
"video_id": "xKyjFdW8y_Y",
|
854 |
+
"title": "\u201cDo you feel itchy scalp?\u201d#fyp #greysanatomy #shorts #tvshow",
|
855 |
+
"viewCount_3d": 3073559,
|
856 |
+
"engagement_ratio_1d": 0.37146209736651387,
|
857 |
+
"spike_index": 2.3134094239238268,
|
858 |
+
"viral_video_score": 3.186356165154621,
|
859 |
+
"thumbnail_url": "https://img.youtube.com/vi/xKyjFdW8y_Y/0.jpg"
|
860 |
+
},
|
861 |
+
{
|
862 |
+
"video_id": "x6eMF_2PZL4",
|
863 |
+
"title": "\u3010\u3060\u304b\u3089\uff1f\u3011\u685c\u306f\u4e2d\u56fd\u539f\u7523\u3067\u3059 #shorts",
|
864 |
+
"viewCount_3d": 136440,
|
865 |
+
"engagement_ratio_1d": 0.19760542487815216,
|
866 |
+
"spike_index": 2.1981604000517567,
|
867 |
+
"viral_video_score": 3.142882052691633,
|
868 |
+
"thumbnail_url": "https://img.youtube.com/vi/x6eMF_2PZL4/0.jpg"
|
869 |
+
}
|
870 |
+
],
|
871 |
+
"genai_summary": "This topic is an explosive viral hit, marked by significant view growth and exceptionally high positive reactions, despite lower overall engagement. Its virality stems from concise, surprising, and highly shareable factual content that educates and entertains. The strong positive reception indicates content is highly valued for its informational impact. Educational platforms, non-profits, or brands aiming to simplify complex information should develop short, engaging 'did you know' style videos or myth-busting content for educational marketing campaigns or CSR initiatives."
|
872 |
+
},
|
873 |
+
{
|
874 |
+
"trend_archetype_cluster": "Gradual Climber",
|
875 |
+
"bertopic_topic": 14,
|
876 |
+
"topic_name": "family_father_mother_mom",
|
877 |
+
"video_count": 266,
|
878 |
+
"median_views_3d": 10932.5,
|
879 |
+
"virality_consistency": 0.395,
|
880 |
+
"topic_viral_score": 1.023,
|
881 |
+
"signals": {
|
882 |
+
"z_velocity_1_3h": 1.727,
|
883 |
+
"z_velocity_3_6h": 1.69,
|
884 |
+
"z_acceleration_1_6h": -0.611,
|
885 |
+
"z_engagement_ratio_1d": 1.186,
|
886 |
+
"z_like_comment_ratio_1d": 1.508,
|
887 |
+
"z_spike_index": 0.118,
|
888 |
+
"z_view_growth_std": 1.791
|
889 |
+
},
|
890 |
+
"sample_videos": [
|
891 |
+
{
|
892 |
+
"video_id": "NlxByZGqic0",
|
893 |
+
"title": "Mi mam\u00e1 me culp\u00f3 de algo que ella hizo \ud83d\ude2d #youtubeshorts #shortvideo",
|
894 |
+
"viewCount_3d": 458272,
|
895 |
+
"engagement_ratio_1d": 0.15085770224584807,
|
896 |
+
"spike_index": 2.4135202230786454,
|
897 |
+
"viral_video_score": 4.266892158740524,
|
898 |
+
"thumbnail_url": "https://img.youtube.com/vi/NlxByZGqic0/0.jpg"
|
899 |
+
},
|
900 |
+
{
|
901 |
+
"video_id": "LNdnvpOB3cY",
|
902 |
+
"title": "Mom FACE TREND \ud83d\ude1c #shorts #Asianmom #roseneale #trending #relatable #viral #funny #comedy #fpy #skit",
|
903 |
+
"viewCount_3d": 121811,
|
904 |
+
"engagement_ratio_1d": 0.36097429463183983,
|
905 |
+
"spike_index": 2.3441587194287066,
|
906 |
+
"viral_video_score": 3.9207089928659453,
|
907 |
+
"thumbnail_url": "https://img.youtube.com/vi/LNdnvpOB3cY/0.jpg"
|
908 |
+
},
|
909 |
+
{
|
910 |
+
"video_id": "RfIFisdOPUE",
|
911 |
+
"title": "You get there chance to choose your family #km#shortsviral #ytshorts #youtubeshorts #shorts #funny",
|
912 |
+
"viewCount_3d": 191350,
|
913 |
+
"engagement_ratio_1d": 0.07418634505226594,
|
914 |
+
"spike_index": 2.1066557967923294,
|
915 |
+
"viral_video_score": 3.6689231181450044,
|
916 |
+
"thumbnail_url": "https://img.youtube.com/vi/RfIFisdOPUE/0.jpg"
|
917 |
+
}
|
918 |
+
],
|
919 |
+
"genai_summary": "This topic is a strong gradual climber, boasting exceptionally high viewership and robust engagement, indicating deep audience connection. Its consistent virality is driven by relatable family dynamics and emotional storytelling, evoking humor, nostalgia, or shared experiences. This fosters high shareability and sustained interest. Family-oriented brands, consumer goods, or services targeting parents should create heartwarming or authentic content depicting everyday family life. Collaborate with parent influencers to promote products that simplify or enhance family experiences."
|
920 |
+
},
|
921 |
+
{
|
922 |
+
"trend_archetype_cluster": "Gradual Climber",
|
923 |
+
"bertopic_topic": 18,
|
924 |
+
"topic_name": "relatable_situational_situations_everyday",
|
925 |
+
"video_count": 381,
|
926 |
+
"median_views_3d": 8001.0,
|
927 |
+
"virality_consistency": 0.236,
|
928 |
+
"topic_viral_score": 0.856,
|
929 |
+
"signals": {
|
930 |
+
"z_velocity_1_3h": 0.984,
|
931 |
+
"z_velocity_3_6h": 1.266,
|
932 |
+
"z_acceleration_1_6h": -0.049,
|
933 |
+
"z_engagement_ratio_1d": 1.324,
|
934 |
+
"z_like_comment_ratio_1d": 1.17,
|
935 |
+
"z_spike_index": 0.146,
|
936 |
+
"z_view_growth_std": 1.17
|
937 |
+
},
|
938 |
+
"sample_videos": [
|
939 |
+
{
|
940 |
+
"video_id": "5_1RNoXW3T4",
|
941 |
+
"title": "Rahul tere sang chalungi \u2764\ufe0f\ud83d\ude02 #viral #trending #public",
|
942 |
+
"viewCount_3d": 331968,
|
943 |
+
"engagement_ratio_1d": 0.10070122125660375,
|
944 |
+
"spike_index": 2.3834199621235355,
|
945 |
+
"viral_video_score": 4.048532573205088,
|
946 |
+
"thumbnail_url": "https://img.youtube.com/vi/5_1RNoXW3T4/0.jpg"
|
947 |
+
},
|
948 |
+
{
|
949 |
+
"video_id": "jDeJQ0jzqgY",
|
950 |
+
"title": "Pov Ketika shampoo kamu ketinggalan di toilet.!!! #reels #shampoo #shorts",
|
951 |
+
"viewCount_3d": 135529,
|
952 |
+
"engagement_ratio_1d": 0.1600316962670755,
|
953 |
+
"spike_index": 2.1476726107253645,
|
954 |
+
"viral_video_score": 3.861712722684066,
|
955 |
+
"thumbnail_url": "https://img.youtube.com/vi/jDeJQ0jzqgY/0.jpg"
|
956 |
+
},
|
957 |
+
{
|
958 |
+
"video_id": "BFtFDc7iPWY",
|
959 |
+
"title": "\u0c1f\u0c4d\u0c30\u0c3e\u0c15\u0c4d\u0c1f\u0c30\u0c4d \u0c15\u0c4a\u0c28\u0c3f \u0c2a\u0c46\u0c26\u0c4d\u0c26 \u0c06\u0c2a\u0c24\u0c3f \u0c10\u0c2a\u0c4b\u0c2f\u0c3f\u0c02\u0c26\u0c3f \u0c2a\u0c4b\u2026 #ownvoice #viralreels #tractor",
|
960 |
+
"viewCount_3d": 168653,
|
961 |
+
"engagement_ratio_1d": 0.10816675307717419,
|
962 |
+
"spike_index": 2.2937191501134095,
|
963 |
+
"viral_video_score": 3.7686367078434673,
|
964 |
+
"thumbnail_url": "https://img.youtube.com/vi/BFtFDc7iPWY/0.jpg"
|
965 |
+
}
|
966 |
+
],
|
967 |
+
"genai_summary": "A consistent gradual climber, this topic shows strong viewership and high engagement, indicating its content deeply resonates. Its virality is fueled by the universal appeal of everyday scenarios and shared experiences, fostering a strong sense of connection and encouraging sharing. The humor and authenticity drive consistent viewership. Brands in consumer goods, entertainment, or lifestyle should develop short, humorous skits or vignettes that highlight common daily situations. This is ideal for showcasing how products or services offer relatable solutions or add value."
|
968 |
+
},
|
969 |
+
{
|
970 |
+
"trend_archetype_cluster": "Gradual Climber",
|
971 |
+
"bertopic_topic": 8,
|
972 |
+
"topic_name": "couple_relationship_husband_wife",
|
973 |
+
"video_count": 387,
|
974 |
+
"median_views_3d": 7098.0,
|
975 |
+
"virality_consistency": 0.274,
|
976 |
+
"topic_viral_score": 0.849,
|
977 |
+
"signals": {
|
978 |
+
"z_velocity_1_3h": 1.149,
|
979 |
+
"z_velocity_3_6h": 1.259,
|
980 |
+
"z_acceleration_1_6h": -0.136,
|
981 |
+
"z_engagement_ratio_1d": 1.297,
|
982 |
+
"z_like_comment_ratio_1d": 1.29,
|
983 |
+
"z_spike_index": 0.114,
|
984 |
+
"z_view_growth_std": 1.294
|
985 |
+
},
|
986 |
+
"sample_videos": [
|
987 |
+
{
|
988 |
+
"video_id": "Y-EnblwhWK0",
|
989 |
+
"title": "Ayioo\ud83d\ude31pocheyy\ud83e\udd75watch End\ud83d\ude02\ud83d\udd25#trending #funny #couple #tamil #reels #comedy #love #shorts #status",
|
990 |
+
"viewCount_3d": 159542,
|
991 |
+
"engagement_ratio_1d": 0.1699272967614012,
|
992 |
+
"spike_index": 2.2683800059799406,
|
993 |
+
"viral_video_score": 3.8317922934505217,
|
994 |
+
"thumbnail_url": "https://img.youtube.com/vi/Y-EnblwhWK0/0.jpg"
|
995 |
+
},
|
996 |
+
{
|
997 |
+
"video_id": "AyryOTWjSmc",
|
998 |
+
"title": "Shadi mai kuch log \u2026.. #abrazkhan #shorts",
|
999 |
+
"viewCount_3d": 402289,
|
1000 |
+
"engagement_ratio_1d": 0.052396115426202025,
|
1001 |
+
"spike_index": 2.5351732944961274,
|
1002 |
+
"viral_video_score": 3.800705736275976,
|
1003 |
+
"thumbnail_url": "https://img.youtube.com/vi/AyryOTWjSmc/0.jpg"
|
1004 |
+
},
|
1005 |
+
{
|
1006 |
+
"video_id": "JTTNGd7IXY4",
|
1007 |
+
"title": "Bach Gayi Aaj\ud83d\ude21 #Shorts #CoupleComedy #CelebrateWithShorts",
|
1008 |
+
"viewCount_3d": 170852,
|
1009 |
+
"engagement_ratio_1d": 0.10578528316424811,
|
1010 |
+
"spike_index": 1.9876271165531443,
|
1011 |
+
"viral_video_score": 3.7302159346843844,
|
1012 |
+
"thumbnail_url": "https://img.youtube.com/vi/JTTNGd7IXY4/0.jpg"
|
1013 |
+
}
|
1014 |
+
],
|
1015 |
+
"genai_summary": "This topic is a strong gradual climber, demonstrating high viewership and excellent engagement. Its viral appeal lies in authentic, often humorous or heartwarming, portrayals of relationship dynamics, fostering a strong emotional connection with the audience. This leads to high shareability and sustained interest. Brands targeting couples, such as travel, home goods, or gift-related products, should collaborate with popular couple influencers. Create relatable content showcasing products within relationship contexts, emphasizing shared experiences and joy."
|
1016 |
+
},
|
1017 |
+
{
|
1018 |
+
"trend_archetype_cluster": "Momentum Builder",
|
1019 |
+
"bertopic_topic": 2,
|
1020 |
+
"topic_name": "sports_football_highlight_reel",
|
1021 |
+
"video_count": 447,
|
1022 |
+
"median_views_3d": 4239.0,
|
1023 |
+
"virality_consistency": 0.217,
|
1024 |
+
"topic_viral_score": 0.726,
|
1025 |
+
"signals": {
|
1026 |
+
"z_velocity_1_3h": 0.883,
|
1027 |
+
"z_velocity_3_6h": 1.048,
|
1028 |
+
"z_acceleration_1_6h": -0.065,
|
1029 |
+
"z_engagement_ratio_1d": 0.928,
|
1030 |
+
"z_like_comment_ratio_1d": 0.878,
|
1031 |
+
"z_spike_index": 0.148,
|
1032 |
+
"z_view_growth_std": 1.371
|
1033 |
+
},
|
1034 |
+
"sample_videos": [
|
1035 |
+
{
|
1036 |
+
"video_id": "c7DOWrxW-00",
|
1037 |
+
"title": "Trent explains why he changed the name on his shirt \ud83d\udc55\u26aa\ufe0f",
|
1038 |
+
"viewCount_3d": 365997,
|
1039 |
+
"engagement_ratio_1d": 0.2597933667468833,
|
1040 |
+
"spike_index": 2.2431115861135797,
|
1041 |
+
"viral_video_score": 3.981742195184278,
|
1042 |
+
"thumbnail_url": "https://img.youtube.com/vi/c7DOWrxW-00/0.jpg"
|
1043 |
+
},
|
1044 |
+
{
|
1045 |
+
"video_id": "gezEsSRB97U",
|
1046 |
+
"title": "1v1 vs Michael Jordan #shorts",
|
1047 |
+
"viewCount_3d": 1051729,
|
1048 |
+
"engagement_ratio_1d": 0.12474901072061811,
|
1049 |
+
"spike_index": 2.589132780684615,
|
1050 |
+
"viral_video_score": 3.9521441943406685,
|
1051 |
+
"thumbnail_url": "https://img.youtube.com/vi/gezEsSRB97U/0.jpg"
|
1052 |
+
},
|
1053 |
+
{
|
1054 |
+
"video_id": "2BV3H9HatQM",
|
1055 |
+
"title": "\u3010\u30d0\u30b9\u30b1\u3011\u30d0\u30b9\u30b1\u304c\u4e0a\u624b\u3044\u82b8\u80fd\u4eba3\u9078#shorts #\u30d0\u30b9\u30b1 #basketball #\u82b8\u80fd\u4eba",
|
1056 |
+
"viewCount_3d": 558422,
|
1057 |
+
"engagement_ratio_1d": 0.14005456150204607,
|
1058 |
+
"spike_index": 2.4267849274676156,
|
1059 |
+
"viral_video_score": 3.767577548329056,
|
1060 |
+
"thumbnail_url": "https://img.youtube.com/vi/2BV3H9HatQM/0.jpg"
|
1061 |
+
}
|
1062 |
+
],
|
1063 |
+
"genai_summary": "This topic is a strong momentum builder, showing high content volume, good viewership, and solid engagement. Its virality is driven by the inherent excitement of sports, particularly dynamic highlights and compelling narratives around athletes. The rapid view growth indicates high demand for timely, impactful sports content, fostering a passionate and active community. Ideal for sports brands, athletic wear, or streaming services, focus on dynamic highlight reels, behind-the-scenes content, or fan reactions. Partner with commentators or athletes to amplify reach."
|
1064 |
+
},
|
1065 |
+
{
|
1066 |
+
"trend_archetype_cluster": "Momentum Builder",
|
1067 |
+
"bertopic_topic": 1,
|
1068 |
+
"topic_name": "religious_islamic_devotional_recitation",
|
1069 |
+
"video_count": 395,
|
1070 |
+
"median_views_3d": 2027.0,
|
1071 |
+
"virality_consistency": 0.106,
|
1072 |
+
"topic_viral_score": 0.596,
|
1073 |
+
"signals": {
|
1074 |
+
"z_velocity_1_3h": 0.38,
|
1075 |
+
"z_velocity_3_6h": 0.506,
|
1076 |
+
"z_acceleration_1_6h": -0.202,
|
1077 |
+
"z_engagement_ratio_1d": 1.637,
|
1078 |
+
"z_like_comment_ratio_1d": 1.395,
|
1079 |
+
"z_spike_index": 0.171,
|
1080 |
+
"z_view_growth_std": 0.653
|
1081 |
+
},
|
1082 |
+
"sample_videos": [
|
1083 |
+
{
|
1084 |
+
"video_id": "XDHKV1vWLIQ",
|
1085 |
+
"title": "#allah #dua #foryou #shorts",
|
1086 |
+
"viewCount_3d": 172190,
|
1087 |
+
"engagement_ratio_1d": 0.2916365782260632,
|
1088 |
+
"spike_index": 2.1721179140583304,
|
1089 |
+
"viral_video_score": 3.9020859078561463,
|
1090 |
+
"thumbnail_url": "https://img.youtube.com/vi/XDHKV1vWLIQ/0.jpg"
|
1091 |
+
},
|
1092 |
+
{
|
1093 |
+
"video_id": "tOsXp_8NZxI",
|
1094 |
+
"title": "DEUS EST\u00c1 AQUI, AGORA! #thechosen #osescolhidos #jesus #deus #series #shorts #biblia #filmes #cristo",
|
1095 |
+
"viewCount_3d": 72538,
|
1096 |
+
"engagement_ratio_1d": 0.18211821182118212,
|
1097 |
+
"spike_index": 2.014062719541174,
|
1098 |
+
"viral_video_score": 3.380815776436331,
|
1099 |
+
"thumbnail_url": "https://img.youtube.com/vi/tOsXp_8NZxI/0.jpg"
|
1100 |
+
},
|
1101 |
+
{
|
1102 |
+
"video_id": "EMTrNA87MnM",
|
1103 |
+
"title": "Bhagwan kis Qasoor ki \ud83d\ude4f\ud83d\ude2d\ud83d\udc4d#shorts #subscribe",
|
1104 |
+
"viewCount_3d": 133042,
|
1105 |
+
"engagement_ratio_1d": 0.06539996326782763,
|
1106 |
+
"spike_index": 2.2563291693630365,
|
1107 |
+
"viral_video_score": 3.3685562384805654,
|
1108 |
+
"thumbnail_url": "https://img.youtube.com/vi/EMTrNA87MnM/0.jpg"
|
1109 |
+
}
|
1110 |
+
],
|
1111 |
+
"genai_summary": "This topic is a momentum builder with high content volume and exceptionally strong engagement, indicating a deeply connected and devout audience. Its virality is driven by the spiritual significance and emotional impact of devotional content, fostering a loyal community around shared beliefs. The content resonates deeply, leading to consistent viewership. Suitable for religious organizations, publishers of spiritual content, or brands promoting values-aligned products, focus on authentic, inspiring content like recitations or reflections. Engage with community leaders to build trust and reach."
|
1112 |
+
},
|
1113 |
+
{
|
1114 |
+
"trend_archetype_cluster": "Momentum Builder",
|
1115 |
+
"bertopic_topic": 11,
|
1116 |
+
"topic_name": "motivational_quotes_quote_speech",
|
1117 |
+
"video_count": 631,
|
1118 |
+
"median_views_3d": 2661.0,
|
1119 |
+
"virality_consistency": 0.158,
|
1120 |
+
"topic_viral_score": 0.577,
|
1121 |
+
"signals": {
|
1122 |
+
"z_velocity_1_3h": 0.599,
|
1123 |
+
"z_velocity_3_6h": 0.776,
|
1124 |
+
"z_acceleration_1_6h": -0.116,
|
1125 |
+
"z_engagement_ratio_1d": 1.001,
|
1126 |
+
"z_like_comment_ratio_1d": 0.603,
|
1127 |
+
"z_spike_index": 0.183,
|
1128 |
+
"z_view_growth_std": 0.887
|
1129 |
+
},
|
1130 |
+
"sample_videos": [
|
1131 |
+
{
|
1132 |
+
"video_id": "XZOmgMPFfws",
|
1133 |
+
"title": "Kesempatan banget #shorts",
|
1134 |
+
"viewCount_3d": 595856,
|
1135 |
+
"engagement_ratio_1d": 0.09909364339207494,
|
1136 |
+
"spike_index": 2.6125604815940875,
|
1137 |
+
"viral_video_score": 3.74846937799384,
|
1138 |
+
"thumbnail_url": "https://img.youtube.com/vi/XZOmgMPFfws/0.jpg"
|
1139 |
+
},
|
1140 |
+
{
|
1141 |
+
"video_id": "JjEgoCLN8g8",
|
1142 |
+
"title": "When actors give thanks to God #Shorts",
|
1143 |
+
"viewCount_3d": 89085,
|
1144 |
+
"engagement_ratio_1d": 0.21501442153616065,
|
1145 |
+
"spike_index": 1.9413934304950027,
|
1146 |
+
"viral_video_score": 3.5533084102346164,
|
1147 |
+
"thumbnail_url": "https://img.youtube.com/vi/JjEgoCLN8g8/0.jpg"
|
1148 |
+
},
|
1149 |
+
{
|
1150 |
+
"video_id": "Jl05Q4ChICg",
|
1151 |
+
"title": "Respect \ud83d\udcaf #short #shorts #mashallah #allah #Viral #greatest",
|
1152 |
+
"viewCount_3d": 83072,
|
1153 |
+
"engagement_ratio_1d": 0.433306960747905,
|
1154 |
+
"spike_index": 2.1187255680548844,
|
1155 |
+
"viral_video_score": 3.531286693918469,
|
1156 |
+
"thumbnail_url": "https://img.youtube.com/vi/Jl05Q4ChICg/0.jpg"
|
1157 |
+
}
|
1158 |
+
],
|
1159 |
+
"genai_summary": "A significant momentum builder, this topic boasts an extremely high volume of content and consistent engagement. Its virality is fueled by the universal desire for inspiration and upliftment, providing quick, impactful bursts of positivity. The content thrives on its ability to resonate emotionally and be easily shareable. Applicable to personal development platforms, lifestyle brands, or coaching services, create short, impactful videos featuring inspiring quotes or snippets of motivational speeches. Leverage this for brand messaging aligned with empowerment and personal growth."
|
1160 |
+
},
|
1161 |
+
{
|
1162 |
+
"trend_archetype_cluster": "Organic Riser",
|
1163 |
+
"bertopic_topic": 8,
|
1164 |
+
"topic_name": "couple_relationship_husband_wife",
|
1165 |
+
"video_count": 226,
|
1166 |
+
"median_views_3d": 7048.5,
|
1167 |
+
"virality_consistency": 0.367,
|
1168 |
+
"topic_viral_score": 0.743,
|
1169 |
+
"signals": {
|
1170 |
+
"z_velocity_1_3h": 1.458,
|
1171 |
+
"z_velocity_3_6h": 1.712,
|
1172 |
+
"z_acceleration_1_6h": -0.638,
|
1173 |
+
"z_engagement_ratio_1d": 0.199,
|
1174 |
+
"z_like_comment_ratio_1d": 0.344,
|
1175 |
+
"z_spike_index": 0.194,
|
1176 |
+
"z_view_growth_std": 1.854
|
1177 |
+
},
|
1178 |
+
"sample_videos": [
|
1179 |
+
{
|
1180 |
+
"video_id": "-msl3fvwxYw",
|
1181 |
+
"title": "sali jija masti#shorts#subscribe #funny #love #funny #love #funny",
|
1182 |
+
"viewCount_3d": 46903,
|
1183 |
+
"engagement_ratio_1d": 4.999488360194423,
|
1184 |
+
"spike_index": 6.409434684574062,
|
1185 |
+
"viral_video_score": 3.3080066436006166,
|
1186 |
+
"thumbnail_url": "https://img.youtube.com/vi/-msl3fvwxYw/0.jpg"
|
1187 |
+
},
|
1188 |
+
{
|
1189 |
+
"video_id": "XnYcB6N49cI",
|
1190 |
+
"title": "Love is caring#trending #shorts #viral #funny",
|
1191 |
+
"viewCount_3d": 115050,
|
1192 |
+
"engagement_ratio_1d": 0.33670453495889907,
|
1193 |
+
"spike_index": 2.127934905047403,
|
1194 |
+
"viral_video_score": 3.263225932223879,
|
1195 |
+
"thumbnail_url": "https://img.youtube.com/vi/XnYcB6N49cI/0.jpg"
|
1196 |
+
},
|
1197 |
+
{
|
1198 |
+
"video_id": "s7mKbU8zw7A",
|
1199 |
+
"title": "Husband vs Wife\ud83d\ude02 | thoda sa pyaar #youtubeshorts #ytshorts #husbandwife #smartyworld",
|
1200 |
+
"viewCount_3d": 107581,
|
1201 |
+
"engagement_ratio_1d": 0.2515777937341748,
|
1202 |
+
"spike_index": 2.0731918110477396,
|
1203 |
+
"viral_video_score": 3.17256682187726,
|
1204 |
+
"thumbnail_url": "https://img.youtube.com/vi/s7mKbU8zw7A/0.jpg"
|
1205 |
+
}
|
1206 |
+
],
|
1207 |
+
"genai_summary": "This topic is an organic riser, demonstrating high viewership and very strong growth, indicating a rapidly expanding audience. Its virality is driven by relatable and often humorous depictions of relationship dynamics, making content highly shareable despite moderate direct engagement. The authentic portrayal of everyday couple interactions resonates broadly. Ideal for brands targeting couples or home-related products, focus on lighthearted content that captures these interactions. Partner with creators specializing in relationship humor to reach a broad and growing audience."
|
1208 |
+
},
|
1209 |
+
{
|
1210 |
+
"trend_archetype_cluster": "Organic Riser",
|
1211 |
+
"bertopic_topic": 12,
|
1212 |
+
"topic_name": "skit_comedy_about_short",
|
1213 |
+
"video_count": 557,
|
1214 |
+
"median_views_3d": 6278.0,
|
1215 |
+
"virality_consistency": 0.366,
|
1216 |
+
"topic_viral_score": 0.696,
|
1217 |
+
"signals": {
|
1218 |
+
"z_velocity_1_3h": 1.593,
|
1219 |
+
"z_velocity_3_6h": 1.544,
|
1220 |
+
"z_acceleration_1_6h": -1.09,
|
1221 |
+
"z_engagement_ratio_1d": 0.29,
|
1222 |
+
"z_like_comment_ratio_1d": 0.211,
|
1223 |
+
"z_spike_index": 0.113,
|
1224 |
+
"z_view_growth_std": 1.79
|
1225 |
+
},
|
1226 |
+
"sample_videos": [
|
1227 |
+
{
|
1228 |
+
"video_id": "CfW1s3JShBk",
|
1229 |
+
"title": "Bala Bala \ud83d\ude30\ud83d\ude0e #shorts #comedy",
|
1230 |
+
"viewCount_3d": 97593,
|
1231 |
+
"engagement_ratio_1d": 0.2359150556774434,
|
1232 |
+
"spike_index": 2.0708234799849836,
|
1233 |
+
"viral_video_score": 2.938115146870472,
|
1234 |
+
"thumbnail_url": "https://img.youtube.com/vi/CfW1s3JShBk/0.jpg"
|
1235 |
+
},
|
1236 |
+
{
|
1237 |
+
"video_id": "eyFwALIPJBc",
|
1238 |
+
"title": "\u0d1a\u0d3f\u0d30\u0d3f\u0d1a\u0d4d\u0d1a\u0d41 \u0d2e\u0d1f\u0d41\u0d24\u0d4d\u0d24\u0d41 \ud83d\ude04\ud83d\ude04#shorts #shortcomedy #shortvideo #comedy",
|
1239 |
+
"viewCount_3d": 120132,
|
1240 |
+
"engagement_ratio_1d": 2.2080535612204364,
|
1241 |
+
"spike_index": 1.9130531762172978,
|
1242 |
+
"viral_video_score": 2.846979460906416,
|
1243 |
+
"thumbnail_url": "https://img.youtube.com/vi/eyFwALIPJBc/0.jpg"
|
1244 |
+
},
|
1245 |
+
{
|
1246 |
+
"video_id": "zmaCW37hfiA",
|
1247 |
+
"title": "Akibat begadang\ud83d\ude02 #shortvideo #shortsviral #shorts #trending #viralvideo #fyp #funny #lucu #games",
|
1248 |
+
"viewCount_3d": 173299,
|
1249 |
+
"engagement_ratio_1d": 1.9684761738523302,
|
1250 |
+
"spike_index": 1.8191562999893536,
|
1251 |
+
"viral_video_score": 2.82543557285618,
|
1252 |
+
"thumbnail_url": "https://img.youtube.com/vi/zmaCW37hfiA/0.jpg"
|
1253 |
+
}
|
1254 |
+
],
|
1255 |
+
"genai_summary": "As an organic riser, this topic shows very strong growth and high viewership, driven by its short, punchy comedic content. The universal appeal of humor makes these skits highly shareable, fueling rapid audience adoption despite moderate direct engagement. Its viral behavior is rooted in its ability to provide quick entertainment. Excellent for entertainment platforms, snack brands, or any brand seeking lighthearted, viral content, develop short, relatable comedic skits that subtly integrate product placements or brand messaging to maximize shareability and reach."
|
1256 |
+
},
|
1257 |
+
{
|
1258 |
+
"trend_archetype_cluster": "Organic Riser",
|
1259 |
+
"bertopic_topic": 18,
|
1260 |
+
"topic_name": "relatable_situational_situations_everyday",
|
1261 |
+
"video_count": 228,
|
1262 |
+
"median_views_3d": 6118.5,
|
1263 |
+
"virality_consistency": 0.355,
|
1264 |
+
"topic_viral_score": 0.676,
|
1265 |
+
"signals": {
|
1266 |
+
"z_velocity_1_3h": 1.388,
|
1267 |
+
"z_velocity_3_6h": 1.519,
|
1268 |
+
"z_acceleration_1_6h": -0.919,
|
1269 |
+
"z_engagement_ratio_1d": 0.274,
|
1270 |
+
"z_like_comment_ratio_1d": 0.331,
|
1271 |
+
"z_spike_index": 0.033,
|
1272 |
+
"z_view_growth_std": 1.339
|
1273 |
+
},
|
1274 |
+
"sample_videos": [
|
1275 |
+
{
|
1276 |
+
"video_id": "lqsnCeqQ-lI",
|
1277 |
+
"title": "Mi pap\u00e1 el alba\u00f1il @alfredolarin #humor #comedia #fyp #shortsfeed #shorts",
|
1278 |
+
"viewCount_3d": 108606,
|
1279 |
+
"engagement_ratio_1d": 0.2520307027349281,
|
1280 |
+
"spike_index": 2.1613387068298917,
|
1281 |
+
"viral_video_score": 3.3811115080011893,
|
1282 |
+
"thumbnail_url": "https://img.youtube.com/vi/lqsnCeqQ-lI/0.jpg"
|
1283 |
+
},
|
1284 |
+
{
|
1285 |
+
"video_id": "v-RIornfpdw",
|
1286 |
+
"title": "si o no? pt.2! #tiktok #shorts",
|
1287 |
+
"viewCount_3d": 114881,
|
1288 |
+
"engagement_ratio_1d": 0.34634860447814925,
|
1289 |
+
"spike_index": 1.9188039284838998,
|
1290 |
+
"viral_video_score": 2.9932694810061267,
|
1291 |
+
"thumbnail_url": "https://img.youtube.com/vi/v-RIornfpdw/0.jpg"
|
1292 |
+
},
|
1293 |
+
{
|
1294 |
+
"video_id": "2DtIVw9Y9uU",
|
1295 |
+
"title": "Mai kuchh galat bol diya\ud83e\udd23 ?#funny #shorts #youtubeshorts",
|
1296 |
+
"viewCount_3d": 81418,
|
1297 |
+
"engagement_ratio_1d": 2.1372558838257385,
|
1298 |
+
"spike_index": 1.8766835254587575,
|
1299 |
+
"viral_video_score": 2.5823595329147184,
|
1300 |
+
"thumbnail_url": "https://img.youtube.com/vi/2DtIVw9Y9uU/0.jpg"
|
1301 |
+
}
|
1302 |
+
],
|
1303 |
+
"genai_summary": "This topic is an organic riser, exhibiting significant growth and high viewership, indicating content that strongly resonates with common experiences. Its rapid spread is fueled by the universal appeal of relatable scenarios, making it highly shareable despite moderate direct engagement. The authenticity of these everyday situations drives its viral potential. Suitable for consumer goods, lifestyle brands, or services addressing daily challenges, create short, humorous, or insightful content depicting relatable situations. Collaborate with creators skilled in observational humor to connect with a broad, growing audience."
|
1304 |
+
}
|
1305 |
+
],
|
1306 |
+
"section_3_Nascent_Trends": {
|
1307 |
+
"Nascent_Topics_summary": {
|
1308 |
+
"executive_summary": "Short-form video data reveals a diverse array of nascent topics exhibiting early momentum and promising engagement. These trends span pop culture, lifestyle, and practical interests, indicating broad audience appeal and fertile ground for marketers seeking early-mover advantage. While still low in cumulative exposure, their consistent engagement signals significant potential for growth and influence.",
|
1309 |
+
"key_insights": [
|
1310 |
+
"Momentum is broad, with early signals across entertainment, lifestyle, and niche interests, indicating widespread emerging engagement.",
|
1311 |
+
"Engagement levels are consistently strong, with a significant portion of content in these topics resonating highly with viewers, suggesting quality and appeal.",
|
1312 |
+
"These topics represent prime opportunities for early market entry before widespread saturation, allowing brands to establish authority.",
|
1313 |
+
"Content themes are highly varied, appealing to diverse demographics from family-focused audiences to pop culture enthusiasts and hobbyists."
|
1314 |
+
],
|
1315 |
+
"recommended_actions": [
|
1316 |
+
"Activate campaigns now to capitalize on early audience attention and establish brand presence within these emerging niches.",
|
1317 |
+
"Develop specific creator briefs tailored to each topic's unique style, leveraging authentic voices for family narratives, gadget reviews, or fashion showcases.",
|
1318 |
+
"Experiment with native short-form video formats like quick tutorials, reaction videos, or behind-the-scenes glimpses to maximize engagement within these trends.",
|
1319 |
+
"Identify opportunities for organic brand integration, even if tangential, to reach highly engaged, niche communities and build relevance."
|
1320 |
+
],
|
1321 |
+
"risks_watchouts": [
|
1322 |
+
"The nascent nature of these topics means they can be highly volatile, with trends potentially peaking or fading quickly.",
|
1323 |
+
"Some topics, such as 'celebrity gossip' or 'exaggerated reactions', may require careful brand safety considerations depending on specific content.",
|
1324 |
+
"Rapid adoption by other brands or creators could lead to quick saturation, diminishing the impact of later entries."
|
1325 |
+
],
|
1326 |
+
"Nascent_Topics": [
|
1327 |
+
{
|
1328 |
+
"bertopic_topic": 49.0,
|
1329 |
+
"topic_name": "49_superhero_marvel_character_avengers",
|
1330 |
+
"nascent_topic_score": 0.4543335371687674,
|
1331 |
+
"n_videos": 90,
|
1332 |
+
"mean_score": 0.527592932318316,
|
1333 |
+
"share_above_75": 0.34444444444444444
|
1334 |
+
},
|
1335 |
+
{
|
1336 |
+
"bertopic_topic": 68.0,
|
1337 |
+
"topic_name": "68_wwe_wrestling_wrestler_arm",
|
1338 |
+
"nascent_topic_score": 0.44736286035192807,
|
1339 |
+
"n_videos": 70,
|
1340 |
+
"mean_score": 0.5265571482055945,
|
1341 |
+
"share_above_75": 0.32857142857142857
|
1342 |
+
},
|
1343 |
+
{
|
1344 |
+
"bertopic_topic": 14.0,
|
1345 |
+
"topic_name": "14_family_father_mother_mom",
|
1346 |
+
"nascent_topic_score": 0.44519225009359786,
|
1347 |
+
"n_videos": 81,
|
1348 |
+
"mean_score": 0.5197648612671076,
|
1349 |
+
"share_above_75": 0.3333333333333333
|
1350 |
+
},
|
1351 |
+
{
|
1352 |
+
"bertopic_topic": 23.0,
|
1353 |
+
"topic_name": "23_celebrity_tribute_sighting_gossip",
|
1354 |
+
"nascent_topic_score": 0.44313308325893497,
|
1355 |
+
"n_videos": 130,
|
1356 |
+
"mean_score": 0.512914113123866,
|
1357 |
+
"share_above_75": 0.3384615384615385
|
1358 |
+
},
|
1359 |
+
{
|
1360 |
+
"bertopic_topic": 55.0,
|
1361 |
+
"topic_name": "55_gadgets_gadget_tools_smart",
|
1362 |
+
"nascent_topic_score": 0.43253760267577235,
|
1363 |
+
"n_videos": 166,
|
1364 |
+
"mean_score": 0.5080445988371306,
|
1365 |
+
"share_above_75": 0.3192771084337349
|
1366 |
+
},
|
1367 |
+
{
|
1368 |
+
"bertopic_topic": 41.0,
|
1369 |
+
"topic_name": "41_military_army_pride_tribute",
|
1370 |
+
"nascent_topic_score": 0.42794132581430183,
|
1371 |
+
"n_videos": 64,
|
1372 |
+
"mean_score": 0.5153188763571697,
|
1373 |
+
"share_above_75": 0.296875
|
1374 |
+
},
|
1375 |
+
{
|
1376 |
+
"bertopic_topic": 39.0,
|
1377 |
+
"topic_name": "39_fruit_plant_gardening_garden",
|
1378 |
+
"nascent_topic_score": 0.4248401940201604,
|
1379 |
+
"n_videos": 158,
|
1380 |
+
"mean_score": 0.5055353444639803,
|
1381 |
+
"share_above_75": 0.3037974683544304
|
1382 |
+
},
|
1383 |
+
{
|
1384 |
+
"bertopic_topic": 57.0,
|
1385 |
+
"topic_name": "57_fishing_fish_catching_catch",
|
1386 |
+
"nascent_topic_score": 0.4235795442480596,
|
1387 |
+
"n_videos": 67,
|
1388 |
+
"mean_score": 0.5069609319557212,
|
1389 |
+
"share_above_75": 0.29850746268656714
|
1390 |
+
},
|
1391 |
+
{
|
1392 |
+
"bertopic_topic": 64.0,
|
1393 |
+
"topic_name": "64_asmr_mukbang_food_sounds",
|
1394 |
+
"nascent_topic_score": 0.4214688268660201,
|
1395 |
+
"n_videos": 93,
|
1396 |
+
"mean_score": 0.501731198898564,
|
1397 |
+
"share_above_75": 0.3010752688172043
|
1398 |
+
},
|
1399 |
+
{
|
1400 |
+
"bertopic_topic": 29.0,
|
1401 |
+
"topic_name": "29_reaction_exaggerated_to_funny",
|
1402 |
+
"nascent_topic_score": 0.41971493169929136,
|
1403 |
+
"n_videos": 109,
|
1404 |
+
"mean_score": 0.5038062317312348,
|
1405 |
+
"share_above_75": 0.29357798165137616
|
1406 |
+
},
|
1407 |
+
{
|
1408 |
+
"bertopic_topic": 17.0,
|
1409 |
+
"topic_name": "17_fashion_outfit_showcase_dress",
|
1410 |
+
"nascent_topic_score": 0.4195311823643722,
|
1411 |
+
"n_videos": 420,
|
1412 |
+
"mean_score": 0.5071551452104616,
|
1413 |
+
"share_above_75": 0.28809523809523807
|
1414 |
+
},
|
1415 |
+
{
|
1416 |
+
"bertopic_topic": 59.0,
|
1417 |
+
"topic_name": "59_yoga_poses_pose_practice",
|
1418 |
+
"nascent_topic_score": 0.4191381684557115,
|
1419 |
+
"n_videos": 73,
|
1420 |
+
"mean_score": 0.5250476323576927,
|
1421 |
+
"share_above_75": 0.2602739726027397
|
1422 |
+
},
|
1423 |
+
{
|
1424 |
+
"bertopic_topic": 38.0,
|
1425 |
+
"topic_name": "38_hair_hairstyle_tutorial_styling",
|
1426 |
+
"nascent_topic_score": 0.4155849954761014,
|
1427 |
+
"n_videos": 240,
|
1428 |
+
"mean_score": 0.5065305480157245,
|
1429 |
+
"share_above_75": 0.2791666666666667
|
1430 |
+
},
|
1431 |
+
{
|
1432 |
+
"bertopic_topic": 8.0,
|
1433 |
+
"topic_name": "8_couple_relationship_husband_wife",
|
1434 |
+
"nascent_topic_score": 0.41315156920484986,
|
1435 |
+
"n_videos": 104,
|
1436 |
+
"mean_score": 0.5090987691875702,
|
1437 |
+
"share_above_75": 0.2692307692307692
|
1438 |
+
},
|
1439 |
+
{
|
1440 |
+
"bertopic_topic": 2.0,
|
1441 |
+
"topic_name": "2_sports_football_highlight_reel",
|
1442 |
+
"nascent_topic_score": 0.4109173566330165,
|
1443 |
+
"n_videos": 1385,
|
1444 |
+
"mean_score": 0.5058008892138722,
|
1445 |
+
"share_above_75": 0.26859205776173284
|
1446 |
+
}
|
1447 |
+
]
|
1448 |
+
},
|
1449 |
+
"Nascent_Videos_summary": {
|
1450 |
+
"executive_summary": "Nascent videos demonstrating strong early momentum are predominantly short-form content, leveraging quick hooks and dynamic pacing across diverse categories. These include gaming, art, educational tutorials, and sports highlights, all exhibiting significant initial engagement. The common thread is their ability to capture immediate attention and generate an early burst of interest, despite still being underexposed.",
|
1451 |
+
"momentum_patterns": [
|
1452 |
+
"Almost all nascent videos show a high early burst, indicating rapid initial viewer acquisition and engagement within the first few hours/days.",
|
1453 |
+
"Many videos maintain a high growth ratio after the initial burst, suggesting continued organic reach and audience expansion.",
|
1454 |
+
"A significant portion of these nascent videos achieve strong engagement metrics relative to their low exposure, indicating content resonance with early viewers.",
|
1455 |
+
"The majority of these high-performing videos are still in their early discovery phase, presenting a prime opportunity for amplified reach.",
|
1456 |
+
"Some nascent videos demonstrate exceptional virality, quickly transitioning from low exposure to massive view counts while maintaining high engagement, signaling breakout potential.",
|
1457 |
+
"While many show good growth, some exhibit higher volatility in their view growth, indicating less predictable audience retention over time."
|
1458 |
+
],
|
1459 |
+
"creative_playbook": [
|
1460 |
+
"Craft compelling 1-3 second hooks to immediately grab attention, leveraging curiosity, action, or direct value propositions.",
|
1461 |
+
"Focus on concise, high-impact videos (e.g., \"shorts\") that deliver value or entertainment quickly, aligning with observed high early bursts.",
|
1462 |
+
"Diversify content categories, exploring high-performing niches like quick tutorials (Art, Educational), dynamic highlights (Gaming, Sports), or engaging lifestyle snippets.",
|
1463 |
+
"Optimize for early engagement by encouraging immediate viewer interaction through clear calls to action, questions, or visually engaging elements in the initial moments.",
|
1464 |
+
"Monitor early performance closely, allocating small test budgets to emerging content and scaling up based on strong early burst and engagement quality signals.",
|
1465 |
+
"Leverage trending topics and relevant hashtags to tap into existing audience interest and enhance discoverability."
|
1466 |
+
],
|
1467 |
+
"risks_watchouts": [
|
1468 |
+
"While early burst is high, engagement quality can vary significantly, indicating that not all initial attention translates to deep viewer resonance.",
|
1469 |
+
"Some videos show higher view growth volatility, suggesting less predictable long-term performance and potential for rapid decay after initial spikes.",
|
1470 |
+
"High performance in popular categories like Gaming or Art might indicate saturation, requiring unique angles to maintain competitive edge.",
|
1471 |
+
"An exclusive focus on short-form content might limit opportunities for deeper storytelling or complex topics requiring longer formats."
|
1472 |
+
],
|
1473 |
+
"Nascent_Videos": [
|
1474 |
+
{
|
1475 |
+
"video_id": "-Dx9zh4UPA0",
|
1476 |
+
"title": "Milagre! #shorts",
|
1477 |
+
"nascent_video_score": 0.7426806439535754,
|
1478 |
+
"early_burst": 0.7689816548109323,
|
1479 |
+
"growth_ratio": 0.8688880569075252,
|
1480 |
+
"engagement_quality": 0.4672032946461999,
|
1481 |
+
"low_exposure": 0.9827218270310745,
|
1482 |
+
"stability": 0.0955821789591913,
|
1483 |
+
"viewCount_3d": 13,
|
1484 |
+
"engagement_ratio_1d": 0.0681259670519705,
|
1485 |
+
"view_growth_std": 5595.206192208947,
|
1486 |
+
"bertopic_topic": 4.0,
|
1487 |
+
"primary_content_category": "Gaming_Content",
|
1488 |
+
"thumbnail_url": "https://img.youtube.com/vi/-Dx9zh4UPA0/0.jpg"
|
1489 |
+
},
|
1490 |
+
{
|
1491 |
+
"video_id": "-IFs9m-OozY",
|
1492 |
+
"title": "How to draw anime easy tutorial | Day-13 #shorts #artsbyshubham #animedrawing #trending #anime #gojo",
|
1493 |
+
"nascent_video_score": 0.7344646199925122,
|
1494 |
+
"early_burst": 0.7914451516286035,
|
1495 |
+
"growth_ratio": 0.8153126169973792,
|
1496 |
+
"engagement_quality": 0.44309247472856605,
|
1497 |
+
"low_exposure": 0.981935604642456,
|
1498 |
+
"stability": 0.16394608760763763,
|
1499 |
+
"viewCount_3d": 14,
|
1500 |
+
"engagement_ratio_1d": 0.05401350337584396,
|
1501 |
+
"view_growth_std": 2852.335242101344,
|
1502 |
+
"bertopic_topic": 24.0,
|
1503 |
+
"primary_content_category": "Art_Creative_Process",
|
1504 |
+
"thumbnail_url": "https://img.youtube.com/vi/-IFs9m-OozY/0.jpg"
|
1505 |
+
},
|
1506 |
+
{
|
1507 |
+
"video_id": "-CO4v8Ggx2w",
|
1508 |
+
"title": "Neymar Is Back\u2620\ufe0f\ud83d\udd25 #eafc25 #fifa #eafc24 #eafcmobile #fifamobile #fifa #shorts",
|
1509 |
+
"nascent_video_score": 0.7280157244477723,
|
1510 |
+
"early_burst": 0.9960314488955447,
|
1511 |
+
"growth_ratio": 0.6456757768625982,
|
1512 |
+
"engagement_quality": 0.3703481842006739,
|
1513 |
+
"low_exposure": 0.9647697491576188,
|
1514 |
+
"stability": 0.015275177836016507,
|
1515 |
+
"viewCount_3d": 172,
|
1516 |
+
"engagement_ratio_1d": 0.03151153943697692,
|
1517 |
+
"view_growth_std": 36675.50460798052,
|
1518 |
+
"bertopic_topic": 4.0,
|
1519 |
+
"primary_content_category": "Sports_Highlights_Analysis",
|
1520 |
+
"thumbnail_url": "https://img.youtube.com/vi/-CO4v8Ggx2w/0.jpg"
|
1521 |
+
},
|
1522 |
+
{
|
1523 |
+
"video_id": "-h9NcfllC38",
|
1524 |
+
"title": "IAS JOB PROFILE KYA HOTI HAI ? #motivation #upsc #upscmotvation #short #shortsfeed",
|
1525 |
+
"nascent_video_score": 0.724488955447398,
|
1526 |
+
"early_burst": 0.8079371022089106,
|
1527 |
+
"growth_ratio": 0.707675028079371,
|
1528 |
+
"engagement_quality": 0.5104080868588544,
|
1529 |
+
"low_exposure": 0.981935604642456,
|
1530 |
+
"stability": 0.1344065892923999,
|
1531 |
+
"viewCount_3d": 14,
|
1532 |
+
"engagement_ratio_1d": 0.11100928641251222,
|
1533 |
+
"view_growth_std": 3757.2172770105626,
|
1534 |
+
"bertopic_topic": 11.0,
|
1535 |
+
"primary_content_category": "Educational_Informative",
|
1536 |
+
"thumbnail_url": "https://img.youtube.com/vi/-h9NcfllC38/0.jpg"
|
1537 |
+
},
|
1538 |
+
{
|
1539 |
+
"video_id": "-xN0rkLKz5Q",
|
1540 |
+
"title": "\u0b95\u0bc1\u0b9f\u0bcd\u0b9f\u0bbf \u0b95\u0bcb\u0bb2\u0bae\u0bcd design Rangoli Kolam #shortsfeed#rangoli#trending#viralvideos#ytshorts#latestshorts",
|
1541 |
+
"nascent_video_score": 0.7221340321976787,
|
1542 |
+
"early_burst": 0.88951703481842,
|
1543 |
+
"growth_ratio": 0.8958442530887308,
|
1544 |
+
"engagement_quality": 0.15117933358292773,
|
1545 |
+
"low_exposure": 0.9948333957319356,
|
1546 |
+
"stability": 0.04230625233994756,
|
1547 |
+
"viewCount_3d": 2,
|
1548 |
+
"engagement_ratio_1d": 0.010381673933242798,
|
1549 |
+
"view_growth_std": 11201.907110696226,
|
1550 |
+
"bertopic_topic": 46.0,
|
1551 |
+
"primary_content_category": "Art_Creative_Process",
|
1552 |
+
"thumbnail_url": "https://img.youtube.com/vi/-xN0rkLKz5Q/0.jpg"
|
1553 |
+
},
|
1554 |
+
{
|
1555 |
+
"video_id": "-IcLtjWSl0M",
|
1556 |
+
"title": "The problem with guitar instruction books(and how I solved it) #shorts",
|
1557 |
+
"nascent_video_score": 0.720780606514414,
|
1558 |
+
"early_burst": 0.645469861475103,
|
1559 |
+
"growth_ratio": 0.5459378509921378,
|
1560 |
+
"engagement_quality": 0.9252901535005615,
|
1561 |
+
"low_exposure": 0.9881505054286784,
|
1562 |
+
"stability": 0.15934107076001502,
|
1563 |
+
"viewCount_3d": 7,
|
1564 |
+
"engagement_ratio_1d": 1.75,
|
1565 |
+
"view_growth_std": 2962.098017734502,
|
1566 |
+
"bertopic_topic": 40.0,
|
1567 |
+
"primary_content_category": "Educational_Informative",
|
1568 |
+
"thumbnail_url": "https://img.youtube.com/vi/-IcLtjWSl0M/0.jpg"
|
1569 |
+
},
|
1570 |
+
{
|
1571 |
+
"video_id": "-EAs9UisIuA",
|
1572 |
+
"title": "TUDO NO ULTRA! PC Gamer de R$3500! #shorts #pc",
|
1573 |
+
"nascent_video_score": 0.7167390490453014,
|
1574 |
+
"early_burst": 0.8070572819168851,
|
1575 |
+
"growth_ratio": 0.6337326843878697,
|
1576 |
+
"engagement_quality": 0.5150505428678398,
|
1577 |
+
"low_exposure": 0.9738487457880943,
|
1578 |
+
"stability": 0.36817671284163234,
|
1579 |
+
"viewCount_3d": 57,
|
1580 |
+
"engagement_ratio_1d": 0.11560384752404702,
|
1581 |
+
"view_growth_std": 531.988721684962,
|
1582 |
+
"bertopic_topic": -1.0,
|
1583 |
+
"primary_content_category": "Gaming_Content",
|
1584 |
+
"thumbnail_url": "https://img.youtube.com/vi/-EAs9UisIuA/0.jpg"
|
1585 |
+
},
|
1586 |
+
{
|
1587 |
+
"video_id": "-ZGzmed7pcY",
|
1588 |
+
"title": "\u2665\ufe0f\ud83d\ude0d #dance #dailyshorts #dailyshorts #shortsvideo #shortsviral",
|
1589 |
+
"nascent_video_score": 0.7149831523773869,
|
1590 |
+
"early_burst": 0.8927742418569824,
|
1591 |
+
"growth_ratio": 0.6589292399850243,
|
1592 |
+
"engagement_quality": 0.38180456757768627,
|
1593 |
+
"low_exposure": 0.9881505054286784,
|
1594 |
+
"stability": 0.16855110445526023,
|
1595 |
+
"viewCount_3d": 7,
|
1596 |
+
"engagement_ratio_1d": 0.03384287499081355,
|
1597 |
+
"view_growth_std": 2752.213457685771,
|
1598 |
+
"bertopic_topic": 10.0,
|
1599 |
+
"primary_content_category": "Dance_Performance",
|
1600 |
+
"thumbnail_url": "https://img.youtube.com/vi/-ZGzmed7pcY/0.jpg"
|
1601 |
+
},
|
1602 |
+
{
|
1603 |
+
"video_id": "-Y2c_PdJdlk",
|
1604 |
+
"title": "Simple Front Page Design: Bengali \u270f\ufe0f #shorts #nhuandaocalligraphy #frontpage",
|
1605 |
+
"nascent_video_score": 0.7145095469861475,
|
1606 |
+
"early_burst": 0.9341819543242231,
|
1607 |
+
"growth_ratio": 0.5451890677648821,
|
1608 |
+
"engagement_quality": 0.3626357169599401,
|
1609 |
+
"low_exposure": 0.9770872332459752,
|
1610 |
+
"stability": 0.6002620741295395,
|
1611 |
+
"viewCount_3d": 29,
|
1612 |
+
"engagement_ratio_1d": 0.030203545633617858,
|
1613 |
+
"view_growth_std": 162.42613705928008,
|
1614 |
+
"bertopic_topic": 22.0,
|
1615 |
+
"primary_content_category": "Art_Creative_Process",
|
1616 |
+
"thumbnail_url": "https://img.youtube.com/vi/-Y2c_PdJdlk/0.jpg"
|
1617 |
+
},
|
1618 |
+
{
|
1619 |
+
"video_id": "-z-AM2bjzvE",
|
1620 |
+
"title": "bollywood actress unique mangalsutra \u2728\u2764\ufe0f #bollywood #wedding #actress #shorts",
|
1621 |
+
"nascent_video_score": 0.7142624485211532,
|
1622 |
+
"early_burst": 0.8490640209659304,
|
1623 |
+
"growth_ratio": 0.8445151628603519,
|
1624 |
+
"engagement_quality": 0.23605391239236242,
|
1625 |
+
"low_exposure": 0.9942718083114939,
|
1626 |
+
"stability": 0.04698614751029573,
|
1627 |
+
"viewCount_3d": 3,
|
1628 |
+
"engagement_ratio_1d": 0.015738077931928073,
|
1629 |
+
"view_growth_std": 10400.984712997131,
|
1630 |
+
"bertopic_topic": -1.0,
|
1631 |
+
"primary_content_category": "Fashion_Beauty",
|
1632 |
+
"thumbnail_url": "https://img.youtube.com/vi/-z-AM2bjzvE/0.jpg"
|
1633 |
+
},
|
1634 |
+
{
|
1635 |
+
"video_id": "-ViWKZbfwGY",
|
1636 |
+
"title": "Mahindra Scorpio Classic S11 #shortsvideo #viralvideo #viarlshorts #mahindrascorpio #youtubeshorts",
|
1637 |
+
"nascent_video_score": 0.7141332834144515,
|
1638 |
+
"early_burst": 0.7915761886933733,
|
1639 |
+
"growth_ratio": 0.8333957319356047,
|
1640 |
+
"engagement_quality": 0.30924747285660803,
|
1641 |
+
"low_exposure": 0.997903406963684,
|
1642 |
+
"stability": 0.13762635716959937,
|
1643 |
+
"viewCount_3d": 0,
|
1644 |
+
"engagement_ratio_1d": 0.022328548644338118,
|
1645 |
+
"view_growth_std": 3640.960221333561,
|
1646 |
+
"bertopic_topic": 3.0,
|
1647 |
+
"primary_content_category": "Product_Review_Unboxing_Haul",
|
1648 |
+
"thumbnail_url": "https://img.youtube.com/vi/-ViWKZbfwGY/0.jpg"
|
1649 |
+
},
|
1650 |
+
{
|
1651 |
+
"video_id": "-m9R3NKHa9c",
|
1652 |
+
"title": "pt 2! #fypviral #aldcalways #dancemoms #edit #aldc #dance #shorts #blowup #dancechoreography",
|
1653 |
+
"nascent_video_score": 0.7126432047922127,
|
1654 |
+
"early_burst": 0.9544178210408086,
|
1655 |
+
"growth_ratio": 0.5125421190565331,
|
1656 |
+
"engagement_quality": 0.26196181205540997,
|
1657 |
+
"low_exposure": 0.9842942718083115,
|
1658 |
+
"stability": 0.9786222388618495,
|
1659 |
+
"viewCount_3d": 11,
|
1660 |
+
"engagement_ratio_1d": 0.017813889314732486,
|
1661 |
+
"view_growth_std": 0.5773502691896257,
|
1662 |
+
"bertopic_topic": 10.0,
|
1663 |
+
"primary_content_category": "Dance_Performance",
|
1664 |
+
"thumbnail_url": "https://img.youtube.com/vi/-m9R3NKHa9c/0.jpg"
|
1665 |
+
},
|
1666 |
+
{
|
1667 |
+
"video_id": "-MeZBfqYI94",
|
1668 |
+
"title": "Kiski achi handwriting hai? \ud83d\udcdd #trending #shorts #viralvideo",
|
1669 |
+
"nascent_video_score": 0.710202171471359,
|
1670 |
+
"early_burst": 0.8864844627480345,
|
1671 |
+
"growth_ratio": 0.716922500935979,
|
1672 |
+
"engagement_quality": 0.30557843504305504,
|
1673 |
+
"low_exposure": 0.9842942718083115,
|
1674 |
+
"stability": 0.14103332085361286,
|
1675 |
+
"viewCount_3d": 11,
|
1676 |
+
"engagement_ratio_1d": 0.021994627266621894,
|
1677 |
+
"view_growth_std": 3523.6455553872042,
|
1678 |
+
"bertopic_topic": 24.0,
|
1679 |
+
"primary_content_category": "Educational_Informative",
|
1680 |
+
"thumbnail_url": "https://img.youtube.com/vi/-MeZBfqYI94/0.jpg"
|
1681 |
+
},
|
1682 |
+
{
|
1683 |
+
"video_id": "-TfqxHL63IU",
|
1684 |
+
"title": "\u4e2d\u8eab\u9006feat.\u30c1\u30e7\u30b3\u30e9\u30b9\u30af #shorts #\u6599\u7406",
|
1685 |
+
"nascent_video_score": 0.7086877573942343,
|
1686 |
+
"early_burst": 0.9875327592661924,
|
1687 |
+
"growth_ratio": 0.5849494571321603,
|
1688 |
+
"engagement_quality": 0.34447772369898916,
|
1689 |
+
"low_exposure": 0.9772369898914264,
|
1690 |
+
"stability": 0.03695245226506927,
|
1691 |
+
"viewCount_3d": 28,
|
1692 |
+
"engagement_ratio_1d": 0.026971808556091572,
|
1693 |
+
"view_growth_std": 12288.546384743804,
|
1694 |
+
"bertopic_topic": -1.0,
|
1695 |
+
"primary_content_category": "Food_Cooking_Baking",
|
1696 |
+
"thumbnail_url": "https://img.youtube.com/vi/-TfqxHL63IU/0.jpg"
|
1697 |
+
},
|
1698 |
+
{
|
1699 |
+
"video_id": "9JwKVd299cc",
|
1700 |
+
"title": "ruchika new post with nischay \ud83d\ude32\u2764\ufe0f @triggeredinsaan #liveinsaan #shorts",
|
1701 |
+
"nascent_video_score": 0.7055428678397604,
|
1702 |
+
"early_burst": 0.998090602770498,
|
1703 |
+
"growth_ratio": 0.8291276675402471,
|
1704 |
+
"engagement_quality": 0.9912392362411082,
|
1705 |
+
"low_exposure": 0.002321228004492748,
|
1706 |
+
"stability": 0.0024335454885811014,
|
1707 |
+
"viewCount_3d": 2422846,
|
1708 |
+
"engagement_ratio_1d": 2.405605770011433,
|
1709 |
+
"view_growth_std": 234111.95333856833,
|
1710 |
+
"bertopic_topic": 30.0,
|
1711 |
+
"primary_content_category": "Lifestyle_Daily_Vlog",
|
1712 |
+
"thumbnail_url": "https://img.youtube.com/vi/9JwKVd299cc/0.jpg"
|
1713 |
+
}
|
1714 |
+
]
|
1715 |
+
}
|
1716 |
+
}
|
1717 |
+
}
|
requirements.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
Flask==3.0.3
|
2 |
+
gunicorn==22.0.0
|
static/css/style.css
ADDED
@@ -0,0 +1,264 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
/* Sizes (easy to tweak) */
|
3 |
+
:root{
|
4 |
+
--flip-w: 360px; /* card width */
|
5 |
+
--flip-h: 370px; /* card height */
|
6 |
+
}
|
7 |
+
|
8 |
+
|
9 |
+
/* --- Flip cards row: single line, horizontal scroll --- */
|
10 |
+
.flip-row{
|
11 |
+
display:flex; flex-wrap:nowrap; gap:3px; overflow-x:auto; padding-bottom:4px;min-height: calc(var(--flip-h) + 3px);
|
12 |
+
}
|
13 |
+
|
14 |
+
/* --- Flip card base (clip/round here, not on the rotating inner) --- */
|
15 |
+
.flip-card{
|
16 |
+
--card-bg:#111827; --card-fg:#ffffff;
|
17 |
+
flex: 0 0 var(--flip-w); outline:0; border:1px solid #e6e9ef;
|
18 |
+
border-radius:14px; overflow:hidden; /* <-- moved here */
|
19 |
+
perspective:1000px; -webkit-perspective:1000px; /* 3D space */
|
20 |
+
}
|
21 |
+
.flip-card:focus{ box-shadow:0 0 0 3px rgba(30,58,138,.25); border-radius:8px; }
|
22 |
+
|
23 |
+
/* rotating container */
|
24 |
+
.flip-card .flip-card-inner{
|
25 |
+
position:relative; width:100%; height: var(--flip-h);
|
26 |
+
transform-style:preserve-3d; -webkit-transform-style:preserve-3d;
|
27 |
+
transition:transform .6s;
|
28 |
+
/* no border/overflow/radius here */
|
29 |
+
}
|
30 |
+
|
31 |
+
/* flip on hover or when focused */
|
32 |
+
@media (hover: hover){
|
33 |
+
.flip-card:hover .flip-card-inner{ transform:rotateY(180deg); -webkit-transform:rotateY(180deg); }
|
34 |
+
}
|
35 |
+
.flip-card:focus-within .flip-card-inner{ transform:rotateY(180deg); -webkit-transform:rotateY(180deg); }
|
36 |
+
|
37 |
+
/* faces */
|
38 |
+
.flip-card-front,
|
39 |
+
.flip-card-back{
|
40 |
+
position:absolute; inset:0; display:flex; flex-direction:column;
|
41 |
+
backface-visibility:hidden; -webkit-backface-visibility:hidden;
|
42 |
+
background:var(--card-bg); color:var(--card-fg);
|
43 |
+
transform:translateZ(0); -webkit-transform:translateZ(0);
|
44 |
+
}
|
45 |
+
|
46 |
+
/* explicitly separate layers + orientation */
|
47 |
+
.flip-card-front{
|
48 |
+
z-index:2;
|
49 |
+
transform:rotateY(0deg) translateZ(1px); /* <-- own layer */
|
50 |
+
-webkit-transform:rotateY(0deg) translateZ(1px);
|
51 |
+
}
|
52 |
+
.flip-card-back{
|
53 |
+
z-index:1;
|
54 |
+
transform:rotateY(180deg) translateZ(1px); /* <-- own layer */
|
55 |
+
-webkit-transform:rotateY(180deg) translateZ(1px);
|
56 |
+
}
|
57 |
+
|
58 |
+
/* content */
|
59 |
+
.flip-title{ font-weight:800; font-size:1.05rem; padding:12px 14px; letter-spacing:.2px; }
|
60 |
+
.flip-content{
|
61 |
+
padding: 12px 14px;
|
62 |
+
overflow-y: auto;
|
63 |
+
-webkit-overflow-scrolling: touch;
|
64 |
+
/* subtract title + padding (~64px) so content fits the face height */
|
65 |
+
max-height: calc(var(--flip-h) - 64px);
|
66 |
+
}
|
67 |
+
.flip-subtitle{ font-size:.85rem; }
|
68 |
+
.flip-card .text-muted{ color: rgba(17,24,39,.65) !important; }
|
69 |
+
|
70 |
+
.type-explosive{ --card-bg:#fecaca; --card-fg:#111827; } /* red-200 */
|
71 |
+
.type-momentum { --card-bg:#fde68a; --card-fg:#111827; } /* amber-200 */
|
72 |
+
.type-consistent{ --card-bg:#bfdbfe; --card-fg:#111827; }/* blue-200 */
|
73 |
+
.type-gradual { --card-bg:#bbf7d0; --card-fg:#111827; } /* green-200 */
|
74 |
+
.type-organic { --card-bg:#ddd6fe; --card-fg:#111827; } /* violet-200 */
|
75 |
+
|
76 |
+
/* --- Two-column split with vertical separator --- */
|
77 |
+
.split-2 { display: grid; grid-template-columns: 1fr; gap: 24px; }
|
78 |
+
@media (min-width: 992px) {
|
79 |
+
.split-2 { grid-template-columns: 1fr 12px 1fr; align-items: start; }
|
80 |
+
}
|
81 |
+
.split-2-col { min-width: 0; }
|
82 |
+
.split-2-sep { width: 12px; background: linear-gradient(180deg, #eef2ff, #eef1f6); border-radius: 8px; }
|
83 |
+
|
84 |
+
/* Existing styles kept */
|
85 |
+
:root{ --bg:#f6f8fb; --card-bg:#ffffff; --text:#232b3a; }
|
86 |
+
body.bg-body { background: var(--bg); color: var(--text); }
|
87 |
+
.navbar.bg-primary { background: #1e3a8a !important; }
|
88 |
+
|
89 |
+
.card { border-radius: 14px; border-color: #e6e9ef; }
|
90 |
+
.card-header { border-bottom: 1px solid #eef1f6; }
|
91 |
+
|
92 |
+
.table-header { background: #eef2ff; }
|
93 |
+
.table thead th { font-weight: 600; }
|
94 |
+
.table tbody td { vertical-align: top; }
|
95 |
+
|
96 |
+
.thumb {
|
97 |
+
display:inline-block; width:120px; height:68px; border-radius:10px;
|
98 |
+
overflow:hidden; border:1px solid #e5e7eb; box-shadow:0 1px 2px rgba(0,0,0,.04);
|
99 |
+
}
|
100 |
+
.thumb img { width:100%; height:100%; object-fit:cover; }
|
101 |
+
|
102 |
+
/* KPI styles remain if you still use them elsewhere */
|
103 |
+
.kpi-card { background: var(--card-bg); border: 1px solid #e6e9ef; border-radius: 14px; }
|
104 |
+
.kpi-label { font-size: .9rem; color: #6b7280; }
|
105 |
+
.kpi-value { font-size: 2rem; font-weight: 700; line-height: 1; }
|
106 |
+
.kpi-sub { font-size: .8rem; color: #9aa1ad; }
|
107 |
+
|
108 |
+
/* Sample videos right side */
|
109 |
+
.sample-table-wrap{
|
110 |
+
max-height: 420px; /* scroll within accordion body */
|
111 |
+
overflow: auto;
|
112 |
+
-webkit-overflow-scrolling: touch;
|
113 |
+
}
|
114 |
+
|
115 |
+
.thumb-sm{
|
116 |
+
width: 64px;
|
117 |
+
height: 36px;
|
118 |
+
object-fit: cover;
|
119 |
+
border-radius: 6px;
|
120 |
+
border: 1px solid #e5e7eb;
|
121 |
+
}
|
122 |
+
|
123 |
+
/* Color sliver on accordion headers by archetype */
|
124 |
+
.accordion-button.sample-head{ background: #f8fafc; }
|
125 |
+
.accordion-button.sample-head.type-explosive{ border-left:6px solid #F87171; } /* red-500 */
|
126 |
+
.accordion-button.sample-head.type-momentum { border-left:6px solid #FCD34D; } /* amber-500 */
|
127 |
+
.accordion-button.sample-head.type-consistent{ border-left:6px solid #93C5FD; }/* blue-500 */
|
128 |
+
.accordion-button.sample-head.type-gradual { border-left:6px solid #86EFAC; } /* green-500 */
|
129 |
+
.accordion-button.sample-head.type-organic { border-left:6px solid #C4B5FD; } /* violet-500 */
|
130 |
+
|
131 |
+
.chart-box{
|
132 |
+
position: relative;
|
133 |
+
height: 380px; /* ensures non-zero height */
|
134 |
+
width: 100%;
|
135 |
+
}
|
136 |
+
|
137 |
+
#videoPieChart{ width: 100% !important; height: 100% !important; display:block; }
|
138 |
+
|
139 |
+
/* Compact, more readable sample videos table */
|
140 |
+
.sample-table-wrap{
|
141 |
+
max-height: 520px; /* a bit taller to reduce scroll */
|
142 |
+
overflow: auto;
|
143 |
+
-webkit-overflow-scrolling: touch;
|
144 |
+
}
|
145 |
+
|
146 |
+
.sample-table{
|
147 |
+
font-size: 0.84rem; /* smaller text for density */
|
148 |
+
}
|
149 |
+
@media (min-width: 1600px){
|
150 |
+
.sample-table{ font-size: 0.9rem; }
|
151 |
+
}
|
152 |
+
|
153 |
+
/* tighter cell padding */
|
154 |
+
.compact-table > :not(caption) > * > *{
|
155 |
+
padding: .35rem .5rem;
|
156 |
+
}
|
157 |
+
|
158 |
+
/* align numbers nicely */
|
159 |
+
.metric-cell{
|
160 |
+
text-align: right;
|
161 |
+
font-variant-numeric: tabular-nums; /* monospaced digits for vertical scan */
|
162 |
+
white-space: nowrap;
|
163 |
+
}
|
164 |
+
|
165 |
+
/* slimmer thumbnails */
|
166 |
+
.thumb-xs{
|
167 |
+
width: 56px;
|
168 |
+
height: 32px;
|
169 |
+
object-fit: cover;
|
170 |
+
border-radius: 6px;
|
171 |
+
border: 1px solid #e5e7eb;
|
172 |
+
}
|
173 |
+
|
174 |
+
/* ellipsis for long titles on wide screens; wrap on small */
|
175 |
+
.sample-title{
|
176 |
+
display: inline-block;
|
177 |
+
max-width: 520px; /* adjust as needed */
|
178 |
+
white-space: nowrap;
|
179 |
+
overflow: hidden;
|
180 |
+
text-overflow: ellipsis;
|
181 |
+
}
|
182 |
+
@media (max-width: 1400px){
|
183 |
+
.sample-title{ max-width: 380px; }
|
184 |
+
}
|
185 |
+
@media (max-width: 1200px){
|
186 |
+
.sample-title{ max-width: 300px; }
|
187 |
+
}
|
188 |
+
@media (max-width: 992px){
|
189 |
+
.sample-title{
|
190 |
+
max-width: 100%;
|
191 |
+
white-space: normal; /* allow wrapping on smaller screens */
|
192 |
+
overflow: visible;
|
193 |
+
text-overflow: clip;
|
194 |
+
}
|
195 |
+
}
|
196 |
+
|
197 |
+
/* Two-column layout with a thin vertical separator */
|
198 |
+
#area3-metrics .split-2{
|
199 |
+
display:flex;
|
200 |
+
gap:24px;
|
201 |
+
align-items:stretch;
|
202 |
+
}
|
203 |
+
#area3-metrics .split-2-col{
|
204 |
+
flex:1 1 0;
|
205 |
+
min-width:0; /* lets tables/canvas shrink without overflow */
|
206 |
+
}
|
207 |
+
#area3-metrics .split-2-sep{
|
208 |
+
width:1px;
|
209 |
+
background:rgba(0,0,0,.08);
|
210 |
+
}
|
211 |
+
|
212 |
+
/* Chart container β make it taller so it visually matches the table area */
|
213 |
+
#area3-metrics .linechart-box{
|
214 |
+
position:relative;
|
215 |
+
height:200px; /* increased from 380px */
|
216 |
+
width:100%;
|
217 |
+
}
|
218 |
+
@media (min-width:1400px){
|
219 |
+
#area3-metrics .linechart-box{ height:220px; }
|
220 |
+
}
|
221 |
+
|
222 |
+
/* Ensure the canvas fills its parent box */
|
223 |
+
#metricsLineChart{
|
224 |
+
width:100% !important;
|
225 |
+
height:100% !important;
|
226 |
+
display:block;
|
227 |
+
}
|
228 |
+
|
229 |
+
/* Compact table spacing + right-aligned numeric columns */
|
230 |
+
#area3-metrics .compact-table > :not(caption) > * > *{
|
231 |
+
padding:.35rem .5rem;
|
232 |
+
}
|
233 |
+
#area3-metrics .metric-cell{
|
234 |
+
text-align:right;
|
235 |
+
font-variant-numeric:tabular-nums;
|
236 |
+
white-space:nowrap;
|
237 |
+
}
|
238 |
+
|
239 |
+
/* Sticky table header so labels remain visible while scrolling */
|
240 |
+
#area3-metrics .table-header{
|
241 |
+
position:sticky;
|
242 |
+
top:0;
|
243 |
+
z-index:1;
|
244 |
+
background:#fff; /* or var(--bs-body-bg) if you use Bootstrap vars */
|
245 |
+
}
|
246 |
+
|
247 |
+
/* Optional: scrollable table body if it grows large */
|
248 |
+
#area3-metrics .sample-table-wrap{
|
249 |
+
max-height:560px;
|
250 |
+
overflow:auto;
|
251 |
+
-webkit-overflow-scrolling:touch;
|
252 |
+
}
|
253 |
+
|
254 |
+
/* Viral Topics: compact numeric columns */
|
255 |
+
#viral-topics .table td.text-end, #viral-topics .table th.text-end{
|
256 |
+
white-space: nowrap;
|
257 |
+
font-variant-numeric: tabular-nums;
|
258 |
+
}
|
259 |
+
|
260 |
+
/* Section 3: compact numeric columns */
|
261 |
+
#nascent-trends .table td.text-end, #nascent-trends .table th.text-end{
|
262 |
+
white-space: nowrap;
|
263 |
+
font-variant-numeric: tabular-nums;
|
264 |
+
}
|
static/js/archetypes_chart.js
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* static/js/archetypes_section.js */
|
2 |
+
|
3 |
+
/* Run immediately if DOM is ready; else wait */
|
4 |
+
const ready = (fn) =>
|
5 |
+
document.readyState !== "loading"
|
6 |
+
? fn()
|
7 |
+
: document.addEventListener("DOMContentLoaded", fn);
|
8 |
+
|
9 |
+
ready(() => {
|
10 |
+
// =========================
|
11 |
+
// Data guard
|
12 |
+
// =========================
|
13 |
+
const data = (typeof clustersData !== "undefined" && Array.isArray(clustersData))
|
14 |
+
? clustersData
|
15 |
+
: [];
|
16 |
+
|
17 |
+
// =========================
|
18 |
+
// Shared order + color maps
|
19 |
+
// =========================
|
20 |
+
const DESIRED_ORDER = [
|
21 |
+
"Explosive Viral Hit",
|
22 |
+
"Momentum Builder",
|
23 |
+
"Consistent Performer",
|
24 |
+
"Gradual Climber",
|
25 |
+
"Organic Riser"
|
26 |
+
];
|
27 |
+
|
28 |
+
// Mild (pastel) fills + stronger strokes for charts
|
29 |
+
const FILL_MAP = {
|
30 |
+
"Explosive Viral Hit": "rgba(248,113,113,0.65)", // red-400 @ 65%
|
31 |
+
"Momentum Builder": "rgba(252,211,77,0.65)", // amber-300 @ 65%
|
32 |
+
"Consistent Performer": "rgba(147,197,253,0.70)", // blue-300 @ 70%
|
33 |
+
"Gradual Climber": "rgba(134,239,172,0.70)", // green-300 @ 70%
|
34 |
+
"Organic Riser": "rgba(196,181,253,0.70)" // violet-300 @ 70%
|
35 |
+
};
|
36 |
+
const STROKE_MAP = {
|
37 |
+
"Explosive Viral Hit": "#ef4444", // red-500
|
38 |
+
"Momentum Builder": "#f59e0b", // amber-500
|
39 |
+
"Consistent Performer": "#3b82f6", // blue-500
|
40 |
+
"Gradual Climber": "#10b981", // green-500
|
41 |
+
"Organic Riser": "#8b5cf6" // violet-500
|
42 |
+
};
|
43 |
+
|
44 |
+
const COLOR_CLASS_MAP = {
|
45 |
+
"Explosive Viral Hit": "type-explosive",
|
46 |
+
"Momentum Builder": "type-momentum",
|
47 |
+
"Consistent Performer": "type-consistent",
|
48 |
+
"Gradual Climber": "type-gradual",
|
49 |
+
"Organic Riser": "type-organic"
|
50 |
+
};
|
51 |
+
|
52 |
+
const orderedClusters = () => {
|
53 |
+
const byName = Object.fromEntries(data.map(c => [c.trend_archetype, c]));
|
54 |
+
const inOrder = DESIRED_ORDER.map(n => byName[n]).filter(Boolean);
|
55 |
+
const extras = data.filter(c => !DESIRED_ORDER.includes(c.trend_archetype));
|
56 |
+
return inOrder.concat(extras);
|
57 |
+
};
|
58 |
+
|
59 |
+
// =========================
|
60 |
+
// Area 1: Flip-cards ordering + color classes
|
61 |
+
// (Flip behavior is pure CSS hover/focus in your stylesheet)
|
62 |
+
// =========================
|
63 |
+
const flipRow = document.getElementById("flipRow");
|
64 |
+
if (flipRow) {
|
65 |
+
flipRow.querySelectorAll(".flip-card").forEach(card => {
|
66 |
+
const name = card.getAttribute("data-archetype") || "";
|
67 |
+
const idx = DESIRED_ORDER.indexOf(name);
|
68 |
+
card.style.order = idx === -1 ? "99" : String(idx).padStart(2, "0");
|
69 |
+
const cls = COLOR_CLASS_MAP[name];
|
70 |
+
if (cls) card.classList.add(cls);
|
71 |
+
});
|
72 |
+
}
|
73 |
+
});
|
74 |
+
|
static/style.css
ADDED
@@ -0,0 +1,123 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* General Layout */
|
2 |
+
body {
|
3 |
+
font-family: Arial, sans-serif;
|
4 |
+
margin: 0;
|
5 |
+
padding: 0;
|
6 |
+
background-color: #f8f9fa;
|
7 |
+
color: #333;
|
8 |
+
}
|
9 |
+
|
10 |
+
header {
|
11 |
+
background-color: #343a40;
|
12 |
+
color: white;
|
13 |
+
padding: 1.5rem;
|
14 |
+
text-align: center;
|
15 |
+
}
|
16 |
+
|
17 |
+
section {
|
18 |
+
padding: 2rem;
|
19 |
+
border-bottom: 1px solid #dee2e6;
|
20 |
+
}
|
21 |
+
|
22 |
+
h2 {
|
23 |
+
border-bottom: 2px solid #007BFF;
|
24 |
+
padding-bottom: 0.5rem;
|
25 |
+
margin-bottom: 1rem;
|
26 |
+
color: #212529;
|
27 |
+
}
|
28 |
+
|
29 |
+
/* Grid and Cards */
|
30 |
+
.flex-grid {
|
31 |
+
display: flex;
|
32 |
+
flex-wrap: wrap;
|
33 |
+
gap: 1rem;
|
34 |
+
}
|
35 |
+
|
36 |
+
.card {
|
37 |
+
background-color: #fff;
|
38 |
+
padding: 1rem;
|
39 |
+
border-radius: 8px;
|
40 |
+
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
|
41 |
+
flex: 1 1 calc(33% - 2rem);
|
42 |
+
display: flex;
|
43 |
+
flex-direction: column;
|
44 |
+
justify-content: space-between;
|
45 |
+
}
|
46 |
+
|
47 |
+
.card img.thumbnail {
|
48 |
+
width: 100%;
|
49 |
+
height: auto;
|
50 |
+
border-radius: 6px;
|
51 |
+
margin-bottom: 0.75rem;
|
52 |
+
}
|
53 |
+
|
54 |
+
.video-card {
|
55 |
+
width: 250px;
|
56 |
+
margin: 0.5rem;
|
57 |
+
text-decoration: none;
|
58 |
+
color: #333;
|
59 |
+
background: #f9f9f9;
|
60 |
+
border-radius: 10px;
|
61 |
+
padding: 0.75rem;
|
62 |
+
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
|
63 |
+
transition: transform 0.2s ease;
|
64 |
+
display: flex;
|
65 |
+
flex-direction: column;
|
66 |
+
justify-content: space-between;
|
67 |
+
}
|
68 |
+
|
69 |
+
.video-card:hover {
|
70 |
+
transform: scale(1.03);
|
71 |
+
background: #f0f8ff;
|
72 |
+
}
|
73 |
+
|
74 |
+
.video-card img {
|
75 |
+
width: 100%;
|
76 |
+
border-radius: 6px;
|
77 |
+
margin-bottom: 0.5rem;
|
78 |
+
}
|
79 |
+
|
80 |
+
.video-card h5 {
|
81 |
+
font-size: 0.9rem;
|
82 |
+
margin: 0.25rem 0;
|
83 |
+
}
|
84 |
+
|
85 |
+
.video-card p {
|
86 |
+
font-size: 0.75rem;
|
87 |
+
margin: 0.1rem 0;
|
88 |
+
}
|
89 |
+
|
90 |
+
/* Table Styles */
|
91 |
+
table {
|
92 |
+
width: 100%;
|
93 |
+
border-collapse: collapse;
|
94 |
+
margin-top: 1rem;
|
95 |
+
}
|
96 |
+
|
97 |
+
th, td {
|
98 |
+
padding: 0.75rem;
|
99 |
+
border: 1px solid #dee2e6;
|
100 |
+
text-align: left;
|
101 |
+
}
|
102 |
+
|
103 |
+
th {
|
104 |
+
background-color: #007BFF;
|
105 |
+
color: white;
|
106 |
+
}
|
107 |
+
|
108 |
+
/* Filter Select */
|
109 |
+
select {
|
110 |
+
padding: 0.5rem;
|
111 |
+
margin-top: 0.5rem;
|
112 |
+
margin-bottom: 1rem;
|
113 |
+
border-radius: 4px;
|
114 |
+
border: 1px solid #ccc;
|
115 |
+
font-size: 1rem;
|
116 |
+
}
|
117 |
+
|
118 |
+
/* Responsive Fix */
|
119 |
+
@media (max-width: 768px) {
|
120 |
+
.card {
|
121 |
+
flex: 1 1 100%;
|
122 |
+
}
|
123 |
+
}
|
templates/dashboard.html
ADDED
@@ -0,0 +1,1055 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!doctype html>
|
2 |
+
<html lang="en">
|
3 |
+
<head>
|
4 |
+
<meta charset="utf-8"/>
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
6 |
+
<title>Trend Discovery Engine</title>
|
7 |
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
|
8 |
+
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
|
9 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
|
10 |
+
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2"></script>
|
11 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
|
12 |
+
</head>
|
13 |
+
<body class="bg-body">
|
14 |
+
|
15 |
+
<nav class="navbar navbar-expand-lg navbar-dark bg-primary shadow-sm">
|
16 |
+
<div class="container-fluid">
|
17 |
+
<a class="navbar-brand fw-semibold" href="#">Trend Discovery Engine</a>
|
18 |
+
</div>
|
19 |
+
</nav>
|
20 |
+
|
21 |
+
<main class="container py-4">
|
22 |
+
<ul class="nav nav-tabs" id="main-tabs" role="tablist">
|
23 |
+
<li class="nav-item" role="presentation">
|
24 |
+
<button class="nav-link active" id="archetypes-tab"
|
25 |
+
data-bs-toggle="tab" data-bs-target="#archetypes"
|
26 |
+
type="button" role="tab" aria-controls="archetypes" aria-selected="true">
|
27 |
+
Trend Archetypes
|
28 |
+
</button>
|
29 |
+
</li>
|
30 |
+
<li class="nav-item" role="presentation">
|
31 |
+
<button class="nav-link" id="viral-topics-tab"
|
32 |
+
data-bs-toggle="tab" data-bs-target="#viral-topics"
|
33 |
+
type="button" role="tab" aria-controls="viral-topics" aria-selected="false">
|
34 |
+
Viral Topics
|
35 |
+
</button>
|
36 |
+
</li>
|
37 |
+
<li class="nav-item" role="presentation">
|
38 |
+
<button class="nav-link" id="nascent-trends-tab"
|
39 |
+
data-bs-toggle="tab" data-bs-target="#nascent-trends"
|
40 |
+
type="button" role="tab" aria-controls="nascent-trends" aria-selected="false">
|
41 |
+
Nascent Trends
|
42 |
+
</button>
|
43 |
+
</li>
|
44 |
+
</ul>
|
45 |
+
<div class="tab-content pt-4">
|
46 |
+
<!-- TAB 1: Trend Archetypes -->
|
47 |
+
<div class="tab-pane fade show active" id="archetypes" role="tabpanel" aria-labelledby="archetypes-tab">
|
48 |
+
|
49 |
+
<div class="d-flex align-items-center mb-3">
|
50 |
+
<h2 class="me-3 mb-0">Trend Archetypes</h2>
|
51 |
+
</div>
|
52 |
+
|
53 |
+
<!-- First area: Flip cards (single row, click to flip, color-coded) -->
|
54 |
+
<div class="card mb-4">
|
55 |
+
<div class="card-header bg-light fw-semibold">Archetype Cards</div>
|
56 |
+
<div class="card-body">
|
57 |
+
<div class="flip-row" id="flipRow">
|
58 |
+
{% for c in clusters %}
|
59 |
+
<div class="flip-card" data-archetype="{{ c.trend_archetype }}" tabindex="0" aria-label="Flip card">
|
60 |
+
<div class="flip-card-inner">
|
61 |
+
<!-- FRONT -->
|
62 |
+
<div class="flip-card-front">
|
63 |
+
<div class="flip-title">{{ c.trend_archetype }}</div>
|
64 |
+
<div class="flip-content">
|
65 |
+
<div class="flip-subtitle">Description</div>
|
66 |
+
<p class="small mt-2">{{ c.description }}</p>
|
67 |
+
</div>
|
68 |
+
</div>
|
69 |
+
<!-- BACK -->
|
70 |
+
<div class="flip-card-back">
|
71 |
+
<div class="flip-title">{{ c.trend_archetype }}</div>
|
72 |
+
<div class="flip-content">
|
73 |
+
<div class="flip-subtitle">Recommendation</div>
|
74 |
+
<p class="small mt-2">{{ c.strategic_recommendation }}</p>
|
75 |
+
</div>
|
76 |
+
</div>
|
77 |
+
</div>
|
78 |
+
</div>
|
79 |
+
{% endfor %}
|
80 |
+
</div>
|
81 |
+
<div class="text-muted small mt-2">Hover over a card to flip. Scroll sideways if needed.</div>
|
82 |
+
</div>
|
83 |
+
</div>
|
84 |
+
|
85 |
+
<!-- Second area: Split 50/50 β Pie | Sample videos by cluster -->
|
86 |
+
<div class="card mb-4">
|
87 |
+
<div class="card-header bg-light fw-semibold">Distribution & Sample Videos</div>
|
88 |
+
<div class="card-body">
|
89 |
+
<div class="split-2">
|
90 |
+
<!-- Left: Pie -->
|
91 |
+
<div class="split-2-col pe-lg-3">
|
92 |
+
<h6 class="mb-3">Video Count by Archetype</h6>
|
93 |
+
|
94 |
+
<!-- (remove these 2 lines if already loaded globally) -->
|
95 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
|
96 |
+
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2"></script>
|
97 |
+
|
98 |
+
<div class="chart-box">
|
99 |
+
<canvas id="videoPieChart"></canvas>
|
100 |
+
</div>
|
101 |
+
|
102 |
+
<!-- JSON payloads for the pie (safe, no Jinja map) -->
|
103 |
+
<script id="pieLabelsJSON" type="application/json">[
|
104 |
+
{% for c in clusters %}"{{ c.trend_archetype|replace('"','\\"') }}"{% if not loop.last %},{% endif %}{% endfor %}
|
105 |
+
]</script>
|
106 |
+
<script id="pieDataJSON" type="application/json">[
|
107 |
+
{% for c in clusters %}{{ (c.video_count or 0)|int }}{% if not loop.last %},{% endif %}{% endfor %}
|
108 |
+
]</script>
|
109 |
+
|
110 |
+
<script>
|
111 |
+
(function(){
|
112 |
+
const canvas = document.getElementById('videoPieChart');
|
113 |
+
if (!canvas) return;
|
114 |
+
|
115 |
+
const labels = JSON.parse(document.getElementById('pieLabelsJSON')?.textContent || '[]');
|
116 |
+
const values = JSON.parse(document.getElementById('pieDataJSON')?.textContent || '[]');
|
117 |
+
if (!labels.length || !values.length) { console.warn('[pie] no data'); return; }
|
118 |
+
|
119 |
+
const colorMap = {
|
120 |
+
"Explosive Viral Hit": "rgba(248,113,113,0.65)", // red-400 @ 65%
|
121 |
+
"Momentum Builder": "rgba(252,211,77,0.65)", // amber-300 @ 65%
|
122 |
+
"Consistent Performer": "rgba(147,197,253,0.70)", // blue-300 @ 70%
|
123 |
+
"Gradual Climber": "rgba(134,239,172,0.70)", // green-300 @ 70%
|
124 |
+
"Organic Riser": "rgba(196,181,253,0.70)" // violet-300 @ 70%
|
125 |
+
};
|
126 |
+
const bg = labels.map(l => colorMap[l] || "rgba(107,114,128,0.9)");
|
127 |
+
const border = bg.map(c => c.replace(/0\.9\)$/, "1)"));
|
128 |
+
const total = values.reduce((a,b)=>a+b,0);
|
129 |
+
|
130 |
+
new Chart(canvas.getContext('2d'), {
|
131 |
+
type: 'pie',
|
132 |
+
plugins: [ChartDataLabels],
|
133 |
+
data: {
|
134 |
+
labels,
|
135 |
+
datasets: [{ data: values, backgroundColor: bg, borderColor: border, borderWidth: 1 }]
|
136 |
+
},
|
137 |
+
options: {
|
138 |
+
responsive: true,
|
139 |
+
maintainAspectRatio: false,
|
140 |
+
plugins: {
|
141 |
+
datalabels: {
|
142 |
+
color: '#000',
|
143 |
+
font: { weight: 'bold', size: 13 },
|
144 |
+
formatter: (v) => (total ? (v/total*100).toFixed(1) : '0.0') + '%'
|
145 |
+
},
|
146 |
+
legend: {
|
147 |
+
position: 'bottom',
|
148 |
+
labels: { boxWidth: 18, font: { size: 14 } }
|
149 |
+
},
|
150 |
+
tooltip: {
|
151 |
+
callbacks: {
|
152 |
+
label: (ctx) => {
|
153 |
+
const label = ctx.label || '';
|
154 |
+
const val = ctx.raw ?? 0;
|
155 |
+
const pct = total ? ((val/total)*100).toFixed(1) : '0.0';
|
156 |
+
return `${label}: ${val.toLocaleString()} videos (${pct}%)`;
|
157 |
+
}
|
158 |
+
}
|
159 |
+
},
|
160 |
+
title: { display: false }
|
161 |
+
}
|
162 |
+
}
|
163 |
+
});
|
164 |
+
})();
|
165 |
+
</script>
|
166 |
+
</div>
|
167 |
+
|
168 |
+
<div class="split-2-sep d-none d-lg-block"></div>
|
169 |
+
|
170 |
+
<!-- Right: All sample videos, grouped by archetype -->
|
171 |
+
<div class="split-2-col ps-lg-3">
|
172 |
+
<h6 class="mb-3">Sample Videos by Archetype</h6>
|
173 |
+
|
174 |
+
<div class="accordion accordion-flush" id="samplesAccordion">
|
175 |
+
{% for c in clusters %}
|
176 |
+
{% set type_class =
|
177 |
+
'type-explosive' if c.trend_archetype == 'Explosive Viral Hit' else
|
178 |
+
'type-momentum' if c.trend_archetype == 'Momentum Builder' else
|
179 |
+
'type-consistent' if c.trend_archetype == 'Consistent Performer' else
|
180 |
+
'type-gradual' if c.trend_archetype == 'Gradual Climber' else
|
181 |
+
'type-organic' if c.trend_archetype == 'Organic Riser' else '' %}
|
182 |
+
|
183 |
+
<div class="accordion-item">
|
184 |
+
<h2 class="accordion-header" id="head-{{ loop.index }}">
|
185 |
+
<button class="accordion-button collapsed sample-head {{ type_class }}"
|
186 |
+
type="button"
|
187 |
+
data-bs-toggle="collapse"
|
188 |
+
data-bs-target="#collapse-{{ loop.index }}"
|
189 |
+
aria-expanded="false"
|
190 |
+
aria-controls="collapse-{{ loop.index }}">
|
191 |
+
<span class="fw-semibold">{{ c.trend_archetype }}</span>
|
192 |
+
<span class="ms-2 text-muted small">({{ c.sample_videos|length }} videos)</span>
|
193 |
+
</button>
|
194 |
+
</h2>
|
195 |
+
<div id="collapse-{{ loop.index }}" class="accordion-collapse collapse"
|
196 |
+
aria-labelledby="head-{{ loop.index }}"
|
197 |
+
data-bs-parent="#samplesAccordion">
|
198 |
+
<div class="accordion-body p-0">
|
199 |
+
<div class="table-responsive sample-table-wrap">
|
200 |
+
<table class="table table-sm table-striped table-hover mb-0 align-middle sample-table compact-table">
|
201 |
+
<thead class="table-header sticky-top">
|
202 |
+
<tr>
|
203 |
+
<th style="width:64px;">Thumb</th>
|
204 |
+
<th>Title</th>
|
205 |
+
<th class="text-end" title="Velocity 1β3 hours">V1β3h</th>
|
206 |
+
<th class="text-end" title="Velocity 12 hoursβ1 day">V12hβ1d</th>
|
207 |
+
<th class="text-end" title="Velocity 1β3 days">V1β3d</th>
|
208 |
+
<th class="text-end" title="Spike Index">Spike</th>
|
209 |
+
</tr>
|
210 |
+
</thead>
|
211 |
+
<tbody>
|
212 |
+
{% for v in c.sample_videos %}
|
213 |
+
<tr>
|
214 |
+
<td>
|
215 |
+
<a href="https://www.youtube.com/watch?v={{ v.video_id }}" target="_blank" rel="noopener">
|
216 |
+
<img class="thumb-xs" src="{{ v.thumbnail_url }}" alt="{{ v.title }}" loading="lazy">
|
217 |
+
</a>
|
218 |
+
</td>
|
219 |
+
<td>
|
220 |
+
<a class="link-dark text-decoration-none sample-title"
|
221 |
+
href="https://www.youtube.com/watch?v={{ v.video_id }}"
|
222 |
+
target="_blank" rel="noopener" title="{{ v.title }}">
|
223 |
+
{{ v.title }}
|
224 |
+
</a>
|
225 |
+
</td>
|
226 |
+
<td class="metric-cell">{{ ((v.velocity_1_3h or 0)|round(0))|int }}</td>
|
227 |
+
<td class="metric-cell">{{ ((v.velocity_12h_1d or 0)|round(0))|int }}</td>
|
228 |
+
<td class="metric-cell">{{ ((v.velocity_1d_3d or 0)|round(0))|int }}</td>
|
229 |
+
<td class="metric-cell">{{ (v.spike_index or 0)|round(2) }}</td>
|
230 |
+
</tr>
|
231 |
+
{% endfor %}
|
232 |
+
</tbody>
|
233 |
+
</table>
|
234 |
+
</div>
|
235 |
+
</div>
|
236 |
+
</div>
|
237 |
+
</div>
|
238 |
+
{% endfor %}
|
239 |
+
</div>
|
240 |
+
|
241 |
+
</div>
|
242 |
+
</div>
|
243 |
+
</div>
|
244 |
+
</div>
|
245 |
+
|
246 |
+
<!-- Third area: Metrics (Table | Line chart) with common filter -->
|
247 |
+
<!-- ===== Area 3 JSON payloads (table + line chart) ===== -->
|
248 |
+
<script id="metricsOrderJSON" type="application/json">
|
249 |
+
{{ clusters | map(attribute='trend_archetype') | list | tojson }}
|
250 |
+
</script>
|
251 |
+
|
252 |
+
<script id="metricsKeysJSON" type="application/json">
|
253 |
+
{
|
254 |
+
"velocity": ["velocity_1_3h","velocity_3_6h","velocity_6_12h","velocity_12h_1d","velocity_1d_3d"],
|
255 |
+
"acceleration": ["acceleration_1_6h","acceleration_6_12h","acceleration_12h_1d","acceleration_1d_3d"],
|
256 |
+
"engagement": ["engagement_ratio_3h","engagement_ratio_6h","engagement_ratio_1d","engagement_ratio_3d"]
|
257 |
+
}
|
258 |
+
</script>
|
259 |
+
|
260 |
+
<script id="metricsKeyLabelsJSON" type="application/json">
|
261 |
+
{
|
262 |
+
"velocity": ["1β3h","3β6h","6β12h","12hβ1d","1β3d"],
|
263 |
+
"acceleration": ["1β6h","6β12h","12hβ1d","1β3d"],
|
264 |
+
"engagement": ["Eng 3h","Eng 6h","Eng 1d","Eng 3d"]
|
265 |
+
}
|
266 |
+
</script>
|
267 |
+
|
268 |
+
<script id="metricsRowsJSON" type="application/json">[
|
269 |
+
{% for c in clusters %}
|
270 |
+
{
|
271 |
+
"archetype": "{{ c.trend_archetype|replace('"','\\"') }}",
|
272 |
+
"velocity": [{{ c.velocity_1_3h or 0 }}, {{ c.velocity_3_6h or 0 }}, {{ c.velocity_6_12h or 0 }}, {{ c.velocity_12h_1d or 0 }}, {{ c.velocity_1d_3d or 0 }}],
|
273 |
+
"acceleration": [{{ c.acceleration_1_6h or 0 }}, {{ c.acceleration_6_12h or 0 }}, {{ c.acceleration_12h_1d or 0 }}, {{ c.acceleration_1d_3d or 0 }}],
|
274 |
+
"engagement": [{{ c.engagement_ratio_3h or 0 }}, {{ c.engagement_ratio_6h or 0 }}, {{ c.engagement_ratio_1d or 0 }}, {{ c.engagement_ratio_3d or 0 }}]
|
275 |
+
}{% if not loop.last %},{% endif %}
|
276 |
+
{% endfor %}
|
277 |
+
]</script>
|
278 |
+
|
279 |
+
<div class="card mb-4" id="area3-metrics">
|
280 |
+
<div class="card-header bg-light d-flex justify-content-between align-items-center">
|
281 |
+
<span class="fw-semibold">Cluster Summary Metrics</span>
|
282 |
+
|
283 |
+
<div class="d-flex align-items-center gap-2">
|
284 |
+
<label for="metricGroupSelect" class="small text-muted mb-0">Metrics:</label>
|
285 |
+
<select id="metricGroupSelect" class="form-select form-select-sm" style="min-width: 180px;">
|
286 |
+
<option value="velocity" selected>Velocity</option>
|
287 |
+
<option value="acceleration">Acceleration</option>
|
288 |
+
<option value="engagement">Engagement</option>
|
289 |
+
</select>
|
290 |
+
</div>
|
291 |
+
</div>
|
292 |
+
|
293 |
+
<div class="card-body">
|
294 |
+
<div class="split-2">
|
295 |
+
<!-- Left: Table -->
|
296 |
+
<div class="split-2-col pe-lg-3">
|
297 |
+
<h6 id="metricsTableTitle" class="mb-2">Velocity Metrics by Archetype</h6>
|
298 |
+
<div class="table-responsive sample-table-wrap">
|
299 |
+
<table id="metricsTable" class="table table-sm table-striped table-hover mb-0 align-middle compact-table">
|
300 |
+
<tbody><tr><td class="text-muted">Loadingβ¦</td></tr></tbody>
|
301 |
+
</table>
|
302 |
+
</div>
|
303 |
+
</div>
|
304 |
+
|
305 |
+
<div class="split-2-sep d-none d-lg-block"></div>
|
306 |
+
|
307 |
+
<!-- Right: Line chart -->
|
308 |
+
<div class="split-2-col ps-lg-3">
|
309 |
+
<h6 id="metricsChartTitle" class="mb-2">Velocity Metrics Trend</h6>
|
310 |
+
<div class="linechart-box">
|
311 |
+
<canvas id="metricsLineChart"></canvas>
|
312 |
+
</div>
|
313 |
+
<div id="metricsChartNotice" class="small text-muted mt-2" style="display:none;"></div>
|
314 |
+
</div>
|
315 |
+
</div>
|
316 |
+
</div>
|
317 |
+
</div>
|
318 |
+
|
319 |
+
<script>
|
320 |
+
(function metricsAreaJSON(){
|
321 |
+
const sel = document.getElementById('metricGroupSelect');
|
322 |
+
const tbl = document.getElementById('metricsTable');
|
323 |
+
const tHdr = document.getElementById('metricsTableTitle');
|
324 |
+
const cHdr = document.getElementById('metricsChartTitle');
|
325 |
+
const cvs = document.getElementById('metricsLineChart');
|
326 |
+
if (!sel || !tbl) return;
|
327 |
+
|
328 |
+
const parseJSON = (id, fallback) => {
|
329 |
+
const el = document.getElementById(id);
|
330 |
+
if (!el) return fallback;
|
331 |
+
try { return JSON.parse(el.textContent || JSON.stringify(fallback)); }
|
332 |
+
catch { return fallback; }
|
333 |
+
};
|
334 |
+
|
335 |
+
// payloads
|
336 |
+
const ORDER = parseJSON('metricsOrderJSON', []);
|
337 |
+
const KEYS = parseJSON('metricsKeysJSON', {});
|
338 |
+
const KEYLABELS = parseJSON('metricsKeyLabelsJSON', {});
|
339 |
+
const ROWS = parseJSON('metricsRowsJSON', []);
|
340 |
+
|
341 |
+
// desired visual order
|
342 |
+
const DESIRED = ["Explosive Viral Hit","Momentum Builder","Consistent Performer","Gradual Climber","Organic Riser"];
|
343 |
+
const FILL = {
|
344 |
+
"Explosive Viral Hit":"rgba(248,113,113,0.65)",
|
345 |
+
"Momentum Builder":"rgba(252,211,77,0.65)",
|
346 |
+
"Consistent Performer":"rgba(147,197,253,0.70)",
|
347 |
+
"Gradual Climber":"rgba(134,239,172,0.70)",
|
348 |
+
"Organic Riser":"rgba(196,181,253,0.70)"
|
349 |
+
};
|
350 |
+
const STROKE = {
|
351 |
+
"Explosive Viral Hit":"#ef4444",
|
352 |
+
"Momentum Builder":"#f59e0b",
|
353 |
+
"Consistent Performer":"#3b82f6",
|
354 |
+
"Gradual Climber":"#10b981",
|
355 |
+
"Organic Riser":"#8b5cf6"
|
356 |
+
};
|
357 |
+
|
358 |
+
// order rows consistently
|
359 |
+
const byName = Object.fromEntries(ROWS.map(r => [r.archetype, r]));
|
360 |
+
const rowsOrdered = DESIRED.map(n => byName[n]).filter(Boolean)
|
361 |
+
.concat(ORDER.filter(n => !DESIRED.includes(n)).map(n => byName[n]).filter(Boolean));
|
362 |
+
|
363 |
+
const fmt = (v) => (typeof v === 'number'
|
364 |
+
? (Math.abs(v)>=1000 ? Math.round(v).toLocaleString()
|
365 |
+
: Math.round(v*100)/100)
|
366 |
+
: '-');
|
367 |
+
|
368 |
+
function renderTable(group){
|
369 |
+
const keys = KEYS[group] || [];
|
370 |
+
let html = `<thead class="table-header sticky-top"><tr><th>Archetype</th>`;
|
371 |
+
(KEYLABELS[group] || keys).forEach(l => html += `<th class="text-end">${l}</th>`);
|
372 |
+
html += `</tr></thead><tbody>`;
|
373 |
+
if (!rowsOrdered.length){
|
374 |
+
html += `<tr><td colspan="${keys.length+1}" class="text-muted">No cluster data.</td></tr>`;
|
375 |
+
} else {
|
376 |
+
rowsOrdered.forEach(r => {
|
377 |
+
html += `<tr><td class="fw-semibold">${r.archetype}</td>`;
|
378 |
+
(r[group] || []).forEach(v => { html += `<td class="metric-cell">${fmt(v)}</td>`; });
|
379 |
+
html += `</tr>`;
|
380 |
+
});
|
381 |
+
}
|
382 |
+
html += `</tbody>`;
|
383 |
+
tbl.innerHTML = html;
|
384 |
+
if (tHdr) tHdr.textContent = `${group[0].toUpperCase()+group.slice(1)} Metrics by Archetype`;
|
385 |
+
}
|
386 |
+
|
387 |
+
let chart = null;
|
388 |
+
function renderChart(group){
|
389 |
+
if (!cvs || typeof Chart === 'undefined') return;
|
390 |
+
const labels = KEYLABELS[group] || KEYS[group] || [];
|
391 |
+
const datasets = rowsOrdered.map(r => ({
|
392 |
+
label: r.archetype,
|
393 |
+
data: (r[group] || []).map(v => (typeof v === 'number' ? v : null)),
|
394 |
+
borderColor: STROKE[r.archetype] || '#6b7280',
|
395 |
+
backgroundColor: FILL[r.archetype] || 'rgba(156,163,175,0.35)',
|
396 |
+
tension: 0.25, borderWidth: 2, pointRadius: 3, pointHoverRadius: 5, spanGaps: true
|
397 |
+
}));
|
398 |
+
if (chart) chart.destroy();
|
399 |
+
chart = new Chart(cvs.getContext('2d'), {
|
400 |
+
type: 'line',
|
401 |
+
data: { labels, datasets },
|
402 |
+
options: {
|
403 |
+
responsive: true, maintainAspectRatio: false,
|
404 |
+
interaction: { mode: 'index', intersect: false },
|
405 |
+
scales: {
|
406 |
+
x: { ticks: { autoSkip: false } },
|
407 |
+
y: {
|
408 |
+
beginAtZero: false,
|
409 |
+
ticks: { callback: (v) => (Math.abs(v)>=1000 ? Math.round(v).toLocaleString() : v) },
|
410 |
+
grid: { color: 'rgba(0,0,0,0.06)' }
|
411 |
+
}
|
412 |
+
},
|
413 |
+
plugins: {
|
414 |
+
legend: { position: 'top' },
|
415 |
+
tooltip: {
|
416 |
+
callbacks: {
|
417 |
+
label: (ctx) => `${ctx.dataset.label}: ${typeof ctx.parsed.y==='number' ? ctx.parsed.y.toLocaleString() : '-'}`
|
418 |
+
}
|
419 |
+
}
|
420 |
+
}
|
421 |
+
}
|
422 |
+
});
|
423 |
+
if (cHdr) cHdr.textContent = `${group[0].toUpperCase()+group.slice(1)} Metrics Trend`;
|
424 |
+
}
|
425 |
+
|
426 |
+
function update(){
|
427 |
+
const g = sel.value || 'velocity';
|
428 |
+
renderTable(g);
|
429 |
+
renderChart(g);
|
430 |
+
}
|
431 |
+
sel.addEventListener('change', update);
|
432 |
+
update();
|
433 |
+
})();
|
434 |
+
</script>
|
435 |
+
|
436 |
+
<!-- ===== Data bootstrap (must be BEFORE the section JS) ===== -->
|
437 |
+
<script id="clustersJSON" type="application/json">
|
438 |
+
{{ (clusters | default([], true)) | tojson | safe }}
|
439 |
+
</script>
|
440 |
+
<script>
|
441 |
+
// Make clusters available to the section JS
|
442 |
+
window.clustersData = [];
|
443 |
+
try {
|
444 |
+
window.clustersData = JSON.parse(document.getElementById('clustersJSON').textContent || '[]');
|
445 |
+
console.info('[bootstrap] clustersData length =', window.clustersData.length);
|
446 |
+
} catch (e) {
|
447 |
+
console.error('[bootstrap] failed to parse clustersJSON', e);
|
448 |
+
}
|
449 |
+
</script>
|
450 |
+
|
451 |
+
<!-- Chart libs (remove if already included globally) -->
|
452 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
|
453 |
+
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@2"></script>
|
454 |
+
|
455 |
+
<!-- Archetypes section JS -->
|
456 |
+
<script src="{{ url_for('static', filename='js/archetypes_section.js') }}"></script>
|
457 |
+
</div>
|
458 |
+
|
459 |
+
<!-- TAB 2: Viral Topics -->
|
460 |
+
<div class="tab-pane fade" id="viral-topics" role="tabpanel" aria-labelledby="viral-topics-tab">
|
461 |
+
<!-- Toolbar: single-select archetype chips -->
|
462 |
+
<div class="card mb-3">
|
463 |
+
<div class="card-body">
|
464 |
+
<label class="form-label small mb-2">Choose Archetype</label>
|
465 |
+
<div id="vt-archetype-chips" class="d-flex flex-wrap gap-2"></div>
|
466 |
+
<div id="vt-chip-hint" class="text-muted small mt-1">Showing top 3 topics by Viral Score.</div>
|
467 |
+
</div>
|
468 |
+
</div>
|
469 |
+
|
470 |
+
<!-- Main card: Top 3 topics + Radar + Sample Videos -->
|
471 |
+
<div class="card">
|
472 |
+
<div class="card-header bg-light fw-semibold d-flex align-items-center justify-content-between">
|
473 |
+
<span>Top Topics</span>
|
474 |
+
<span id="vt-archetype-badge" class="badge rounded-pill text-dark" style="display:none;">Archetype</span>
|
475 |
+
</div>
|
476 |
+
<div class="card-body">
|
477 |
+
|
478 |
+
<!-- Top 3 topic metric cards -->
|
479 |
+
<div id="vt-topcards" class="row g-3 mb-3">
|
480 |
+
<!-- rendered by JS -->
|
481 |
+
</div>
|
482 |
+
|
483 |
+
<!-- Radar: overlay of 3 topics -->
|
484 |
+
<div class="mb-3">
|
485 |
+
<h6 class="mb-2">Signal Profile (Top 3)</h6>
|
486 |
+
<div style="position:relative; height:380px;">
|
487 |
+
<canvas id="vt-radar"></canvas>
|
488 |
+
</div>
|
489 |
+
</div>
|
490 |
+
|
491 |
+
<!-- Sample videos: tabs per topic -->
|
492 |
+
<div class="mt-3">
|
493 |
+
<ul id="vt-tabs" class="nav nav-tabs"></ul>
|
494 |
+
<div id="vt-tabpanes" class="tab-content border-start border-end border-bottom p-3" style="max-height: 420px; overflow:auto;">
|
495 |
+
<!-- rendered by JS -->
|
496 |
+
</div>
|
497 |
+
</div>
|
498 |
+
|
499 |
+
<!-- Empty state -->
|
500 |
+
<div id="vt-empty" class="text-muted small" style="display:none;">No topics available for this archetype.</div>
|
501 |
+
</div>
|
502 |
+
</div>
|
503 |
+
|
504 |
+
<!-- ===== JSON payloads ===== -->
|
505 |
+
{% set _topics = (
|
506 |
+
viral_topics
|
507 |
+
if viral_topics is defined
|
508 |
+
else (data['section_2_Viral_Topics'] if data is defined and 'section_2_Viral_Topics' in data else [])
|
509 |
+
) %}
|
510 |
+
|
511 |
+
<script id="topicsJSON" type="application/json">
|
512 |
+
{{ (_topics | default([], true)) | tojson | safe }}
|
513 |
+
</script>
|
514 |
+
|
515 |
+
<script id="archetypeOrderJSON" type="application/json">
|
516 |
+
["Explosive Viral Hit","Momentum Builder","Consistent Performer","Gradual Climber","Organic Riser"]
|
517 |
+
</script>
|
518 |
+
|
519 |
+
<script id="archetypeColorsJSON" type="application/json">
|
520 |
+
{
|
521 |
+
"Explosive Viral Hit": {"fill":"#F87171","chip":"#FECACA","text":"#111827"},
|
522 |
+
"Momentum Builder": {"fill":"#FCD34D","chip":"#FDE68A","text":"#111827"},
|
523 |
+
"Consistent Performer":{"fill":"#93C5FD","chip":"#BFDBFE","text":"#111827"},
|
524 |
+
"Gradual Climber": {"fill":"#86EFAC","chip":"#BBF7D0","text":"#111827"},
|
525 |
+
"Organic Riser": {"fill":"#C4B5FD","chip":"#DDD6FE","text":"#111827"}
|
526 |
+
}
|
527 |
+
</script>
|
528 |
+
|
529 |
+
<script id="topicSignalsKeysJSON" type="application/json">
|
530 |
+
["z_velocity_1_3h","z_velocity_3_6h","z_acceleration_1_6h","z_engagement_ratio_1d","z_like_comment_ratio_1d","z_spike_index","z_view_growth_std"]
|
531 |
+
</script>
|
532 |
+
|
533 |
+
<!-- Chart.js (skip if already loaded globally) -->
|
534 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
|
535 |
+
|
536 |
+
<!-- JS for this tab -->
|
537 |
+
<script>
|
538 |
+
(function ready(fn){
|
539 |
+
document.readyState !== "loading" ? fn() : document.addEventListener("DOMContentLoaded", fn);
|
540 |
+
})(() => {
|
541 |
+
const ROOT = document.getElementById("viral-topics");
|
542 |
+
if (!ROOT) return; // tab not on this page
|
543 |
+
|
544 |
+
// Use ROOT.querySelector instead of document.getElementById
|
545 |
+
const q = (sel) => ROOT.querySelector(sel);
|
546 |
+
|
547 |
+
const chipsWrap = document.getElementById("vt-archetype-chips");
|
548 |
+
const badgeEl = document.getElementById("vt-archetype-badge");
|
549 |
+
const topCards = document.getElementById("vt-topcards");
|
550 |
+
const radarCv = document.getElementById("vt-radar");
|
551 |
+
const tabsEl = document.getElementById("vt-tabs");
|
552 |
+
const panesEl = document.getElementById("vt-tabpanes");
|
553 |
+
const emptyEl = document.getElementById("vt-empty");
|
554 |
+
if (!chipsWrap || !topCards || !radarCv || !tabsEl || !panesEl) return;
|
555 |
+
|
556 |
+
// ----- JSON -----
|
557 |
+
const parseJSON = (id, fallback) => {
|
558 |
+
const el = document.getElementById(id);
|
559 |
+
if (!el) return fallback;
|
560 |
+
try { return JSON.parse(el.textContent || JSON.stringify(fallback)); }
|
561 |
+
catch { return fallback; }
|
562 |
+
};
|
563 |
+
const RAW_TOPICS = parseJSON("topicsJSON", []);
|
564 |
+
const ORDER = parseJSON("archetypeOrderJSON", []);
|
565 |
+
const COLORS = parseJSON("archetypeColorsJSON", {});
|
566 |
+
const SIGNAL_KEYS = parseJSON("topicSignalsKeysJSON", []);
|
567 |
+
|
568 |
+
// ----- Normalize -----
|
569 |
+
const titleCase = (s) => (s || "").replace(/_/g, " ").replace(/\b\w/g, c => c.toUpperCase());
|
570 |
+
const topics = RAW_TOPICS.map(t => ({
|
571 |
+
archetype: t.trend_archetype_cluster || "",
|
572 |
+
topic_name: t.topic_name || "",
|
573 |
+
display_name: titleCase(t.topic_name || ""),
|
574 |
+
video_count: Number(t.video_count || 0),
|
575 |
+
median_views_3d: Number(t.median_views_3d || 0),
|
576 |
+
virality_consistency: Number(t.virality_consistency || 0),
|
577 |
+
topic_viral_score: Number(t.topic_viral_score || 0),
|
578 |
+
signals: t.signals || {},
|
579 |
+
genai_summary: t.genai_summary || "",
|
580 |
+
sample_videos: Array.isArray(t.sample_videos) ? t.sample_videos : []
|
581 |
+
}));
|
582 |
+
|
583 |
+
// By archetype
|
584 |
+
const byArch = ORDER.reduce((acc, name) => (acc[name] = [], acc), {});
|
585 |
+
topics.forEach(t => { if (byArch[t.archetype]) byArch[t.archetype].push(t); });
|
586 |
+
|
587 |
+
// ----- State -----
|
588 |
+
let selectedArch = ORDER.find(a => (byArch[a] && byArch[a].length)) || ORDER[0];
|
589 |
+
|
590 |
+
// ----- Utils -----
|
591 |
+
const metric = (v) => (typeof v === "number" && !Number.isNaN(v)
|
592 |
+
? (v >= 1000 ? Math.round(v).toLocaleString() : Math.round(v * 100) / 100)
|
593 |
+
: "β");
|
594 |
+
|
595 |
+
function hexToRgb(hex){
|
596 |
+
const m = (hex||"").replace('#','').match(/^([a-f\d]{3}|[a-f\d]{6})$/i);
|
597 |
+
if(!m) return {r:147,g:197,b:253};
|
598 |
+
const h = m[1].length===3 ? m[1].split('').map(c=>c+c).join('') : m[1];
|
599 |
+
return { r: parseInt(h.substr(0,2),16), g: parseInt(h.substr(2,2),16), b: parseInt(h.substr(4,2),16) };
|
600 |
+
}
|
601 |
+
const withAlpha = (hex, a=0.35) => {
|
602 |
+
const {r,g,b} = hexToRgb(hex); return `rgba(${r},${g},${b},${a})`;
|
603 |
+
};
|
604 |
+
const lighten = (hex, amt=0.2) => {
|
605 |
+
const {r,g,b} = hexToRgb(hex);
|
606 |
+
const L = (c)=>Math.round(c + (255-c)*amt);
|
607 |
+
return `rgb(${L(r)},${L(g)},${L(b)})`;
|
608 |
+
};
|
609 |
+
|
610 |
+
// ----- Chips (single-select) -----
|
611 |
+
function renderChips(){
|
612 |
+
chipsWrap.innerHTML = ORDER.map(name => {
|
613 |
+
const color = COLORS[name]?.chip || "#f3f4f6";
|
614 |
+
const text = COLORS[name]?.text || "#111827";
|
615 |
+
const active = (name === selectedArch);
|
616 |
+
return `
|
617 |
+
<button type="button" class="btn btn-sm"
|
618 |
+
data-arch="${name}"
|
619 |
+
style="background:${active? color : 'transparent'}; color:${text};
|
620 |
+
border:1px solid rgba(0,0,0,.12); ${active ? 'box-shadow: inset 0 0 0 1px rgba(0,0,0,.12);' : ''}">
|
621 |
+
${name}
|
622 |
+
</button>`;
|
623 |
+
}).join("");
|
624 |
+
|
625 |
+
chipsWrap.querySelectorAll('button[data-arch]').forEach(btn => {
|
626 |
+
btn.addEventListener('click', () => {
|
627 |
+
selectedArch = btn.getAttribute('data-arch');
|
628 |
+
renderChips();
|
629 |
+
renderAll();
|
630 |
+
});
|
631 |
+
});
|
632 |
+
}
|
633 |
+
|
634 |
+
// ----- Top 3 selection -----
|
635 |
+
function top3For(archetype){
|
636 |
+
const rows = (byArch[archetype] || []).slice()
|
637 |
+
.sort((a,b) => b.topic_viral_score - a.topic_viral_score);
|
638 |
+
return rows.slice(0,3);
|
639 |
+
}
|
640 |
+
|
641 |
+
// ----- Render metric cards -----
|
642 |
+
function renderCards(top3){
|
643 |
+
if (!top3.length){
|
644 |
+
topCards.innerHTML = "";
|
645 |
+
emptyEl.style.display = "";
|
646 |
+
return;
|
647 |
+
}
|
648 |
+
emptyEl.style.display = "none";
|
649 |
+
topCards.innerHTML = top3.map((t,i)=>`
|
650 |
+
<div class="col-12 col-md-6 col-xl-4">
|
651 |
+
<div class="border rounded h-100 p-3">
|
652 |
+
<div class="d-flex align-items-start justify-content-between">
|
653 |
+
<div class="fw-semibold">${t.display_name}</div>
|
654 |
+
<span class="badge bg-light text-dark">#${i+1}</span>
|
655 |
+
</div>
|
656 |
+
${t.genai_summary ? `<div class="text-muted small mt-1 text-truncate-2" title="${t.genai_summary.replace(/"/g,'"')}">${t.genai_summary}</div>` : ``}
|
657 |
+
<div class="row g-2 mt-2">
|
658 |
+
<div class="col-6"><div class="small text-muted">Viral Score</div><div class="fw-bold">${metric(t.topic_viral_score)}</div></div>
|
659 |
+
<div class="col-6"><div class="small text-muted">Consistency</div><div class="fw-bold">${metric(t.virality_consistency)}</div></div>
|
660 |
+
<div class="col-6"><div class="small text-muted">Median Views (3d)</div><div class="fw-bold">${metric(t.median_views_3d)}</div></div>
|
661 |
+
<div class="col-6"><div class="small text-muted">Videos</div><div class="fw-bold">${t.video_count?.toLocaleString?.() || t.video_count}</div></div>
|
662 |
+
</div>
|
663 |
+
</div>
|
664 |
+
</div>
|
665 |
+
`).join("");
|
666 |
+
}
|
667 |
+
|
668 |
+
// ----- Radar: 3 datasets -----
|
669 |
+
let radarChart = null;
|
670 |
+
function renderRadar(top3){
|
671 |
+
if (radarChart) { radarChart.destroy(); radarChart = null; }
|
672 |
+
if (!top3.length) return;
|
673 |
+
const base = COLORS[selectedArch]?.fill || "#93C5FD";
|
674 |
+
const c1 = base;
|
675 |
+
const c2 = lighten(base, 0.18);
|
676 |
+
const c3 = lighten(base, 0.36);
|
677 |
+
|
678 |
+
const dsColors = [c1,c2,c3];
|
679 |
+
const datasets = top3.map((t, idx) => ({
|
680 |
+
label: t.display_name,
|
681 |
+
data: SIGNAL_KEYS.map(k => Number(t.signals?.[k] ?? 0)),
|
682 |
+
borderColor: dsColors[idx],
|
683 |
+
backgroundColor: withAlpha(dsColors[idx], 0.25),
|
684 |
+
borderWidth: 2,
|
685 |
+
pointRadius: 2
|
686 |
+
}));
|
687 |
+
|
688 |
+
const labels = SIGNAL_KEYS.map(k => k.replace(/^z_/, "").replace(/_/g," ").toUpperCase());
|
689 |
+
radarChart = new Chart(radarCv.getContext("2d"), {
|
690 |
+
type: "radar",
|
691 |
+
data: { labels, datasets },
|
692 |
+
options: {
|
693 |
+
responsive: true, maintainAspectRatio: false,
|
694 |
+
scales: {
|
695 |
+
r: {
|
696 |
+
angleLines: { color: "rgba(0,0,0,.08)" },
|
697 |
+
grid: { color: "rgba(0,0,0,.08)" },
|
698 |
+
suggestedMin: -1.5, suggestedMax: 2.5,
|
699 |
+
ticks: { backdropColor: "transparent" }
|
700 |
+
}
|
701 |
+
},
|
702 |
+
plugins: { legend: { position: "top" } }
|
703 |
+
}
|
704 |
+
});
|
705 |
+
}
|
706 |
+
|
707 |
+
// ----- Sample videos: tabs per topic -----
|
708 |
+
function renderTabs(top3){
|
709 |
+
if (!top3.length){
|
710 |
+
tabsEl.innerHTML = "";
|
711 |
+
panesEl.innerHTML = "";
|
712 |
+
return;
|
713 |
+
}
|
714 |
+
tabsEl.innerHTML = top3.map((t, i) => `
|
715 |
+
<li class="nav-item" role="presentation">
|
716 |
+
<button class="nav-link ${i===0?'active':''}" id="tab-${i}"
|
717 |
+
data-bs-toggle="tab" data-bs-target="#pane-${i}" type="button"
|
718 |
+
role="tab" aria-controls="pane-${i}" aria-selected="${i===0}">
|
719 |
+
${t.display_name}
|
720 |
+
</button>
|
721 |
+
</li>
|
722 |
+
`).join("");
|
723 |
+
|
724 |
+
panesEl.innerHTML = top3.map((t, i) => `
|
725 |
+
<div class="tab-pane fade ${i===0?'show active':''}" id="pane-${i}" role="tabpanel" aria-labelledby="tab-${i}">
|
726 |
+
${renderVideosTable(t)}
|
727 |
+
</div>
|
728 |
+
`).join("");
|
729 |
+
}
|
730 |
+
|
731 |
+
function renderVideosTable(topic){
|
732 |
+
if (!topic.sample_videos.length){
|
733 |
+
return `<div class="text-muted small">No sample videos for this topic.</div>`;
|
734 |
+
}
|
735 |
+
const rows = topic.sample_videos.map(v => {
|
736 |
+
const views = Number(v.viewCount_3d || 0);
|
737 |
+
const eng = Number(v.engagement_ratio_1d || 0);
|
738 |
+
const spike = Number(v.spike_index || 0);
|
739 |
+
return `
|
740 |
+
<tr>
|
741 |
+
<td style="width:64px;">
|
742 |
+
<a href="https://www.youtube.com/watch?v=${v.video_id}" target="_blank" rel="noopener">
|
743 |
+
<img src="${v.thumbnail_url}" alt="${(v.title||'').replace(/"/g,'"')}"
|
744 |
+
loading="lazy" style="width:56px;height:32px;object-fit:cover;border-radius:6px;border:1px solid #e5e7eb;">
|
745 |
+
</a>
|
746 |
+
</td>
|
747 |
+
<td>
|
748 |
+
<a class="link-dark text-decoration-none"
|
749 |
+
href="https://www.youtube.com/watch?v=${v.video_id}" target="_blank" rel="noopener"
|
750 |
+
title="${(v.title||'').replace(/"/g,'"')}">
|
751 |
+
${v.title || "(untitled)"}
|
752 |
+
</a>
|
753 |
+
</td>
|
754 |
+
<td class="text-end">${views >= 1000 ? Math.round(views).toLocaleString() : Math.round(views*100)/100}</td>
|
755 |
+
<td class="text-end">${Math.round(eng*100)/100}</td>
|
756 |
+
<td class="text-end">${Math.round(spike*100)/100}</td>
|
757 |
+
</tr>
|
758 |
+
`;
|
759 |
+
}).join("");
|
760 |
+
|
761 |
+
return `
|
762 |
+
<div class="table-responsive">
|
763 |
+
<table class="table table-sm table-striped table-hover align-middle mb-0">
|
764 |
+
<thead class="table-light sticky-top" style="top:0; z-index:1;">
|
765 |
+
<tr>
|
766 |
+
<th style="width:64px;">Thumb</th>
|
767 |
+
<th>Title</th>
|
768 |
+
<th class="text-end">Views (3d)</th>
|
769 |
+
<th class="text-end">Eng. (1d)</th>
|
770 |
+
<th class="text-end">Spike</th>
|
771 |
+
</tr>
|
772 |
+
</thead>
|
773 |
+
<tbody>${rows}</tbody>
|
774 |
+
</table>
|
775 |
+
</div>`;
|
776 |
+
}
|
777 |
+
|
778 |
+
// ----- Header badge -----
|
779 |
+
function renderBadge(){
|
780 |
+
const cfg = COLORS[selectedArch] || {};
|
781 |
+
badgeEl.textContent = selectedArch;
|
782 |
+
badgeEl.style.display = "inline-block";
|
783 |
+
badgeEl.style.background = cfg.chip || "#f3f4f6";
|
784 |
+
badgeEl.style.color = cfg.text || "#111827";
|
785 |
+
badgeEl.style.border = "1px solid rgba(0,0,0,.12)";
|
786 |
+
}
|
787 |
+
|
788 |
+
// ----- Master render -----
|
789 |
+
function renderAll(){
|
790 |
+
renderBadge();
|
791 |
+
const top3 = top3For(selectedArch);
|
792 |
+
renderCards(top3);
|
793 |
+
renderRadar(top3);
|
794 |
+
renderTabs(top3);
|
795 |
+
}
|
796 |
+
|
797 |
+
// init
|
798 |
+
renderChips();
|
799 |
+
renderAll();
|
800 |
+
});
|
801 |
+
|
802 |
+
</script>
|
803 |
+
</div>
|
804 |
+
|
805 |
+
<!-- TAB 3: Nascent Trends (stub for next step) -->
|
806 |
+
<div class="tab-pane fade" id="nascent-trends" role="tabpanel" aria-labelledby="nascent-trends-tab">
|
807 |
+
|
808 |
+
<!-- ===== Nascent Topics ===== -->
|
809 |
+
<div class="card mb-4">
|
810 |
+
<div class="card-header bg-light fw-semibold">Nascent Topics</div>
|
811 |
+
<div class="card-body">
|
812 |
+
<div class="row g-3">
|
813 |
+
<!-- Left: summaries -->
|
814 |
+
<div class="col-12 col-lg-6">
|
815 |
+
<h6 class="mb-2">Executive Summary</h6>
|
816 |
+
<p id="nt-exec" class="text-muted mb-3">β</p>
|
817 |
+
|
818 |
+
<div class="row g-3">
|
819 |
+
<div class="col-12 col-md-6">
|
820 |
+
<h6 class="mb-2">Key Insights</h6>
|
821 |
+
<ul id="nt-insights" class="mb-0 small"></ul>
|
822 |
+
</div>
|
823 |
+
<div class="col-12 col-md-6">
|
824 |
+
<h6 class="mb-2">Recommended Actions</h6>
|
825 |
+
<ul id="nt-actions" class="mb-0 small"></ul>
|
826 |
+
</div>
|
827 |
+
<div class="col-12">
|
828 |
+
<h6 class="mt-3 mb-2">Risks & Watchouts</h6>
|
829 |
+
<ul id="nt-risks" class="mb-0 small"></ul>
|
830 |
+
</div>
|
831 |
+
</div>
|
832 |
+
</div>
|
833 |
+
|
834 |
+
<!-- Right: topics table -->
|
835 |
+
<div class="col-12 col-lg-6">
|
836 |
+
<h6 class="mb-2">Topics (sorted by score)</h6>
|
837 |
+
<div class="table-responsive" style="max-height: 420px; overflow:auto;">
|
838 |
+
<table class="table table-sm table-striped table-hover align-middle mb-0">
|
839 |
+
<thead class="table-light sticky-top" style="top:0; z-index:1;">
|
840 |
+
<tr>
|
841 |
+
<th>Topic</th>
|
842 |
+
<th class="text-end">Videos</th>
|
843 |
+
<th class="text-end">Nascent Score</th>
|
844 |
+
</tr>
|
845 |
+
</thead>
|
846 |
+
<tbody id="nt-rows">
|
847 |
+
<tr><td colspan="3" class="text-muted">No nascent topics.</td></tr>
|
848 |
+
</tbody>
|
849 |
+
</table>
|
850 |
+
</div>
|
851 |
+
</div>
|
852 |
+
</div>
|
853 |
+
</div>
|
854 |
+
</div>
|
855 |
+
|
856 |
+
<!-- ===== Nascent Videos ===== -->
|
857 |
+
<div class="card">
|
858 |
+
<div class="card-header bg-light fw-semibold">Nascent Videos</div>
|
859 |
+
<div class="card-body">
|
860 |
+
<div class="row g-3">
|
861 |
+
<!-- Left: summaries -->
|
862 |
+
<div class="col-12 col-lg-6">
|
863 |
+
<h6 class="mb-2">Executive Summary</h6>
|
864 |
+
<p id="nv-exec" class="text-muted mb-3">β</p>
|
865 |
+
|
866 |
+
<div class="row g-3">
|
867 |
+
<div class="col-12 col-md-6">
|
868 |
+
<h6 class="mb-2">Momentum Patterns</h6>
|
869 |
+
<ul id="nv-insights" class="mb-0 small"></ul>
|
870 |
+
</div>
|
871 |
+
<div class="col-12 col-md-6">
|
872 |
+
<h6 class="mb-2">Creative Playbook</h6>
|
873 |
+
<ul id="nv-actions" class="mb-0 small"></ul>
|
874 |
+
</div>
|
875 |
+
<div class="col-12">
|
876 |
+
<h6 class="mt-3 mb-2">Risks & Watchouts</h6>
|
877 |
+
<ul id="nv-risks" class="mb-0 small"></ul>
|
878 |
+
</div>
|
879 |
+
</div>
|
880 |
+
</div>
|
881 |
+
|
882 |
+
<!-- Right: videos table -->
|
883 |
+
<div class="col-12 col-lg-6">
|
884 |
+
<h6 class="mb-2">Videos (sorted by score)</h6>
|
885 |
+
<div class="table-responsive" style="max-height: 520px; overflow:auto;">
|
886 |
+
<table class="table table-sm table-striped table-hover align-middle mb-0">
|
887 |
+
<thead class="table-light sticky-top" style="top:0; z-index:1;">
|
888 |
+
<tr>
|
889 |
+
<th style="width:64px;">Thumb</th>
|
890 |
+
<th>Title</th>
|
891 |
+
<th class="text-end">Score</th>
|
892 |
+
<th class="text-end">Early Burst</th>
|
893 |
+
<th class="text-end">Growth Ratio</th>
|
894 |
+
<th class="text-end">Eng. Quality</th>
|
895 |
+
<th class="text-end">Low Exposure</th>
|
896 |
+
<th class="text-end">Stability</th>
|
897 |
+
<th class="text-end">Views (3d)</th>
|
898 |
+
<th class="text-end">Eng. (1d)</th>
|
899 |
+
<th class="text-end">Growth Std</th>
|
900 |
+
<th class="text-end">Topic</th>
|
901 |
+
<th>Category</th>
|
902 |
+
</tr>
|
903 |
+
</thead>
|
904 |
+
<tbody id="nv-rows">
|
905 |
+
<tr><td colspan="13" class="text-muted">No nascent videos.</td></tr>
|
906 |
+
</tbody>
|
907 |
+
</table>
|
908 |
+
</div>
|
909 |
+
</div>
|
910 |
+
</div>
|
911 |
+
</div>
|
912 |
+
</div>
|
913 |
+
|
914 |
+
<!-- ===== JSON payloads (Nascent Trends) ===== -->
|
915 |
+
{% set _nascent = (
|
916 |
+
data['section_3_Nascent_Trends']
|
917 |
+
if data is defined and 'section_3_Nascent_Trends' in data
|
918 |
+
else {}
|
919 |
+
) %}
|
920 |
+
|
921 |
+
{% set _nt_summary = (
|
922 |
+
nt_summary
|
923 |
+
if nt_summary is defined
|
924 |
+
else _nascent.get('Nascent_Topics_summary', {})
|
925 |
+
) %}
|
926 |
+
|
927 |
+
{% set _nv_summary = (
|
928 |
+
nv_summary
|
929 |
+
if nv_summary is defined
|
930 |
+
else _nascent.get('Nascent_Videos_summary', {})
|
931 |
+
) %}
|
932 |
+
|
933 |
+
{% set _nt_list = (
|
934 |
+
nt_list
|
935 |
+
if nt_list is defined
|
936 |
+
else _nt_summary.get('Nascent_Topics', [])
|
937 |
+
) %}
|
938 |
+
|
939 |
+
{% set _nv_list = (
|
940 |
+
nv_list
|
941 |
+
if nv_list is defined
|
942 |
+
else _nv_summary.get('Nascent_Videos', [])
|
943 |
+
) %}
|
944 |
+
|
945 |
+
<!-- Keep IDs aligned with nascent_section.js -->
|
946 |
+
<script id="ntSummaryJSON" type="application/json">
|
947 |
+
{{ (_nt_summary | default({}, true)) | tojson | safe }}
|
948 |
+
</script>
|
949 |
+
|
950 |
+
<script id="nvSummaryJSON" type="application/json">
|
951 |
+
{{ (_nv_summary | default({}, true)) | tojson | safe }}
|
952 |
+
</script>
|
953 |
+
|
954 |
+
<script id="nascentTopicsJSON" type="application/json">
|
955 |
+
{{ (_nt_list | default([], true)) | tojson | safe }}
|
956 |
+
</script>
|
957 |
+
|
958 |
+
<script id="nascentVideosJSON" type="application/json">
|
959 |
+
{{ (_nv_list | default([], true)) | tojson | safe }}
|
960 |
+
</script>
|
961 |
+
<!-- Section 3 JS -->
|
962 |
+
<script>
|
963 |
+
(function ready(fn){
|
964 |
+
document.readyState !== "loading" ? fn() : document.addEventListener("DOMContentLoaded", fn);
|
965 |
+
})(() => {
|
966 |
+
// Pick the #nascent-trends pane that actually contains the JSON payloads
|
967 |
+
const PANES = Array.from(document.querySelectorAll('#nascent-trends'));
|
968 |
+
const ROOT = PANES.find(p => p.querySelector('#ntSummaryJSON')) || PANES[0] || document;
|
969 |
+
|
970 |
+
const q = (sel) => ROOT.querySelector(sel) || document.querySelector(sel);
|
971 |
+
const getJSON = (id, fallback) => {
|
972 |
+
const el = ROOT.querySelector(`#${id}`) || document.getElementById(id);
|
973 |
+
if (!el) return fallback;
|
974 |
+
try { return JSON.parse(el.textContent); } catch { return fallback; }
|
975 |
+
};
|
976 |
+
|
977 |
+
// ---- Nodes
|
978 |
+
const ntExec = q("#nt-exec"), ntIns = q("#nt-insights"), ntAct = q("#nt-actions"), ntRisk = q("#nt-risks"), ntRows = q("#nt-rows");
|
979 |
+
const nvExec = q("#nv-exec"), nvIns = q("#nv-insights"), nvAct = q("#nv-actions"), nvRisk = q("#nv-risks"), nvRows = q("#nv-rows");
|
980 |
+
|
981 |
+
// ---- Data
|
982 |
+
const ntSummary = getJSON("ntSummaryJSON", {});
|
983 |
+
const nvSummary = getJSON("nvSummaryJSON", {});
|
984 |
+
const ntList = getJSON("nascentTopicsJSON", []);
|
985 |
+
const nvList = getJSON("nascentVideosJSON", []);
|
986 |
+
|
987 |
+
// ---- Helpers
|
988 |
+
const setText = (el, txt) => { if (el) el.textContent = (txt ?? "β"); };
|
989 |
+
const renderList = (ul, arr) => { if (ul) ul.innerHTML = (arr||[]).length ? arr.map(s=>`<li>${s}</li>`).join("") : `<li class="text-muted">β</li>`; };
|
990 |
+
const n2 = (v) => Number.isFinite(+v) ? Math.round(+v * 100) / 100 : "β";
|
991 |
+
const i0 = (v) => Number.isFinite(+v) ? Math.round(+v).toLocaleString() : "β";
|
992 |
+
|
993 |
+
// ---- Summaries
|
994 |
+
setText(ntExec, ntSummary.executive_summary || "");
|
995 |
+
renderList(ntIns, ntSummary.key_insights || []);
|
996 |
+
renderList(ntAct, ntSummary.recommended_actions || []);
|
997 |
+
renderList(ntRisk, ntSummary.risks_watchouts || []);
|
998 |
+
|
999 |
+
setText(nvExec, nvSummary.executive_summary || "");
|
1000 |
+
renderList(nvIns, nvSummary.momentum_patterns || []);
|
1001 |
+
renderList(nvAct, nvSummary.creative_playbook || []);
|
1002 |
+
renderList(nvRisk, nvSummary.risks_watchouts || []);
|
1003 |
+
|
1004 |
+
// ---- Topics table
|
1005 |
+
if (ntRows) {
|
1006 |
+
const rows = (ntList||[])
|
1007 |
+
.slice()
|
1008 |
+
.sort((a,b)=>(b.nascent_topic_score||0)-(a.nascent_topic_score||0))
|
1009 |
+
.map(t=>`
|
1010 |
+
<tr>
|
1011 |
+
<td>${t.topic_name || "(untitled)"}</td>
|
1012 |
+
<td class="text-end">${i0(t.n_videos)}</td>
|
1013 |
+
<td class="text-end">${n2(t.nascent_topic_score)}</td>
|
1014 |
+
</tr>`).join("");
|
1015 |
+
ntRows.innerHTML = rows || `<tr><td colspan="3" class="text-muted">No nascent topics.</td></tr>`;
|
1016 |
+
}
|
1017 |
+
|
1018 |
+
// ---- Videos table
|
1019 |
+
if (nvRows) {
|
1020 |
+
const rows = (nvList||[])
|
1021 |
+
.slice()
|
1022 |
+
.sort((a,b)=>(b.nascent_video_score||0)-(a.nascent_video_score||0))
|
1023 |
+
.map(v=>{
|
1024 |
+
const title=(v.title||"").replace(/"/g,""");
|
1025 |
+
const href = v.video_id?`https://www.youtube.com/watch?v=${v.video_id}`:null;
|
1026 |
+
const thumb=v.thumbnail_url?`<img src="${v.thumbnail_url}" alt="${title}" loading="lazy" style="width:56px;height:32px;object-fit:cover;border-radius:6px;border:1px solid #e5e7eb;">`:"";
|
1027 |
+
const tcell=href?`<a class="link-dark text-decoration-none" href="${href}" target="_blank" rel="noopener" title="${title}">${title||"(untitled)"}</a>`:(title||"(untitled)");
|
1028 |
+
return `
|
1029 |
+
<tr>
|
1030 |
+
<td style="width:64px;">${href?`<a href="${href}" target="_blank" rel="noopener">${thumb}</a>`:thumb}</td>
|
1031 |
+
<td>${tcell}</td>
|
1032 |
+
<td class="text-end">${n2(v.nascent_video_score)}</td>
|
1033 |
+
<td class="text-end">${n2(v.early_burst)}</td>
|
1034 |
+
<td class="text-end">${n2(v.growth_ratio)}</td>
|
1035 |
+
<td class="text-end">${n2(v.engagement_quality)}</td>
|
1036 |
+
<td class="text-end">${n2(v.low_exposure)}</td>
|
1037 |
+
<td class="text-end">${n2(v.stability)}</td>
|
1038 |
+
<td class="text-end">${i0(v.viewCount_3d)}</td>
|
1039 |
+
<td class="text-end">${n2(v.engagement_ratio_1d)}</td>
|
1040 |
+
<td class="text-end">${i0(v.view_growth_std)}</td>
|
1041 |
+
<td class="text-end">${(typeof v.bertopic_topic==='number'||typeof v.bertopic_topic==='string')?v.bertopic_topic:'β'}</td>
|
1042 |
+
<td>${v.primary_content_category || "β"}</td>
|
1043 |
+
</tr>`;
|
1044 |
+
}).join("");
|
1045 |
+
nvRows.innerHTML = rows || `<tr><td colspan="13" class="text-muted">No nascent videos.</td></tr>`;
|
1046 |
+
}
|
1047 |
+
});
|
1048 |
+
</script>
|
1049 |
+
</div>
|
1050 |
+
</div>
|
1051 |
+
</main>
|
1052 |
+
|
1053 |
+
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
|
1054 |
+
</body>
|
1055 |
+
</html>
|