Gestion download au travers de premiumizeme
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
5.1 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. <?php
  2. class Download {
  3. public $_id;
  4. public $timestamp;
  5. public $premURL;
  6. public $filename;
  7. public $cstate;
  8. /**
  9. * Retourne les infos sur le prochain fichier a telecharger
  10. *
  11. * @return Download Instance du fichier a dl
  12. */
  13. static function findNextJob()
  14. {
  15. $db = DbMongo::get();
  16. $coll = $db->download;
  17. $dbRet = $coll->findOne(
  18. ['cstate' => 'added']
  19. );
  20. $myDownload = new Download();
  21. $myDownload->db2Inst($dbRet);
  22. $myDownload->addEvent([
  23. 'timestamp' => time(),
  24. 'state' => 'downloading'
  25. ]);
  26. return $myDownload;
  27. }
  28. static function addDownload($url)
  29. {
  30. $premInfos = PremiumizeMe::getLink($url);
  31. $myTime = time();
  32. $myDownload = new Download();
  33. $db = DbMongo::get();
  34. $coll = $db->download;
  35. $values = [
  36. '_id' => new MongoId(),
  37. 'timestamp' => $myTime,
  38. 'premURL' => $premInfos['location'],
  39. 'filename' => $premInfos['filename'],
  40. 'cstate' => 'added'
  41. ];
  42. // TODO : verifier le retour
  43. $coll->insert($values);
  44. $myDownload->db2Inst($values);
  45. $myDownload->addEvent([
  46. 'timestamp' => $myTime,
  47. 'ip' => $_SERVER['REMOTE_ADDR'],
  48. 'url' => $url,
  49. 'state' => 'added'
  50. ]);
  51. return $myDownload;
  52. }
  53. private function db2Inst($dbRet)
  54. {
  55. $this->_id = $dbRet['_id'];
  56. $this->timestamp = $dbRet['timestamp'];
  57. $this->premURL = $dbRet['premURL'];
  58. $this->filename = $dbRet['filename'];
  59. $this->cstate = $dbRet['cstate'];
  60. }
  61. private function addEvent($event)
  62. {
  63. $db = DbMongo::get();
  64. $coll = $db->download;
  65. $dbRet = $coll->update(
  66. ['_id' => $this->_id],
  67. ['$push' => ['event' => $event]]
  68. );
  69. }
  70. /**
  71. * Telecharge le fichier
  72. *
  73. * @return array Informations sur le transfert
  74. */
  75. public function get() {
  76. // TODO : tester si fichier existant (temp et definitif)
  77. set_time_limit(0);
  78. if (file_exists(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$this->filename) || file_exists(DOWNLOADEDDIR.DIRECTORY_SEPARATOR.$this->filename)) {
  79. echo 'le fichier existe deja, exit';
  80. exit();
  81. }
  82. $fp = fopen(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$this->filename, 'w+');
  83. $ch = curl_init($this->premURL);
  84. curl_setopt($ch, CURLOPT_FILE, $fp);
  85. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  86. curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  87. curl_exec($ch);
  88. $retour = curl_getinfo($ch);
  89. curl_close($ch);
  90. fclose($fp);
  91. rename(DOWNLOADINGDIR.DIRECTORY_SEPARATOR.$this->filename, DOWNLOADEDDIR.DIRECTORY_SEPARATOR.$this->filename);
  92. // TODO : verifier le retour ?
  93. $this->addEvent([
  94. 'timestamp' => time(),
  95. 'state' => 'downloaded',
  96. 'curlinfo' => [
  97. 'http_code' => $retour['http_code'],
  98. 'total_time' => $retour['total_time'],
  99. 'namelookup_time' => $retour['namelookup_time'],
  100. 'connect_time' => $retour['connect_time'],
  101. 'pretransfer_time' => $retour['pretransfer_time'],
  102. 'size_download' => $retour['size_download'],
  103. 'speed_download' => $retour['speed_download'],
  104. 'starttransfer_time' => $retour['starttransfer_time']
  105. ]
  106. ]);
  107. $db = DbMongo::get();
  108. $coll = $db->download;
  109. $dbRet = $coll->update(
  110. ['_id' => $this->_id],
  111. ['$set' => ['cstate' => 'downloaded']]
  112. );
  113. return $retour;
  114. }
  115. /**
  116. * Retourne si l'on peut lancer un nouveau dl ou si un lock est deja en place
  117. *
  118. * @return bool
  119. */
  120. static function lockOk()
  121. {
  122. if (file_exists(DOWNLOADLOCK)) {
  123. return false;
  124. } else {
  125. return true;
  126. }
  127. }
  128. /**
  129. * Mets en place un lock, si err -> false
  130. *
  131. * @return bool
  132. */
  133. static function putLock()
  134. {
  135. if (!touch(DOWNLOADLOCK)) {
  136. return false;
  137. }
  138. return true;
  139. }
  140. /**
  141. * Supprime le lock
  142. */
  143. static function removeLock()
  144. {
  145. if (!file_exists(DOWNLOADLOCK)) {
  146. echo 'le fichier de lock n\'existe plus !!! exit';
  147. exit();
  148. }
  149. if (!unlink(DOWNLOADLOCK)) {
  150. echo 'impossible de supprimer le fichier de lock !!! exit';
  151. exit();
  152. }
  153. }
  154. /**
  155. * Lance le telechargement du prochain fichier a dl
  156. */
  157. static function launchNextDownload()
  158. {
  159. if (!self::lockOk()) {
  160. echo json_encode('deja lock');
  161. exit();
  162. }
  163. if (!self::putLock()) {
  164. echo json_encode('putlock err');
  165. exit();
  166. }
  167. echo json_encode('Ok');
  168. fastcgi_finish_request();
  169. $toDownload = self::findNextJob();
  170. $toDownload->get();
  171. self::removeLock();
  172. }
  173. }