From a02b5d5f66ce024238f6334765830131b30b7f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Helle=C5=9Ben?= Date: Tue, 24 Mar 2026 03:58:08 +0100 Subject: [PATCH] Add initial version of feeds app --- .vscode/settings.json | 3 + config/settings.py | 6 + feeds/management/__init__.py | 0 feeds/management/commands/__init__.py | 0 feeds/management/commands/archive_feed.py | 34 ++++ feeds/migrations/0001_initial.py | 186 +++++++++++++++++++++ feeds/models.py | 136 +++++++++++++++ feeds/services.py | 191 ++++++++++++++++++++++ feeds/tasks.py | 24 +++ feeds/tests/__init__.py | 1 + feeds/tests/test_entry_id.py | 117 +++++++++++++ feeds/tests/test_entry_id_extra.py | 111 +++++++++++++ feeds/tests/test_services.py | 64 ++++++++ feeds/tests/twitch-campaigns.xml | 39 +++++ feeds/urls.py | 19 +-- feeds/views.py | 70 ++++++++ pyproject.toml | 7 + 17 files changed, 993 insertions(+), 15 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 feeds/management/__init__.py create mode 100644 feeds/management/commands/__init__.py create mode 100644 feeds/management/commands/archive_feed.py create mode 100644 feeds/migrations/0001_initial.py create mode 100644 feeds/services.py create mode 100644 feeds/tasks.py create mode 100644 feeds/tests/__init__.py create mode 100644 feeds/tests/test_entry_id.py create mode 100644 feeds/tests/test_entry_id_extra.py create mode 100644 feeds/tests/test_services.py create mode 100644 feeds/tests/twitch-campaigns.xml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..5bacf27 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.analysis.typeCheckingMode": "standard" +} diff --git a/config/settings.py b/config/settings.py index ea6a6cb..8f62567 100644 --- a/config/settings.py +++ b/config/settings.py @@ -4,10 +4,13 @@ import sys from pathlib import Path from typing import Any +import django_stubs_ext import sentry_sdk from dotenv import load_dotenv from platformdirs import user_data_dir +django_stubs_ext.monkeypatch() + logger: logging.Logger = logging.getLogger("feedvault.settings") load_dotenv(verbose=True) @@ -224,3 +227,6 @@ CELERY_BROKER_URL: str = REDIS_URL_CELERY CELERY_RESULT_BACKEND = "django-db" CELERY_RESULT_EXTENDED = True CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler" + +USER_AGENT = "FeedVault/1.0 (+https://feedvault.se/bot; archiving feeds; contact: Discord: TheLovinator#9276, Email: bot@feedvault.se)" +BOT_CONTACT_EMAIL = "bot@feedvault.se" diff --git a/feeds/management/__init__.py b/feeds/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/feeds/management/commands/__init__.py b/feeds/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/feeds/management/commands/archive_feed.py b/feeds/management/commands/archive_feed.py new file mode 100644 index 0000000..8f938dc --- /dev/null +++ b/feeds/management/commands/archive_feed.py @@ -0,0 +1,34 @@ +from typing import TYPE_CHECKING + +from django.core.management.base import BaseCommand + +from feeds.models import Feed +from feeds.services import fetch_and_archive_feed + +if TYPE_CHECKING: + from django.core.management.base import CommandParser + + +class Command(BaseCommand): + """Django management command to fetch and archive a feed by URL.""" + + help = "Fetch and archive a feed by URL." + + def add_arguments(self, parser: CommandParser) -> None: + """Add URL argument to the command.""" + parser.add_argument("url", type=str, help="Feed URL to fetch and archive.") + + def handle(self, *args, **options) -> None: # noqa: ARG002 + """Handle the command execution.""" + url: str = options["url"] + feed, created = Feed.objects.get_or_create(url=url) + if created: + self.stdout.write(self.style.SUCCESS(f"Created new feed for URL: {url}")) + + new_entries: int = fetch_and_archive_feed(feed) + if new_entries: + msg: str = f"Archived {new_entries} new entr{'y' if new_entries == 1 else 'ies'} for URL: {url}" + self.stdout.write(self.style.SUCCESS(msg)) + else: + msg: str = "\tFeed is up to date, but no new entries were archived." + self.stdout.write(self.style.WARNING(msg)) diff --git a/feeds/migrations/0001_initial.py b/feeds/migrations/0001_initial.py new file mode 100644 index 0000000..dd27adf --- /dev/null +++ b/feeds/migrations/0001_initial.py @@ -0,0 +1,186 @@ +# Generated by Django 6.0.3 on 2026-03-24 01:13 + +import django.contrib.postgres.indexes +import django.db.models.deletion +from django.db import migrations +from django.db import models + + +class Migration(migrations.Migration): + """Initial migration for Feed and Entry models.""" + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Feed", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "url", + models.URLField( + help_text="The canonical URL of the RSS/Atom feed. Must be unique.", + max_length=2048, + unique=True, + verbose_name="Feed URL", + ), + ), + ( + "domain", + models.CharField( + db_index=True, + help_text="Domain name extracted from the feed URL.", + max_length=255, + verbose_name="Domain", + ), + ), + ( + "etag", + models.CharField( + blank=True, + default="", + help_text="HTTP ETag header for conditional requests.", + max_length=255, + verbose_name="ETag", + ), + ), + ( + "last_modified", + models.CharField( + blank=True, + default="", + help_text="HTTP Last-Modified header for conditional requests.", + max_length=255, + verbose_name="Last Modified", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Whether this feed is currently being fetched.", + verbose_name="Is Active", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, + help_text="Timestamp when this feed was first added.", + verbose_name="Created At", + ), + ), + ( + "last_fetched_at", + models.DateTimeField( + blank=True, + help_text="Timestamp when this feed was last fetched.", + null=True, + verbose_name="Last Fetched At", + ), + ), + ], + options={ + "verbose_name": "Feed", + "verbose_name_plural": "Feeds", + }, + ), + migrations.CreateModel( + name="Entry", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "entry_id", + models.CharField( + db_index=True, + help_text="Unique entry ID (guid, id, or link) from the feed.", + max_length=512, + verbose_name="Entry ID", + ), + ), + ( + "fetched_at", + models.DateTimeField( + auto_now_add=True, + db_index=True, + help_text="Timestamp when this entry was archived.", + verbose_name="Fetched At", + ), + ), + ( + "published_at", + models.DateTimeField( + blank=True, + db_index=True, + help_text="Timestamp when this entry was published (if available).", + null=True, + verbose_name="Published At", + ), + ), + ( + "content_hash", + models.BigIntegerField( + db_index=True, + help_text="xxhash64 integer of the entry content for deduplication.", + verbose_name="Content Hash", + ), + ), + ( + "data", + models.JSONField( + blank=True, + help_text="Parsed entry data as JSON.", + null=True, + verbose_name="Entry Data", + ), + ), + ( + "error_message", + models.TextField( + blank=True, + default="", + help_text="Error message if archiving failed.", + verbose_name="Error Message", + ), + ), + ( + "feed", + models.ForeignKey( + help_text="The feed this entry was fetched from.", + on_delete=django.db.models.deletion.CASCADE, + related_name="entries", + to="feeds.feed", + verbose_name="Feed", + ), + ), + ], + options={ + "verbose_name": "Entry", + "verbose_name_plural": "Entries", + "indexes": [ + django.contrib.postgres.indexes.GinIndex( + fields=["data"], name="feeds_entry_data_c87562_gin" + ) + ], + "unique_together": {("feed", "entry_id", "content_hash")}, + }, + ), + ] diff --git a/feeds/models.py b/feeds/models.py index e69de29..4e9b818 100644 --- a/feeds/models.py +++ b/feeds/models.py @@ -0,0 +1,136 @@ +import logging +from urllib.parse import urlparse + +from django.contrib.postgres.indexes import GinIndex +from django.db import models + +logger: logging.Logger = logging.getLogger("feeds.models") + + +class Feed(models.Model): + """Represents the actual RSS/Atom feed URL and its metadata.""" + + url = models.URLField( + help_text="The canonical URL of the RSS/Atom feed. Must be unique.", + verbose_name="Feed URL", + max_length=2048, + unique=True, + ) + domain = models.CharField( + help_text="Domain name extracted from the feed URL.", + verbose_name="Domain", + max_length=255, + db_index=True, + ) + etag = models.CharField( + help_text="HTTP ETag header for conditional requests.", + verbose_name="ETag", + max_length=255, + blank=True, + default="", + ) + last_modified = models.CharField( + help_text="HTTP Last-Modified header for conditional requests.", + verbose_name="Last Modified", + max_length=255, + blank=True, + default="", + ) + is_active = models.BooleanField( + help_text="Whether this feed is currently being fetched.", + verbose_name="Is Active", + default=True, + ) + created_at = models.DateTimeField( + help_text="Timestamp when this feed was first added.", + verbose_name="Created At", + auto_now_add=True, + ) + last_fetched_at = models.DateTimeField( + help_text="Timestamp when this feed was last fetched.", + verbose_name="Last Fetched At", + blank=True, + null=True, + ) + + class Meta: + verbose_name = "Feed" + verbose_name_plural = "Feeds" + + def __str__(self) -> str: + """Return the feed URL as string representation.""" + return self.url + + def save(self, *args, **kwargs) -> None: + """Override save to auto-populate domain from URL if not set.""" + if not self.domain and self.url: + self.domain = str(urlparse(str(self.url)).netloc) + + if logger.isEnabledFor(logging.DEBUG): + logger.debug( + "Auto-populated domain '%s' for feed URL: %s", + self.domain, + self.url, + ) + + super().save(*args, **kwargs) + + +class Entry(models.Model): + """An archived entry (item/post) from a feed.""" + + feed = models.ForeignKey( + to="Feed", + help_text="The feed this entry was fetched from.", + on_delete=models.CASCADE, + related_name="entries", + verbose_name="Feed", + ) + entry_id = models.CharField( + help_text="Unique entry ID (guid, id, or link) from the feed.", + verbose_name="Entry ID", + max_length=512, + db_index=True, + ) + fetched_at = models.DateTimeField( + help_text="Timestamp when this entry was archived.", + verbose_name="Fetched At", + auto_now_add=True, + db_index=True, + ) + published_at = models.DateTimeField( + help_text="Timestamp when this entry was published (if available).", + verbose_name="Published At", + db_index=True, + blank=True, + null=True, + ) + content_hash = models.BigIntegerField( + help_text="xxhash64 integer of the entry content for deduplication.", + verbose_name="Content Hash", + db_index=True, + ) + data = models.JSONField( + help_text="Parsed entry data as JSON.", + verbose_name="Entry Data", + blank=True, + null=True, + ) + error_message = models.TextField( + help_text="Error message if archiving failed.", + verbose_name="Error Message", + blank=True, + default="", + ) + + class Meta: + unique_together = ("feed", "entry_id", "content_hash") + indexes = [ + GinIndex(fields=["data"]), + ] + verbose_name = "Entry" + verbose_name_plural = "Entries" + + def __str__(self) -> str: + """Return a string representation of the entry.""" + return f"{self.feed.domain} entry {self.entry_id} at {self.fetched_at}" diff --git a/feeds/services.py b/feeds/services.py new file mode 100644 index 0000000..5024806 --- /dev/null +++ b/feeds/services.py @@ -0,0 +1,191 @@ +from typing import TYPE_CHECKING +from typing import Any +from xml.parsers.expat import ExpatError + +import dateparser +import niquests +import xmltodict +import xxhash +from django.conf import settings +from django.utils import timezone + +from feeds.models import Entry + +if TYPE_CHECKING: + import datetime + + from feeds.models import Feed + +HTTP_OK = 200 +HTTP_NOT_MODIFIED = 304 + + +def extract_id(val: str | dict | None) -> str | None: + """Extracts a string ID from a guid or id field, handling both string and dict formats. + + Args: + val (str | dict | None): The value to extract the ID from, which can be a string, a dict (with possible '#text' or '@id' keys), or None + + Returns: + str | None: The extracted ID as a string, or None if it cannot be extracted + """ + if isinstance(val, dict): + # RSS guid or Atom id as dict: prefer '#text', fallback to str(val) + return val.get("#text") or val.get("@id") or str(val) + return val + + +def fetch_and_archive_feed(feed: Feed) -> int: + """Fetches the feed, parses entries, deduplicates, and archives new entries. + + Returns: + The number of new entries archived. + """ + request_headers: dict[str, str] = get_request_headers() + if feed.etag: + request_headers["If-None-Match"] = feed.etag + if feed.last_modified: + request_headers["If-Modified-Since"] = feed.last_modified + + try: + response: niquests.Response = niquests.get( + feed.url, + headers=request_headers, + timeout=10, + ) + + if response.status_code == HTTP_NOT_MODIFIED: + feed.last_fetched_at = timezone.now() + feed.save(update_fields=["last_fetched_at"]) + return 0 + + raw_xml: bytes = response.content or b"" + error_msg: str = "" + parsed_data: dict[str, Any] | None = None + if response.status_code == HTTP_OK: + try: + parsed_data = xmltodict.parse( + raw_xml.decode("utf-8", errors="replace"), + process_namespaces=False, + ) + except ExpatError as e: + error_msg = f"XML Parsing Error: {e!s}" + + # Extract entries from parsed_data + entries: list[dict[str, Any]] = extract_feed_entries(parsed_data) + + new_count = 0 + for entry in entries: + content_hash: int = calculate_content_hash(entry) + + entry_id: str = ( + extract_id(entry.get("guid")) + or extract_id(entry.get("id")) + or entry.get("link") + or str(content_hash) + ) + if not isinstance(entry_id, str): + entry_id = str(entry_id) + + published_at: datetime.datetime | None = None + for date_field in ("published", "pubDate", "updated", "created"): + if entry.get(date_field): + published_at = dateparser.parse(entry[date_field]) + if published_at: + break + + # Deduplicate: skip if entry with same feed+entry_id+content_hash exists + exists: bool = Entry.objects.filter( + feed=feed, + entry_id=entry_id, + content_hash=content_hash, + ).exists() + if not exists: + Entry.objects.create( + feed=feed, + entry_id=entry_id, + fetched_at=timezone.now(), + published_at=published_at, + content_hash=content_hash, + data=entry, + error_message=error_msg, + ) + new_count += 1 + + feed.etag = response.headers.get("ETag", "") + feed.last_modified = response.headers.get("Last-Modified", "") + feed.last_fetched_at = timezone.now() + feed.save() + + except niquests.exceptions.RequestException as e: + Entry.objects.create( + feed=feed, + entry_id="__error__", + fetched_at=timezone.now(), + published_at=None, + content_hash=0, + data=None, + error_message=str(e), + ) + return 0 + + else: + return new_count + + +def calculate_content_hash(entry: dict[str, Any]) -> int: + """Calculates a content hash for the entry using xxhash64. + + Args: + entry (dict[str, Any]): The entry data as a dictionary. + + Returns: + int: A 64-bit integer hash of the entry content, suitable for deduplication. + """ + entry_bytes: bytes = str(entry).encode("utf-8") + entry_hash_int: int = xxhash.xxh64_intdigest(entry_bytes) + + # Ensure content_hash fits in signed 64-bit integer + content_hash: int = entry_hash_int & 0x7FFFFFFFFFFFFFFF + return content_hash + + +def extract_feed_entries(parsed_data: dict[str, Any] | None) -> list[dict[str, Any]]: + """Extracts a list of entries from the parsed feed data, handling both RSS and Atom formats. + + Args: + parsed_data (dict[str, Any] | None): The parsed feed data as a dictionary, or None if parsing failed + + Returns: + list[dict[str, Any]]: A list of entries extracted from the feed, where each entry is represented as a dictionary. If no entries are found or if parsed_data is None, an empty list is returned. + """ + entries: list[dict[str, Any]] = [] + if parsed_data: + # RSS: channel > item; Atom: feed > entry + items: list[dict[str, Any]] | dict[str, Any] = [] + if "rss" in parsed_data: + items = parsed_data["rss"].get("channel", {}).get("item", []) + elif "feed" in parsed_data: + items = parsed_data["feed"].get("entry", []) + if isinstance(items, dict): + items = [items] + entries = items + return entries + + +def get_request_headers() -> dict[str, str]: + """Helper function to get standard request headers for fetching feeds. + + Returns: + dict[str, str]: A dictionary of HTTP headers to include in feed fetch requests. + """ + # https://blog.cloudflare.com/verified-bots-with-cryptography/ + # https://www.cloudflare.com/lp/verified-bots/ + # TODO(TheLovinator): We have to sign our requests # noqa: TD003 + + request_headers: dict[str, str] = { + "User-Agent": settings.USER_AGENT, + "From": settings.BOT_CONTACT_EMAIL, + } + + return request_headers diff --git a/feeds/tasks.py b/feeds/tasks.py new file mode 100644 index 0000000..9fa21f0 --- /dev/null +++ b/feeds/tasks.py @@ -0,0 +1,24 @@ +from celery import shared_task + +from feeds.models import Feed +from feeds.services import fetch_and_archive_feed + + +@shared_task +def archive_feed_task(feed_id: int) -> str: + """Celery task to fetch and archive a feed by its ID. + + Args: + feed_id: The ID of the Feed to archive. + + Returns: + A message indicating the result of the archiving process. + """ + try: + feed: Feed = Feed.objects.get(id=feed_id) + except Feed.DoesNotExist: + return f"Feed with id {feed_id} does not exist." + new_entries_count: int = fetch_and_archive_feed(feed) + if new_entries_count > 0: + return f"Archived {new_entries_count} new entries for {feed.url}" + return f"No new entries archived for {feed.url}" diff --git a/feeds/tests/__init__.py b/feeds/tests/__init__.py new file mode 100644 index 0000000..0145fca --- /dev/null +++ b/feeds/tests/__init__.py @@ -0,0 +1 @@ +# This file marks the directory as a Python package. diff --git a/feeds/tests/test_entry_id.py b/feeds/tests/test_entry_id.py new file mode 100644 index 0000000..a84d8d8 --- /dev/null +++ b/feeds/tests/test_entry_id.py @@ -0,0 +1,117 @@ +import os +import threading +from http.server import HTTPServer +from http.server import SimpleHTTPRequestHandler +from pathlib import Path +from typing import TYPE_CHECKING + +import pytest + +from feeds.models import Entry +from feeds.models import Feed +from feeds.services import fetch_and_archive_feed + +if TYPE_CHECKING: + from pathlib import Path + + +@pytest.mark.django_db +def test_entry_id_string_guid_dict(tmp_path: Path) -> None: + """Test that entry_id is always a string, even if guid is a dict.""" + # Prepare a fake RSS feed with guid as dict (attributes) + feed_content = """ + + + Test Feed + http://example.com/ + Test feed description + + Item 1 + http://example.com/item1 + http://example.com/item1 + + + + """ + feed_path: Path = tmp_path / "test_feed.xml" + feed_path.write_text(feed_content, encoding="utf-8") + os.chdir(tmp_path) + server = HTTPServer(("localhost", 0), SimpleHTTPRequestHandler) + port: int = server.server_address[1] + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + url: str = f"http://localhost:{port}/test_feed.xml" + feed: Feed = Feed.objects.create(url=url, domain="localhost") + fetch_and_archive_feed(feed) + entry: Entry | None = Entry.objects.filter(feed=feed).first() + assert entry is not None + assert isinstance(entry.entry_id, str) + assert entry.entry_id == "http://example.com/item1" + server.shutdown() + + +@pytest.mark.django_db +def test_entry_id_string_guid_string(tmp_path: Path) -> None: + """Test that entry_id is a string when guid is a plain string.""" + feed_content = """ + + + Test Feed + http://example.com/ + Test feed description + + Item 2 + http://example.com/item2 + http://example.com/item2 + + + + """ + feed_path: Path = tmp_path / "test_feed.xml" + feed_path.write_text(feed_content, encoding="utf-8") + os.chdir(tmp_path) + server = HTTPServer(("localhost", 0), SimpleHTTPRequestHandler) + port: int = server.server_address[1] + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + url: str = f"http://localhost:{port}/test_feed.xml" + feed: Feed = Feed.objects.create(url=url, domain="localhost") + fetch_and_archive_feed(feed) + entry: Entry | None = Entry.objects.filter(feed=feed).first() + assert entry is not None + assert isinstance(entry.entry_id, str) + assert entry.entry_id == "http://example.com/item2" + server.shutdown() + + +@pytest.mark.django_db +def test_entry_id_fallback_to_link(tmp_path: Path) -> None: + """Test that entry_id falls back to link if guid/id missing.""" + feed_content = """ + + + Test Feed + http://example.com/ + Test feed description + + Item 3 + http://example.com/item3 + + + + """ + feed_path: Path = tmp_path / "test_feed.xml" + feed_path.write_text(feed_content, encoding="utf-8") + os.chdir(tmp_path) + server = HTTPServer(("localhost", 0), SimpleHTTPRequestHandler) + port: int = server.server_address[1] + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + url: str = f"http://localhost:{port}/test_feed.xml" + feed: Feed = Feed.objects.create(url=url, domain="localhost") + fetch_and_archive_feed(feed) + entry: Entry | None = Entry.objects.filter(feed=feed).first() + assert entry is not None + assert isinstance(entry.entry_id, str) + assert entry.entry_id == "http://example.com/item3" + server.shutdown() diff --git a/feeds/tests/test_entry_id_extra.py b/feeds/tests/test_entry_id_extra.py new file mode 100644 index 0000000..b5d1729 --- /dev/null +++ b/feeds/tests/test_entry_id_extra.py @@ -0,0 +1,111 @@ +import os +import threading +from http.server import HTTPServer +from http.server import SimpleHTTPRequestHandler +from pathlib import Path +from typing import TYPE_CHECKING + +import pytest + +from feeds.models import Entry +from feeds.models import Feed +from feeds.services import fetch_and_archive_feed + +if TYPE_CHECKING: + from pathlib import Path + + +@pytest.mark.django_db +def test_entry_id_id_dict(tmp_path: Path) -> None: + """Test that entry_id is a string when id is a dict.""" + feed_content = """ + + Test Atom Feed + http://example.com/feed + + Entry 1 + urn:uuid:1234 + + + + """ + feed_path: Path = tmp_path / "test_feed.xml" + feed_path.write_text(feed_content, encoding="utf-8") + os.chdir(tmp_path) + server = HTTPServer(("localhost", 0), SimpleHTTPRequestHandler) + port: int = server.server_address[1] + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + url: str = f"http://localhost:{port}/test_feed.xml" + feed: Feed = Feed.objects.create(url=url, domain="localhost") + fetch_and_archive_feed(feed) + entry: Entry | None = Entry.objects.filter(feed=feed).first() + assert entry is not None + assert isinstance(entry.entry_id, str) + assert "urn:uuid:1234" in entry.entry_id + server.shutdown() + + +@pytest.mark.django_db +def test_entry_id_all_fields_missing(tmp_path: Path) -> None: + """Test that entry_id falls back to content_hash if guid/id/link missing.""" + feed_content = """ + + + Test Feed + + Item with no id + + + + """ + feed_path: Path = tmp_path / "test_feed.xml" + feed_path.write_text(feed_content, encoding="utf-8") + os.chdir(tmp_path) + server = HTTPServer(("localhost", 0), SimpleHTTPRequestHandler) + port: int = server.server_address[1] + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + url: str = f"http://localhost:{port}/test_feed.xml" + feed: Feed = Feed.objects.create(url=url, domain="localhost") + fetch_and_archive_feed(feed) + entry: Entry | None = Entry.objects.filter(feed=feed).first() + assert entry is not None + assert isinstance(entry.entry_id, str) + + # Should be a hash string (digits only) + assert entry.entry_id.isdigit() or entry.entry_id.lstrip("-").isdigit() + server.shutdown() + + +@pytest.mark.django_db +def test_entry_id_malformed_guid(tmp_path: Path) -> None: + """Test that entry_id handles malformed guid/id gracefully.""" + feed_content = """ + + + Test Feed + + Malformed guid + + + + + """ + feed_path: Path = tmp_path / "test_feed.xml" + feed_path.write_text(feed_content, encoding="utf-8") + os.chdir(tmp_path) + server = HTTPServer(("localhost", 0), SimpleHTTPRequestHandler) + port: int = server.server_address[1] + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + url: str = f"http://localhost:{port}/test_feed.xml" + feed: Feed = Feed.objects.create(url=url, domain="localhost") + fetch_and_archive_feed(feed) + entry: Entry | None = Entry.objects.filter(feed=feed).first() + assert entry is not None + assert isinstance(entry.entry_id, str) + + # Should fallback to content_hash + assert entry.entry_id.isdigit() or entry.entry_id.lstrip("-").isdigit() + server.shutdown() diff --git a/feeds/tests/test_services.py b/feeds/tests/test_services.py new file mode 100644 index 0000000..8124333 --- /dev/null +++ b/feeds/tests/test_services.py @@ -0,0 +1,64 @@ +import os +import threading +from http.server import HTTPServer +from http.server import SimpleHTTPRequestHandler +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from pathlib import Path + +import pytest + +from feeds.models import Entry +from feeds.models import Feed +from feeds.services import fetch_and_archive_feed + + +@pytest.mark.django_db +def test_fetch_and_archive_feed_xml(tmp_path: Path) -> None: + """Test fetching and archiving a simple XML feed using a local HTTP server.""" + # Use a local test XML file as a feed source + test_feed_path: Path = tmp_path / "test_feed.xml" + test_feed_path.write_text( + encoding="utf-8", + data=""" + + + Test Feed + http://example.com/ + Test feed description + + Item 1 + http://example.com/item1 + Item 1 description + + + + """, + ) + + # Serve the file using a simple HTTP server + os.chdir(tmp_path) + server = HTTPServer(("localhost", 0), SimpleHTTPRequestHandler) + port: int = server.server_address[1] + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + url: str = f"http://localhost:{port}/test_feed.xml" + + feed: Feed = Feed.objects.create(url=url, domain="localhost") + new_entries: int = fetch_and_archive_feed(feed) + assert new_entries == 1 + + # Check that the entry was archived and contains the expected data + entry: Entry | None = Entry.objects.filter(feed=feed).first() + assert entry is not None + assert entry.data is not None + assert entry.data["title"] == "Item 1" + assert Entry.objects.filter(feed=feed).count() == 1 + + # Clean up: stop the server and wait for the thread to finish + server.shutdown() + + # Wait until the thread terminates. + # This ensures the server is fully stopped before the test ends. + thread.join() diff --git a/feeds/tests/twitch-campaigns.xml b/feeds/tests/twitch-campaigns.xml new file mode 100644 index 0000000..e795b0d --- /dev/null +++ b/feeds/tests/twitch-campaigns.xml @@ -0,0 +1,39 @@ + +Twitch Dropshttps://ttvdrops.lovinator.space/Latest Twitch dropsen-usCC0; Information wants to be free.Tue, 24 Mar 2026 01:02:13 +00001Honkai: Star Rail: V4.1 Honkai: Star Railhttps://ttvdrops.lovinator.space/twitch/campaigns/f54e5832-eee1-4a01-b4b0-89f05c3705e8/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/381b2776-8e10-4aa3-b15c-acf3fc0c4ead.png" alt="V4.1 Honkai: Star Rail" width="160" height="160" /><p>Honkai: Star Rail Drops Campaign</p><p>Starts: 2026-03-24 01:00 UTC (an hour ago)<br />Ends: 2026-04-21 00:59 UTC (3 weeks, 6 days from now)</p><ul><li>15 minutes watched: Credit*20000</li><li>30 minutes watched: Lost Gold Fragment*4</li><li>45 minutes watched: Condensed Aether*5</li><li>60 minutes watched: Traveler&#x27;s Guide*3</li><li>120 minutes watched: Stellar Jade*30</li></ul><a href="https://act.hoyoverse.com/puzzle/hkrpg/pz_u8LiB2qvFN/index.html?game_biz=hkrpg_global&amp;utm_source=twitch&amp;utm_medium=push">About</a>Honkai: Star RailTue, 24 Mar 2026 01:02:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/f54e5832-eee1-4a01-b4b0-89f05c3705e8/twitchdropsHonkai: Star RailCognosphereThe Quinfall: March Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/c864c02b-6880-4cf6-b7b9-86f1fb9d5867/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/a4cfa88e-a3de-4f69-8389-fc5bfa4e91ff.png" alt="March Drops" width="160" height="160" /><p>Watch Twitch streams under The Quinfall category and earn special in-game rewards!</p><p>Starts: 2026-03-23 21:21 UTC (4 hours ago)<br />Ends: 2026-03-24 20:59 UTC (18 hours from now)</p><ul><li>180 minutes watched: Twitch Reward Chest</li></ul><a href="https://www.quinfall.com/twitch-drops">About</a>The QuinfallMon, 23 Mar 2026 21:31:34 +0000https://ttvdrops.lovinator.space/twitch/campaigns/c864c02b-6880-4cf6-b7b9-86f1fb9d5867/twitchdropsThe QuinfallVawraek TechnologyEternal Return: PRO-Fessors: Coralinehttps://ttvdrops.lovinator.space/twitch/campaigns/b033ad2b-176d-11f1-8e92-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/d5997974-6140-44e0-a43e-6baeca5936d4.png" alt="PRO-Fessors: Coraline" width="160" height="160" /><p>https://twitch.playeternalreturn.com/</p><p>Starts: 2026-03-23 21:00 UTC (5 hours ago)<br />Ends: 2026-03-24 02:59 UTC (54 minutes from now)</p><ul><li>60 minutes watched: Drops Token</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/eternalreturngame">EternalReturnGame</a></li></ul><a href="https://twitch.playeternalreturn.com/">About</a>Eternal ReturnMon, 23 Mar 2026 21:01:24 +0000https://ttvdrops.lovinator.space/twitch/campaigns/b033ad2b-176d-11f1-8e92-0a58a9feac02/twitchdropsEternal ReturnNimble Neuron GamesMARVEL Strike Force: Daring Warriors Week 4https://ttvdrops.lovinator.space/twitch/campaigns/ca31e1fb-1380-11f1-8963-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/01c35436-d4e9-4a11-af15-cbace4977f2d.png" alt="Daring Warriors Week 4" width="160" height="160" /><p>Cheer on your favorite creators as they join the fight against Annihilus and earn some sweet rewards for watching!</p><p>Starts: 2026-03-23 21:00 UTC (5 hours ago)<br />Ends: 2026-03-30 20:58 UTC (6 days, 18 hours from now)</p><ul><li>60 minutes watched: 100 L4 Training Modules</li><li>120 minutes watched: x10 Speedball Shards</li></ul><a href="https://marvelstrikeforce.com/en/twitch">About</a>MARVEL Strike ForceMon, 23 Mar 2026 21:01:26 +0000https://ttvdrops.lovinator.space/twitch/campaigns/ca31e1fb-1380-11f1-8963-0a58a9feac02/twitchdropsMARVEL Strike ForceScopelyRise Online: ROW Drop 412https://ttvdrops.lovinator.space/twitch/campaigns/d471d1ef-e8ac-4256-bcb7-c5a2c474f5b8/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/e8340f89-aed7-4e4c-ae61-bb7842ee1ebf.png" alt="ROW Drop 412" width="160" height="160" /><p>Twitch’e özel Rise Online World Twitch Ödülleri elde etmek için talimatları tamamlayın.</p><p>Starts: 2026-03-23 17:59 UTC (8 hours ago)<br />Ends: 2026-03-24 17:56 UTC (15 hours from now)</p><ul><li>240 minutes watched: Red Ribbon Cloak</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/3enpl">3enpL</a></li><li><a href="https://twitch.tv/4cappynaturall">4CappyNaturaLL</a></li><li><a href="https://twitch.tv/adv3nn">Adv3NN</a></li><li><a href="https://twitch.tv/ahmtkursad">Ahmtkursad</a></li><li><a href="https://twitch.tv/akinsama">AkinSama</a></li><li>... and 146 more</li></ul><a href="https://www.riseonlineworld.com/usercp?do=twitch">About</a>Rise OnlineMon, 23 Mar 2026 18:01:24 +0000https://ttvdrops.lovinator.space/twitch/campaigns/d471d1ef-e8ac-4256-bcb7-c5a2c474f5b8/twitchdropsRise OnlineRoko Game StudiosGhosts of Tabor: Day 5 - 3rd anniversaryhttps://ttvdrops.lovinator.space/twitch/campaigns/eb83fc5d-ffa7-4207-8f81-c464cde7fbb7/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/cba8ce41-2c7d-4111-ac43-8916be72bc7c.png" alt="Day 5 - 3rd anniversary" width="160" height="160" /><p>We are celebrating our 3rd year! Join the party, watch your favorite creators and earn new items!</p><p>Starts: 2026-03-23 17:00 UTC (9 hours ago)<br />Ends: 2026-03-24 16:58 UTC (14 hours from now)</p><ul><li>15 minutes watched: M249 Box Magazine</li><li>60 minutes watched: M249</li><li>120 minutes watched: Random Figurine</li><li>180 minutes watched: Shirt Trust no one</li></ul><a href="https://web.stage.ghostsoftabor.com/twitch-drops-event/">About</a>Ghosts of TaborMon, 23 Mar 2026 17:02:04 +0000https://ttvdrops.lovinator.space/twitch/campaigns/eb83fc5d-ffa7-4207-8f81-c464cde7fbb7/twitchdropsGhosts of TaborCombat Waffle StudiosWorld of Tanks: Mafia Drops #2https://ttvdrops.lovinator.space/twitch/campaigns/2d1d8a5a-1315-11f1-95f0-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/b5e87764-f0bf-4f01-9f70-0252a39d6232.jpeg" alt="Mafia Drops #2" width="160" height="160" /><p>Mafia Drops #2</p><p>Starts: 2026-03-23 16:00 UTC (10 hours ago)<br />Ends: 2026-03-26 15:59 UTC (2 days, 13 hours from now)</p><ul><li>180 minutes watched: 2x Personal Reserves, 2x Personal Reserves, 6x Inscriptions</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/06wallst">06wallst</a></li><li><a href="https://twitch.tv/alexundbande">ALEXundBANDE</a></li><li><a href="https://twitch.tv/arkos_ua">Arkos_UA</a></li><li><a href="https://twitch.tv/awesomeepicguys">AwesomeEpicGuys</a></li><li><a href="https://twitch.tv/azumdzumhzums">AzumDzumHzumS</a></li><li>... and 73 more</li></ul><a href="https://worldoftanks.eu/en/news/general-news/battle-pass-special-march-2026/">About</a>World of TanksMon, 23 Mar 2026 16:01:04 +0000https://ttvdrops.lovinator.space/twitch/campaigns/2d1d8a5a-1315-11f1-95f0-0a58a9feac02/twitchdropsWorld of TanksTwitch GamingWargamingShakes and Fidget: S&F Drops 1/3https://ttvdrops.lovinator.space/twitch/campaigns/fce8b663-076d-11f1-9542-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/a2a0d689-fba5-4cbd-9474-f4f0543210a0.png" alt="S&amp;F Drops 1/3" width="160" height="160" /><p>Watch the official Shakes &amp; Fidget stream on Twitch to obtain unique Drops.</p><p>Starts: 2026-03-23 15:00 UTC (11 hours ago)<br />Ends: 2026-03-29 22:58 UTC (5 days, 20 hours from now)</p><ul><li>15 minutes watched: Gilded Package</li><li>30 minutes watched: Potion Package</li><li>60 minutes watched: Soul Taker Package</li><li>90 minutes watched: Fortification Package</li><li>120 minutes watched: Smith Package</li><li>150 minutes watched: Time Jump Package</li><li>180 minutes watched: Gem Package</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/domcaofficial">DomCaOfficial</a></li><li><a href="https://twitch.tv/mozonetv">moZoneTV</a></li><li><a href="https://twitch.tv/n3utr4lsf">N3utr4LSF</a></li><li><a href="https://twitch.tv/sadeg_sf_official">Sadeg_SF_Official</a></li><li><a href="https://twitch.tv/sfgameofficial">sfgameofficial</a></li><li>... and 3 more</li></ul><a href="https://playa-games.helpshift.com/hc/faq/255-twitch-drops/">About</a>Shakes and FidgetMon, 23 Mar 2026 15:01:25 +0000https://ttvdrops.lovinator.space/twitch/campaigns/fce8b663-076d-11f1-9542-0a58a9feac02/twitchdropsShakes and FidgetPlaya-GamesStream Arena RPG: Golden Wings | Back Equiphttps://ttvdrops.lovinator.space/twitch/campaigns/acdfc34b-de50-4115-9aae-5bce3239f995/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/3fcb16c6-ea4d-42fc-8f7a-00bdbe9bd7ab.png" alt="Golden Wings | Back Equip" width="160" height="160" /><p>Get involved in this Stream Arena RPG Twitch Drop! The Golden Wings Back Equip is only available via Twitch Drops!</p><p>Starts: 2026-03-23 14:00 UTC (12 hours ago)<br />Ends: 2026-03-30 06:59 UTC (6 days, 4 hours from now)</p><ul><li>30 minutes watched: 50 Platinum #4</li><li>60 minutes watched: 100 Platinum</li><li>1 sub required: Golden Wings</li></ul><a href="https://streamarenarpg.com/drops_info.html">About</a>Stream Arena RPGMon, 23 Mar 2026 14:00:51 +0000https://ttvdrops.lovinator.space/twitch/campaigns/acdfc34b-de50-4115-9aae-5bce3239f995/twitchdropsStream Arena RPGAyrton AlexisMarbles on Stream: MarbleFest 3/23 - 3/25/26https://ttvdrops.lovinator.space/twitch/campaigns/c871deab-77b3-41f9-aa1c-90ee41070532/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/b183e443-d63c-4f6e-acb0-baef982b5f28.png" alt="MarbleFest 3/23 - 3/25/26" width="160" height="160" /><p>Marbles on Stream is the most welcoming stream interactive experience where a streamer can run the game and welcome anyone in their chat to participate with &quot;!play&quot;. That&#x27;s it! + +Join in for exclusive prizes and keep an eye on our for how we evolve this event in the future. If you need assistance please join our discord. Discord.gg/pixelbypixelstudios </p><p>Starts: 2026-03-23 14:00 UTC (12 hours ago)<br />Ends: 2026-03-25 13:59 UTC (1 day, 11 hours from now)</p><ul><li>120 minutes watched: 15 Community Coins</li><li>360 minutes watched: PbP Deep Vibe</li><li>720 minutes watched: 15 Community Coins</li><li>2 subs required: 30 Tournament Coins</li></ul><a href="https://pixelbypixel.studio/about/twitch-drops">About</a>Marbles on StreamMon, 23 Mar 2026 14:00:50 +0000https://ttvdrops.lovinator.space/twitch/campaigns/c871deab-77b3-41f9-aa1c-90ee41070532/twitchdropsMarbles on StreamPixel by Pixel StudiosOut of the Park Baseball 27: Official 3/23-29/26https://ttvdrops.lovinator.space/twitch/campaigns/2addbe0f-eeb9-450c-9686-8b0929bd3ecf/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/9f8cbb11-4ec9-4265-ae8d-d7038dc23487.png" alt="Official 3/23-29/26" width="160" height="160" /><p>Win a free Perfect Team Card Pack while you watch us stream Out of the Park Baseball 26! Get up to five (5) packs per day!</p><p>Starts: 2026-03-23 13:00 UTC (13 hours ago)<br />Ends: 2026-03-30 12:59 UTC (6 days, 10 hours from now)</p><ul><li>90 minutes watched: PT27 Drop Bundle</li><li>180 minutes watched: PT27 Drop Bundle</li><li>270 minutes watched: PT27 Drop Bundle</li><li>360 minutes watched: PT27 Drop Bundle</li><li>450 minutes watched: PT27 Drop Bundle</li><li>540 minutes watched: PT27 Drop Bundle</li><li>630 minutes watched: PT27 Drop Bundle</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/ootpdevelopments">OOTPDevelopments</a></li></ul><a href="https://forums.ootpdevelopments.com/showpost.php?p=5246508&amp;postcount=1">About</a>Out of the Park Baseball 27Mon, 23 Mar 2026 13:01:35 +0000https://ttvdrops.lovinator.space/twitch/campaigns/2addbe0f-eeb9-450c-9686-8b0929bd3ecf/twitchdropsOut of the Park Baseball 27Out of the Park DevelopmentsOut of the Park Baseball 27: Affiliate 3/23/26https://ttvdrops.lovinator.space/twitch/campaigns/cf4732bc-f717-45a1-82e2-e3cf7f740ddd/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/7ff1801a-e541-49ec-a46e-a8dcd9a555fb.png" alt="Affiliate 3/23/26" width="160" height="160" /><p>Win a free Perfect Team Card Pack while you watch us stream Out of the Park Baseball 26! Get up to five (5) packs per day!</p><p>Starts: 2026-03-23 13:00 UTC (13 hours ago)<br />Ends: 2026-03-24 12:59 UTC (10 hours from now)</p><ul><li>15 minutes watched: PT27 Standard Pack</li><li>30 minutes watched: PT27 Standard Pack</li><li>45 minutes watched: PT27 Standard Pack</li><li>60 minutes watched: PT27 Standard Pack</li><li>90 minutes watched: PT27 Silver Pack</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/angered_unicorn">Angered_Unicorn</a></li><li><a href="https://twitch.tv/atticaonline">AtticaOnline</a></li><li><a href="https://twitch.tv/aydubby">Aydubby</a></li><li><a href="https://twitch.tv/azaxle">AZAxle</a></li><li><a href="https://twitch.tv/baseball_dreamland">Baseball_Dreamland</a></li><li>... and 34 more</li></ul><a href="https://forums.ootpdevelopments.com/showpost.php?p=5246508&amp;postcount=1">About</a>Out of the Park Baseball 27Mon, 23 Mar 2026 13:01:34 +0000https://ttvdrops.lovinator.space/twitch/campaigns/cf4732bc-f717-45a1-82e2-e3cf7f740ddd/twitchdropsOut of the Park Baseball 27Out of the Park DevelopmentsBlack Desert: 2026 BDO Drops (Mar 23)https://ttvdrops.lovinator.space/twitch/campaigns/a4fb4bd2-32af-4d16-85f9-048490010a63/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/b31b610b-ba68-4daf-9c25-639837ef42f0.png" alt="2026 BDO Drops (Mar 23)" width="160" height="160" /><p>• NAEU: https://www.naeu.playblackdesert.com/News/Detail?groupContentNo=5878 • SA: https://www.sa.playblackdesert.com/News/Detail?groupContentNo=3504 • KR: https://www.kr.playblackdesert.com/ko-KR/News/Detail?groupContentNo=10946 • SEA: https://blackdesert.pearlabyss.com/ASIA/en-US/News/Notice/Detail?_boardNo=5614 • TH: https://blackdesert.pearlabyss.com/ASIA/th-TH/News/Notice/Detail?_boardNo=5614</p><p>Starts: 2026-03-23 12:00 UTC (14 hours ago)<br />Ends: 2026-03-24 11:59 UTC (9 hours from now)</p><ul><li>120 minutes watched: 2 Hour (2026 Feb~Apr)</li></ul><a href="https://www.naeu.playblackdesert.com/News/Detail?groupContentNo=5878">About</a>Black DesertMon, 23 Mar 2026 12:01:04 +0000https://ttvdrops.lovinator.space/twitch/campaigns/a4fb4bd2-32af-4d16-85f9-048490010a63/twitchdropsBlack DesertPearl AbyssFishing Planet: Massive Fishing Getawayhttps://ttvdrops.lovinator.space/twitch/campaigns/1057019d-e7e6-4a74-9ea0-eff83103f64f/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/a03b3230-fd78-4496-8aea-337b25b2a67a.png" alt="Massive Fishing Getaway" width="160" height="160" /><p>Welcome to Fishing Planet’s Massive Fishing Getaway Twitch Drops Campaign! +Turn your stream into a rewarding fishing adventure with the Massive Fishing Getaway Drops Campaign! Players can earn rewards simply by watching your Fishing Planet streams. They will receive 2 Pond Passes to some of the most rewarding freshwater and saltwater locations – Congo River, Africa and Kaiji No Ri, Japan. Plus valuable Baitcoin lures and baits, Marker and Navigation Buoys, 4 Repair Kits, extra 38,000 of Credits, and 8 Baitcoins! Just stream under the Fishing Planet tag and let your community reel in some great rewards while enjoying a massive fishing getaway.</p><p>Starts: 2026-03-23 10:00 UTC (16 hours ago)<br />Ends: 2026-04-13 09:59 UTC (2 weeks, 6 days from now)</p><ul><li>30 minutes watched: Gear-Up Congo Box</li><li>60 minutes watched: Gear-Up Japan Box</li><li>120 minutes watched: All-Packed Congo Box</li><li>180 minutes watched: All-Packed Japan Box</li><li>240 minutes watched: Go-Congo Box</li><li>300 minutes watched: Go-Japan Box</li></ul><a href="https://forum.fishingplanet.com/index.php?/topic/40148-massive-fishing-getaway-twitch-drops-campaign/">About</a>Fishing PlanetMon, 23 Mar 2026 10:01:31 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1057019d-e7e6-4a74-9ea0-eff83103f64f/twitchdropsFishing PlanetFishing Planet LLCAlbion Online: Realm Divided 18 - #1/7https://ttvdrops.lovinator.space/twitch/campaigns/8d4d8084-05a2-43f9-9af0-1e03ee5b4ca1/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/234375ea-c24b-4e05-9824-a33871cdcb9a.png" alt="Realm Divided 18 - #1/7" width="160" height="160" /><p>Earn exclusive rewards by watching Albion Online livestreams!</p><p>Starts: 2026-03-23 10:00 UTC (16 hours ago)<br />Ends: 2026-03-24 09:29 UTC (7 hours from now)</p><ul><li>180 minutes watched: Realm Divided Chest</li></ul><a href="https://forum.albiononline.com/index.php/Thread/214756-New-Twitch-Drops-Launching-Monday-July-28-2025/">About</a>Albion OnlineMon, 23 Mar 2026 10:01:28 +0000https://ttvdrops.lovinator.space/twitch/campaigns/8d4d8084-05a2-43f9-9af0-1e03ee5b4ca1/twitchdropsAlbion OnlineSandbox InteractiveNARAKA: BLADEPOINT: S19 Weekly 3.23https://ttvdrops.lovinator.space/twitch/campaigns/927bcf16-a67b-44b2-9b04-648683688f20/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/7aaf1909-fe6f-40a8-b76b-4f95243ffda1.png" alt="S19 Weekly 3.23" width="160" height="160" /><p>Watch livestreams to claim your drops!</p><p>Starts: 2026-03-23 04:00 UTC (22 hours ago)<br />Ends: 2026-03-31 03:58 UTC (1 week from now)</p><ul><li>60 minutes watched: Weekly drop gift</li></ul><a href="https://www.narakathegame.com/news/official/20250723/32172_1249209.html">About</a>NARAKA: BLADEPOINTMon, 23 Mar 2026 04:01:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/927bcf16-a67b-44b2-9b04-648683688f20/twitchdropsNARAKA: BLADEPOINTNetEaseMobile Dungeon: MD Drops Set 1https://ttvdrops.lovinator.space/twitch/campaigns/d36513cd-0770-11f1-8e9b-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/f49b824e-5db4-481d-8983-7f7284ac8616.png" alt="MD Drops Set 1" width="160" height="160" /><p>Watch the official Mobile Dungeon stream on Twitch to obtain unique Drops.</p><p>Starts: 2026-03-23 00:00 UTC (1 day, 2 hours ago)<br />Ends: 2026-03-29 21:59 UTC (5 days, 19 hours from now)</p><ul><li>30 minutes watched: 32x Thirst for Adventure</li><li>60 minutes watched: 2x Dungeon Key</li><li>90 minutes watched: 3x Arena Ticket</li><li>120 minutes watched: 100x Crystal</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/mobiledungeonofficial">MobileDungeonOfficial</a></li><li><a href="https://twitch.tv/mozonetv">moZoneTV</a></li><li><a href="https://twitch.tv/tunyghost">TunyGhost</a></li><li><a href="https://twitch.tv/waves">Waves</a></li></ul><a href="https://playa-games.helpshift.com/hc/faq/463-twitch-drops/">About</a>Mobile DungeonMon, 23 Mar 2026 00:01:33 +0000https://ttvdrops.lovinator.space/twitch/campaigns/d36513cd-0770-11f1-8e9b-0a58a9feac02/twitchdropsMobile DungeonPlaya-GamesModern Warships: Weekly Supply Drops #8https://ttvdrops.lovinator.space/twitch/campaigns/72da302e-1339-11f1-a196-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/cf6d115a-e21e-46b1-9ab5-973ad68f617f.png" alt="Weekly Supply Drops #8" width="160" height="160" /><p>MW Weekly Supply Drops — watch Modern Warships streams and earn weekly useful bonuses with no long watch-time marathons.</p><p>Starts: 2026-03-23 00:00 UTC (1 day, 2 hours ago)<br />Ends: 2026-03-29 23:29 UTC (5 days, 21 hours from now)</p><ul><li>30 minutes watched: 1 Day of Premium</li><li>60 minutes watched: 100 UP&#x27;s</li><li>90 minutes watched: Tactical Consumables Set</li></ul><a href="https://artstorm.com/news/weekly-supply-drops-on-twitch">About</a>Modern WarshipsMon, 23 Mar 2026 00:01:33 +0000https://ttvdrops.lovinator.space/twitch/campaigns/72da302e-1339-11f1-a196-0a58a9feac02/twitchdropsModern WarshipsArtstorm FZEMarble Racing Manager: MM Marble Fest https://ttvdrops.lovinator.space/twitch/campaigns/89a83fea-9d87-4032-b679-24bf42142675/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/2f6319f8-b748-497e-bd36-15615da60e0c.png" alt="MM Marble Fest " width="160" height="160" /><p>Marble Fest is this week! Get involved with Marbles on Stream.</p><p>Starts: 2026-03-22 16:00 UTC (1 day, 10 hours ago)<br />Ends: 2026-03-29 15:59 UTC (5 days, 13 hours from now)</p><ul><li>120 minutes watched: 1x Bronze Crate</li><li>240 minutes watched: 1x Bronze Crate</li><li>360 minutes watched: 1x Bronze Crate</li><li>5 subs required: 1x Bronze Crate</li></ul><a href="https://marblemanager.lovable.app/drops">About</a>Marble Racing ManagerSun, 22 Mar 2026 20:46:29 +0000https://ttvdrops.lovinator.space/twitch/campaigns/89a83fea-9d87-4032-b679-24bf42142675/twitchdropsMarble Racing ManagerPixel by Pixel StudiosCrossout: Rust & Dust Drops IIhttps://ttvdrops.lovinator.space/twitch/campaigns/328a030f-da4d-4052-a041-84f017bf837f/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/fd034a2f-371b-472d-86da-66084cda4b21.jpeg" alt="Rust &amp; Dust Drops II" width="160" height="160" /><p>“Rust &amp; Dust” is a new event that is being launched in Crossout for the first time!</p><p>Starts: 2026-03-22 16:00 UTC (1 day, 10 hours ago)<br />Ends: 2026-03-26 15:59 UTC (2 days, 13 hours from now)</p><ul><li>60 minutes watched: Cartridge</li><li>120 minutes watched: Cartridge</li><li>180 minutes watched: Cartridge</li><li>240 minutes watched: Cartridge</li><li>300 minutes watched: Cartridge</li><li>360 minutes watched: Cartridge</li><li>420 minutes watched: Cartridge</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/7777bear7777">7777BEAR7777</a></li><li><a href="https://twitch.tv/alexdarktech">alexdarktech</a></li><li><a href="https://twitch.tv/alphachop">AlphaChop</a></li><li><a href="https://twitch.tv/b0eser0esi">b0eser0esi</a></li><li><a href="https://twitch.tv/basonsan">Basonsan</a></li><li>... and 53 more</li></ul><a href="https://crossout.net/en/news/490">About</a>CrossoutSun, 22 Mar 2026 16:01:46 +0000https://ttvdrops.lovinator.space/twitch/campaigns/328a030f-da4d-4052-a041-84f017bf837f/twitchdropsCrossoutGaijin NetworkCoin Pusher World: Ticket Lovehttps://ttvdrops.lovinator.space/twitch/campaigns/47fa4de4-178d-4d50-96f9-15fdbe52fd0b/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/default.png" alt="Ticket Love" width="160" height="160" /><p>Just Some Tickets</p><p>Starts: 2026-03-22 14:33 UTC (1 day, 11 hours ago)<br />Ends: 2026-03-24 14:32 UTC (12 hours from now)</p><ul><li>20 minutes watched: 10,000 Tickets</li><li>60 minutes watched: 10,000 Tickets</li><li>120 minutes watched: Lucky Plays 10k Tickets</li><li>240 minutes watched: Lucky Plays 10k Tickets</li><li>360 minutes watched: Coin Skin</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/luckyplaysarcade">LuckyPlaysArcade</a></li></ul><a href="https://coins.coinpusherworld.co.uk/drops/index.php">About</a>Coin Pusher WorldSun, 22 Mar 2026 15:01:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/47fa4de4-178d-4d50-96f9-15fdbe52fd0b/twitchdropsCoin Pusher WorldCoin Pusher World SMITE 2: March Week 4 - Chiron!https://ttvdrops.lovinator.space/twitch/campaigns/d94a2fec-2586-4337-a235-c3036956053d/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/499cf85c-80e5-4cb0-835a-ee72f4ffdaad.png" alt="March Week 4 - Chiron!" width="160" height="160" /><p>Viewers will receive 50 Wandering Market Coins for each two hours spent viewing participating streams. Watch to earn 7 drops for a total of 350 Wandering Market Coins for the week!</p><p>Starts: 2026-03-21 11:00 UTC (2 days, 15 hours ago)<br />Ends: 2026-03-28 10:57 UTC (4 days, 8 hours from now)</p><ul><li>120 minutes watched: Market Coins Bundle 1</li><li>240 minutes watched: Market Coins Bundle 2</li><li>360 minutes watched: Market Coins Bundle 3</li><li>480 minutes watched: Market Coins Bundle 4</li><li>600 minutes watched: Sagittarius Chiron, Market Coins Bundle 5</li><li>720 minutes watched: Market Coins Bundle 6</li><li>840 minutes watched: Market Coins Bundle 7</li></ul><a href="https://www.smite2.com/news/closed-alpha-twitch-drops/">About</a>SMITE 2Sat, 21 Mar 2026 11:01:39 +0000https://ttvdrops.lovinator.space/twitch/campaigns/d94a2fec-2586-4337-a235-c3036956053d/twitchdropsSMITE 2Hi-Rez StudiosNARAKA: BLADEPOINT: 3.21-3.24 NBPL Springhttps://ttvdrops.lovinator.space/twitch/campaigns/7f5bb4a8-41a4-4c54-87fb-22b7033423bc/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/fda46356-5acf-48a6-b02c-8eb3c26fca98.png" alt="3.21-3.24 NBPL Spring" width="160" height="160" /><p>Watch livestreams to claim your drops!</p><p>Starts: 2026-03-21 08:00 UTC (2 days, 18 hours ago)<br />Ends: 2026-03-24 15:59 UTC (13 hours from now)</p><ul><li>60 minutes watched: 10x XP Bonus</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/narakabladepoint">NARAKABLADEPOINT</a></li><li><a href="https://twitch.tv/narakaesports">narakaesports</a></li><li><a href="https://twitch.tv/naraka_asia">永劫無間_亞服</a></li></ul><a href="https://www.narakathegame.com/news/official/20250723/32172_1249209.html">About</a>NARAKA: BLADEPOINTSat, 21 Mar 2026 08:02:05 +0000https://ttvdrops.lovinator.space/twitch/campaigns/7f5bb4a8-41a4-4c54-87fb-22b7033423bc/twitchdropsNARAKA: BLADEPOINTNetEaseNARAKA: BLADEPOINT: 3.21-4.10 NBPL Springhttps://ttvdrops.lovinator.space/twitch/campaigns/edc5d62f-4167-4999-9bc3-09b554e46587/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/506ff7d4-49a1-4c0f-96b9-8dbd699d1cbf.png" alt="3.21-4.10 NBPL Spring" width="160" height="160" /><p>Watch livestreams to claim your drops!</p><p>Starts: 2026-03-21 08:00 UTC (2 days, 18 hours ago)<br />Ends: 2026-04-10 15:59 UTC (2 weeks, 3 days from now)</p><ul><li>15 minutes watched: Spring Split Random Gift </li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/narakabladepoint">NARAKABLADEPOINT</a></li><li><a href="https://twitch.tv/narakaesports">narakaesports</a></li><li><a href="https://twitch.tv/naraka_asia">永劫無間_亞服</a></li></ul><a href="https://www.narakathegame.com/news/official/20250723/32172_1249209.html">About</a>NARAKA: BLADEPOINTSat, 21 Mar 2026 08:02:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/edc5d62f-4167-4999-9bc3-09b554e46587/twitchdropsNARAKA: BLADEPOINTNetEaseNextWorld2: NW2 MERGE DROPS 2026https://ttvdrops.lovinator.space/twitch/campaigns/7b5ee329-1583-436f-9fc2-889c4530b562/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/f2ba9ee4-7bd3-4a13-b01f-a107cec86a9d.png" alt="NW2 MERGE DROPS 2026" width="160" height="160" /><p>NextWorld2 ÖSSZEVONÁS Twitch Dropok! Nézd a streameket és zsákmányolj jobbnál jobb tárgyakat, hogy igazi legendává válj! </p><p>Starts: 2026-03-21 02:00 UTC (3 days ago)<br />Ends: 2026-04-05 23:58 UTC (1 week, 5 days from now)</p><ul><li>120 minutes watched: Gladiátor Köpeny (100db)</li><li>300 minutes watched: Gladiátor Gyűrű (1 db)</li><li>600 minutes watched: Twitch Érme (1 db)</li><li>840 minutes watched: Twitch Érme (1 db)</li><li>900 minutes watched: Haby</li></ul><a href="https://twitch.nextworld2.com/">About</a>NextWorld2Sat, 21 Mar 2026 02:01:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/7b5ee329-1583-436f-9fc2-889c4530b562/twitchdropsNextWorld2Donut Interactive Kft.World of Tanks Console: Iron Horizon Weekend 7https://ttvdrops.lovinator.space/twitch/campaigns/55d1ba64-7652-47da-aa4e-65e6745065c9/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/3fce28fe-0239-468a-a3e7-f46aba6482da.png" alt="Iron Horizon Weekend 7" width="160" height="160" /><p>Defend your horizons with your favorite creators! </p><p>Starts: 2026-03-20 17:00 UTC (3 days, 9 hours ago)<br />Ends: 2026-03-24 09:57 UTC (7 hours from now)</p><ul><li>120 minutes watched: (3) x1.5 Silver Booster</li><li>240 minutes watched: (2) x6 Commander Booster</li><li>480 minutes watched: 4 Camo Vouchers</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/army_guy_e8">Army_Guy_E8</a></li><li><a href="https://twitch.tv/beaverdamstudios">beaverdamstudios</a></li><li><a href="https://twitch.tv/goliathgamestv">GoliathGamesTV</a></li><li><a href="https://twitch.tv/helattv">HELATTV</a></li><li><a href="https://twitch.tv/jeffriker">JeffRiker</a></li><li>... and 6 more</li></ul><a href="https://modernarmor.worldoftanks.com/en/cms/notes/twitch-drops/">About</a>World of Tanks ConsoleFri, 20 Mar 2026 17:01:56 +0000https://ttvdrops.lovinator.space/twitch/campaigns/55d1ba64-7652-47da-aa4e-65e6745065c9/twitchdropsWorld of Tanks ConsoleWargamingMARVEL Contest of Champions: MCOC March Week 4https://ttvdrops.lovinator.space/twitch/campaigns/c3a1a395-929e-4602-84f1-b74da9665861/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/default.png" alt="MCOC March Week 4" width="160" height="160" /><p>Is your Twitch account connected to your Kabam ID? Make sure you do that right away before claiming any rewards! We&#x27;ll see you.. In.. The... Battlerealm!</p><p>Starts: 2026-03-20 17:00 UTC (3 days, 9 hours ago)<br />Ends: 2026-03-27 16:59 UTC (3 days, 14 hours from now)</p><ul><li>15 minutes watched: 3x L2 Revive - S1</li><li>30 minutes watched: 5x Energy - S1</li><li>60 minutes watched: 3x Rebirth Crystals - S1</li><li>120 minutes watched: PRG Gate 7 Star Shards-S1</li><li>180 minutes watched: 2x Exalted Crystals - S1</li><li>240 minutes watched: 20x Saga 7* Sig Stone- S1</li></ul><a href="https://kid.kabam.com/v1/kid/account/login">About</a>MARVEL Contest of ChampionsFri, 20 Mar 2026 17:01:56 +0000https://ttvdrops.lovinator.space/twitch/campaigns/c3a1a395-929e-4602-84f1-b74da9665861/twitchdropsMARVEL Contest of ChampionsKabamMir Korabley: Обновление 26.3: Часть 2https://ttvdrops.lovinator.space/twitch/campaigns/97671970-ecbd-49ad-a95a-1a723073e5ed/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/91dbf1c2-637c-4098-b7a4-e7e1a7efdf81.jpeg" alt="Обновление 26.3: Часть 2" width="160" height="160" /><p>• Смотрите прямые трансляции в категории Mir korabley и получайте боевые задачи прямо в игре. • Подробности на портале «Мир кораблей».</p><p>Starts: 2026-03-20 15:00 UTC (3 days, 11 hours ago)<br />Ends: 2026-03-27 14:59 UTC (3 days, 12 hours from now)</p><ul><li>240 minutes watched: 26.3 Боевая задача #2</li></ul><a href="https://korabli.su/ru/news/sales-and-events/stream-rewards-26-3/">About</a>Mir KorableyFri, 20 Mar 2026 15:01:09 +0000https://ttvdrops.lovinator.space/twitch/campaigns/97671970-ecbd-49ad-a95a-1a723073e5ed/twitchdropsMir KorableyLesta GamesShakes and Fidget: S&F Dropletshttps://ttvdrops.lovinator.space/twitch/campaigns/08640ac2-0761-11f1-8e9b-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/d7d763fb-4c5d-4136-9ff7-6d601dc46654.png" alt="S&amp;F Droplets" width="160" height="160" /><p>Droplets are additional drops to our main drop campaigns.</p><p>Starts: 2026-03-20 15:00 UTC (3 days, 11 hours ago)<br />Ends: 2026-03-26 22:58 UTC (2 days, 20 hours from now)</p><ul><li>15 minutes watched: Gilded Package</li><li>30 minutes watched: Construction Package</li><li>60 minutes watched: Arcane Package</li><li>90 minutes watched: Soul Taker Package</li><li>120 minutes watched: Fortification Package</li><li>150 minutes watched: Smith Package</li><li>180 minutes watched: Allrounder Package</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/achajka23">Achajka23</a></li><li><a href="https://twitch.tv/angela35">Angela35</a></li><li><a href="https://twitch.tv/aurikos_zonestos">Aurikos_Zonestos</a></li><li><a href="https://twitch.tv/avid_is_odd">Avid_is_Odd</a></li><li><a href="https://twitch.tv/banditsf">BanditSF</a></li><li>... and 48 more</li></ul><a href="https://playa-games.helpshift.com/hc/faq/255-twitch-drops/">About</a>Shakes and FidgetFri, 20 Mar 2026 15:01:09 +0000https://ttvdrops.lovinator.space/twitch/campaigns/08640ac2-0761-11f1-8e9b-0a58a9feac02/twitchdropsShakes and FidgetPlaya-GamesHeroes of Newerth Reborn: Marketplace Maniahttps://ttvdrops.lovinator.space/twitch/campaigns/c3f9ff6d-25a1-4e86-a94e-913ef9b6fa46/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/214e4025-6d9e-4995-8d2a-0239a339222c.png" alt="Marketplace Mania" width="160" height="160" /><p>To celebrate HoN Reborn&#x27;s Marketplace launch, we are giving out the following rewards to twitch viewers: Chipper Bush (Emote), Twitch Steampunk Drone (Raven Skin), and Twitch Behemoth (Avatar).</p><p>Starts: 2026-03-20 15:00 UTC (3 days, 11 hours ago)<br />Ends: 2026-04-05 23:58 UTC (1 week, 5 days from now)</p><ul><li>120 minutes watched: Chipper Bush</li><li>240 minutes watched: Twitch: Steampunk Drone</li><li>2 subs required: Twitch: Behemoth Avatar</li></ul><a href="https://app.juvio.com/twitch">About</a>Heroes of Newerth RebornFri, 20 Mar 2026 15:01:10 +0000https://ttvdrops.lovinator.space/twitch/campaigns/c3f9ff6d-25a1-4e86-a94e-913ef9b6fa46/twitchdropsHeroes of Newerth RebornKongor Studios, LLCMarvel Rivals: Season 7 Twitch Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/22911f8a-950d-422c-883f-959304cfaa46/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/766c9b52-0f5a-4ec1-b7b6-e190f412e55a.png" alt="Season 7 Twitch Drops" width="160" height="160" /><p>Tune into your favorite streamers for exclusive drop rewards</p><p>Starts: 2026-03-20 12:00 UTC (3 days, 14 hours ago)<br />Ends: 2026-04-17 08:59 UTC (3 weeks, 3 days from now)</p><ul><li>30 minutes watched: Scarlet Witch Spray</li><li>60 minutes watched: Scarlet Witch Nameplate</li><li>120 minutes watched: Scarlet Witch Emote</li><li>240 minutes watched: Scarlet Witch Costume</li></ul><a href="https://www.marvelrivals.com/twitchdrops/">About</a>Marvel RivalsFri, 20 Mar 2026 12:01:10 +0000https://ttvdrops.lovinator.space/twitch/campaigns/22911f8a-950d-422c-883f-959304cfaa46/twitchdropsMarvel RivalsMarvel RivalsTwitch GamingBaller League: USAhttps://ttvdrops.lovinator.space/twitch/campaigns/370aa794-cd1a-4f75-8da6-7d1c4f4b6616/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/fireballer_q1_2026/baller_league.png" alt="Baller League USA" width="160" height="160" /><p>Watch /ballerleagueusa stream Baller League for 60 minutes to unlock the FireBaller emote for a limited time.</p><p>Starts: 2026-03-20 00:00 UTC (4 days, 2 hours ago)<br />Ends: 2026-04-01 06:30 UTC (1 week, 1 day from now)</p><ul><li>60 minutes watched: FireBaller</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/ballerleagueusa">BallerLeagueUSA</a></li></ul><a href="https://help.twitch.tv/s/article/how-to-use-emotes">About</a>Baller LeagueFri, 20 Mar 2026 00:04:58 +0000https://ttvdrops.lovinator.space/twitch/campaigns/370aa794-cd1a-4f75-8da6-7d1c4f4b6616/twitchdropsBaller LeagueTwitch GamingCrimson Desert: Drops #1https://ttvdrops.lovinator.space/twitch/campaigns/6349626a-75f4-4ec7-903e-6bfd53040338/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/559d6d6c-529e-4a16-8269-19eb9bd05a42.jpeg" alt="Crimson Desert Drops #1" width="160" height="160" /><p>Watch participating Crimson Desert streams on Twitch for rewards!</p><p>Starts: 2026-03-19 23:00 UTC (4 days, 3 hours ago)<br />Ends: 2026-03-25 23:58 UTC (1 day, 21 hours from now)</p><ul><li>60 minutes watched: Scout Lantern, Meat Dish</li><li>120 minutes watched: Scout Accessories</li><li>180 minutes watched: Scout Shield</li><li>300 minutes watched: Scout Cloak, Armor, Hat</li></ul><a href="https://event.pearlabyss.com/CrimsonDesert/Drops">About</a>Crimson DesertThu, 19 Mar 2026 23:01:13 +0000https://ttvdrops.lovinator.space/twitch/campaigns/6349626a-75f4-4ec7-903e-6bfd53040338/twitchdropsCrimson DesertPearl AbyssTwitch GamingWorld of Warships: Update 15.2 Drop: Week 2https://ttvdrops.lovinator.space/twitch/campaigns/b4c08423-b370-431b-80c0-0e80586e41f3/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/ccecb935-1795-4c94-9daa-a83b6c4b44b2.png" alt="Update 15.2 Drop: Week 2" width="160" height="160" /><p>Koalas have fingerprints almost identical to humans, so similar they can confuse crime scene forensics.</p><p>Starts: 2026-03-19 17:00 UTC (4 days, 9 hours ago)<br />Ends: 2026-03-26 16:59 UTC (2 days, 14 hours from now)</p><ul><li>90 minutes watched: Update 15.2 Mission #2</li><li>180 minutes watched: Twitch Container 15.2</li></ul><a href="https://worldofwarships.com/en/news/general-news/community-drops-in-update-152/">About</a>World of WarshipsThu, 19 Mar 2026 17:01:55 +0000https://ttvdrops.lovinator.space/twitch/campaigns/b4c08423-b370-431b-80c0-0e80586e41f3/twitchdropsWorld of WarshipsWargamingDon't Starve Together: Wriggly Eyebrellahttps://ttvdrops.lovinator.space/twitch/campaigns/2276be95-ef40-4ac8-9346-9e182aee6d4e/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/47f2497c-e612-4403-a4b4-a0e811517428.png" alt="Wriggly Eyebrella" width="160" height="160" /><p>The Wriggly Eyebrella is the second campaign in the Chitinous Collection. The campaign includes a Profile Icon, Portrait Frame, and Eyebrella skin.</p><p>Starts: 2026-03-19 17:00 UTC (4 days, 9 hours ago)<br />Ends: 2026-04-16 16:59 UTC (3 weeks, 2 days from now)</p><ul><li>30 minutes watched: Wriggly Eyebrella - Icon</li><li>90 minutes watched: Wriggly Eyebrella - Port</li><li>180 minutes watched: Wriggly Eyebrella</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/nanakoa">연꽃쓰</a></li><li><a href="https://twitch.tv/wkdrlzh">장기코</a></li><li><a href="https://twitch.tv/yuricahanatan7">카노군</a></li><li><a href="https://twitch.tv/myhidy">하이와디</a></li><li><a href="https://twitch.tv/piachuz">합체합체올파워를</a></li><li>... and 358 more</li></ul><a href="https://accounts.klei.com/account/rewards">About</a>Don't Starve TogetherThu, 19 Mar 2026 17:01:56 +0000https://ttvdrops.lovinator.space/twitch/campaigns/2276be95-ef40-4ac8-9346-9e182aee6d4e/twitchdropsDon't Starve TogetherKlei EntertainmentBlue Protocol: Star Resonance: Starland Special Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/1e36a377-9f35-47e8-a6d5-b67c4a9867af/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/21ff4517-9a63-488d-966d-4a99f9be8b8d.png" alt="Starland Special Drops" width="160" height="160" /><p>The description is viewable on the Drops page. It should cover the full details about your drops campaign. Must be fewer than 1024 characters.</p><p>Starts: 2026-03-19 12:30 UTC (4 days, 13 hours ago)<br />Ends: 2026-04-16 12:29 UTC (3 weeks, 2 days from now)</p><ul><li>15 minutes watched: Rose Orb (Bound)*50</li><li>30 minutes watched: Starland Medal *500</li><li>60 minutes watched: Starland Medal *1000</li><li>180 minutes watched: Boom-Boom Ea-chan I*1</li><li>300 minutes watched: Rose Orb (Bound)*150</li></ul><a href="https://www.playbpsr.com/twitch_bind">About</a>Blue Protocol: Star ResonanceThu, 19 Mar 2026 12:31:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1e36a377-9f35-47e8-a6d5-b67c4a9867af/twitchdropsBlue Protocol: Star ResonanceA PLUS JAPAN Inc.EVE Online: Gallente Elections Week 1https://ttvdrops.lovinator.space/twitch/campaigns/a0c6aded-456f-4077-99d6-6520c6b9e99f/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/e90f328a-5b55-40fd-aaa2-104dd76b5346.jpeg" alt="Gallente Elections Week 1" width="160" height="160" /><p>The Gallente Elections are here! + +Be sure to link your account if you haven&#x27;t already, and then simply what your favorite streamer for a combined 6 hours between now and the 25th for the Enyo Pride of the Federation SKIN to be delivered to your redeem queue in game.</p><p>Starts: 2026-03-19 12:00 UTC (4 days, 14 hours ago)<br />Ends: 2026-03-25 23:29 UTC (1 day, 21 hours from now)</p><ul><li>360 minutes watched: Enyo - Pride of the Fed!</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/0g_mcfadden">0G_McFadden</a></li><li><a href="https://twitch.tv/aale_bor">aAle_Bor</a></li><li><a href="https://twitch.tv/abysspaul">AbyssPaul</a></li><li><a href="https://twitch.tv/a_filthe_casual">A_FilthE_Casual</a></li><li><a href="https://twitch.tv/alecjeay">alecjeay</a></li><li>... and 332 more</li></ul><a href="https://www.eveonline.com/twitch">About</a>EVE OnlineThu, 19 Mar 2026 12:31:05 +0000https://ttvdrops.lovinator.space/twitch/campaigns/a0c6aded-456f-4077-99d6-6520c6b9e99f/twitchdropsEVE OnlineCCP GamesUFL: March #4https://ttvdrops.lovinator.space/twitch/campaigns/9896f799-cffa-4568-bd0c-f77c8068f0aa/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/580020ea-800e-4b1d-ad53-25147c45d904.png" alt="March #4" width="160" height="160" /><p>Watch any channel with drops enabled on Twitch in the UFL category and get cool rewards!</p><p>Starts: 2026-03-19 09:00 UTC (4 days, 17 hours ago)<br />Ends: 2026-03-25 23:58 UTC (1 day, 21 hours from now)</p><ul><li>60 minutes watched: 50 LP </li><li>120 minutes watched: Surge Lite Pack</li><li>180 minutes watched: Surge Lite Pack</li><li>240 minutes watched: March GC Pack 2 Lab</li></ul><a href="https://portal.uflgame.com/twitch/drops">About</a>UFLThu, 19 Mar 2026 09:01:44 +0000https://ttvdrops.lovinator.space/twitch/campaigns/9896f799-cffa-4568-bd0c-f77c8068f0aa/twitchdropsUFLXTEN LIMITEDWarhammer 40,000: Darktide: Zealots of Tertiumhttps://ttvdrops.lovinator.space/twitch/campaigns/49ed5bf3-3289-4da9-8183-bdd086e0a6b5/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/b620c3ed-1828-4b12-95e4-6d81660232e5.png" alt="Zealots of Tertium" width="160" height="160" /><p>Unleash the unyielding fervor of the Zealot with the Protector of Tertium Twitch Drop set. Obtain this exclusive set by watching participating Twitch streams and conquer the shadowy depths of Tertium as the ultimate warrior and punisher.</p><p>Starts: 2026-03-19 08:55 UTC (4 days, 17 hours ago)<br />Ends: 2026-04-09 08:54 UTC (2 weeks, 2 days from now)</p><ul><li>20 minutes watched: PoT Hood</li><li>30 minutes watched: PoT Militia Garb</li><li>45 minutes watched: PoT Trousers</li><li>60 minutes watched: PoT Thunderhammer</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/taezzang">태은짱</a></li><li><a href="https://twitch.tv/demonie__">디모니_</a></li><li><a href="https://twitch.tv/acquiretigris">acquireTigris</a></li><li><a href="https://twitch.tv/altair">Altair</a></li><li><a href="https://twitch.tv/alyx117">alyx117</a></li><li>... and 94 more</li></ul><a href="https://www.playdarktide.com/news/earn-twitch-drops">About</a>Warhammer 40,000: DarktideThu, 19 Mar 2026 10:32:05 +0000https://ttvdrops.lovinator.space/twitch/campaigns/49ed5bf3-3289-4da9-8183-bdd086e0a6b5/twitchdropsWarhammer 40,000: DarktideFatsharkCrimson Desert: Badgehttps://ttvdrops.lovinator.space/twitch/campaigns/54b92181-c574-4b08-ba5d-91fabf982a98/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/7d344d52-7868-4c68-898f-9f3124e927de.png" alt="Crimson Desert Badge" width="160" height="160" /><p>This badge was earned by subscribing or gifting a sub to a streamer in the Crimson Desert category!</p><p>Starts: 2026-03-19 08:00 UTC (4 days, 18 hours ago)<br />Ends: 2026-04-01 07:58 UTC (1 week, 1 day from now)</p><ul><li>1 sub required: Crimson Desert - Crest</li></ul><a href="https://help.twitch.tv/s/article/twitch-chat-badges-guide ">About</a>Crimson DesertThu, 19 Mar 2026 08:01:30 +0000https://ttvdrops.lovinator.space/twitch/campaigns/54b92181-c574-4b08-ba5d-91fabf982a98/twitchdropsCrimson DesertPearl AbyssTwitch GamingDragon Ball Gekishin Squadra: SQUADRA SEASON 4 Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/7f6ce2a8-2eb5-459b-81d6-06050845da71/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/7ffc944c-8ff4-4bb1-bf1e-06a55494dd0f.png" alt="SQUADRA SEASON 4 Drops" width="160" height="160" /><p>“DRAGON BALL GEKISHIN SQUADRA” Season 4 Launch Celebration Twitch Drops Campaign! +Don’t miss your chance to earn an exclusive skin and icon to celebrate the start of Season 4!</p><p>Starts: 2026-03-19 06:00 UTC (4 days, 20 hours ago)<br />Ends: 2026-04-16 05:59 UTC (3 weeks, 2 days from now)</p><ul><li>30 minutes watched: Zeni ×3,000 (S4)</li><li>60 minutes watched: Exclusive Icon (S4)</li><li>180 minutes watched: P4G-Capsule ×5 (S4)</li><li>240 minutes watched: Zeni ×7,000 (S4)</li><li>360 minutes watched: Exclusive Skin (S4)</li></ul><a href="https://dbg-squadra.bn-ent.net/news/o5lxsp1xfn">About</a>Dragon Ball Gekishin SquadraThu, 19 Mar 2026 06:01:45 +0000https://ttvdrops.lovinator.space/twitch/campaigns/7f6ce2a8-2eb5-459b-81d6-06050845da71/twitchdropsDragon Ball Gekishin SquadraBandai/NamcoWuthering Waves: V3.2 Wuthering Waveshttps://ttvdrops.lovinator.space/twitch/campaigns/117c7ab7-6f5a-4e67-9cc0-d328b99c014d/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/aa0528b4-b654-48b1-be7e-b1c33339321f.jpeg" alt="V3.2 Wuthering Waves" width="160" height="160" /><p>The V3.2 Wuthering Waves Twitch Drops event has commenced! By streaming Wuthering Waves, you enable your viewers to claim multiple rewards, including the Astrite! Hasten to broadcast Wuthering Waves, and bestow rewards upon your devoted audience!</p><p>Starts: 2026-03-19 03:00 UTC (4 days, 23 hours ago)<br />Ends: 2026-04-16 02:58 UTC (3 weeks, 2 days from now)</p><ul><li>15 minutes watched: Shell Credit*25000 </li><li>30 minutes watched: Medium Resonance Potion*5</li><li>60 minutes watched: Advanced Energy Core*3</li><li>90 minutes watched: Advanced Energy Bag*2 </li><li>120 minutes watched: Astrite*50 </li></ul><a href="https://twitchdrops-wutheringwaves.kurogames-global.com/?source=twitch">About</a>Wuthering WavesThu, 19 Mar 2026 03:01:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/117c7ab7-6f5a-4e67-9cc0-d328b99c014d/twitchdropsWuthering WavesKURO GAMESWorld of Warships: 15.2 WOWS Channel Drophttps://ttvdrops.lovinator.space/twitch/campaigns/06039139-8729-44ff-bbeb-3fe0c21935ba/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/58a87e72-5e61-4bc6-8e3a-94cc29643448.png" alt="15.2 WOWS Channel Drop" width="160" height="160" /><p>Koalas have fingerprints almost identical to humans, so similar they can confuse crime scene forensics.</p><p>Starts: 2026-03-18 22:00 UTC (5 days, 4 hours ago)<br />Ends: 2026-03-25 22:59 UTC (1 day, 20 hours from now)</p><ul><li>60 minutes watched: Update 15.2: 250 CT</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/worldofwarships">WorldofWarships</a></li></ul><a href="https://worldofwarships.com/en/news/general-news/community-drops-in-update-152/">About</a>World of WarshipsWed, 18 Mar 2026 22:01:05 +0000https://ttvdrops.lovinator.space/twitch/campaigns/06039139-8729-44ff-bbeb-3fe0c21935ba/twitchdropsWorld of WarshipsWargamingLineage II: Lineage 2 Drops RUhttps://ttvdrops.lovinator.space/twitch/campaigns/8bf4483d-e6d7-4805-ac02-eb4444b70ac4/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/a1ee76d9-f400-4a01-82da-2f749418fcf9.png" alt="Lineage 2 Drops RU" width="160" height="160" /><p>Награда за просмотр прямых трансляций Lineage 2.</p><p>Starts: 2026-03-18 07:00 UTC (5 days, 19 hours ago)<br />Ends: 2026-03-24 20:59 UTC (18 hours from now)</p><ul><li>600 minutes watched: Special Elements Drops, Essence Elements Drops</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/ahillesl2">AhillesL2</a></li><li><a href="https://twitch.tv/archi_l2">archi_l2</a></li><li><a href="https://twitch.tv/bazzalty">BazzAlty</a></li><li><a href="https://twitch.tv/ctapuktv">CTAPUKTV</a></li><li><a href="https://twitch.tv/dushoymolodoy">dushoymolodoy</a></li><li>... and 27 more</li></ul><a href="https://l2central.info/essence/events_and_promos/3803.html">About</a>Lineage IIWed, 18 Mar 2026 07:01:56 +0000https://ttvdrops.lovinator.space/twitch/campaigns/8bf4483d-e6d7-4805-ac02-eb4444b70ac4/twitchdropsLineage IIInnovaLineage II: Lineage 2 Drops EUhttps://ttvdrops.lovinator.space/twitch/campaigns/dd51b365-a0fd-4007-88d9-81c82344cc98/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/b67c2d3f-44f8-41ad-88e9-8646aee0e98a.png" alt="Lineage 2 Drops EU" width="160" height="160" /><p>Reward for watching live streams of Lineage 2.</p><p>Starts: 2026-03-18 07:00 UTC (5 days, 19 hours ago)<br />Ends: 2026-03-24 20:59 UTC (18 hours from now)</p><ul><li>180 minutes watched: Special Elements Drops EU, Essence Elements Drops EU</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/blednykh">blednykh</a></li><li><a href="https://twitch.tv/defnotflaming">DefNotFlaming</a></li><li><a href="https://twitch.tv/gilvandark">gilvandark</a></li><li><a href="https://twitch.tv/japoneis96">japoneis96</a></li><li><a href="https://twitch.tv/jichang25">JiChang25</a></li><li>... and 4 more</li></ul><a href="https://l2wiki.com/essence/events_and_promos/3475.html">About</a>Lineage IIWed, 18 Mar 2026 07:01:56 +0000https://ttvdrops.lovinator.space/twitch/campaigns/dd51b365-a0fd-4007-88d9-81c82344cc98/twitchdropsLineage IIInnovaKirka.io: Saint Patrickhttps://ttvdrops.lovinator.space/twitch/campaigns/e55fe4ed-6f66-4b92-a916-3f82387d2b96/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/2a40c8a9-6701-4895-b06d-479af4b959f5.png" alt="Saint Patrick" width="160" height="160" /><p>Kirka.io drop for the Saint Patrick Unobtainable</p><p>Starts: 2026-03-17 23:57 UTC (6 days, 2 hours ago)<br />Ends: 2026-03-24 23:28 UTC (21 hours from now)</p><ul><li>900 minutes watched: Saint Patrick</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/bansheeboy52355">BansheeBoy52355</a></li><li><a href="https://twitch.tv/boingoo">Boingoo</a></li><li><a href="https://twitch.tv/zamsgodz">ZamsGodz</a></li></ul><a href="https://kirka.io/connectTwitch=1">About</a>Kirka.ioWed, 18 Mar 2026 00:01:04 +0000https://ttvdrops.lovinator.space/twitch/campaigns/e55fe4ed-6f66-4b92-a916-3f82387d2b96/twitchdropsKirka.ioKirka.ioKirka.io: Gold Coinshttps://ttvdrops.lovinator.space/twitch/campaigns/3a8bf9c7-c532-48e5-9ad9-44b9fa105887/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/79a03a58-5e97-497e-9ed1-6b727cdec041.png" alt="Gold Coins" width="160" height="160" /><p>Kirka.io drop for the Gold Coins Unobtainable</p><p>Starts: 2026-03-17 23:48 UTC (6 days, 2 hours ago)<br />Ends: 2026-03-24 23:28 UTC (21 hours from now)</p><ul><li>900 minutes watched: Gold Coins</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/1queenone1">1queenone1</a></li><li><a href="https://twitch.tv/4supermario4">4supermario4</a></li><li><a href="https://twitch.tv/ab4yt_">Ab4yt_</a></li><li><a href="https://twitch.tv/aceibi">ACEIBI</a></li><li><a href="https://twitch.tv/agenttalex">AgenttAlex</a></li><li>... and 97 more</li></ul><a href="https://kirka.io/connectTwitch=1">About</a>Kirka.ioWed, 18 Mar 2026 00:01:04 +0000https://ttvdrops.lovinator.space/twitch/campaigns/3a8bf9c7-c532-48e5-9ad9-44b9fa105887/twitchdropsKirka.ioKirka.ioPalia: Toadstool Taleshttps://ttvdrops.lovinator.space/twitch/campaigns/45b83bb4-6b9d-47e3-b566-2e976c01bb38/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/0c51b2e1-3edd-4f7b-9c56-5de32ebc6bd0.png" alt="Toadstool Tales" width="160" height="160" /><p>Celebrate the season of growth with new Twitch Drops for the Spring Spectacle: Toadstool Tales update! Tune in to your favorite Palia creators to earn a bushel of springtime rewards, including Honeybee Lures, more Potato Pods, and the adorable Spring Flutterfox Plush and Leafy Flutterfox Plush.</p><p>Starts: 2026-03-17 18:00 UTC (6 days, 8 hours ago)<br />Ends: 2026-04-07 17:59 UTC (2 weeks from now)</p><ul><li>60 minutes watched: 3x Honeybee Lures</li><li>180 minutes watched: 1x Smartypod Prize Bag, 1x Shinypod Prize Bag, 1x Potato Pod Prize Bag</li><li>360 minutes watched: Leafy Flutterfox Plush, Spring Flutterfox Plush</li></ul><a href="https://palia.com/news/201-twitch-drops">About</a>PaliaTue, 17 Mar 2026 19:01:16 +0000https://ttvdrops.lovinator.space/twitch/campaigns/45b83bb4-6b9d-47e3-b566-2e976c01bb38/twitchdropsPaliaSingularity 6FBC: Firebreak: Open House Launchhttps://ttvdrops.lovinator.space/twitch/campaigns/8cfe0a83-16e2-11f1-bda4-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/f780af91-063f-4891-b5ff-08c16ab9cc9e.png" alt="Open House Launch" width="160" height="160" /><p>The Twitch Drops campaign for the launch of the Open House Major Update for FBC: Firebreak. By watching participating streamers for a combined length of 3 hours, you can earn the entire Researcher Armor Set (Threshold Revision) and Overseer Armor Set (Threshold Revision). These armor sets are exclusive to Twitch Drops. The armor sets are purely cosmetic and do not impact gameplay.</p><p>Starts: 2026-03-17 17:00 UTC (6 days, 9 hours ago)<br />Ends: 2026-04-12 21:59 UTC (2 weeks, 5 days from now)</p><ul><li>30 minutes watched: Researcher Gloves</li><li>60 minutes watched: Researcher Helmet</li><li>90 minutes watched: Researcher Armor</li><li>120 minutes watched: Overseer Gloves</li><li>150 minutes watched: Overseer Helmet</li><li>180 minutes watched: Overseer Body Armor</li></ul><a href="https://twitch.fbcfirebreak.com/">About</a>FBC: FirebreakTue, 17 Mar 2026 17:01:35 +0000https://ttvdrops.lovinator.space/twitch/campaigns/8cfe0a83-16e2-11f1-bda4-0a58a9feac02/twitchdropsFBC: FirebreakRemedy EntertainmentRavendawn: March 3https://ttvdrops.lovinator.space/twitch/campaigns/79785bbf-24ed-4aa2-807c-c00b029fa73a/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/c4a719ab-d02f-4e4d-b8ba-9ad6551f32ab.png" alt="March 3" width="160" height="160" /><p>Watch your favorite streamers playing Ravendawn and get exclusive RavenPacks and Infusions! Call your friends, forge alliances, and venture into the new and epic world of Ravendawn! </p><p>Starts: 2026-03-17 17:00 UTC (6 days, 9 hours ago)<br />Ends: 2026-03-24 16:59 UTC (14 hours from now)</p><ul><li>60 minutes watched: Ravenpacks - Mar 3</li><li>180 minutes watched: Ravenpacks - Mar 3</li><li>360 minutes watched: Ravenpacks - Mar 3</li><li>540 minutes watched: Ravenpacks - Mar 3</li><li>720 minutes watched: Ravenpacks - Mar 3</li><li>900 minutes watched: Ghostly Infusion - Mar 3</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/sama3575">멍쿤</a></li><li><a href="https://twitch.tv/nongmin00">탐험가</a></li><li><a href="https://twitch.tv/00mx">00Mx</a></li><li><a href="https://twitch.tv/0taichou">0taichou</a></li><li><a href="https://twitch.tv/0willamy">0willamy</a></li><li>... and 992 more</li></ul><a href="https://ravendawn.online/myaccount/twitch">About</a>RavendawnTue, 17 Mar 2026 17:01:33 +0000https://ttvdrops.lovinator.space/twitch/campaigns/79785bbf-24ed-4aa2-807c-c00b029fa73a/twitchdropsRavendawnTavernlight GamesSplinterlands: March Week 3https://ttvdrops.lovinator.space/twitch/campaigns/b38c5aab-4e42-4367-9896-918667f271de/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/61e358c7-b56e-4f6f-8cc2-b5ca771b5d93.png" alt="March Week 3" width="160" height="160" /><p>March Week #3 Splinterlands Drop Campaign</p><p>Starts: 2026-03-17 17:00 UTC (6 days, 9 hours ago)<br />Ends: 2026-03-24 16:59 UTC (14 hours from now)</p><ul><li>180 minutes watched: 1000 Glint</li><li>360 minutes watched: 1000 Glint</li><li>540 minutes watched: 1000 Glint</li><li>720 minutes watched: 1000 Glint</li><li>900 minutes watched: 1000 Glint</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/babybearhs">BabyBearHS</a></li><li><a href="https://twitch.tv/berzerk_vladi">Berzerk_Vladi</a></li><li><a href="https://twitch.tv/bokipw">BokiPW</a></li><li><a href="https://twitch.tv/bulldog1205">Bulldog1205</a></li><li><a href="https://twitch.tv/bunsbagsandcaps">bunsbagsandcaps</a></li><li>... and 30 more</li></ul><a href="https://peakd.com/splinterlands/@splinterlands/arena-fanatic-influencer-card-plus-twitch-drops">About</a>SplinterlandsThu, 19 Mar 2026 03:01:06 +0000https://ttvdrops.lovinator.space/twitch/campaigns/b38c5aab-4e42-4367-9896-918667f271de/twitchdropsSplinterlandsSteem MonstersRavenQuest: March 3https://ttvdrops.lovinator.space/twitch/campaigns/1abc08dc-8269-4762-9484-8d7eab9fb0be/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/462b26ea-5323-47f2-9976-a7d343bc79f0.png" alt="March 3" width="160" height="160" /><p>It is time to explore Munk Madness and the drop is here: watch your favorite streamer and unlock exclusive rewards!</p><p>Starts: 2026-03-17 15:00 UTC (6 days, 11 hours ago)<br />Ends: 2026-03-24 14:59 UTC (12 hours from now)</p><ul><li>300 minutes watched: M3 - Treasure Below Packs</li><li>600 minutes watched: M3 - Bonded Carved Infu, M3 - Augmenting Stone, M3-Humming Aether Echo SC, M3 - Quest Emote</li><li>900 minutes watched: M3 - Augmenting Stone, M3 - Simple Toolbox, M3 - Warforging Shard, M3 - Fireworks Bundle</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/0xairdrop">0xairdrop</a></li><li><a href="https://twitch.tv/0xkiryuuki">0xkiryuuki</a></li><li><a href="https://twitch.tv/0xkyazh">0xKyazh</a></li><li><a href="https://twitch.tv/0xpatchara">0xpatchara</a></li><li><a href="https://twitch.tv/0xrazel">0xRazeL</a></li><li>... and 541 more</li></ul><a href="https://ravenquest.io/myaccount/twitch">About</a>RavenQuestTue, 17 Mar 2026 15:01:55 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1abc08dc-8269-4762-9484-8d7eab9fb0be/twitchdropsRavenQuestTavernlight GamesGoing Medieval: out of EA!https://ttvdrops.lovinator.space/twitch/campaigns/962fe30d-0cd0-11f1-abf2-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/5ea1fa25-37bf-47b4-b1c9-010191773960.png" alt="Going Medieval out of EA!" width="160" height="160" /><p>Going Medieval is finally out of Early Access! Celebrate this grand event with your community!</p><p>Starts: 2026-03-17 15:00 UTC (6 days, 11 hours ago)<br />Ends: 2026-03-24 23:59 UTC (21 hours from now)</p><ul><li>30 minutes watched: Purple Torch</li><li>60 minutes watched: Purple Wall Torch</li><li>90 minutes watched: Purple Brazier</li><li>120 minutes watched: Sundial, Scarecrow</li></ul><a href="https://drive.google.com/file/d/1LqS9d58R1Z-XUgCXqRJ3WxkmkHKeKROE/view">About</a>Going MedievalTue, 17 Mar 2026 15:01:55 +0000https://ttvdrops.lovinator.space/twitch/campaigns/962fe30d-0cd0-11f1-abf2-0a58a9feac02/twitchdropsGoing MedievalFoxy VoxelDead by Daylight: DbD | All Kill: Comebackhttps://ttvdrops.lovinator.space/twitch/campaigns/c9a3037c-3ae0-492e-9bcd-287c9dee44e9/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/d647db63-1b58-4b6d-ae82-7627c7e73f05.png" alt="DbD | All Kill: Comeback" width="160" height="160" /><p>Earn exclusive Twitch Drops by watching any channel streaming Dead by Daylight between March 17 - 31 for the release of All Kill: Comeback</p><p>Starts: 2026-03-17 15:00 UTC (6 days, 11 hours ago)<br />Ends: 2026-03-31 14:59 UTC (1 week from now)</p><ul><li>60 minutes watched: MiNA Figurine Charm</li><li>180 minutes watched: Dead End Banner</li><li>360 minutes watched: Ruby Cushy Sweater</li></ul><a href="https://account.bhvr.com/twitch/dbd">About</a>Dead by DaylightTue, 17 Mar 2026 15:01:56 +0000https://ttvdrops.lovinator.space/twitch/campaigns/c9a3037c-3ae0-492e-9bcd-287c9dee44e9/twitchdropsDead by DaylightBehaviour Interactive Inc.Twitch GamingCoin Pusher Live: St. Patrick's Day Wraps!https://ttvdrops.lovinator.space/twitch/campaigns/2ca705fc-f815-4647-9bdc-38a6c56e6f9a/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/c2884283-c697-4a28-b3d6-c1bd52574f85.png" alt="St. Patrick&#x27;s Day Wraps!" width="160" height="160" /><p>Watch participating streams to earn lucky Twitch Drops filled with coins and festive rewards. The longer you watch, the more drops you unlock. Collect them all and bring a little luck of the Irish to your coin pusher!</p><p>Starts: 2026-03-17 14:00 UTC (6 days, 12 hours ago)<br />Ends: 2026-03-31 13:59 UTC (1 week from now)</p><ul><li>60 minutes watched: Pug, 500 Coins</li><li>120 minutes watched: Bird, 1,000 Coins</li><li>240 minutes watched: Cat, 1,000 Coins, 500 Coins</li><li>360 minutes watched: Raccoon, 2,000 Coins!</li><li>720 minutes watched: 1,000 Coins, 500 Coins, 2,000 Coins!</li></ul><a href="https://littygames.net/drops">About</a>Coin Pusher LiveTue, 17 Mar 2026 14:00:26 +0000https://ttvdrops.lovinator.space/twitch/campaigns/2ca705fc-f815-4647-9bdc-38a6c56e6f9a/twitchdropsCoin Pusher LiveLitty GamesWarhammer 40,000: Darktide: Zealots of Tertiumhttps://ttvdrops.lovinator.space/twitch/campaigns/eb501d2c-4ad7-4796-801d-a2c4b0bbf2c0/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/3abe92c7-2c34-48ba-aff4-7d6bcacb54a3.png" alt="Zealots of Tertium" width="160" height="160" /><p>Unleash the unyielding fervor of the Zealot with the Protector of Tertium Twitch Drop set. Obtain this exclusive set by watching participating Twitch streams and conquer the shadowy depths of Tertium as the ultimate warrior and punisher.</p><p>Starts: 2026-03-17 13:30 UTC (6 days, 12 hours ago)<br />Ends: 2026-04-07 11:59 UTC (2 weeks from now)</p><ul><li>20 minutes watched: PoT Hood</li><li>30 minutes watched: PoT Militia Garb</li><li>45 minutes watched: PoT Trousers</li><li>60 minutes watched: PoT Thunderhammer</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/taezzang">태은짱</a></li><li><a href="https://twitch.tv/demonie__">디모니_</a></li><li><a href="https://twitch.tv/acquiretigris">acquireTigris</a></li><li><a href="https://twitch.tv/altair">Altair</a></li><li><a href="https://twitch.tv/alyx117">alyx117</a></li><li>... and 95 more</li></ul><a href="https://www.playdarktide.com/news/earn-twitch-drops">About</a>Warhammer 40,000: DarktideTue, 17 Mar 2026 13:32:05 +0000https://ttvdrops.lovinator.space/twitch/campaigns/eb501d2c-4ad7-4796-801d-a2c4b0bbf2c0/twitchdropsWarhammer 40,000: DarktideFatsharkWorld of Tanks Console: Iron Horizon Week 7https://ttvdrops.lovinator.space/twitch/campaigns/f0d19ff1-6de0-427f-8d63-eb2092d66be1/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/89f4dff6-7716-435a-a6c3-57032bb2f2ec.png" alt="Iron Horizon Week 7" width="160" height="160" /><p>Defend your horizons with your favorite creators! </p><p>Starts: 2026-03-17 13:30 UTC (6 days, 12 hours ago)<br />Ends: 2026-03-24 09:57 UTC (7 hours from now)</p><ul><li>120 minutes watched: 10 Enhanced Repair Kits</li><li>240 minutes watched: (3) x1.5 Silver Booster</li><li>480 minutes watched: (2) x6 Commander Booster</li></ul><a href="https://modernarmor.worldoftanks.com/en/cms/notes/twitch-drops/">About</a>World of Tanks ConsoleTue, 17 Mar 2026 13:32:04 +0000https://ttvdrops.lovinator.space/twitch/campaigns/f0d19ff1-6de0-427f-8d63-eb2092d66be1/twitchdropsWorld of Tanks ConsoleWargamingThe Seven Deadly Sins: Origin: 7DS Origin 1st Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/7dd7f2b4-1fc7-430f-92d8-de68434de5f3/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/43804ef0-c6d3-4c07-9717-4abfa25798f1.png" alt="7DS Origin 1st Drops" width="160" height="160" /><p>Based on the iconic IP, The Seven Deadly Sins: Origin follows Tristan on a new journey through a multiverse where time and space have collided. Experience next-generation gameplay with immersive exploration, strategic combat, and stunning console-quality graphics.</p><p>Starts: 2026-03-16 17:00 UTC (1 week ago)<br />Ends: 2026-04-13 16:59 UTC (2 weeks, 6 days from now)</p><ul><li>15 minutes watched: Premium Mastery EXP</li><li>30 minutes watched: Premium Refinement Stone</li><li>60 minutes watched: Gold</li><li>90 minutes watched: Premium Enhancement Stone</li><li>120 minutes watched: Regular Hero Draw Ticket</li></ul><a href="https://7origin.netmarble.com/drops">About</a>The Seven Deadly Sins: OriginMon, 16 Mar 2026 18:06:11 +0000https://ttvdrops.lovinator.space/twitch/campaigns/7dd7f2b4-1fc7-430f-92d8-de68434de5f3/twitchdropsThe Seven Deadly Sins: OriginNetmarbleKakele Online - MMORPG: Kakele Online March 2https://ttvdrops.lovinator.space/twitch/campaigns/393c7cea-186c-48f8-8c81-0800fc800718/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/2ac7c2b6-0965-414a-bd18-427bdbd3e65d.png" alt="Kakele Online March 2" width="160" height="160" /><p>🎮 Announcing Kakele Online&#x27;s Epic Twitch Drops! Embark on a unique journey in Kakele&#x27;s realm. Dive into mystical lands, conquer quests, and enjoy our exciting Twitch Drops for enhanced gaming. Unlock rewards, including teleports, herbs, potions, and materials. 🕒 Timed Rewards: Enjoy cities Teleports, Ultra potions, Gold Refiner Kits and collect Dog Cards and Trophies. 💰 Prosperity Path: Gain Copper, Tin, Silver, Iron, Gold, Life Herbs, Mana Herbs for success. Accumulate Reputation Coins. 🎈 Grand Finale: End with an exclusive Twitch Drop and Bacon Extravaganza surprise! Link accounts, watch streams, and claim rewards for an unforgettable RPG experience. 🌟 How to Join: Link Accounts: Connect your account and Twitch in the game app. Watch Streams: Tune in during to your favorite Kakele streamer. Claim Rewards: Receive Twitch Drop notifications claim in the game app. Influencers: To enable drops on your stream, email us! Don&#x27;t miss the chance to enrich your journey with Twitch Drops!</p><p>Starts: 2026-03-16 12:58 UTC (1 week ago)<br />Ends: 2026-03-30 23:59 UTC (6 days, 21 hours from now)</p><ul><li>120 minutes watched: 2 Kebelessa Teleports, 2 Muroria Teleports, 2 Kechelada Teleports</li><li>240 minutes watched: 30 Supreme Mana Bottles, 15 Ultra Mana Bottles, 15 Ultra Health Bottles</li><li>360 minutes watched: 15 Raw Silver, 10 Raw Gold, 10 Raw Iron</li><li>540 minutes watched: Twitch Drop, 5 Gold Refiner Kits, 50 Reputation Coins</li><li>660 minutes watched: 10 Life Herbs, 10 Mana Herbs, 5 Gold Refiner Kits</li><li>900 minutes watched: Coins Stream, Lost Soul Trophy, 50 Kakele Coins (NT)</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/batatynha_">batatynha_</a></li><li><a href="https://twitch.tv/bravokktv">BravokkTV</a></li><li><a href="https://twitch.tv/kakelemmorpg">KAKELEMMORPG</a></li><li><a href="https://twitch.tv/kapparzojr">KapparzoJr</a></li><li><a href="https://twitch.tv/macielzera__">Macielzera__</a></li><li>... and 5 more</li></ul><a href="https://www.kakele.io/?utm_source=drops">About</a>Kakele Online - MMORPGMon, 16 Mar 2026 18:00:18 +0000https://ttvdrops.lovinator.space/twitch/campaigns/393c7cea-186c-48f8-8c81-0800fc800718/twitchdropsKakele Online - MMORPGViVa GamesSonic Rumble Party: Crossover Drops 3https://ttvdrops.lovinator.space/twitch/campaigns/1a64f11d-185b-11f1-8a83-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/e4941688-9ec9-4c5e-a61d-b5892e0f22b4.png" alt="Crossover Drops 3" width="160" height="160" /><p>コラボ期間限定のキャンペーンです。</p><p>Starts: 2026-03-16 10:00 UTC (1 week ago)<br />Ends: 2026-04-13 07:59 UTC (2 weeks, 6 days from now)</p><ul><li>15 minutes watched: Ring*3000</li><li>30 minutes watched: Tune-Up Wrench*300</li><li>60 minutes watched: Red Star Ring*100</li><li>120 minutes watched: Butterflies Effect*1</li></ul><a href="https://sonicrumble.sega.com/special/twitch-drops/en/">About</a>Sonic Rumble PartyMon, 16 Mar 2026 10:01:39 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1a64f11d-185b-11f1-8a83-0a58a9feac02/twitchdropsSonic Rumble PartySEGADragonkin: The Banished: Launch Event Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/dc94dfdc-1e5a-4de0-9a48-644be57da44a/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/661d4a3a-e822-4a24-95c5-2162743d83b5.png" alt="Launch Event Drops" width="160" height="160" /><p>The draconic threat is once again upon us. Legendary heroes rise up to face the legions from the depths. Tame your wyrmlings, create unique power builds with the Ancestral Grid, expand your city and destroy the Dragons!</p><p>Starts: 2026-03-16 09:37 UTC (1 week ago)<br />Ends: 2026-03-30 23:29 UTC (6 days, 21 hours from now)</p><ul><li>60 minutes watched: Death Animation</li><li>120 minutes watched: Portal Animation</li><li>180 minutes watched: Wyrmling Trail Cosmetic, Wings Cosmetic</li></ul><a href="https://my.nacongaming.com/">About</a>Dragonkin: The BanishedMon, 16 Mar 2026 09:46:41 +0000https://ttvdrops.lovinator.space/twitch/campaigns/dc94dfdc-1e5a-4de0-9a48-644be57da44a/twitchdropsDragonkin: The BanishedNaconDragonkin: The Banished: Launch Event Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/d300a6f4-0a0f-4530-ac78-5c556fc220e1/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/232e9832-ed8e-4ed6-bb26-04cd14bf6631.png" alt="Launch Event Drops" width="160" height="160" /><p>The draconic threat is once again upon us. Legendary heroes rise up to face the legions from the depths. Tame your wyrmlings, create unique power builds with the Ancestral Grid, expand your city and destroy the Dragons!</p><p>Starts: 2026-03-16 09:00 UTC (1 week ago)<br />Ends: 2026-03-30 23:29 UTC (6 days, 21 hours from now)</p><ul><li>60 minutes watched: Death Animation</li><li>120 minutes watched: Portal Animation</li><li>120 minutes watched: Wyrmling Trail Cosmetic, Wings Cosmetic</li></ul><a href="https://my.nacongaming.com/">About</a>Dragonkin: The BanishedMon, 16 Mar 2026 09:01:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/d300a6f4-0a0f-4530-ac78-5c556fc220e1/twitchdropsDragonkin: The BanishedNaconOverwatch: OWCS Stage 1 Campaign 1https://ttvdrops.lovinator.space/twitch/campaigns/6c9b57e3-0c2d-11f1-8de9-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/6b679682-f6cf-4e06-83b3-8479b1f34554.png" alt="OWCS Stage 1 Campaign 1" width="160" height="160" /><p>Celebrate the Overwatch Champions Series 2026 Season Launch with special viewer rewards! Watch 1 hour to get the Overwatch Champions Series Icon, 3 hours to get a Battle Pass Tier Skip, 5 hours to get the Overwatch Champions Series Spray, 7 hours to get a Battle Pass Tier Skip, 10 hours to get the Adventure&#x27;s Pack Spray and 12 hours to get an Esports Loot Box.</p><p>Starts: 2026-03-16 02:00 UTC (1 week, 1 day ago)<br />Ends: 2026-03-28 01:59 UTC (3 days, 23 hours from now)</p><ul><li>60 minutes watched: Overwatch Champions Icon</li><li>180 minutes watched: Battle Pass Tier Skip</li><li>300 minutes watched: Overwatch Champions Spray</li><li>420 minutes watched: Battle Pass Tier Skip</li><li>600 minutes watched: Adventurer&#x27;s Pack Spray</li><li>720 minutes watched: Esports Loot Box 26S1.1</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/ow_esports">ow_esports</a></li><li><a href="https://twitch.tv/ow_esports_jp">OW_ESPORTS_JP</a></li></ul><a href="https://esports.overwatch.com/en-us/rewards">About</a>OverwatchMon, 16 Mar 2026 02:01:34 +0000https://ttvdrops.lovinator.space/twitch/campaigns/6c9b57e3-0c2d-11f1-8de9-0a58a9feac02/twitchdropsOverwatchBlizzardQSMP: Quackity's QSMP2https://ttvdrops.lovinator.space/twitch/campaigns/760e1ca7-2ed9-45f7-ba49-7615d54430fb/<img src="https://static-cdn.jtvnw.net/badges/v1/2fa68fb9-fcdd-4795-bfab-f408e10efaef/3" alt="Quackity&#x27;s QSMP2" width="160" height="160" /><p>This badge was earned for watching QSMP during the initial 2026 launch!</p><p>Starts: 2026-03-14 18:00 UTC (1 week, 2 days ago)<br />Ends: 2026-07-01 14:59 UTC (3 months, 1 week from now)</p><ul><li>60 minutes watched: QSMP2</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/qsmp">QSMP</a></li><li><a href="https://twitch.tv/quackity">Quackity</a></li><li><a href="https://twitch.tv/quackitytoo">QuackityToo</a></li></ul><a href="https://help.twitch.tv/s/article/twitch-chat-badges-guide">About</a>QSMPSat, 14 Mar 2026 18:01:36 +0000https://ttvdrops.lovinator.space/twitch/campaigns/760e1ca7-2ed9-45f7-ba49-7615d54430fb/twitchdropsQSMPTwitch GamingQSMP: Quackity's QSMP S2https://ttvdrops.lovinator.space/twitch/campaigns/c83fc2dc-10fe-11f1-a4d2-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/f6e6ceae-010b-4acc-8c7c-7db54c140294.png" alt="Quackity&#x27;s QSMP S2" width="160" height="160" /><p>Watch Quackity&#x27;s QSMP Season 2 on /quackity, /quackitytoo, or /qsmp for 60 minutes to unlock the QSMP2 emote for a limited time.</p><p>Starts: 2026-03-14 18:00 UTC (1 week, 2 days ago)<br />Ends: 2026-07-01 07:59 UTC (3 months, 1 week from now)</p><ul><li>60 minutes watched: QSMP2</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/qsmp">QSMP</a></li><li><a href="https://twitch.tv/quackity">Quackity</a></li><li><a href="https://twitch.tv/quackitytoo">QuackityToo</a></li></ul><a href="https://help.twitch.tv/s/article/how-to-use-emotes">About</a>QSMPSat, 14 Mar 2026 18:01:36 +0000https://ttvdrops.lovinator.space/twitch/campaigns/c83fc2dc-10fe-11f1-a4d2-0a58a9feac02/twitchdropsQSMPTwitch GamingMONSTER HUNTER STORIES 3: TWISTED REFLECTION: Rudyhttps://ttvdrops.lovinator.space/twitch/campaigns/ea4fb934-61c3-46b1-b427-c9601b9fa016/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/9ce65961-4e0d-403c-9812-6605c3f72e37.png" alt="Rudy" width="160" height="160" /><p>This Rudy badge was earned by subscribing or gifting a sub to a Monster Hunter Stories 3: Twisted Reflection streamer during its launch!</p><p>Starts: 2026-03-13 04:00 UTC (1 week, 3 days ago)<br />Ends: 2026-03-27 03:59 UTC (3 days, 1 hour from now)</p><ul><li>1 sub required: Rudy</li></ul><a href="https://help.twitch.tv/s/article/twitch-chat-badges-guide ">About</a>MONSTER HUNTER STORIES 3: TWISTED REFLECTIONFri, 13 Mar 2026 04:01:54 +0000https://ttvdrops.lovinator.space/twitch/campaigns/ea4fb934-61c3-46b1-b427-c9601b9fa016/twitchdropsMONSTER HUNTER STORIES 3: TWISTED REFLECTIONTwitch GamingFor Honor: Year 10 Season 1https://ttvdrops.lovinator.space/twitch/campaigns/89117fb2-17e6-11f1-8298-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/f4f94006-a65f-46db-9700-2e05db62d639.jpeg" alt="Year 10 Season 1" width="160" height="160" /><p>For Honor - Y10S1 Twitch Drops. Rewards: 1 Hour =&gt; 2 XP Boosts + 1 Scavenger Crate | 2 Hours =&gt; 4 XP Boosts + 2 Scavenger Crates + 3 Day Champion Status | 4 Hours =&gt; 4 XP Boosts + 4 Scavenger Crates + 7 Day Champion Status.</p><p>Starts: 2026-03-12 16:00 UTC (1 week, 4 days ago)<br />Ends: 2026-04-02 15:59 UTC (1 week, 2 days from now)</p><ul><li>60 minutes watched: 2 XP + 1 Scavenger Crate</li><li>120 minutes watched: 3 Day Champion Status, 4 XP + 2 Scavenger Crate</li><li>240 minutes watched: 7 Day Champion Status, 4 XP + 4 Scavenger Crate</li></ul><a href="https://www.ubisoft.com/help/article/000065532">About</a>For HonorThu, 12 Mar 2026 16:01:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/89117fb2-17e6-11f1-8298-0a58a9feac02/twitchdropsFor HonorUbisoftCrystal of Atlan: New Class Releasing! https://ttvdrops.lovinator.space/twitch/campaigns/1e27e07c-17b0-11f1-a896-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/3990d18e-9750-448f-9d87-8888c209b9fb.png" alt="New Class Releasing! " width="160" height="160" /><p>Let&#x27;s welcome the brand-new base class &quot;Inventor&quot;! +The brand-new base Class &quot;Inventor&quot; together with the class branches, &quot;Empirica&quot; and &quot;Rhapsodia&quot; are ready now! +Following the footsteps of a mysterious &quot;mentor,&quot; Jodi, bringing her trusty wrench and a mind full of dreams, has arrived at the City of Magitech and is ready to leave her mark on this world! +The &quot;Inventor&quot; excels at inventing Magitech machinery, allowing her to deploy them in battle and destroy enemies from a safe distance. The &quot;Empirica&quot; specializes in long-range combat, and is capable of instantly deploying a variety of armed mechs. The &quot;Rhapsodia&quot; is a mid-range physical DPS with two combat stances, fighting as herself, or by piloting a powerful mecha!</p><p>Starts: 2026-03-12 10:00 UTC (1 week, 4 days ago)<br />Ends: 2026-03-25 09:59 UTC (1 day, 7 hours from now)</p><ul><li>15 minutes watched: Prismadium x20</li><li>30 minutes watched: Prismadium x50</li><li>60 minutes watched: Bound Gold x500K</li><li>90 minutes watched: Advanced Spare Part x15</li><li>120 minutes watched: Catalyst x1</li></ul><a href="https://twitch-drop.games.skystone.games/">About</a>Crystal of AtlanThu, 12 Mar 2026 10:01:10 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1e27e07c-17b0-11f1-a896-0a58a9feac02/twitchdropsCrystal of AtlanCrystal of AtlanJohn Carpenter's Toxic Commando: Toxic Commando Launchhttps://ttvdrops.lovinator.space/twitch/campaigns/a94bff38-000f-11f1-8e9c-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/d92d1521-7796-43f5-9f04-5e08e325f104.jpeg" alt="Toxic Commando Launch" width="160" height="160" /><p>Watch any John Carpenter&#x27;s Toxic Commando stream on Twitch between 12/03/2026 (9am UTC), and 29/03/2026 (11:58PM UTC), to earn in-game rewards: + +- Watch 30 minutes to earn 400 Residium. +- Watch 1 hour to earn the Profile title. +- Watch 2 hours to earn the Profile Icon and Weapon pattern. +- Gift a minimum of 2 subscriptions to earn the Animation Weapon pattern, alternative Profile Icon, alternative Profile title and 300 Mortite.</p><p>Starts: 2026-03-12 09:00 UTC (1 week, 4 days ago)<br />Ends: 2026-03-29 23:57 UTC (5 days, 21 hours from now)</p><ul><li>30 minutes watched: Residium 400</li><li>60 minutes watched: CRASH DUMMY</li><li>120 minutes watched: ROYAL SLUDGE, BIOHAZARD COOPERATION</li><li>2 subs required: DIRECTOR&#x27;S CUT, DNA READJUSTMENT, TWITCHY, Mortite 300</li></ul><a href="https://support.prismray.io/hc/en-us/articles/14680545135761-How-to-Get-Twitch-Drops">About</a>John Carpenter's Toxic CommandoThu, 12 Mar 2026 09:01:52 +0000https://ttvdrops.lovinator.space/twitch/campaigns/a94bff38-000f-11f1-8e9c-0a58a9feac02/twitchdropsJohn Carpenter's Toxic CommandoSaber InteractiveTwitch GamingJohn Carpenter's Toxic Commando: Toxic Commando Launch https://ttvdrops.lovinator.space/twitch/campaigns/34d76a34-1341-11f1-bef0-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/a6e36b94-315e-41a5-a604-cfc9f60bbc72.png" alt="Toxic Commando Launch " width="160" height="160" /><p>Purchase 1 new recurring or gift subscription and claim the reward</p><p>Starts: 2026-03-12 09:00 UTC (1 week, 4 days ago)<br />Ends: 2026-03-29 23:58 UTC (5 days, 21 hours from now)</p><ul><li>1 sub required: Toxic Zombie (<em>Purchase 1 new recurring or gift subscription during the Toxic Commando launch 2026 and claim the reward</em>)</li></ul><a href="https://help.twitch.tv/s/article/twitch-chat-badges-guide ">About</a>John Carpenter's Toxic CommandoThu, 12 Mar 2026 09:01:52 +0000https://ttvdrops.lovinator.space/twitch/campaigns/34d76a34-1341-11f1-bef0-0a58a9feac02/twitchdropsJohn Carpenter's Toxic CommandoSaber InteractiveTwitch GamingModern Warships: MW: Black Outposthttps://ttvdrops.lovinator.space/twitch/campaigns/3d50910c-fea3-4c56-8f02-db1b28e15b9c/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/cd21e778-4977-4739-8d41-96880b601ec3.png" alt="MW: Black Outpost" width="160" height="160" /><p>Commanders, from March 12 to 25, Twitch Drops are available on Modern Warships streams during the Black Outpost event.</p><p>Starts: 2026-03-12 08:10 UTC (1 week, 4 days ago)<br />Ends: 2026-03-25 23:29 UTC (1 day, 21 hours from now)</p><ul><li>60 minutes watched: 2 Days of Premium</li><li>120 minutes watched: Advanced Consumables</li><li>180 minutes watched: 200 UP&#x27;s</li><li>240 minutes watched: 15 Authorization Keys</li><li>300 minutes watched: Camo Velocity</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/alexshikaka">alexshikaka</a></li><li><a href="https://twitch.tv/annmemories">AnnMemories</a></li><li><a href="https://twitch.tv/by_mitso">by_mitso</a></li><li><a href="https://twitch.tv/confrerie_navale_fr">Confrerie_Navale_FR</a></li><li><a href="https://twitch.tv/eptomoon">EPTOMoon</a></li><li>... and 27 more</li></ul><a href="https://artstorm.com/news/twitch-drops-black-outpost">About</a>Modern WarshipsThu, 12 Mar 2026 09:16:11 +0000https://ttvdrops.lovinator.space/twitch/campaigns/3d50910c-fea3-4c56-8f02-db1b28e15b9c/twitchdropsModern WarshipsArtstorm FZEArknights: Endfield: Rising Tidehttps://ttvdrops.lovinator.space/twitch/campaigns/e47be8ee-1889-11f1-a6e8-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/5fa996cb-50ee-4279-b171-cd65f85ebf22.png" alt="Rising Tide" width="160" height="160" /><p>Join the Arknights: Endfield Version Update Twitch Drops event and treat your community to exclusive rewards just for watching!</p><p>Starts: 2026-03-12 03:00 UTC (1 week, 4 days ago)<br />Ends: 2026-04-08 01:59 UTC (2 weeks from now)</p><ul><li>15 minutes watched: R.T. T-Creds*10000 </li><li>30 minutes watched: R.T. I-Combat Record*15</li><li>60 minutes watched: R.T. Arms INSP Set*3</li><li>90 minutes watched: R.T. E-Cognitive Carrier</li><li>120 minutes watched: R.T. Oroberyl*150</li></ul><a href="https://endfield.gryphline.com/special/third-party-binding?channel=twitch">About</a>Arknights: EndfieldThu, 12 Mar 2026 03:01:37 +0000https://ttvdrops.lovinator.space/twitch/campaigns/e47be8ee-1889-11f1-a6e8-0a58a9feac02/twitchdropsArknights: EndfieldGRYPHLINEWorld of Warships: 15.2 Paint The Seas Greenhttps://ttvdrops.lovinator.space/twitch/campaigns/f5594d2e-cbd2-413e-afcf-24336e741c06/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/91974806-8092-4c30-912c-dd077104587c.png" alt="15.2 Paint The Seas Green" width="160" height="160" /><p>Koalas have fingerprints almost identical to humans, so similar they can confuse crime scene forensics.</p><p>Starts: 2026-03-11 22:00 UTC (1 week, 5 days ago)<br />Ends: 2026-03-25 21:59 UTC (1 day, 19 hours from now)</p><ul><li>120 minutes watched: 15.2 Paint the Seas Green</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/worldofwarships">WorldofWarships</a></li></ul><a href="https://worldofwarships.com/en/news/general-news/community-drops-in-update-152/">About</a>World of WarshipsWed, 11 Mar 2026 22:01:29 +0000https://ttvdrops.lovinator.space/twitch/campaigns/f5594d2e-cbd2-413e-afcf-24336e741c06/twitchdropsWorld of WarshipsWargamingRocket League: Drop Rushhttps://ttvdrops.lovinator.space/twitch/campaigns/06583818-7aae-4d7d-9028-92dad95708ed/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/9f82d07d-9ba0-4bbf-8755-da7a609d28ea.jpeg" alt="Rocket League Drop Rush" width="160" height="160" /><p>Watch any Rocket League stream and get Twitch Drops!</p><p>Starts: 2026-03-11 17:28 UTC (1 week, 5 days ago)<br />Ends: 2026-04-01 03:59 UTC (1 week, 1 day from now)</p><ul><li>30 minutes watched: Tactical Nuke (Saffron)</li><li>60 minutes watched: Tactical Nuke (Lime)</li><li>90 minutes watched: Nemesis (Pink)</li><li>120 minutes watched: Nemesis (Green)</li><li>150 minutes watched: Nemesis (Cobalt)</li><li>180 minutes watched: Nemesis (Purple)</li><li>240 minutes watched: Tactical Nuke (Gray)</li></ul><a href="https://www.epicgames.com/id/login">About</a>Rocket LeagueWed, 11 Mar 2026 17:46:27 +0000https://ttvdrops.lovinator.space/twitch/campaigns/06583818-7aae-4d7d-9028-92dad95708ed/twitchdropsRocket LeagueEpic GamesCall of Duty: Black Ops 7: CDL Major 2 Qualifiershttps://ttvdrops.lovinator.space/twitch/campaigns/0c464b19-2426-4c26-8258-a652c937ef8d/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/98325404-c304-4870-b016-dabed64bacef.png" alt="CDL Major 2 Qualifiers" width="160" height="160" /><p>Starts: 2026-03-11 17:00 UTC (1 week, 5 days ago)<br />Ends: 2026-03-24 04:59 UTC (2 hours from now)</p><ul><li>60 minutes watched: 30 Minute XP Token</li><li>120 minutes watched: 30 Minute Weapon XP Token</li><li>180 minutes watched: 30 Minute XP Token</li><li>240 minutes watched: 30 Minute Weapon XP Token</li><li>300 minutes watched: 30 Minute XP Token</li><li>360 minutes watched: 30 Minute Weapon XP Token</li><li>420 minutes watched: 30 Minute XP Token</li><li>480 minutes watched: 30 Minute Weapon XP Token</li><li>540 minutes watched: 30 Minute XP Token</li><li>600 minutes watched: 30 Minute Weapon XP Token</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/callofduty_esports">callofduty_esports</a></li></ul><a href="https://www.twitch.tv/drops/inventory">About</a>Call of Duty: Black Ops 7Wed, 11 Mar 2026 17:02:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/0c464b19-2426-4c26-8258-a652c937ef8d/twitchdropsCall of Duty: Black Ops 7Activision Publishing Twitch GamingCall of Duty: Warzone: Sole Survivorhttps://ttvdrops.lovinator.space/twitch/campaigns/c1824558-1333-11f1-8f2e-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/9effdcda-71db-401d-895f-5687e224ce88.png" alt="Sole Survivor" width="160" height="160" /><p>Sole Survivor</p><p>Starts: 2026-03-11 17:00 UTC (1 week, 5 days ago)<br />Ends: 2026-04-01 23:29 UTC (1 week, 1 day from now)</p><ul><li>120 minutes watched: Sole Survivor</li></ul><a href="https://www.twitch.tv/drops/inventory">About</a>Call of Duty: WarzoneWed, 11 Mar 2026 17:02:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/c1824558-1333-11f1-8f2e-0a58a9feac02/twitchdropsCall of Duty: WarzoneActivision Publishing Brawlhalla: Luck of the Brawlhttps://ttvdrops.lovinator.space/twitch/campaigns/1a0dc20f-119a-11f1-a696-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/463512e5-e1df-4919-8c5e-ac06df3e256e.png" alt="Luck of the Brawl" width="160" height="160" /><p>Brawlhalla Luck of The Brawl Campaign</p><p>Starts: 2026-03-11 17:00 UTC (1 week, 5 days ago)<br />Ends: 2026-04-08 16:59 UTC (2 weeks, 1 day from now)</p><ul><li>30 minutes watched: Renoodle Avatar</li><li>60 minutes watched: Firehawk Sidekick</li><li>120 minutes watched: Monitor Smash Emote</li><li>240 minutes watched: Lion Rampant Roland Skin</li></ul><a href="https://www.ubisoft.com/en-us/help/connectivity-and-performance/article/information-about-twitch-drops-for-ubisoft-games/000065532#:~:text=You%20can%20earn%20in%2Dgame,stream%20from%20a%20participating%20channel.">About</a>BrawlhallaWed, 11 Mar 2026 17:02:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1a0dc20f-119a-11f1-a696-0a58a9feac02/twitchdropsBrawlhallaUbisoftDiablo IV: S12 Launch Twitch Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/d7c184bb-167f-11f1-9c80-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/ea8e402d-30f8-4b90-b0a4-85a71d3556c7.png" alt="S12 Launch Twitch Drops" width="160" height="160" /><p>Earn the SingSplinter 2H Bow by watching 2 hours of Diablo IV content</p><p>Starts: 2026-03-11 16:00 UTC (1 week, 5 days ago)<br />Ends: 2026-03-26 04:59 UTC (2 days, 2 hours from now)</p><ul><li>120 minutes watched: SingSplinter</li></ul><a href="https://news.blizzard.com/article/24244648">About</a>Diablo IVWed, 11 Mar 2026 16:17:04 +0000https://ttvdrops.lovinator.space/twitch/campaigns/d7c184bb-167f-11f1-9c80-0a58a9feac02/twitchdropsDiablo IVBlizzardTwitch GamingLost Ark: Evergreen Drophttps://ttvdrops.lovinator.space/twitch/campaigns/b18a8be8-17f8-11f1-89cd-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/0c96a076-8547-4a1c-86a0-c102fec99916.jpeg" alt="Evergreen Drop" width="160" height="160" /><p>Take these drops on your next adventure in Arkesia!</p><p>Starts: 2026-03-11 16:00 UTC (1 week, 5 days ago)<br />Ends: 2026-04-01 15:59 UTC (1 week, 1 day from now)</p><ul><li>240 minutes watched: Evergreen Drop</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/scanchinwstreamer">scanchinwstreamer</a></li></ul><a href="https://www.playlostark.com/twitch-drops">About</a>Lost ArkWed, 11 Mar 2026 16:01:42 +0000https://ttvdrops.lovinator.space/twitch/campaigns/b18a8be8-17f8-11f1-89cd-0a58a9feac02/twitchdropsLost ArkSmilegate + Amazon GamesTwitch GamingSTALCRAFT: X: Spring 2026, Week 2https://ttvdrops.lovinator.space/twitch/campaigns/2eed993e-9e9f-422f-a255-3d376811dccb/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/ffafb2b4-2629-44ea-9731-86e1eabab9b5.png" alt="Spring 2026, Week 2" width="160" height="160" /><p>By linking your Twitch account with your EXBO account, you can earn a variety of rewards, including exclusive in-game items. Receive claimed items by talking with the Courier NPC on any safe zones (except for Swamps)</p><p>Starts: 2026-03-11 14:00 UTC (1 week, 5 days ago)<br />Ends: 2026-03-25 12:59 UTC (1 day, 10 hours from now)</p><ul><li>150 minutes watched: Twitch Shards</li><li>210 minutes watched: Meduza Paint</li><li>300 minutes watched: Twitch Shards</li><li>600 minutes watched: Twitch Shards</li><li>750 minutes watched: Sea Depth Paint</li><li>900 minutes watched: Twitch Shards</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/2outcasts">2OutCasts</a></li><li><a href="https://twitch.tv/aceosware">AceOSWare</a></li><li><a href="https://twitch.tv/adhh_spasibo">adhh_spasibo</a></li><li><a href="https://twitch.tv/animus">Animus</a></li><li><a href="https://twitch.tv/anna_kad_">ANNA_KAD_</a></li><li>... and 42 more</li></ul><a href="https://support.exbo.net/help-center/articles/8/19/168/">About</a>STALCRAFT: XWed, 11 Mar 2026 14:01:44 +0000https://ttvdrops.lovinator.space/twitch/campaigns/2eed993e-9e9f-422f-a255-3d376811dccb/twitchdropsSTALCRAFT: XEXBOPUBG: BATTLEGROUNDS: PUBG 9th Anniversaryhttps://ttvdrops.lovinator.space/twitch/campaigns/9d113968-47ce-4536-bc97-ecdc8c5e7f12/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/c11f70da-b6cc-4b5d-a5c4-ba5368d6189f.png" alt="PUBG 9th Anniversary" width="160" height="160" /><p>HAPPY PUB9-ANNIVERSARY! Tune into PUBG livestreams to unlock exclusive 9th Anniversary Drops. +Don’t miss out on your chance to claim all the special rewards!</p><p>Starts: 2026-03-11 08:00 UTC (1 week, 5 days ago)<br />Ends: 2026-03-31 07:58 UTC (1 week from now)</p><ul><li>30 minutes watched: Flamin&#x27; Cake - Console, 9th Anniv. Flamin&#x27; Cake</li><li>60 minutes watched: Cake &amp; Confetti - Console, 9th Anniv. Cake&amp;Confetti</li><li>90 minutes watched: Holo Cat Ears - Console, 9th Anniv. Holo Cat Ears</li></ul><a href="https://pubg.com/events/notice/9797">About</a>PUBG: BATTLEGROUNDSWed, 11 Mar 2026 08:01:47 +0000https://ttvdrops.lovinator.space/twitch/campaigns/9d113968-47ce-4536-bc97-ecdc8c5e7f12/twitchdropsPUBG: BATTLEGROUNDSKRAFTON Inc.Overwatch: OW S1 Midseason Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/1e1112f5-9df8-49db-bafc-ea8cb3876845/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/f75c991e-2eeb-4609-a8ed-ef81d1f3a203.png" alt="OW S1 Midseason Drops" width="160" height="160" /><p>Continue the Reign of Talon this season with Midseason Drops! And don&#x27;t miss the Ramistletoe spray! Created by Twitch Chat during our December 2025 Dev Livestream, it&#x27;s now available to get by watching for 15 minutes! </p><p>Starts: 2026-03-10 19:24 UTC (1 week, 6 days ago)<br />Ends: 2026-04-06 06:58 UTC (1 week, 6 days from now)</p><ul><li>15 minutes watched: Ramistletoe Spray</li><li>60 minutes watched: S20 Lootbox</li><li>180 minutes watched: S20 Lootbox</li><li>420 minutes watched: S20 Epic Lootbox</li></ul><a href="https://overwatch.blizzard.com/en-us/news/24266704/season-1-midcycle-continues-to-conquer-in-the-new-era/">About</a>OverwatchTue, 10 Mar 2026 20:46:22 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1e1112f5-9df8-49db-bafc-ea8cb3876845/twitchdropsOverwatchBlizzardOverwatch: S1 Midseason Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/fd87b674-348c-48d0-a8a1-36e74a3dcf18/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/e6885b53-56e7-4c4b-917d-e0b5f1eaa174.png" alt="S1 Midseason Drops" width="160" height="160" /><p>Starts: 2026-03-10 18:00 UTC (1 week, 6 days ago)<br />Ends: 2026-04-06 06:58 UTC (1 week, 6 days from now)</p><ul><li>15 minutes watched: Ramistletoe Spray 1</li><li>180 minutes watched: S1 Lootbox</li><li>420 minutes watched: S1 Epic Lootbox</li></ul><a href="https://overwatch.blizzard.com/en-us/news/24266704/season-1-midcycle-continues-to-conquer-in-the-new-era/">About</a>OverwatchTue, 10 Mar 2026 18:02:07 +0000https://ttvdrops.lovinator.space/twitch/campaigns/fd87b674-348c-48d0-a8a1-36e74a3dcf18/twitchdropsOverwatchBlizzardStar Wars: The Old Republic: T2-26 Scout Walker Mounthttps://ttvdrops.lovinator.space/twitch/campaigns/ee61410e-17e6-11f1-aa6e-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/4b3645ba-433e-4938-99e2-6bd3e50f332d.jpeg" alt="T2-26 Scout Walker Mount" width="160" height="160" /><p>Watch for 5 hours and claim the T2-26 Scout Walker Mount</p><p>Starts: 2026-03-10 15:00 UTC (1 week, 6 days ago)<br />Ends: 2026-04-07 05:57 UTC (2 weeks from now)</p><ul><li>300 minutes watched: T2-26 Scout Walker Mount</li></ul><a href="https://www.swtor.com/">About</a>Star Wars: The Old RepublicTue, 10 Mar 2026 15:01:34 +0000https://ttvdrops.lovinator.space/twitch/campaigns/ee61410e-17e6-11f1-aa6e-0a58a9feac02/twitchdropsStar Wars: The Old RepublicBroadsword Online GamesLegend of YMIR: LOY DROPS_ALL (26_MAR)https://ttvdrops.lovinator.space/twitch/campaigns/5142d4d7-0571-4259-bbe2-ff872b761a7d/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/b499b4d9-f71e-486a-980d-8ede4d623f28.jpeg" alt="LOY DROPS_ALL (26_MAR)" width="160" height="160" /><p>Share the loot, Share the glory. + +Your view becomes your reward, the Twitch Drops event is here, granting generous rewards just for watching streams on Twitch! + +Join the epic saga of Legend of YMIR showcased by SSS streamers and creators from around the world. Tune in and earn special rewards simply by watching.</p><p>Starts: 2026-03-10 03:00 UTC (1 week, 6 days ago)<br />Ends: 2026-03-29 14:59 UTC (5 days, 12 hours from now)</p><ul><li>15 minutes watched: Mana Regeneration Potion</li><li>30 minutes watched: Middle Scroll Package</li><li>60 minutes watched: Mani&#x27;s Valkyrie x11 Card</li><li>180 minutes watched: Galar&#x27;s Mead</li><li>300 minutes watched: Enh.Stone Selection Chest</li><li>420 minutes watched: Mani&#x27;s Disir x11 Card</li><li>540 minutes watched: Mid Craft Mat Selector</li><li>660 minutes watched: Boss Feather</li><li>780 minutes watched: Lesser Horn</li><li>900 minutes watched: Full Drops Chest</li></ul><a href="https://www.legendofymir.com/event/ongoing/719573">About</a>Legend of YMIRTue, 10 Mar 2026 03:01:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/5142d4d7-0571-4259-bbe2-ff872b761a7d/twitchdropsLegend of YMIRWemade EntertainmentLegend of YMIR: LOY DROPS_SSS (26 MAR)https://ttvdrops.lovinator.space/twitch/campaigns/17945383-2a54-4053-9682-91bca2247d62/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/370bfe79-1c63-412a-a771-66db2719e235.jpeg" alt="LOY DROPS_SSS (26 MAR)" width="160" height="160" /><p>Share the loot, Share the glory. + +Your view becomes your reward, the Twitch Drops event is here, granting generous rewards just for watching streams on Twitch! + +Join the epic saga of Legend of YMIR showcased by SSS streamers and creators from around the world. Tune in and earn special rewards simply by watching.</p><p>Starts: 2026-03-10 03:00 UTC (1 week, 6 days ago)<br />Ends: 2026-03-29 14:59 UTC (5 days, 12 hours from now)</p><ul><li>15 minutes watched: Mana Regeneration Potion</li><li>30 minutes watched: Middle Scroll Package</li><li>60 minutes watched: Sol&#x27;s Valkyrie x11 Card</li><li>180 minutes watched: Galar&#x27;s Mead</li><li>300 minutes watched: Enh.Stone Selection Chest</li><li>420 minutes watched: Sol&#x27;s Disir x11 Card</li><li>540 minutes watched: Mid Craft Mat Selector</li><li>660 minutes watched: Raid Feather</li><li>780 minutes watched: Lesser Horn</li><li>900 minutes watched: SSS Full Drops Chest</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/64world">64world</a></li><li><a href="https://twitch.tv/abak">Abak</a></li><li><a href="https://twitch.tv/aceboogzgaming">AceboogzGaming</a></li><li><a href="https://twitch.tv/agnarv2">agnarv2</a></li><li><a href="https://twitch.tv/alabanft">AlabaNFT</a></li><li>... and 178 more</li></ul><a href="https://www.legendofymir.com/event/ongoing/719573">About</a>Legend of YMIRTue, 10 Mar 2026 03:01:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/17945383-2a54-4053-9682-91bca2247d62/twitchdropsLegend of YMIRWemade EntertainmentSkull and Bones: S&B RUBYNXT dropshttps://ttvdrops.lovinator.space/twitch/campaigns/594d1ee5-addb-4951-aac6-7d619096d49d/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/default.png" alt="S&amp;B RUBYNXT drops" width="160" height="160" /><p>RUBYNXT exclusive drops</p><p>Starts: 2026-03-10 00:00 UTC (2 weeks ago)<br />Ends: 2026-03-24 23:58 UTC (21 hours from now)</p><ul><li>60 minutes watched: Ruby of the Reefs</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/rubynxt">rubynxt</a></li></ul><a href="https://www.ubisoft.com/fr-fr/help/gameplay/article/information-about-twitch-drops-for-ubisoft-games/000065532">About</a>Skull and BonesTue, 10 Mar 2026 00:01:08 +0000https://ttvdrops.lovinator.space/twitch/campaigns/594d1ee5-addb-4951-aac6-7d619096d49d/twitchdropsSkull and BonesUbisoftLeague of Legends: First Stand - Sub Drop https://ttvdrops.lovinator.space/twitch/campaigns/5082675e-1665-11f1-b32c-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/bdcee689-1676-4bcf-a57d-115dbab72b83.jpeg" alt="First Stand - Sub Drop " width="160" height="160" /><p>Subscribers with paid and gifted Tier 1 subscriptions will earn the “And That&#x27;s It.” emote by subscribing to participating LoL Esports channels. By subscribing, fans will receive an enhanced viewing experience while providing direct support to their favorite leagues and teams. </p><p>Starts: 2026-03-09 18:00 UTC (2 weeks ago)<br />Ends: 2026-03-30 17:59 UTC (6 days, 15 hours from now)</p><ul><li>1 sub required: <a href="https://twitch.tv/cblol" >cblol</a></li></ul><a href="https://lolesports.com/en-US/news/fst-2026-primer ">About</a>League of LegendsMon, 09 Mar 2026 18:02:13 +0000https://ttvdrops.lovinator.space/twitch/campaigns/5082675e-1665-11f1-b32c-0a58a9feac02/twitchdropsLeague of LegendsRiot GamesTwitch GamingMortal Online 2: March 2026 Veterancyhttps://ttvdrops.lovinator.space/twitch/campaigns/341a2188-6dda-4882-8216-0fd6599d1157/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/f3573d6e-befa-4346-9eb7-a6c21e576a50.png" alt="March 2026 Veterancy" width="160" height="160" /><p>Watch Mortal Online 2 content creators to earn free Veterancy!</p><p>Starts: 2026-03-07 17:00 UTC (2 weeks, 2 days ago)<br />Ends: 2026-03-28 23:58 UTC (4 days, 21 hours from now)</p><ul><li>240 minutes watched: March 2026 Veterancy A</li><li>480 minutes watched: March 2026 Veterancy B</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/1ceprime">1cePrime</a></li><li><a href="https://twitch.tv/1dnsl">1DNSL</a></li><li><a href="https://twitch.tv/7dsvellek">7DSVelleK</a></li><li><a href="https://twitch.tv/activee">Activee</a></li><li><a href="https://twitch.tv/amalg4m">amalg4m</a></li><li>... and 128 more</li></ul><a href="https://www.mortalonline2.com/new-twitch-drop-info-veterancy-sprint-16-patch-campaign">About</a>Mortal Online 2Sat, 07 Mar 2026 17:06:07 +0000https://ttvdrops.lovinator.space/twitch/campaigns/341a2188-6dda-4882-8216-0fd6599d1157/twitchdropsMortal Online 2Star Vault ABWhere Winds Meet: Marchhttps://ttvdrops.lovinator.space/twitch/campaigns/03078c05-15fb-11f1-a4d2-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/fb4aa8d5-8a8b-483b-8f50-26d5561f200d.png" alt="Where Winds Meet March" width="160" height="160" /><p>Watch Where Winds Meet on Twitch and Get Exclusive Rewards! +Step1- Log in Your Where Winds Meet Account on https://www.wherewindsmeetgame.com/ +Step2- Connect Your Twitch Account +Step3- Watch Where Winds Meet on Twitch and Get Exclusive Rewards!</p><p>Starts: 2026-03-06 02:00 UTC (2 weeks, 4 days ago)<br />Ends: 2026-04-03 01:59 UTC (1 week, 2 days from now)</p><ul><li>15 minutes watched: 15-minute drop march</li><li>30 minutes watched: 30-minute drop march</li><li>60 minutes watched: 60-minute drop march</li><li>120 minutes watched: 120-minute drop march</li><li>180 minutes watched: 180-minute drop march</li><li>240 minutes watched: 240-minute drop march</li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/almadejugador">AlmaDeJugador</a></li><li><a href="https://twitch.tv/averse">Averse</a></li><li><a href="https://twitch.tv/blue_squadron">Blue_Squadron</a></li><li><a href="https://twitch.tv/bv_nez">BV_Nez</a></li><li><a href="https://twitch.tv/cantpredictofficial">cantpredictofficial</a></li><li>... and 26 more</li></ul><a href="https://www.wherewindsmeetgame.com/twitchdrops/">About</a>Where Winds MeetFri, 06 Mar 2026 03:25:58 +0000https://ttvdrops.lovinator.space/twitch/campaigns/03078c05-15fb-11f1-a4d2-0a58a9feac02/twitchdropsWhere Winds MeetWhere Winds MeetHonkai Impact 3rd: V8.7 Special Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/ee159f49-00c6-11f1-9ef4-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/47629d01-f833-447d-bb19-111dedb0491c.png" alt="V8.7 Special Drops" width="160" height="160" /><p>V8.7 Special Drops</p><p>Starts: 2026-03-05 10:00 UTC (2 weeks, 4 days ago)<br />Ends: 2026-04-02 09:59 UTC (1 week, 2 days from now)</p><ul><li>15 minutes watched: Stamina Potion*1</li><li>30 minutes watched: Phase Shifter*1</li><li>60 minutes watched: Asterite*1500</li><li>180 minutes watched: Crystal*120</li></ul><a href="https://act.hoyoverse.com/puzzle/bh3/pz_gg2nWmyfbo/index.html?game_biz=bh3_global&amp;utm_source=web&amp;utm_medium=twitchdrops">About</a>Honkai Impact 3rdThu, 05 Mar 2026 15:42:19 +0000https://ttvdrops.lovinator.space/twitch/campaigns/ee159f49-00c6-11f1-9ef4-0a58a9feac02/twitchdropsHonkai Impact 3rdCognosphereWolvesville: March 2026https://ttvdrops.lovinator.space/twitch/campaigns/1ea0a64b-006d-4d51-a2da-d657bada7f53/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/default.png" alt="March 2026" width="160" height="160" /><p>Unlock the limited Twitch march items! You&#x27;ll need to link your Twitch account with Wolvesville for this to work.</p><p>Starts: 2026-03-05 00:00 UTC (2 weeks, 5 days ago)<br />Ends: 2026-03-31 23:59 UTC (1 week from now)</p><ul><li>60 minutes watched: Twitch gravestone</li><li>120 minutes watched: Twitch back</li></ul><a href="https://wolvesville.com/">About</a>WolvesvilleThu, 05 Mar 2026 19:31:14 +0000https://ttvdrops.lovinator.space/twitch/campaigns/1ea0a64b-006d-4d51-a2da-d657bada7f53/twitchdropsWolvesvilleWolvesvilleInfinity Nikki: V2.3 Infinity Nikkihttps://ttvdrops.lovinator.space/twitch/campaigns/3e75791e-06ea-11f1-8ae0-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/baa7a914-752b-44eb-b3f8-38f3b758e666.png" alt="V2.3 Infinity Nikki" width="160" height="160" /><p>Watch Infinity Nikki on Twitch and earn exclusive in-game rewards! + +Watch Time Rewards: +⏱️ Watch 15 mins – Diamond ×10 +⏱️ Watch 30 mins – Diamond ×20 +⏱️ Watch 45 mins – Bling ×20,000 +⏱️ Watch 1 hour – Thread of Purity ×100 +⏱️ Watch 1.5 hours – Shining Particle ×100</p><p>Starts: 2026-03-03 03:00 UTC (2 weeks, 6 days ago)<br />Ends: 2026-03-26 02:59 UTC (2 days from now)</p><ul><li>15 minutes watched: 2.3 Diamondx10</li><li>30 minutes watched: 2.3 Diamondx20</li><li>45 minutes watched: 2.3 Bling×20,000</li><li>60 minutes watched: 2.3 Thread of Purity×100</li><li>90 minutes watched: 2.3 Shining Particle×100</li></ul><a href="https://infinitynikki.infoldgames.com/proj/en/twitch-drops.html">About</a>Infinity NikkiTue, 03 Mar 2026 05:50:54 +0000https://ttvdrops.lovinator.space/twitch/campaigns/3e75791e-06ea-11f1-8ae0-0a58a9feac02/twitchdropsInfinity NikkiINFOLD PTE. LTD.NARAKA: BLADEPOINT: S19 PARTNER I 3.2https://ttvdrops.lovinator.space/twitch/campaigns/a95a21cb-0243-11f1-86c7-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/e6c2fa61-d4f4-4ddc-af36-da3a4d81e4d5.png" alt="S19 PARTNER I 3.2" width="160" height="160" /><p>Watch livestreams to claim your drops!</p><p>Starts: 2026-03-02 04:00 UTC (3 weeks ago)<br />Ends: 2026-03-29 03:59 UTC (5 days, 1 hour from now)</p><ul><li>120 minutes watched: Tae*500</li><li>240 minutes watched: Spectral Silk*500</li><li>360 minutes watched: Outfit Trial Choice Gift</li><li>480 minutes watched: Zenda Wu·Grand Entrance</li><li>600 minutes watched: Splendor Treasure Choice </li></ul><p>Channels with this drop:</p><ul><li><a href="https://twitch.tv/0b0100">0b0100</a></li><li><a href="https://twitch.tv/abaddonvt">AbaddonVT</a></li><li><a href="https://twitch.tv/adole">adole</a></li><li><a href="https://twitch.tv/agiamk">agiamk</a></li><li><a href="https://twitch.tv/agwendoh">Agwendoh</a></li><li>... and 258 more</li></ul><a href="https://www.narakathegame.com/news/official/20250723/32172_1249209.html">About</a>NARAKA: BLADEPOINTTue, 03 Mar 2026 05:50:54 +0000https://ttvdrops.lovinator.space/twitch/campaigns/a95a21cb-0243-11f1-86c7-0a58a9feac02/twitchdropsNARAKA: BLADEPOINTNetEaseVampire: The Masquerade - Bloodhunt: March Dropshttps://ttvdrops.lovinator.space/twitch/campaigns/0ade22f9-c90d-11f0-ba97-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/4d9ea8d5-7168-437b-8936-4b84fe90bbf1.png" alt="March Drops" width="160" height="160" /><p>March drops</p><p>Starts: 2026-02-27 08:00 UTC (3 weeks, 3 days ago)<br />Ends: 2026-03-27 07:58 UTC (3 days, 5 hours from now)</p><ul><li>240 minutes watched: Beast, Cryo Corsair, Illusive Heart Outfit, Holo hit, Manipulation, Blow Raspberry, Unholy Smokes, Rose Tears</li></ul><a href="https://bloodhunt.com/twitchdrops">About</a>Vampire: The Masquerade - BloodhuntFri, 27 Feb 2026 08:23:47 +0000https://ttvdrops.lovinator.space/twitch/campaigns/0ade22f9-c90d-11f0-ba97-0a58a9feac02/twitchdropsVampire: The Masquerade - BloodhuntSharkmobWorld of Warcraft: Grggles & Fishmonger Mayhttps://ttvdrops.lovinator.space/twitch/campaigns/3fd0c555-133b-11f1-a307-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/b0dc0fce-e69c-4bcd-9d0f-d0325313b400.jpeg" alt="Grggles &amp; Fishmonger May" width="160" height="160" /><p>Watch 4 hours of World of Warcraft content while these Twitch Drops are active on any channel to earn the Cuddly Alliance Blue Grrgle &amp; Cuddly Horde Red Grrgle decor. + +Earn the Fishmonger May pet by gifting a total of 2 subscriptions to across any eligible streamers who are Twitch Partners or Twitch Affiliates while the streamers are live streaming World of Warcraft with the channel category set to World of Warcraft. </p><p>Starts: 2026-02-26 23:00 UTC (3 weeks, 4 days ago)<br />Ends: 2026-03-26 21:59 UTC (2 days, 19 hours from now)</p><ul><li>240 minutes watched: Cuddly Faction Grrgles</li><li>2 subs required: Fishmonger May Pet</li></ul><a href="https://worldofwarcraft.blizzard.com/news/24264010">About</a>World of WarcraftThu, 26 Feb 2026 23:23:03 +0000https://ttvdrops.lovinator.space/twitch/campaigns/3fd0c555-133b-11f1-a307-0a58a9feac02/twitchdropsWorld of WarcraftBlizzardARC Raiders: Shrouded Skyhttps://ttvdrops.lovinator.space/twitch/campaigns/8a100794-0cb8-11f1-8228-0a58a9feac02/<img src="https://static-cdn.jtvnw.net/twitch-quests-assets/CAMPAIGN/99b8bf09-98b0-4b6b-9924-c1e3d02ab2fc.png" alt="Shrouded Sky" width="160" height="160" /><p>Attention, Raiders! + +Violent hurricanes are sweeping topside, forcing new strategies for low-visibility combat, powerful gales, and hurtling debris. Scouts have spotted two new ARC types in the Rust Belt; we advise caution while the storm runs its course, but those who know how to read the weather will find opportunity in the chaos.</p><p>Starts: 2026-02-24 12:00 UTC (3 weeks, 6 days ago)<br />Ends: 2026-03-24 11:59 UTC (9 hours from now)</p><ul><li>60 minutes watched: Royal Steed</li><li>120 minutes watched: Record Player</li></ul><a href="https://arcraiders.com/twitch-drops">About</a>ARC RaidersTue, 24 Feb 2026 12:08:35 +0000https://ttvdrops.lovinator.space/twitch/campaigns/8a100794-0cb8-11f1-8228-0a58a9feac02/twitchdropsARC RaidersEmbark StudiosTwitch Gaming diff --git a/feeds/urls.py b/feeds/urls.py index 4625904..cfb1cff 100644 --- a/feeds/urls.py +++ b/feeds/urls.py @@ -1,26 +1,15 @@ from typing import TYPE_CHECKING -from django.http import HttpResponse from django.urls import path +from . import views + if TYPE_CHECKING: - from django.http import HttpRequest from django.urls import URLPattern from django.urls import URLResolver -def index(request: HttpRequest) -> HttpResponse: - """View for the index page. - - Args: - request: The HTTP request object. - - Returns: - HttpResponse: A simple HTTP response with a greeting message. - """ - return HttpResponse("Hello, world!") - - urlpatterns: list[URLPattern | URLResolver] = [ - path("", index, name="index"), + path("", views.feed_list, name="feed-list"), + path("feeds//", views.feed_detail, name="feed-detail"), ] diff --git a/feeds/views.py b/feeds/views.py index e69de29..38a5d93 100644 --- a/feeds/views.py +++ b/feeds/views.py @@ -0,0 +1,70 @@ +from typing import TYPE_CHECKING + +from django.http import HttpResponse +from django.shortcuts import get_object_or_404 + +from feeds.models import Entry +from feeds.models import Feed + +if TYPE_CHECKING: + from django.http import HttpRequest + from pytest_django.asserts import QuerySet + + +def feed_list(request: HttpRequest) -> HttpResponse: + """View to list all feeds. + + Returns: + HttpResponse: An HTML response containing the list of feeds. + """ + feeds = Feed.objects.all().order_by("id") + html = [ + "", + "FeedVault - Feeds", + "

