Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace App\Http\Controllers;
- use App\Models\Release;
- use App\Models\User;
- use App\Models\UserDownload;
- use App\Models\UsersRelease;
- use Blacklight\NZB;
- use Blacklight\utility\Utility;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\File;
- class GetNzbController extends BasePageController
- {
- /**
- * @throws \Exception
- */
- public function getNzb(Request $request)
- {
- $this->setPreferences();
- // User validation (logged in or RSS token)
- if ($request->user()) {
- $uid = $this->userdata->id;
- $maxDownloads = $this->userdata->role->downloadrequests;
- $rssToken = $this->userdata->api_token;
- if ($this->userdata->hasRole('Disabled')) {
- return Utility::showApiError(101);
- }
- } else {
- if ($request->missing('r')) {
- return Utility::showApiError(200);
- }
- $res = User::getByRssToken($request->input('r'));
- if (!$res) {
- return Utility::showApiError(100);
- }
- $uid = $res['id'];
- $rssToken = $res['api_token'];
- $maxDownloads = $res->role->downloadrequests;
- if ($res->hasRole('Disabled')) {
- return Utility::showApiError(101);
- }
- }
- // Check user download limits
- $requests = UserDownload::getDownloadRequests($uid);
- if ($requests >= $maxDownloads) {
- return Utility::showApiError(501);
- }
- // Validate release ID
- $releaseId = $request->input('id');
- if (!$releaseId) {
- return Utility::showApiError(200, 'Parameter id is required');
- }
- // Clean up the release ID (remove ".nzb" suffix)
- $releaseId = str_ireplace('.nzb', '', $releaseId);
- // Handle ZIP downloads
- if ($request->has('zip') && $request->input('zip') === '1') {
- $guids = explode(',', $releaseId);
- if ($requests + count($guids) > $maxDownloads) {
- return Utility::showApiError(501);
- }
- $zip = getStreamingZip($guids);
- if ($zip !== '') {
- User::incrementGrabs($uid, count($guids));
- foreach ($guids as $guid) {
- Release::updateGrab($guid);
- UserDownload::addDownloadRequest($uid, $guid);
- if ($request->has('del') && (int)$request->input('del') === 1) {
- UsersRelease::delCartByUserAndRelease($guid, $uid);
- }
- }
- return $zip;
- }
- return response()->json(['message' => 'Unable to create .zip file'], 404);
- }
- // Get NZB file path
- $nzbPath = (new NZB())->getNZBPath($releaseId);
- if (!$nzbPath || !File::exists($nzbPath)) {
- return Utility::showApiError(300, 'NZB file not found!');
- }
- // Fetch release details
- $relData = Release::getByGuid($releaseId);
- if (!$relData) {
- return Utility::showApiError(300, 'Release not found!');
- }
- // Update release and user activity
- Release::updateGrab($releaseId);
- UserDownload::addDownloadRequest($uid, $relData['id']);
- User::incrementGrabs($uid);
- if ($request->has('del') && (int)$request->input('del') === 1) {
- UsersRelease::delCartByUserAndRelease($releaseId, $uid);
- }
- // Generate a clean filename
- $cleanName = str_replace([',', ' ', '/', '\\'], '_', $relData['searchname']);
- // Add metadata headers
- $headers = [
- 'Content-Type' => 'application/x-nzb',
- 'Expires' => date('r', now()->addDays(365)->timestamp),
- 'X-DNZB-Failure' => url('/') . '/failed?guid=' . $releaseId . '&userid=' . $uid . '&api_token=' . $rssToken,
- 'X-DNZB-Category' => $relData['category_name'],
- 'X-DNZB-Details' => url('/') . '/details/' . $releaseId,
- ];
- if (!empty($relData['imdbid']) && $relData['imdbid'] > 0) {
- $headers['X-DNZB-MoreInfo'] = 'http://www.imdb.com/title/tt' . $relData['imdbid'];
- } elseif (!empty($relData['tvdb']) && $relData['tvdb'] > 0) {
- $headers['X-DNZB-MoreInfo'] = 'http://www.thetvdb.com/?tab=series&id=' . $relData['tvdb'];
- }
- if ((int)$relData['nfostatus'] === 1) {
- $headers['X-DNZB-NFO'] = url('/') . '/nfo/' . $releaseId;
- }
- // Stream the decompressed NZB file
- return response()->streamDownload(function () use ($nzbPath) {
- $tempFile = sys_get_temp_dir() . '/' . uniqid('nzb_', true) . '.nzb';
- $gzFile = gzopen($nzbPath, 'rb');
- if (!$gzFile) {
- throw new \Exception('Failed to open compressed NZB file: ' . $nzbPath);
- }
- $outFile = fopen($tempFile, 'wb');
- while (!gzeof($gzFile)) {
- fwrite($outFile, gzread($gzFile, 4096));
- }
- gzclose($gzFile);
- fclose($outFile);
- readfile($tempFile);
- unlink($tempFile);
- }, $cleanName . '.nzb', $headers);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement