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