Feed List

", + "", "")) + return HttpResponse("\n".join(html)) + + +def feed_detail(request: HttpRequest, feed_id: int) -> HttpResponse: + """View to display the details of a specific feed. + + Args: + request (HttpRequest): The HTTP request object. + feed_id (int): The ID of the feed to display. + + Returns: + HttpResponse: An HTML response containing the feed details and its entries. + """ + feed: Feed = get_object_or_404(Feed, id=feed_id) + + entries: QuerySet[Entry, Entry] = Entry.objects.filter(feed=feed).order_by( + "-published_at", + "-fetched_at", + )[:50] + html: list[str] = [ + "", + f"FeedVault - {feed.url}", + "

Feed Detail

", + f"

URL: {feed.url}

", + f"

Domain: {feed.domain}

", + f"

Active: {'yes' if feed.is_active else 'no'}

", + f"

Created: {feed.created_at}

", + f"

Last fetched: {feed.last_fetched_at}

", + "

Entries (latest 50)

", + "", '

Back to list

', "")) + return HttpResponse("\n".join(html)) diff --git a/pyproject.toml b/pyproject.toml index 3660414..6f2ca32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,18 +11,24 @@ dependencies = [ "django-celery-results", "django-debug-toolbar", "django-silk[formatting]", + "django-stubs-ext", "django", "flower", "gunicorn", "hiredis", "index-now-for-python", + "niquests", "platformdirs", "psycopg[binary]", + "pydantic", "python-dotenv", "redis", "sentry-sdk", "setproctitle", "sitemap-parser", + "xmltodict", + "dateparser>=1.3.0", + "xxhash>=3.6.0", ] [dependency-groups] @@ -36,6 +42,7 @@ dev = [ "pytest-randomly", "pytest-xdist[psutil]", "pytest", + "types-xmltodict", ] [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "config.settings"