Fengqing Liu 68118d9e4b Add manual mode feature with UI improvements and batch updates
This commit introduces a manual mode for channel selection that allows users to lock onto a specific game, along with significant UI/UX improvements:

Manual Mode Features:
- Locks channel selection to a specific game when user manually selects a different game
- Automatically exits manual mode when all drops for the game are completed
- Shows visual indicators (🎯 badge) in status bar and drop display
- Allows manual exit via "Return to Auto Mode" button
- Prioritizes manual game in wanted_games list during auto-selection

UI/UX Improvements:
- Batch update system for channels and campaigns prevents flickering during refresh
- Channels list now updates atomically instead of clearing and re-adding
- Campaign loading emits all campaigns at once for smooth initial load
- Drop progress persists on initial_state load for reconnecting clients
- Game icons (box art) now displayed in channel list
- Campaign links added to inventory items

Bug Fixes:
- Fixed logging level to respect INFO by default (was hardcoded to DEBUG)
- Fixed channel cleanup to not call channel.remove() (handled by batch_update)
- Fixed drop display not persisting during channel switch
- Fixed stop_watching() clearing drop timer prematurely
- Fixed status display typo ("fames_to_watch" → "games_to_watch")

Backend Changes:
- Added manual mode tracking (_manual_target_channel, _manual_target_game)
- Added enter_manual_mode(), exit_manual_mode(), is_manual_mode() methods
- Added get_manual_mode_info() for API serialization
- Added batch_update() to ChannelListManager for atomic updates
- Added start_batch()/finalize_batch() to InventoryManager
- Added /api/mode/exit-manual endpoint
- Game model now stores box_art_url from GraphQL response
- Manual mode info included in /api/status and initial_state

Frontend Changes:
- Added manual mode badge and controls in UI
- Added channels_batch_update and inventory_batch_update socket events
- Added manual_mode_update socket event
- Countdown timer now properly tracked and cleared
- Drop display shows manual mode status with game name
- Exit manual mode button added to drop display area

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 00:22:34 +11:00
2025-10-17 20:04:23 +11:00
2025-08-27 17:19:32 +02:00
2024-01-30 17:16:29 +01:00
2024-12-31 21:05:35 +01:00

Twitch Drops Miner

Note: This is a fork of DevilXD/TwitchDropsMiner. See Acknowledgments for credits to the original author and contributors.

Disclaimer: This fork is heavily maintained and developed using AI-assisted coding (Claude Code). While functional, the codebase may reflect "vibe coding" patterns and AI-generated conventions. Use at your own discretion and always review changes before deploying.

This application allows you to AFK mine timed Twitch drops, without having to worry about switching channels when the one you were watching goes offline, claiming the drops, or even receiving the stream data itself. This helps you save on bandwidth and hassle.

How It Works:

Every several seconds, the application pretends to watch a particular stream by fetching stream metadata - this is enough to advance the drops. Note that this completely bypasses the need to download any actual stream video and sound. To keep the status (ONLINE or OFFLINE) of the channels up-to-date, there's a websocket connection established that receives events about streams going up or down, or updates regarding the current amount of viewers.

Features:

  • Stream-less drop mining - save on bandwidth.
  • Game priority and exclusion lists, allowing you to focus on mining what you want, in the order you want, and ignore what you don't want.
  • Sharded websocket connection, allowing for tracking up to 199 channels at the same time.
  • Automatic drop campaigns discovery based on linked accounts (requires you to do account linking yourself though).
  • Stream tags and drop campaign validation, to ensure you won't end up mining a stream that can't earn you the drop.
  • Automatic channel stream switching, when the one you were currently watching goes offline, as well as when a channel streaming a higher priority game goes online.
  • Login session is saved in a cookies file, so you don't need to login every time.
  • Mining is automatically started as new campaigns appear, and stopped when the last available drops have been mined.

Usage:

Quick Start with Docker (Recommended):

# Clone the repository
git clone https://github.com/rangermix/TwitchDropsMiner.git
cd TwitchDropsMiner

# Start with docker-compose
docker-compose up -d

# Access the web interface at http://localhost:8080

Running from Source:

# Install Python 3.10+ and dependencies
pip install -r requirements.txt

# Run the application
python main.py

# Access the web interface at http://localhost:8080

Using the Application:

  • Open the web interface in your browser at http://localhost:8080
  • Login/connect the miner to your Twitch account using the OAuth device code flow
  • After a successful login, the app will fetch all available campaigns and games you can mine drops for
  • Select and add games to the Priority List on the Settings tab, then press Reload to start processing
  • The miner will fetch applicable streams and start mining automatically
  • You can manually switch to a different channel as needed
  • Make sure to link your Twitch account to game accounts on the campaigns page

Screenshots:

The application features a modern web-based interface accessible from any browser on your network.

Notes:

Warning

Due to how Twitch handles the drop progression on their side, watching a stream in the browser (or by any other means) on the same account that is actively being used by the miner, will usually cause the miner to misbehave, reporting false progress and getting stuck mining the current drop.

Using the same account to watch other streams during mining is thus discouraged, in order to avoid any problems arising from it.

Caution

Persistent cookies will be stored in the cookies.jar file, from which the authorization (login) information will be restored on each subsequent run. Make sure to keep your cookies file safe, as the authorization information it stores can give another person access to your Twitch account, even without them knowing your password!

Important

