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