Files
cerebellum.neuroinf.jp/etc/dumpSimPFConetnts.php
T

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;
}