Advertisement
DaRealNG

Untitled

Nov 27th, 2024
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.84 KB | None | 0 0
  1. <?php
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. use App\Models\Release;
  6. use App\Models\User;
  7. use App\Models\UserDownload;
  8. use App\Models\UsersRelease;
  9. use Blacklight\NZB;
  10. use Blacklight\utility\Utility;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\File;
  13.  
  14. class GetNzbController extends BasePageController
  15. {
  16. /**
  17. * @throws \Exception
  18. */
  19.  
  20. public function getNzb(Request $request)
  21. {
  22. $this->setPreferences();
  23.  
  24. // User validation (logged in or RSS token)
  25. if ($request->user()) {
  26. $uid = $this->userdata->id;
  27. $maxDownloads = $this->userdata->role->downloadrequests;
  28. $rssToken = $this->userdata->api_token;
  29. if ($this->userdata->hasRole('Disabled')) {
  30. return Utility::showApiError(101);
  31. }
  32. } else {
  33. if ($request->missing('r')) {
  34. return Utility::showApiError(200);
  35. }
  36.  
  37. $res = User::getByRssToken($request->input('r'));
  38. if (!$res) {
  39. return Utility::showApiError(100);
  40. }
  41.  
  42. $uid = $res['id'];
  43. $rssToken = $res['api_token'];
  44. $maxDownloads = $res->role->downloadrequests;
  45. if ($res->hasRole('Disabled')) {
  46. return Utility::showApiError(101);
  47. }
  48. }
  49.  
  50. // Check user download limits
  51. $requests = UserDownload::getDownloadRequests($uid);
  52. if ($requests >= $maxDownloads) {
  53. return Utility::showApiError(501);
  54. }
  55.  
  56. // Validate release ID
  57. $releaseId = $request->input('id');
  58. if (!$releaseId) {
  59. return Utility::showApiError(200, 'Parameter id is required');
  60. }
  61.  
  62. // Clean up the release ID (remove ".nzb" suffix)
  63. $releaseId = str_ireplace('.nzb', '', $releaseId);
  64.  
  65. // Handle ZIP downloads
  66. if ($request->has('zip') && $request->input('zip') === '1') {
  67. $guids = explode(',', $releaseId);
  68. if ($requests + count($guids) > $maxDownloads) {
  69. return Utility::showApiError(501);
  70. }
  71.  
  72. $zip = getStreamingZip($guids);
  73. if ($zip !== '') {
  74. User::incrementGrabs($uid, count($guids));
  75. foreach ($guids as $guid) {
  76. Release::updateGrab($guid);
  77. UserDownload::addDownloadRequest($uid, $guid);
  78.  
  79. if ($request->has('del') && (int)$request->input('del') === 1) {
  80. UsersRelease::delCartByUserAndRelease($guid, $uid);
  81. }
  82. }
  83.  
  84. return $zip;
  85. }
  86.  
  87. return response()->json(['message' => 'Unable to create .zip file'], 404);
  88. }
  89.  
  90. // Get NZB file path
  91. $nzbPath = (new NZB())->getNZBPath($releaseId);
  92. if (!$nzbPath || !File::exists($nzbPath)) {
  93. return Utility::showApiError(300, 'NZB file not found!');
  94. }
  95.  
  96. // Fetch release details
  97. $relData = Release::getByGuid($releaseId);
  98. if (!$relData) {
  99. return Utility::showApiError(300, 'Release not found!');
  100. }
  101.  
  102. // Update release and user activity
  103. Release::updateGrab($releaseId);
  104. UserDownload::addDownloadRequest($uid, $relData['id']);
  105. User::incrementGrabs($uid);
  106.  
  107. if ($request->has('del') && (int)$request->input('del') === 1) {
  108. UsersRelease::delCartByUserAndRelease($releaseId, $uid);
  109. }
  110.  
  111. // Generate a clean filename
  112. $cleanName = str_replace([',', ' ', '/', '\\'], '_', $relData['searchname']);
  113.  
  114. // Add metadata headers
  115. $headers = [
  116. 'Content-Type' => 'application/x-nzb',
  117. 'Expires' => date('r', now()->addDays(365)->timestamp),
  118. 'X-DNZB-Failure' => url('/') . '/failed?guid=' . $releaseId . '&userid=' . $uid . '&api_token=' . $rssToken,
  119. 'X-DNZB-Category' => $relData['category_name'],
  120. 'X-DNZB-Details' => url('/') . '/details/' . $releaseId,
  121. ];
  122.  
  123. if (!empty($relData['imdbid']) && $relData['imdbid'] > 0) {
  124. $headers['X-DNZB-MoreInfo'] = 'http://www.imdb.com/title/tt' . $relData['imdbid'];
  125. } elseif (!empty($relData['tvdb']) && $relData['tvdb'] > 0) {
  126. $headers['X-DNZB-MoreInfo'] = 'http://www.thetvdb.com/?tab=series&id=' . $relData['tvdb'];
  127. }
  128.  
  129. if ((int)$relData['nfostatus'] === 1) {
  130. $headers['X-DNZB-NFO'] = url('/') . '/nfo/' . $releaseId;
  131. }
  132.  
  133. // Stream the decompressed NZB file
  134. return response()->streamDownload(function () use ($nzbPath) {
  135. $tempFile = sys_get_temp_dir() . '/' . uniqid('nzb_', true) . '.nzb';
  136. $gzFile = gzopen($nzbPath, 'rb');
  137. if (!$gzFile) {
  138. throw new \Exception('Failed to open compressed NZB file: ' . $nzbPath);
  139. }
  140.  
  141. $outFile = fopen($tempFile, 'wb');
  142. while (!gzeof($gzFile)) {
  143. fwrite($outFile, gzread($gzFile, 4096));
  144. }
  145.  
  146. gzclose($gzFile);
  147. fclose($outFile);
  148.  
  149. readfile($tempFile);
  150. unlink($tempFile);
  151. }, $cleanName . '.nzb', $headers);
  152. }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement