forked from seblucas/cops
-
Notifications
You must be signed in to change notification settings - Fork 1
/
epubfs.php
84 lines (71 loc) · 2.25 KB
/
epubfs.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
/**
* COPS (Calibre OPDS PHP Server) class file
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Sébastien Lucas <[email protected]>
*/
require 'config.php';
require 'base.php';
function getComponentContent($book, $component, $add)
{
$data = $book->component($component);
$callback = function($m) use ($book, $component, $add) {
$method = $m[1];
$path = $m[2];
$end = '';
if (preg_match('/^src\s*:/', $method)) {
$end = ')';
}
if (preg_match('/^#/', $path)) {
return $method . "'" . $path . "'" . $end;
}
$hash = '';
if (preg_match('/^(.+)#(.+)$/', $path, $matches)) {
$path = $matches[1];
$hash = '#' . $matches[2];
}
$comp = $book->getComponentName($component, $path);
if (!$comp) {
return $method . "'#'" . $end;
}
$out = $method . "'epubfs.php?" . $add . 'comp=' . $comp . $hash . "'" . $end;
if ($end) {
return $out;
}
return str_replace('&', '&', $out);
};
$data = preg_replace_callback("/(src=)[\"']([^:]*?)[\"']/", $callback, $data);
$data = preg_replace_callback("/(href=)[\"']([^:]*?)[\"']/", $callback, $data);
$data = preg_replace_callback("/(\@import\s+)[\"'](.*?)[\"'];/", $callback, $data);
$data = preg_replace_callback('/(src\s*:\s*url\()(.*?)\)/', $callback, $data);
return $data;
}
if (php_sapi_name() === 'cli') {
return;
}
$idData = getURLParam('data', NULL);
$add = 'data=' . $idData . '&';
if (!is_null(GetUrlParam(DB))) {
$add .= DB . '=' . GetUrlParam(DB) . '&';
}
$myBook = Book::getBookByDataId($idData);
$book = new EPub($myBook->getFilePath('EPUB', $idData));
$book->initSpineComponent();
if (!isset($_GET['comp'])) {
notFound();
return;
}
$component = $_GET['comp'];
try {
$data = getComponentContent($book, $component, $add);
$expires = 60*60*24*14;
header('Pragma: public');
header('Cache-Control: maxage='.$expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
header ('Content-Type: ' . $book->componentContentType($component));
echo $data;
} catch (Exception $e) {
error_log($e);
notFound();
}