|
|
@ -7,6 +7,7 @@ require_once __DIR__ . '/../../../plugins/Parsedown.php'; |
|
|
|
require_once __DIR__ . '/../../../plugins/Common.php'; |
|
|
|
require_once __DIR__ . '/../../../plugins/Common.php'; |
|
|
|
|
|
|
|
|
|
|
|
Class CommandController extends Controller { |
|
|
|
Class CommandController extends Controller { |
|
|
|
|
|
|
|
protected $logPrefix = '[MainBot]'; |
|
|
|
|
|
|
|
|
|
|
|
public function actionIndex() { |
|
|
|
public function actionIndex() { |
|
|
|
$commands = <<<eof |
|
|
|
$commands = <<<eof |
|
|
@ -100,7 +101,7 @@ eof; |
|
|
|
//服务器端机器人程序,负责图片、视频文件拍摄时间等信息扫描,并缓存结果供前端使用 |
|
|
|
//服务器端机器人程序,负责图片、视频文件拍摄时间等信息扫描,并缓存结果供前端使用 |
|
|
|
public function actionMainBot() { |
|
|
|
public function actionMainBot() { |
|
|
|
$thisTime = date('Y-m-d H:i:s'); |
|
|
|
$thisTime = date('Y-m-d H:i:s'); |
|
|
|
$botLogPrefix = '[MainBot]'; |
|
|
|
$botLogPrefix = $this->logPrefix; |
|
|
|
echo "{$botLogPrefix} Main bot started @{$thisTime}\n"; |
|
|
|
echo "{$botLogPrefix} Main bot started @{$thisTime}\n"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -120,6 +121,9 @@ eof; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//扫描媒体文件:图片、视频、音乐 |
|
|
|
|
|
|
|
//TODO: 把它们按年份、月份归类,并缓存到/runtime/cache/目录,方便前端展示读取 |
|
|
|
|
|
|
|
//把当前扫描进度保存到单独的缓存文件,便于用户随时获取 |
|
|
|
protected function scanMediaFiles($dirpath = '') { |
|
|
|
protected function scanMediaFiles($dirpath = '') { |
|
|
|
$rootDir = __DIR__ . '/../../../www/' . FSC::$app['config']['content_directory']; |
|
|
|
$rootDir = __DIR__ . '/../../../www/' . FSC::$app['config']['content_directory']; |
|
|
|
if (empty($dirpath)) { |
|
|
|
if (empty($dirpath)) { |
|
|
@ -140,10 +144,13 @@ eof; |
|
|
|
$supportedImageExts = FSC::$app['config']['supportedImageExts']; |
|
|
|
$supportedImageExts = FSC::$app['config']['supportedImageExts']; |
|
|
|
$supportedVideoExts = FSC::$app['config']['supportedVideoExts']; |
|
|
|
$supportedVideoExts = FSC::$app['config']['supportedVideoExts']; |
|
|
|
$supportedAudioExts = FSC::$app['config']['supportedAudioExts']; |
|
|
|
$supportedAudioExts = FSC::$app['config']['supportedAudioExts']; |
|
|
|
|
|
|
|
|
|
|
|
$cacheKey = 'MainBotScanedDirs'; |
|
|
|
$cacheKey = 'MainBotScanedDirs'; |
|
|
|
|
|
|
|
|
|
|
|
if (!empty($scanResults)) { |
|
|
|
if (!empty($scanResults)) { |
|
|
|
|
|
|
|
$scanIndex = 0; |
|
|
|
|
|
|
|
$scanTotal = count($scanResults); |
|
|
|
|
|
|
|
|
|
|
|
foreach ($scanResults as $id => $item) { |
|
|
|
foreach ($scanResults as $id => $item) { |
|
|
|
$hadScanedDirs = Common::getCache($cacheKey); |
|
|
|
$hadScanedDirs = Common::getCache($cacheKey); |
|
|
|
|
|
|
|
|
|
|
@ -153,22 +160,77 @@ eof; |
|
|
|
&& in_array($item['extension'], $supportedImageExts) |
|
|
|
&& in_array($item['extension'], $supportedImageExts) |
|
|
|
&& !in_array($item['extension'], $scanner->exifSupportFileExtensions) |
|
|
|
&& !in_array($item['extension'], $scanner->exifSupportFileExtensions) |
|
|
|
) { |
|
|
|
) { |
|
|
|
echo "Image file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n"; |
|
|
|
//echo "Image file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n"; |
|
|
|
}else if ( |
|
|
|
}else if ( |
|
|
|
!empty($item['filename']) |
|
|
|
!empty($item['filename']) |
|
|
|
&& empty($item['original_ctime']) |
|
|
|
&& empty($item['original_ctime']) |
|
|
|
&& (in_array($item['extension'], $supportedVideoExts) || in_array($item['extension'], $supportedAudioExts)) |
|
|
|
&& (in_array($item['extension'], $supportedVideoExts) || in_array($item['extension'], $supportedAudioExts)) |
|
|
|
) { |
|
|
|
) { |
|
|
|
echo "Video or audio file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n"; |
|
|
|
//echo "Video or audio file no original_ctime: {$item['filename']}.{$item['extension']}, {$item['realpath']}\n"; |
|
|
|
}else if (!empty($item['directory']) && empty($hadScanedDirs[$id])) { //if it's directory |
|
|
|
}else if (!empty($item['directory']) && empty($hadScanedDirs[$id])) { //if it's directory |
|
|
|
$hadScanedDirs[$id] = true; |
|
|
|
$hadScanedDirs[$id] = true; |
|
|
|
Common::setCache($cacheKey, $hadScanedDirs); |
|
|
|
Common::setCache($cacheKey, $hadScanedDirs); |
|
|
|
|
|
|
|
|
|
|
|
sleep(1); |
|
|
|
//sleep(1); |
|
|
|
$this->scanMediaFiles($item['realpath']); |
|
|
|
$this->scanMediaFiles($item['realpath']); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$scanIndex ++; |
|
|
|
|
|
|
|
$stats = $this->updateScanStats($dirpath, $scanTotal, $scanIndex); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sleep(1); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//更新扫描进度 |
|
|
|
|
|
|
|
protected function updateScanStats($dirpath, $total, $index) { |
|
|
|
|
|
|
|
if (empty($total)) {return false;} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$stats = array( |
|
|
|
|
|
|
|
'currentDir' => $dirpath, |
|
|
|
|
|
|
|
'total' => $total, |
|
|
|
|
|
|
|
'current' => $index, |
|
|
|
|
|
|
|
'percent' => round($index/$total, 2) * 100, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$botLogPrefix = $this->logPrefix; |
|
|
|
|
|
|
|
$cacheDir = __DIR__ . '/../../../runtime/cache/'; |
|
|
|
|
|
|
|
$statsFile = "{$cacheDir}stats_scan.json"; |
|
|
|
|
|
|
|
if (!is_dir($cacheDir)) { |
|
|
|
|
|
|
|
mkdir($cacheDir, 0777, true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$rootDir = __DIR__ . '/../../../www/' . FSC::$app['config']['content_directory']; |
|
|
|
|
|
|
|
if ($dirpath == $rootDir) { |
|
|
|
|
|
|
|
echo "{$botLogPrefix} {$dirpath} scan has finished {$stats['percent']}%, total {$stats['total']}, current {$stats['current']}\n"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//保存进度文件 |
|
|
|
|
|
|
|
file_put_contents($statsFile, json_encode($stats) . "\n"); |
|
|
|
|
|
|
|
}else if (file_exists($statsFile)) { //更新当前扫描目录 |
|
|
|
|
|
|
|
$json = file_get_contents($statsFile); |
|
|
|
|
|
|
|
if (!empty($json)) { |
|
|
|
|
|
|
|
$jsonData = json_decode(trim($json), true); |
|
|
|
|
|
|
|
if ($jsonData['currentDir'] != $dirpath) { |
|
|
|
|
|
|
|
$jsonData['currentDir'] = $dirpath; |
|
|
|
|
|
|
|
$json = json_encode($jsonData) . "\n"; |
|
|
|
|
|
|
|
file_put_contents($statsFile, $json); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return $stats; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function actionTest() { |
|
|
|
|
|
|
|
$cacheKey = 'TestSTData'; |
|
|
|
|
|
|
|
$time = Common::getCache($cacheKey); |
|
|
|
|
|
|
|
if (empty($time)) { |
|
|
|
|
|
|
|
$time = date('Y-m-d H:i:s'); |
|
|
|
|
|
|
|
Common::setCache($cacheKey, $time); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo "Cache time {$time}\n"; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|