diff --git a/src/invidious/trending.cr b/src/invidious/trending.cr
index 74bab1bd..fcaf60d1 100644
--- a/src/invidious/trending.cr
+++ b/src/invidious/trending.cr
@@ -20,6 +20,20 @@ def fetch_trending(trending_type, region, locale)
 
   items, _ = extract_items(initial_data)
 
-  # Return items, but ignore categories (e.g featured content)
-  return items.reject!(Category), plid
+  extracted = [] of SearchItem
+
+  items.each do |itm|
+    if itm.is_a?(Category)
+      # Ignore the smaller categories, as they generally contain a sponsored
+      # channel, which brings a lot of noise on the trending page.
+      # See: https://github.com/iv-org/invidious/issues/2989
+      next if itm.contents.size < 24
+
+      extracted.concat extract_category(itm)
+    else
+      extracted << itm
+    end
+  end
+
+  return extracted, plid
 end
diff --git a/src/invidious/yt_backend/extractors_utils.cr b/src/invidious/yt_backend/extractors_utils.cr
index b247dca8..11d95958 100644
--- a/src/invidious/yt_backend/extractors_utils.cr
+++ b/src/invidious/yt_backend/extractors_utils.cr
@@ -68,16 +68,17 @@ rescue ex
   return false
 end
 
-# This function extracts the SearchItems from a Category.
+# This function extracts SearchVideo items from a Category.
 # Categories are commonly returned in search results and trending pages.
 def extract_category(category : Category) : Array(SearchVideo)
-  items = [] of SearchItem
+  return category.contents.select(SearchVideo)
+end
 
-  category.contents.each do |item|
-    target << cate_i if item.is_a?(SearchItem)
+# :ditto:
+def extract_category(category : Category, &)
+  category.contents.select(SearchVideo).each do |item|
+    yield item
   end
-
-  return items
 end
 
 def extract_selected_tab(tabs)