Subversion Repositories yt_downloader

Rev

Rev 14 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. // ViaThinkSoft YouTube Downloader Util 2.3
  4. // Revision: 2022-02-07
  5. // Author: Daniel Marschall <www.daniel-marschall.de>
  6. // Licensed under the terms of the Apache 2.0 License
  7.  
  8. function cs_get_checksumfilename($file, $type='sfv') {
  9.         $dir = dirname($file);
  10.         $files = preg_grep('/\.'.preg_quote($type,'/').'$/i', glob($dir.'/*'));
  11.  
  12.         if (count($files) > 0) {
  13.                 $cs_file = array_pop($files);
  14.         } else {
  15.                 $cs_file = $dir.'/'.basename(dirname($file)).'.'.$type;
  16.         }
  17.         return $cs_file;
  18. }
  19.  
  20. function cs_add_automatically($file, $type='sfv') {
  21.         $type = strtolower($type);
  22.         $cs_file = cs_get_checksumfilename($file, $type);
  23.         // echo "Checksum file: $cs_file\n";
  24.         if ($type == 'sfv') {
  25.                 if (file_exists($cs_file)) {
  26.                         $files = sfv_get_files($cs_file);
  27.                         if (in_arrayi(basename($file), $files)) return true;
  28.                 } else {
  29.                         file_put_contents($cs_file, "; Generated by ViaThinkSoft\r\n"); // TODO: BOM
  30.                         $files = array();
  31.                 }
  32.                 $hash = crc32_file($file);
  33.                 if ($hash === false) {
  34.                         fwrite(STDERR, "Cannot calculate hash of file '$file'\n");
  35.                         return false;
  36.                 }
  37.                 $crc32 = strtoupper($hash);
  38.                 file_put_contents($cs_file, basename($file)." $crc32\r\n", FILE_APPEND);
  39.                 return true;
  40.         }
  41.         else if ($type == 'md5') {
  42.                 if (file_exists($cs_file)) {
  43.                         $files = md5_get_files($cs_file);
  44.                         if (in_arrayi(basename($file), $files)) return true;
  45.                 } else {
  46.                         file_put_contents($cs_file, "; Generated by ViaThinkSoft\r\n"); // TODO: BOM
  47.                         $files = array();
  48.                 }
  49.                 $hash = md5_file($file);
  50.                 if ($hash === false) {
  51.                         fwrite(STDERR, "Cannot calculate hash of file '$file'\n");
  52.                         return false;
  53.                 }
  54.                 $md5 = strtolower($hash);
  55.                 file_put_contents($cs_file, "$md5 *".basename($file)."\r\n", FILE_APPEND);
  56.                 return true;
  57.         }
  58.         else if ($type == 'none') {
  59.                 return true;
  60.         }
  61.         else {
  62.                 fwrite(STDERR, "Unknown checksum type '$type'. Must be SFV, MD5 or None\n");
  63.                 return false;
  64.         }
  65. }
  66.  
  67. function md5_get_files($filename) {
  68.         // Source: https://github.com/danielmarschall/checksum-tools/blob/master/PHP/md5_generate.php
  69.         $out = array();
  70.         $lines = file($filename);
  71.         foreach ($lines as $line) {
  72.                 $line = str_replace("\xEF\xBB\xBF",'',$line);
  73.                 $line = trim($line);
  74.                 if ($line == '') continue;
  75.                 $line = str_replace('*', ' ', $line);
  76.                 $line = str_replace("\t", ' ', $line);
  77.                 list($checksum, $origname) = explode(' ', $line, 2);
  78.                 $origname = dirname($filename) . '/' . trim($origname);
  79.                 $checksum = trim($checksum);
  80.                 $out[] = $origname;
  81.         }
  82.  
  83.         return $out;
  84. }
  85.  
  86. function sfv_get_files($filename) {
  87.         // Source: https://github.com/danielmarschall/checksum-tools/blob/master/PHP/sfv_generate.php
  88.         $out = array();
  89.         $lines = file($filename);
  90.         foreach ($lines as $line) {
  91.                 $line = rtrim($line);
  92.                 if ($line == '') continue;
  93.                 if (substr($line,0,1) == ';') continue;
  94.                 $out[] = substr($line, 0, strrpos($line, ' '));
  95.  
  96.         }
  97.         return $out;
  98. }
  99.  
  100. function swapEndianness($hex) {
  101.         // Source: https://github.com/danielmarschall/checksum-tools/blob/master/PHP/sfv_generate.php
  102.         return implode('', array_reverse(str_split($hex, 2)));
  103. }
  104.  
  105. function crc32_file($filename, $rawOutput = false) {
  106.         // Source: https://github.com/danielmarschall/checksum-tools/blob/master/PHP/sfv_generate.php
  107.         $hash = hash_file('crc32b', $filename, true);
  108.         if ($hash === false) return false;
  109.         $out = bin2hex($hash);
  110.         if (hash('crc32b', 'TEST') == 'b893eaee') {
  111.                 // hash_file() in PHP 5.2 has the wrong Endianess!
  112.                 // https://bugs.php.net/bug.php?id=47467
  113.                 $out = swapEndianness($out);
  114.         }
  115.         return $out;
  116. }
  117.  
  118. function in_arrayi($needle, $haystack) {
  119.         // Source: https://www.php.net/manual/en/function.in-array.php#89256
  120.         return in_array(strtolower($needle), array_map('strtolower', $haystack));
  121. }
  122.