232 lines
7.6 KiB
PHP
232 lines
7.6 KiB
PHP
<?php
|
|
|
|
require_once __DIR__.'/common.inc.php';
|
|
|
|
$prefix = $xoopsDB->prefix();
|
|
|
|
$table = 'xoonips_item_basic';
|
|
if (!MyDumpTool::tableExists($table)) {
|
|
exit('xoonips module not found'.PHP_EOL);
|
|
}
|
|
$dllimit = getDLLimitItems();
|
|
|
|
$xoops_url_path = parse_url(XOOPS_URL, PHP_URL_PATH);
|
|
$xoops_url_host = parse_url(XOOPS_URL, PHP_URL_HOST);
|
|
$host = preg_replace('/\..*$/', '', $xoops_url_host);
|
|
is_dir(__DIR__.'/simpf') || mkdir(__DIR__.'/simpf');
|
|
is_dir(__DIR__.'/simpf/'.$host) || mkdir(__DIR__.'/simpf/'.$host);
|
|
|
|
$xconfig_handler = xoonips_getormhandler('xoonips', 'config');
|
|
$fileutil = xoonips_getutility('file');
|
|
$basePath = $xconfig_handler->getValue('upload_dir');
|
|
|
|
// get simpf link data
|
|
$lines = file(__DIR__.'/simpflink2.csv');
|
|
foreach ($lines as $line) {
|
|
list($simpfItemId, $simpfIsPublic, $pfname, $url) = array_map('trim', explode(',', $line));
|
|
if ($pfname === $host) {
|
|
$pUrl = parse_url($url);
|
|
if ($pUrl['path'] != $xoops_url_path.'/modules/xoonips/detail.php') {
|
|
echo 'not xoonips url found in simpf link file. URL:'.$url.PHP_EOL;
|
|
continue;
|
|
}
|
|
if (preg_match('/(?:^|&)(id|item_id)=([^$&]+)/', $pUrl['query'], $matches)) {
|
|
$key = $matches[1];
|
|
$value = $matches[2];
|
|
$itemId = 0;
|
|
if ('item_id' == $key) {
|
|
$itemId = (int) $value;
|
|
} elseif ('id' == $key) {
|
|
$itemId = doi2itemid($value);
|
|
if (0 == $itemId) {
|
|
echo 'failed to lookup item id from doi. DOI:'.$value.PHP_EOL;
|
|
continue;
|
|
}
|
|
}
|
|
$files = getFile($itemId);
|
|
$data = false;
|
|
foreach ($files as $file) {
|
|
if (in_array($file['file_type_name'], ['preview', 'readme', 'rights', 'license'])) {
|
|
continue;
|
|
}
|
|
if (false === $data) {
|
|
$data = $file;
|
|
} else {
|
|
echo 'multiple data file found in item id.:'.$itemId.PHP_EOL;
|
|
}
|
|
}
|
|
$isPublic = isPublicItemId($itemId);
|
|
$isDLLimit = in_array($itemId, $dllimit);
|
|
$url = XOOPS_URL.'/database/file/'.$data['file_id'].'/'.$data['original_file_name'];
|
|
if (!$isPublic || $isDLLimit) {
|
|
$url = 'simpf:'.$host.'/'.$data['file_id'].'/'.$data['original_file_name'];
|
|
$destDir = __DIR__.'/simpf/'.$host.'/'.$data['file_id'];
|
|
$srcFile = $basePath.'/'.$data['file_id'];
|
|
if (!is_dir($destDir)) {
|
|
@mkdir($destDir);
|
|
}
|
|
if (!MyDumpTool::fileCopy($srcFile, $destDir.'/'.$data['original_file_name'])) {
|
|
echo 'failed to copy file: '.$srcFile.PHP_EOL;
|
|
}
|
|
}
|
|
echo sprintf('%s,%s', $simpfItemId, $url).PHP_EOL;
|
|
}
|
|
}
|
|
}
|
|
exit();
|
|
|
|
function isPublicItemId($itemId)
|
|
{
|
|
$db = XoopsDatabaseFactory::getDatabaseConnection();
|
|
$prefix = $db->prefix();
|
|
$sql = <<< SQL
|
|
SELECT
|
|
`ib`.`item_id`
|
|
FROM `${prefix}_xoonips_item_basic` AS `ib`
|
|
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `ib`.`item_id`=`iil`.`item_id`
|
|
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
|
|
WHERE `ib`.`item_id`=$itemId
|
|
AND `iil`.`certify_state`=2
|
|
AND `idx`.`open_level`=1
|
|
GROUP BY `ib`.`item_id`
|
|
SQL;
|
|
if (!($res = $db->query($sql))) {
|
|
var_dump($db);
|
|
exit();
|
|
}
|
|
$items = array();
|
|
$row = $db->fetchArray($res);
|
|
$db->freeRecordSet($res);
|
|
|
|
return is_array($row);
|
|
}
|
|
|
|
function doi2itemid($doi)
|
|
{
|
|
$db = XoopsDatabaseFactory::getDatabaseConnection();
|
|
$prefix = $db->prefix();
|
|
$sql = <<< SQL
|
|
SELECT
|
|
`ib`.`item_id`
|
|
FROM `${prefix}_xoonips_item_basic` AS `ib`
|
|
WHERE `ib`.`doi`='${doi}'
|
|
SQL;
|
|
if (!($res = $db->query($sql))) {
|
|
var_dump($db);
|
|
exit();
|
|
}
|
|
$items = array();
|
|
$row = $db->fetchArray($res);
|
|
$db->freeRecordSet($res);
|
|
|
|
return is_array($row) ? (int) $row['item_id'] : 0;
|
|
}
|
|
|
|
function getDLLimitItems()
|
|
{
|
|
$lines = file(MYDUMPTOOL_OUTPUTDIR.'/dl-limit-items.csv');
|
|
$ret = [];
|
|
foreach ($lines as $line) {
|
|
list($itemId) = explode(',', $line);
|
|
$ret[] = (int) $itemId;
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
// get files
|
|
$xconfig_handler = xoonips_getormhandler('xoonips', 'config');
|
|
$fileutil = xoonips_getutility('file');
|
|
|
|
$basePath = $xconfig_handler->getValue('upload_dir');
|
|
$sql = <<< SQL
|
|
SELECT
|
|
`f`.`file_id`, `f`.`item_id`, `f`.`original_file_name`,
|
|
`ft`.`name` AS `file_type_name`
|
|
FROM `${prefix}_xoonips_file` AS `f`
|
|
INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id`
|
|
INNER JOIN `${prefix}_xoonips_index_item_link` AS `iil` ON `f`.`item_id`=`iil`.`item_id`
|
|
INNER JOIN `${prefix}_xoonips_index` AS `idx` ON `iil`.`index_id`=`idx`.`index_id`
|
|
WHERE `f`.`is_deleted`=0
|
|
AND `ft`.`name` NOT IN('readme' , 'license', 'rights')
|
|
AND `iil`.`certify_state`=2
|
|
AND `idx`.`open_level`=1
|
|
GROUP BY `f`.`file_id`
|
|
ORDER BY `f`.`file_id` ASC
|
|
SQL;
|
|
|
|
if (!($res = $xoopsDB->query($sql))) {
|
|
var_dump($xoopsDB);
|
|
exit();
|
|
}
|
|
$filesDir = MYDUMPTOOL_OUTPUTDIR.'/public/database/file';
|
|
while ($row = $xoopsDB->fetchArray($res)) {
|
|
MyDumpTool::decode($row);
|
|
MyDumpTool::convertToInt($row, array('file_id', 'item_id'));
|
|
$file_id = $row['file_id'];
|
|
$item_id = $row['item_id'];
|
|
$file_name = $row['original_file_name'];
|
|
$file_type = $row['file_type_name'];
|
|
if (in_array($file_id, $limitFiles)) {
|
|
echo "download limit file found.. skip to copy.. item_id:$item_id, file_id:$file_id".PHP_EOL;
|
|
continue;
|
|
}
|
|
$file_dir = $filesDir.'/'.$file_id;
|
|
$src_file = $basePath.'/'.$file_id;
|
|
if (!is_dir($file_dir)) {
|
|
@mkdir($file_dir);
|
|
}
|
|
//if (!file_exists($file_dir.'/'.$file_name)) {
|
|
if (!MyDumpTool::fileCopy($src_file, $file_dir.'/'.$file_name)) {
|
|
echo 'failed to copy file: '.$basePath.'/'.$file_id.PHP_EOL;
|
|
}
|
|
$htaccess = $file_dir.'/.htaccess';
|
|
$xfilename = str_replace(' ', '\\ ', $file_name);
|
|
$data = "RewriteEngine On\nRewriteBase /database/file/$file_id\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteRule .* $xfilename [R=301,L]\n";
|
|
file_put_contents($htaccess, $data);
|
|
//}
|
|
if ('preview' == $file_type) {
|
|
$thumbnail_file = $file_dir.'.png';
|
|
if (!file_exists($thumbnail_file)) {
|
|
$mimetype = $fileutil->get_mimetype($src_file, $file_name);
|
|
$thumbnail = $fileutil->get_thumbnail($src_file, $mimetype);
|
|
if (null !== $thumbnail) {
|
|
file_put_contents($thumbnail_file, $thumbnail);
|
|
} else {
|
|
createThumbnail($src_file, $mimetype, $thumbnail_file);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$xoopsDB->freeRecordSet($res);
|
|
|
|
// functions
|
|
|
|
function getFile($item_id)
|
|
{
|
|
global $xoopsDB;
|
|
$prefix = $xoopsDB->prefix();
|
|
$sql = <<< SQL
|
|
SELECT `f`.`file_id`, `f`.`original_file_name`, `f`.`mime_type`, `f`.`file_size`, `f`.`caption`, `f`.`timestamp`,
|
|
`ft`.`name` AS `file_type_name`, `ft`.`display_name` AS `file_type_display_name`
|
|
FROM `${prefix}_xoonips_file` AS `f`
|
|
INNER JOIN `${prefix}_xoonips_file_type` AS `ft` ON `f`.`file_type_id`=`ft`.`file_type_id`
|
|
WHERE `item_id`=$item_id
|
|
AND `is_deleted`=0
|
|
ORDER BY `ft`.`name` ASC
|
|
SQL;
|
|
if (!($res = $xoopsDB->query($sql))) {
|
|
var_dump($xoopsDB);
|
|
exit();
|
|
}
|
|
$ret = array();
|
|
while ($row = $xoopsDB->fetchArray($res)) {
|
|
MyDumpTool::decode($row);
|
|
MyDumpTool::convertToInt($row, array('file_id', 'file_size'));
|
|
$ret[] = $row;
|
|
}
|
|
$xoopsDB->freeRecordSet($res);
|
|
|
|
return $ret;
|
|
}
|