{"id":330845,"date":"2026-08-25T20:20:19","date_gmt":"2026-08-25T20:20:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/torrent-scrapper-for-blogs-and-forums\/"},"modified":"2026-08-25T20:20:01","modified_gmt":"2026-08-25T20:20:01","slug":"torrent-scraper-for-blogs-and-forums","status":"publish","type":"plugin","link":"https:\/\/lin.wordpress.org\/plugins\/torrent-scraper-for-blogs-and-forums\/","author":23493638,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"6.9","requires_php":"8.2","requires_plugins":null,"header_name":"Torrent Scraper for Blogs and Forums","header_author":"Shiva Gandla (https:\/\/github.com\/shiva-gandla\/)","header_description":"Publish torrent files and magnet links with live seeder\/leecher stats for blogs and wpForo communities.","assets_banners_color":"","last_updated":"2026-08-25 20:20:01","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/shivgandla","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":56,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"rockydev8193","date":"2026-08-25 20:20:01"}},"upgrade_notice":{"1.0.0":"<p>Initial release of the plugin. No upgrade required.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"torrent-scraper\/torrent-info":{"name":"torrent-scraper\/torrent-info","title":"Torrent Info"},"torrent-scraper\/tracker-stats":{"name":"torrent-scraper\/tracker-stats","title":"Tracker Stats"},"torrent-scraper\/torrent-files":{"name":"torrent-scraper\/torrent-files","title":"Torrent Files"},"torrent-scraper\/magnet-button":{"name":"torrent-scraper\/magnet-button","title":"Magnet Button"}},"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Torrent manager admin dashboard displaying uploaded torrent lists.","2":"wpForo topic creation editor with torrent upload \/ link options panel.","3":"Live seeder, leecher, and completed download stats badge on a blog post."}},"plugin_section":[],"plugin_tags":[568,5706,7677,12635,5352],"plugin_category":[44],"plugin_contributors":[277480],"plugin_business_model":[],"class_list":["post-330845","plugin","type-plugin","status-publish","hentry","plugin_tags-download","plugin_tags-forum","plugin_tags-scraper","plugin_tags-torrent","plugin_tags-tracker","plugin_category-discussion-and-community","plugin_contributors-rockydev8193","plugin_committers-rockydev8193"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/torrent-scraper-for-blogs-and-forums.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Torrent Scraper for Blogs and Forums<\/strong> lets you publish torrent files and magnet links directly inside WordPress blog posts and wpForo forum topics, complete with live seeder, leecher, and download count badges that auto-update every 5 minutes via WP-Cron.<\/p>\n\n<h4>How It Works<\/h4>\n\n<ol>\n<li><strong>Upload a .torrent file<\/strong> or paste a <strong>magnet link<\/strong> through the admin dashboard or the wpForo topic editor.<\/li>\n<li>The plugin parses the torrent file using its built-in Bencode decoder -- extracting the torrent name, total size, file count, and info hash. No external API is called for this step.<\/li>\n<li>The info hash is used to query the torrent's tracker URLs (listed inside the .torrent file itself) using standard BitTorrent HTTP and UDP scrape protocols. The tracker responds with seeder\/leecher\/completed counts.<\/li>\n<li>Those counts are saved to the plugin's own database tables and displayed on your posts or forum topics via shortcodes, Gutenberg blocks, or automatic injection.<\/li>\n<li>WP-Cron updates tracker stats every 5 minutes in the background.<\/li>\n<\/ol>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Torrent Parsing<\/strong> -- Upload .torrent files or paste magnet links. Full Bencode decoding, single\/multi-file support, info hash extraction. No third-party parser libraries required.<\/li>\n<li><strong>Live Tracker Stats<\/strong> -- Seeder, leecher, and completed counts updated automatically every 5 minutes via WP-Cron. Supports both HTTP tracker scraping and UDP tracker scraping (BEP 15 protocol).<\/li>\n<li><strong>Gutenberg Blocks<\/strong> -- 4 server-side rendered Gutenberg blocks: Torrent Info, Tracker Stats, Torrent Files, Magnet Button. No JavaScript build step required.<\/li>\n<li><strong>Shortcodes<\/strong> -- 8 shortcodes for embedding torrent data anywhere in posts, pages, and forum topics.<\/li>\n<li><strong>REST API<\/strong> -- Full JSON API at <code>\/wp-json\/tsbf\/v1\/<\/code> with pagination, filtering, and per-IP rate limiting.<\/li>\n<li><strong>wpForo Forum Integration<\/strong> -- Optionally attach torrent metadata cards to wpForo forum topics. Requires the wpForo plugin to be installed and active.<\/li>\n<li><strong>Admin Dashboard<\/strong> -- Manage torrents, categories, settings, and run a system health check directly from the WordPress admin.<\/li>\n<li><strong>Security<\/strong> -- Magic byte validation on file uploads, SSRF protection for tracker URLs, nonce verification on all forms, capability checks on all admin actions, parameterized database queries throughout.<\/li>\n<li><strong>Theme-Adaptive Design<\/strong> -- Plugin UI inherits your active theme's CSS variables for colors, fonts, and spacing. No manual CSS configuration needed.<\/li>\n<\/ul>\n\n<h4>wpForo Integration<\/h4>\n\n<p>When wpForo is active, the plugin adds a torrent attachment panel to the topic editor. Users with the appropriate capability can upload a .torrent file or paste a magnet link directly from the forum topic form. The torrent metadata card is then automatically displayed inside the topic. This integration is <strong>optional<\/strong> -- the plugin works fully as a standalone blog plugin without wpForo installed.<\/p>\n\n<h4>Who Is This For?<\/h4>\n\n<ul>\n<li>Blog owners who want to embed torrent download information with live stats in their posts<\/li>\n<li>Forum communities running wpForo who publish torrent-related content<\/li>\n<li>Site administrators managing a torrent index or tracker listings<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li><strong>PHP:<\/strong> 8.2 or higher<\/li>\n<li><strong>WordPress:<\/strong> 6.9 or higher<\/li>\n<li><strong>MySQL:<\/strong> 5.7+ or MariaDB 10.3+<\/li>\n<li><strong>PHP Extensions Required:<\/strong> <code>sockets<\/code> (UDP tracker scraping), <code>curl<\/code> (HTTP tracker scraping), <code>mbstring<\/code> (Bencode decoding), <code>fileinfo<\/code> (file upload security)<\/li>\n<li><strong>Optional:<\/strong> wpForo plugin (only required for forum integration)<\/li>\n<\/ul>\n\n<p>After activating, visit <strong>Torrent Scraper -- Settings -- System Check<\/strong> to verify your server meets all requirements.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin contacts external BitTorrent tracker servers to retrieve live seeder, leecher, and completed-download counts for torrents stored in your database. This section documents every external connection this plugin makes: what is sent, what is received, when it happens, how it happens, why it is needed, and which third-party service is involved.<\/p>\n\n<p><strong>Important:<\/strong> No personal user data is ever transmitted to any external server. No usernames, email addresses, passwords, WordPress session tokens, visitor IP addresses, or any personally identifiable information is sent to tracker servers under any circumstances.<\/p>\n\n\n\n<h4>Service 1: BitTorrent Tracker Servers (Core Feature \u2014 Tracker Scraping)<\/h4>\n\n<p><strong>What this service is:<\/strong>\nBitTorrent tracker servers are public network services that coordinate peer-to-peer file sharing. When a client queries a tracker using the \"scrape\" protocol, the tracker reports how many peers are currently seeding (uploading) a file, how many are leeching (downloading) it, and how many times it has been fully downloaded. This plugin uses that information to display live statistics on your WordPress site. The plugin does NOT seed or download any file content. It does NOT join any peer-to-peer swarm.<\/p>\n\n<p><strong>Which tracker servers are contacted:<\/strong>\nThe plugin contacts ONLY the tracker announce URLs that are embedded inside each <code>.torrent<\/code> file that a site administrator uploads through the admin dashboard or wpForo topic form. These tracker URLs are chosen by whoever originally created the torrent file -- the plugin reads them from the file and uses them as-is. The plugin does NOT maintain its own hardcoded list of trackers.<\/p>\n\n<p>Example of a tracker URL that may appear inside an uploaded torrent file:\n    udp:\/\/tracker.example.com\/announce<\/p>\n\n<p><strong>When does this happen:<\/strong>\n1. <strong>Immediately after upload<\/strong> -- When a site administrator uploads a <code>.torrent<\/code> file or submits a magnet link, the plugin immediately sends one scrape request per tracker URL embedded in the torrent to populate the initial seeder\/leecher statistics.\n2. <strong>Every 5 minutes via WP-Cron<\/strong> -- The plugin schedules a recurring background job (WordPress WP-Cron hook: <code>tsbf_run_scheduler<\/code>) that runs every 5 minutes and sends scrape requests for all active torrents in the database. This keeps statistics up to date automatically. This can be disabled via <strong>Settings -- Integrations -- Automatic Scraper<\/strong>.\n3. <strong>Manual refresh<\/strong> -- When a site administrator clicks the \"Reload\" button next to a torrent in the admin dashboard, the plugin immediately sends a fresh scrape request for that torrent.<\/p>\n\n<p><strong>How it works -- HTTP Trackers (BitTorrent BEP 48 Scrape Convention):<\/strong><\/p>\n\n<p><em>What is sent (outbound):<\/em>\nAn HTTP GET request is sent to the tracker's scrape URL. The request contains:\n- The torrent's <strong>info hash<\/strong>: a 20-byte SHA-1 hash of the torrent file's \"info\" dictionary, URL-percent-encoded. This is a mathematical identifier for the torrent and does not contain any personal data or file content.\n- Standard HTTP request headers automatically included by WordPress's built-in <code>wp_remote_get()<\/code> function, including a User-Agent string identifying the WordPress HTTP client.<\/p>\n\n<p>Nothing else is sent. No user data. No file content. No authentication credentials.<\/p>\n\n<p><em>What is received (inbound):<\/em>\nThe tracker responds with a bencoded binary dictionary. The plugin decodes this response and extracts:\n- <strong><code>complete<\/code><\/strong>: An integer representing the current number of seeders (peers who have the complete file and are sharing it).\n- <strong><code>incomplete<\/code><\/strong>: An integer representing the current number of leechers (peers who are actively downloading the file).\n- <strong><code>downloaded<\/code><\/strong>: An integer representing the total number of times the complete file has been successfully downloaded from the swarm since the tracker began counting.<\/p>\n\n<p>These three numbers are public, aggregate statistics. They do not identify any individual user. The plugin stores these three values in its own database table (<code>{wordpress_prefix}tsbf_torrent_statistics<\/code>) alongside a timestamp.<\/p>\n\n<p>No other data from the HTTP response body is stored or used. HTTP response headers (such as cache-control or content-type) are used only to process the response and are not stored.<\/p>\n\n<p><strong>How it works -- UDP Trackers (BitTorrent BEP 15 UDP Tracker Protocol):<\/strong><\/p>\n\n<p><em>What is sent (outbound):<\/em>\nUDP tracker communication follows a two-step handshake:<\/p>\n\n<p>Step 1 -- Connect Request (16 bytes):\n- <code>connection_id<\/code>: fixed protocol magic constant <code>0x41727101980<\/code> (publicly defined by the BitTorrent protocol specification)\n- <code>action<\/code>: integer <code>0<\/code> (meaning \"connect\")\n- <code>transaction_id<\/code>: a randomly generated 32-bit integer used to match this request to its response; discarded after use; never stored<\/p>\n\n<p>Step 2 -- Scrape Request (sent after receiving a connection token):\n- <code>connection_id<\/code>: a temporary token issued by the tracker (valid for approximately 2 minutes; used only to send this request; never stored after the request completes)\n- <code>action<\/code>: integer <code>2<\/code> (meaning \"scrape\")\n- <code>transaction_id<\/code>: a new randomly generated 32-bit integer; discarded after use\n- <code>info_hash<\/code>: the 20-byte raw binary SHA-1 info hash of the torrent<\/p>\n\n<p><strong>Side effect of network connection:<\/strong> Because UDP is connectionless, the tracker server will see your web server's outbound IP address as the network source of the UDP packets. This is an unavoidable, standard side-effect of any internet connection and is equivalent to visiting any website. The plugin does not attempt to mask or spoof this.<\/p>\n\n<p>Nothing else is sent. No user data. No file content.<\/p>\n\n<p><em>What is received (inbound):<\/em>\nThe tracker responds with a UDP scrape response packet. The plugin decodes this response and extracts:\n- <strong><code>seeders<\/code><\/strong>: Current number of peers with the complete file.\n- <strong><code>completed<\/code><\/strong>: Total number of successful complete downloads recorded by this tracker.\n- <strong><code>leechers<\/code><\/strong>: Current number of peers still downloading the file.<\/p>\n\n<p>These three integers are stored in the plugin's database (<code>{wordpress_prefix}tsbf_torrent_statistics<\/code>) alongside a timestamp. No other data from the UDP response is stored or used. The connection token and transaction ID are discarded immediately after the response is processed.<\/p>\n\n<p><strong>Why this is needed:<\/strong>\nWithout querying the tracker, the plugin has no way to display live seeder and leecher counts. These statistics are the core value of the plugin -- they allow site visitors to see at a glance whether a torrent is well-seeded before downloading it. The scrape protocol is the only standardized, publicly available mechanism for retrieving this data from BitTorrent trackers.<\/p>\n\n<p><strong>Third-party tracker responsibility:<\/strong>\nThe plugin has no control over which trackers are embedded inside <code>.torrent<\/code> files uploaded by site administrators. Each tracker is a third-party service with its own policies. Site administrators are responsible for reviewing the tracker URLs embedded in the torrent files they upload. The plugin only sends the torrent's info hash to each tracker -- it does not send any personal data.<\/p>\n\n\n\n<h4>Summary Table<\/h4>\n\n\n\n\n  Connection\n  Destination\n  Trigger\n  Data Sent\n  Data Received\n  Stored\n\n\n\n\n  HTTP Tracker Scrape\n  Tracker URLs inside .torrent files\n  Upload, WP-Cron every 5 min, manual reload\n  Info hash (hex string)\n  Seeders, leechers, completed (3 integers)\n  Yes \u2014 in plugin database\n\n\n  UDP Tracker Scrape\n  Tracker URLs inside .torrent files\n  Upload, WP-Cron every 5 min, manual reload\n  Info hash (20 raw bytes)\n  Seeders, completed, leechers (3 integers)\n  Yes \u2014 in plugin database\n\n\n\n\n\n\n<h4>Important Notes for Site Owners<\/h4>\n\n<ul>\n<li><strong>No visitor data is ever sent<\/strong> to any external server. Tracker communication happens server-to-server (your web server to the tracker server). Your site visitors' IP addresses, browsing history, identities, and any other personal information are never involved.<\/li>\n<li><strong>No file content is transmitted.<\/strong> Only a mathematical hash (the info hash) is sent to trackers. The actual torrent file, its contents, and any files being shared by the torrent are never sent to tracker servers.<\/li>\n<li><strong>Tracker scraping can be completely disabled.<\/strong> Turn off \"Automatic Scraper (Cron)\" in Settings -- Integrations. Once disabled, the plugin will not contact any tracker server unless an administrator manually clicks the Reload button.<\/li>\n<li><strong>Site administrators control which trackers are queried.<\/strong> The plugin only contacts the tracker URLs embedded inside <code>.torrent<\/code> files that administrators choose to upload. Reviewing those tracker URLs before uploading is the site owner's responsibility.<\/li>\n<\/ul>\n\n<h3>Shortcodes<\/h3>\n\n<ul>\n<li><code>[tsbf_torrent id=\"123\"]<\/code> -- Torrent info card (name, size, file count, stats)<\/li>\n<li><code>[tsbf_torrent_stats id=\"123\"]<\/code> -- Seeder \/ leecher \/ completed badges only<\/li>\n<li><code>[tsbf_torrent_files id=\"123\"]<\/code> -- File count and total size table<\/li>\n<li><code>[tsbf_magnet id=\"123\"]<\/code> -- Magnet link button<\/li>\n<li><code>[tsbf_torrent_list category=\"movies\" limit=\"20\" orderby=\"seeders\"]<\/code> -- Sortable torrent table<\/li>\n<li><code>[tsbf_global_stats]<\/code> -- Network-wide aggregate stats widget<\/li>\n<li><code>[tsbf_user_torrents user_id=\"0\" limit=\"20\"]<\/code> -- Torrents uploaded by a user<\/li>\n<li><code>[tsbf_torrent_browse]<\/code> -- Full browsable torrent listing page<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>torrent-scraper-for-blogs-and-forums<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Visit <strong>Torrent Scraper -- Settings -- System Check<\/strong> to verify your hosting environment meets all requirements.<\/li>\n<li>Configure settings at <strong>Torrent Scraper -- Settings<\/strong>.<\/li>\n<li>Use the <strong>Upload Torrent<\/strong> tab to add your first torrent, or embed one in a post using a shortcode or Gutenberg block.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20require%20any%20external%20api%20keys%20or%20paid%20services%3F\"><h3>Does this plugin require any external API keys or paid services?<\/h3><\/dt>\n<dd><p>No. The plugin uses only the standard BitTorrent tracker scrape protocol, which is a free, open protocol. No API keys, accounts, or paid subscriptions are required.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20work%20without%20wpforo%3F\"><h3>Does this plugin work without wpForo?<\/h3><\/dt>\n<dd><p>Yes. The wpForo integration is fully optional. All core features (torrent upload, shortcodes, Gutenberg blocks, REST API, admin dashboard) work on any standard WordPress site without wpForo installed.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20tracker%20is%20offline%20or%20unreachable%3F\"><h3>What happens if a tracker is offline or unreachable?<\/h3><\/dt>\n<dd><p>The plugin catches connection errors gracefully and skips the failed tracker. Previously stored counts are kept until the tracker becomes available again. No errors are shown to site visitors.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20store%20torrent%20files%20on%20my%20server%3F\"><h3>Does the plugin store torrent files on my server?<\/h3><\/dt>\n<dd><p>Yes. When a .torrent file is uploaded, it is saved to <code>wp-content\/uploads\/torrent-scraper\/<\/code>. Magnet links do not create any files -- only metadata is stored in the database.<\/p><\/dd>\n<dt id=\"what%20php%20extensions%20are%20required%3F\"><h3>What PHP extensions are required?<\/h3><\/dt>\n<dd><p>The <code>sockets<\/code> extension is required for UDP tracker scraping. The <code>curl<\/code> extension is required for HTTP tracker scraping. The <code>mbstring<\/code> extension is required for Bencode decoding of torrent metadata. The <code>fileinfo<\/code> extension is required for secure MIME type validation during file uploads. All can be verified via the built-in System Check page.<\/p><\/dd>\n<dt id=\"what%20data%20does%20the%20plugin%20store%20in%20the%20wordpress%20database%3F\"><h3>What data does the plugin store in the WordPress database?<\/h3><\/dt>\n<dd><p>The plugin creates its own tables (prefixed with <code>{wordpress_prefix}tsbf_<\/code>) to store: torrent metadata (name, size, info hash, file list), tracker URLs, scrape statistics (seeders, leechers, completed counts with timestamps), categories, log entries, and post\/topic associations. No visitor personal data is stored in these tables.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20tracker%20scraping%20entirely%3F\"><h3>Can I disable tracker scraping entirely?<\/h3><\/dt>\n<dd><p>Yes. Go to Torrent Scraper -- Settings -- Integrations and disable \"Automatic Scraper (Cron)\". The plugin will stop its scheduled background scraping. Note that without periodic scraping, the seeder\/leecher counts displayed on your site will become stale.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Torrent file upload and magnet link submission.<\/li>\n<li>Live seeder\/leecher\/completed stats via HTTP and UDP tracker scraping (BEP 15).<\/li>\n<li>WP-Cron scheduled background scraping (every 5 minutes).<\/li>\n<li>4 Gutenberg blocks: Torrent Info, Tracker Stats, Torrent Files, Magnet Button.<\/li>\n<li>8 shortcodes: [tsbf_torrent], [tsbf_torrent_stats], [tsbf_torrent_files], [tsbf_magnet], [tsbf_torrent_list], [tsbf_global_stats], [tsbf_user_torrents], [tsbf_torrent_browse].<\/li>\n<li>REST API at \/wp-json\/tsbf\/v1\/ with pagination, filtering, and rate limiting.<\/li>\n<li>wpForo forum integration (optional).<\/li>\n<li>Admin dashboard with torrent management, categories, settings, and system health check.<\/li>\n<\/ul>","raw_excerpt":"Publish torrent files and magnet links with live seeder\/leecher stats inside blog posts and wpForo forum topics.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/330845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=330845"}],"author":[{"embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rockydev8193"}],"wp:attachment":[{"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=330845"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=330845"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=330845"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=330845"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=330845"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lin.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=330845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}