Successfully logging into your Twitch account in the application may cause Twitch to send you a "New Login" notification email. This is normal - you can verify that it comes from your own IP address. The detected browser during the login will be "Chrome", as that's what the miner currently presents itself to the Twitch server.

Note

The time remaining timer always countdowns a single minute and then stops - it is then restarted only after the application redetermines the remaining time. This "redetermination" can happen at any time Twitch decides to report on the drop's progress, but not later than 20 seconds after the timer reaches zero. The seconds timer is only an approximation and does not represent nor affect actual mining speed. The time variations are due to Twitch sometimes not reporting drop progress at all, or reporting progress for the wrong drop - these cases have all been accounted for in the application though.

Note

The source code requires Python 3.10 or higher to run.

Docker Deployment:

The application is designed for Docker deployment, making it easy to run on any platform:

Using pre-built images (Recommended):

# Pull and run from GitHub Container Registry
docker pull ghcr.io/rangermix/twitchdropsminer:latest
docker run -d -p 8080:8080 -v $(pwd)/data:/app/data ghcr.io/rangermix/twitchdropsminer:latest

# Or use docker-compose with the pre-built image
# Create a docker-compose.yml file with:
# services:
#   twitch-drops-miner:
#     image: ghcr.io/rangermix/twitchdropsminer:latest
#     ...

Building locally:

# Build and run with docker-compose
docker-compose up -d

# Or build and run manually
docker build -t twitch-drops-miner .
docker run -d -p 8080:8080 -v $(pwd)/data:/app/data twitch-drops-miner

Important Docker notes:

  • All persistent data (cookies, settings, logs) is stored in the data/ directory
  • Login uses OAuth device code flow - you'll be given a code to enter at twitch.tv/activate
  • Browser notifications supported (requires permission)
  • Health checks and automatic restart included in docker-compose
  • Configure timezone with TZ environment variable
  • Pre-built images are automatically built from the master branch via GitHub Actions
  • Available tags: latest (stable), dev (latest development build)

Running from Source:

For development or customization:

# Install Python 3.10+
# Create virtual environment (recommended)
python -m venv env
source env/bin/activate  # On Windows: env\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Run the application
python main.py

Support This Fork

If you find this fork useful, please consider supporting my work:

Buy me a coffee

You can also support the original author @DevilXD at buymeacoffee.com/DevilXD or Patreon.

Project goals:

Twitch Drops Miner (TDM for short) has been designed with a couple of simple goals in mind:

What TDM is:

  • Twitch Drops focused - Automatic mining of timed Twitch drops
  • Easy to use - Simple web interface accessible from any browser
  • Reliable - Designed to run continuously with minimal attention needed
  • Efficient - Minimal interactions with Twitch, respecting their service
  • Docker-ready - Easy deployment on any platform or server

What TDM is NOT:

  • Mining channel points
  • Mining other platforms besides Twitch
  • Multi-account support
  • Mining unlinked campaigns
  • 100% guaranteed uptime (expect occasional errors)

Limitations:

  • Single account per instance
  • No automatic error recovery (monitor periodically)
  • No additional notification systems (email, webhook, etc.)
  • Campaigns must be linked to your Twitch account

This is a web-only application designed for Docker deployment and headless operation.

Acknowledgments:

This project is a fork of the excellent TwitchDropsMiner created by @DevilXD. Huge thanks to DevilXD for creating and maintaining this amazing tool, and to all the contributors who have helped improve it over time.

Original Project: DevilXD/TwitchDropsMiner Original Author: @DevilXD

Translation Credits:

@guihkx - For the CI script, CI maintenance, and everything related to Linux builds.
@kWAYTV - For the implementation of the dark mode theme.

@Bamboozul - For the entirety of the Arabic (العربية) translation.
@Suz1e - For the entirety of the Chinese (简体中文) translation and revisions.
@wwj010 - For the Chinese (简体中文) translation corrections and revisions.
@zhangminghao1989 - For the Chinese (简体中文) translation corrections and revisions.
@Ricky103403 - For the entirety of the Traditional Chinese (繁體中文) translation.
@LusTerCsI - For the Traditional Chinese (繁體中文) translation corrections and revisions.
@nwvh - For the entirety of the Czech (Čeština) translation.
@Kjerne - For the entirety of the Danish (Dansk) translation.
@roobini-gamer - For the entirety of the French (Français) translation.
@Calvineries - For the French (Français) translation revisions.
@ThisIsCyreX - For the entirety of the German (Deutsch) translation.
@Eriza-Z - For the entirety of the Indonesian translation.
@casungo - For the entirety of the Italian (Italiano) translation.
@ShimadaNanaki - For the entirety of the Japanese (日本語) translation.
@Patriot99 - For the Polish (Polski) translation and revisions (co-authored with @DevilXD).
@zarigata - For the entirety of the Portuguese (Português) translation.
@Sergo1217 - For the entirety of the Russian (Русский) translation.
@kilroy98 - For the Russian (Русский) translation corrections and revisions.
@Shofuu - For the entirety of the Spanish (Español) translation and revisions.
@alikdb - For the entirety of the Turkish (Türkçe) translation.
@Nollasko - For the entirety of the Ukrainian (Українська) translation and revisions.
@kilroy98 - For the Ukrainian (Українська) translation corrections and revisions.

Languages
Python 69.1%
JavaScript 20%
CSS 6.6%
HTML 3.9%
Dockerfile 0.4%