# How to rank the best recent videos on any topic: a weighted, recency-aware method

> Sorting by views returns old all-time giants, never the freshest videos. This is a weighted, recency-aware ranking method: five normalized signals (recency, velocity, over-performance, popularity, engagement), a 60-day half-life decay, hard pre-filters, per-channel diversity caps, and Apify for bulk publish dates.
>
> https://pravda.systems/blog/how-to-rank-the-best-recent-videos · 2026-06-18

You want to know what's actually good on a topic *right now*, this quarter, this month. So you search it, sort by views, and there they are: the same four videos that topped the list a year ago, most of them older than the thing you're trying to learn. Meanwhile the sharpest video on the subject (the one that dropped three weeks ago and is quietly pulling views faster than any of them) sits on page nine, if it surfaces at all. Sorting by views doesn't find the best *recent* videos. It finds the oldest popular ones, every single time.

That's not a search-engine failure. It's a ranking problem with a specific shape, and once you see the shape it's small and fixable. Here's the weighted, recency-aware method I use to surface the freshest high-signal videos on any topic, with every knob exposed.

## Why does "sort by views" keep showing you old videos?

**Raw view count is an all-time accumulator, so it rewards age, not relevance-now.** A four-year-old video has had four years to pile up views a three-week-old breakout never could. Sort a topic by views and you get a museum, not a feed.

For "what's good *now*," you need a score that explicitly decays with age and rewards how fast a video is gaining. Bolt recency on as a filter and the freshest gems still never reach the top. They get out-counted by the giants that happened to survive the cut. Recency has to be *in the score*, pulling weight, not standing at the door checking IDs.

## How do you get publish dates when the search won't give them to you?

**The first practical wall: a plain search returns titles and view counts but not publish dates, so there's literally nothing to rank recency on.** [YouTube](https://youtube.com)'s flat search via [yt-dlp](https://github.com/yt-dlp/yt-dlp) hands back `date=NA`. You can't decay what you can't date.

Two ways out:

- **A per-video metadata call for every candidate.** Works, but it's slow, and it hammers the same IP that YouTube rate-limits. You hit the 429 wall fast.
- **A bulk metadata provider.** An [Apify](https://apify.com) YouTube scraper is the clean primary. It runs from its own infrastructure, so it sidesteps the per-IP 429 that blocks direct subtitle and metadata pulls, and it returns views, publish date, likes, comments, and duration for a whole query at once, exactly the fields the score needs.

The per-video pass is your no-token fallback. The Apify pass is what makes a full topic sweep cheap and fast.

## What makes a recent video actually worth watching? (the five-lever score)

**Score each candidate as a weighted blend of five normalized signals (recency, velocity, over-performance, popularity, engagement), defaulting to `0.32·recency + 0.25·velocity + 0.18·over-performance + 0.15·popularity + 0.10·engagement`.** Every lever is squeezed to 0–1, so those weights are honest proportions, not vibes.

| Lever | Formula | Why it's there |
|---|---|---|
| **Recency** | `0.5 ^ (age_days / 60)` | Exponential decay, 60-day half-life. A two-month-old video scores half a brand-new one. This is what makes the rank *recency-aware*, not recency-filtered. |
| **Velocity** | `log10(views / age_days)`, normalized | Views *per day*, the breakout signal. A video with 100k views in 30 days outranks 500k views spread over 5 years. |
| **Over-performance** | `views / channel_subscribers`, capped at 3× | Views relative to the channel's *own* audience. A video that outruns its subscriber base got pushed by the algorithm past the home crowd, a real signal independent of reach. It demotes a big channel coasting on subscriber inertia and promotes a small channel's breakout. Unknown subscriber count falls back to popularity. |
| **Popularity** | `log10(views)`, normalized | Damped total views, so mega-channels don't flatten everyone. A quality signal, not the driver. |
| **Engagement** | `(likes + comments) / views` | Audience resonance, separating "watched" from "mattered." |

The shape of the thing: velocity, recency, and over-performance together carry **0.75 of the weight**. They're what surface the fresh, genuinely-good winners. Popularity and engagement hold the remaining quarter, keeping reach and resonance in the mix without letting either run the table.

The over-performance lever is the quiet hero. It's the one that pulls a 12k-subscriber channel's 40k-view sleeper up next to a household name's latest upload, because 40k views on 12k subs means the algorithm carried it well past the people who were already going to watch.

## Why filter before you score?

**Apply hard filters first, so the score only ranks things already worth ranking.** Drop anything older than your recency window, below a view floor, shorter than a few minutes, or not in your language, before a single weight gets computed.

The defaults: *(reserved for members — sign in free at pravda.systems)* (that pair drops both Shorts and teasers), English only. Gating first is cheaper than scoring everything, and it stops a viral 12-second Short or a 2023 classic from ever entering the ranking. No clever weight has to fight them off downstream.

## How do you tune for "this month" versus "the best of the year"?

**Two knobs reshape the entire result: the recency half-life and the max-age gate. Shrink them for "what dropped this month," widen them for "the best of the past year."** Everything else can stay put. These two move the center of gravity.

The presets I reach for:

*(reserved for members — sign in free at pravda.systems)*

The weights themselves are tunable too. Push velocity up when you're hunting breakouts. Push engagement up when you care more about community resonance than raw reach. Same machine, different question.

## How do you keep one channel from taking over the list?

**Without a guard, one prolific channel floods the top, so cap how many videos any single channel can contribute (default 3) before you take the top-K.** A topic's "best recent" should be a survey of the field, not one creator's upload schedule.

The cap runs *after* scoring: walk the ranked list top-down, count per channel, and skip a channel's further entries once it's hit its quota. The strongest video from a dominant channel still makes it. The channel just can't own the page.

## How do you actually run the whole thing?

**The method is a small, provider-agnostic ranker with three stages.** Point it at a query, get back a ranked, recency-aware shortlist.

1. **Fetch.** A metadata provider returns candidates with views, publish date, and engagement, with Apify as the primary and the per-video pass as the no-token fallback.
2. **Score.** Apply the hard gates, then the weighted blend across the five levers.
3. **Diversify.** Run the per-channel cap over the ranked list and return the top-K.

Every parameter above is a knob you can turn (half-life, max-age, view floor, the channel cap, and the four weights), so the same documented mechanism serves every topic sweep. And the point of all of it is efficiency: it separates *finding the few videos worth your time* from the expensive step of actually pulling and reading them. Rank first, cheaply, on metadata alone. Then fetch transcripts for the winners only. You read three transcripts instead of skimming thirty thumbnails, and the three are the right three.
