You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

317 lines
11 KiB

<?php
namespace App\Services;
use DateTime;
use App\Services\QueuedFfmpegService;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
class FileService {
private $queuedFfmpegService;
public function __construct() {
$this->queuedFfmpegService = new QueuedFfmpegService();
}
public function segmentFiles($baseDir)
{
if (!is_dir($baseDir)) {
return;
}
// $files = new Finder();
// $files->files()->in($baseDir);
$files = $this->scan_dir($baseDir);
$firstTime = true;
$counter = 0;
$dirCounter = 0;
$dirName = "";
foreach ($files as $file) {
if ($firstTime) {
$dirName = $baseDir . "/" . date("Y-m-d", filectime($baseDir . "/" . $file)) . "-$dirCounter";
if (!is_dir($dirName)) {
mkdir($dirName);
}
$dirCounter++;
$firstTime = false;
}
rename($baseDir . "/" . $file, $dirName . "/" . $file);
$counter++;
if ($counter % 1000 == 0) {
$firstTime = true;
}
// exit;
}
}
private function scan_dir($dir) {
$ignored = array(".", "..", ".svn", ".htaccess",".DS_Store");
$files = array();
foreach (scandir($dir) as $file) {
if (in_array($file, $ignored)) continue;
$files[$file] = filemtime($dir . '/' . $file);
}
asort($files);
$files = array_keys($files);
return ($files) ? $files : false;
}
public function queryFileTime($file)
{
$mtime = date("Y-m-d H:i:s", filemtime($file));
$atime = date("Y-m-d H:i:s", fileatime($file));
$ctime = date("Y-m-d H:i:s", filectime($file));
echo "file mtime is $mtime, atime is $atime, ctime is $ctime";
}
public function compareLocalFilesAndGooglePhotoFiles() {
// $dir = "/Users/shixuesen/Downloads/y/910283-小清晨儿_";
// $list = scandir($dir);
$baseDir = "/Users/shixuesen/Documents/sync/image";
$dirs = ["腐团儿"];
$files = [];
foreach ($dirs as $dir) {
$currentFiles = scandir($baseDir . DIRECTORY_SEPARATOR . $dir);
foreach ($currentFiles as $file) {
if ($file == "." || $file == ".." || $file == ".DS_Store") {
continue;
}
$files[] = $baseDir . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $file;
}
// $files = array_merge($files, $currentFiles);
}
// $list = array_merge($list, scandir("/Users/shixuesen/Documents/sync/image/weibo04"));
// $list = [];
// $list = array_merge($list, scandir("/Volumes/desktop-81dpan3/pcSync/china_cam/china_cam_001"));
$photoList = [];
// $this->deleteFileListWithDir($photoList, "/Volumes/desktop-81dpan3/pcSync/china_cam/china_cam_001/");
$i = 0;
// $s1 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
// $s2 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
// $s3 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
// $s4 = "ストッキング脚コンパイル_蓮実クレア-MIAD-711-C.mp4";
// $members = Redis::connection()->smembers("ストッキング脚コンパイル");
// dump($members);exit;
// dump($members);exit;
foreach ($files as $item) {
$basename = pathinfo($item, PATHINFO_BASENAME);
// dump($basename);continue;
//
if (Redis::connection()->sismember("腐团儿", $basename) == 0) {
// echo $item . " size is " . filesize($item) / 1024 . "kb\n";
$i++;
if (!str_contains($basename, "baiduyun.uploading.cfg")) {
dump($item);
// rename($item, $baseDir . DIRECTORY_SEPARATOR . "acfun_need" . DIRECTORY_SEPARATOR . $basename);
}
//
}
// else {
// unlink($item);
// }
}
echo "all file num is " . $i;
// dump(array_diff($list, $photoList));
}
public function deleteFilesForExtensions($dir, array $extensions)
{
if (!is_dir($dir)) {
return;
}
$files = scandir($dir);
foreach ($files as $file) {
if (skipDefaultPathAndFile($file)) {
continue;
}
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
if (is_dir($currentItem)) {
$this->deleteFilesForExtensions($currentItem, $extensions);
}
if (is_file($currentItem)) {
$pathInfo = pathinfo($currentItem);
if (in_array($pathInfo["extension"], $extensions)) {
dump("now delete file $currentItem");
unlink($currentItem);
}
}
}
}
public function renameFileExtensionToAnother($dir, $fromExtension, $toExtension)
{
if (!is_dir($dir)) {
return;
}
$files = scandir($dir);
foreach ($files as $file) {
if (skipDefaultPathAndFile($file)) {
continue;
}
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
if (is_dir($currentItem)) {
$this->renameFileExtensionToAnother($currentItem, $fromExtension, $toExtension);
}
if (is_file($currentItem)) {
$pathInfo = pathinfo($currentItem);
if ($pathInfo["extension"] == $fromExtension) {
$newFile = str_replace($fromExtension, $toExtension, $currentItem);
dump("now rename file $currentItem to $newFile");
rename($currentItem, $newFile);
$this->queuedFfmpegService->addToQueue($newFile);
}
}
}
}
public function renameFileAndAddToQueue($file, $fromExtension, $toExtension)
{
if (is_file($file)) {
$pathInfo = pathinfo($file);
if ($pathInfo["extension"] == $fromExtension) {
$newFile = str_replace($fromExtension, $toExtension, $file);
dump("now rename file $file to $newFile");
rename($file, $newFile);
$this->queuedFfmpegService->addToQueue($newFile);
}
}
}
public function copySelectedFilesToMappedDirectory(array $sourceToDestMap)
{
foreach ($sourceToDestMap as $sourceDir => $dest) {
// $lastTime = $this->processDirAndFindLastFileMTime($destDir);
$destDir = $dest[0];
$lastTime = $dest[1];
echo "sourceDir:{$sourceDir}, destDir: {$destDir}, lastTime: {$lastTime} \n";
$lastTime = strtotime("2022-10-10 23:00:00");
$this->deleteFilesInDir($destDir);
$list = $this->queryNewerFilesInDirectory($sourceDir, $lastTime);
$this->copyFileToDest($destDir, $list);
// dump($list);
}
}
public function mvFile($file, $destDirectory): bool
{
return rename($file, $destDirectory . DIRECTORY_SEPARATOR . basename($file));
}
public function queryNewerFilesInDirectory($dir, $lastTime)
{
$list = [];
if (!is_dir($dir)) {
return $list;
}
echo "start scandir $dir\n";
$files = scandir($dir);
// echo "end scandir $dir\n";
foreach ($files as $file) {
if ($file == "." || $file == ".." || $file == ".DS_Store") {
continue;
}
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
if (is_dir($currentItem)) {
$list = array_merge($list, $this->queryNewerFilesInDirectory($currentItem, $lastTime));
} else if (is_file($currentItem)) {
if (filemtime($currentItem) > $lastTime) {
Log::info("now add file $currentItem");
// exit;
$list[] = $currentItem;
}
}
}
return $list;
}
/**
* 找出文件夹里的最新的的文件
* @param $destDir
* @return false|string
*/
public function processDirAndFindLastFileMTime($destDir)
{
$date = new DateTime("last year");
$date = $date->format("Y-m-d H:i:s");
if (!is_dir($destDir)) {
return $date;
}
$files = scandir($destDir);
foreach ($files as $file) {
if ($file == "." || $file == ".." || $file == ".DS_Store") {
continue;
}
$currentItem = implode(DIRECTORY_SEPARATOR, [$destDir, $file]);
if (is_dir($currentItem)) {
$currentTime = $this->processDirAndFindLastFileMTime($currentItem);
} else {
$currentTime = date("Y-m-d H:i:s", filemtime($currentItem));
echo $currentItem . " " . $currentTime . "\n";
}
if (strtotime($currentTime) > strtotime($date)) {
$date = $currentTime;
}
}
return $date;
}
public function deleteFilesInDir($dir)
{
if (!is_dir($dir)) {
return;
}
$files = scandir($dir);
foreach ($files as $file) {
if ($file == "." || $file == ".." || $file == ".DS_Store") {
continue;
}
$currentItem = implode(DIRECTORY_SEPARATOR, [$dir, $file]);
if (is_file($currentItem)) {
unlink($currentItem);
}
}
}
public function deleteFileListWithDir($list, $prefix) {
foreach ($list as $file) {
$file = $prefix . $file;
if (is_file($file)) {
unlink($file);
}
}
}
public function copyFileToDest($destDir, $fileList)
{
$num = count($fileList);
foreach ($fileList as $file) {
// $filePathInfo = pathinfo($file);
// dump($filePathInfo);
// echo pathinfo($file, PATHINFO_BASENAME);
// exit;
$targetFile = $destDir . DIRECTORY_SEPARATOR . pathinfo($file, PATHINFO_BASENAME);
$num--;
if (is_file($targetFile)) {
echo "target file $targetFile exists \n";
continue;
}
copy($file, $targetFile);
echo "{$num} files left\n";
// exit;
// $filePathInfo[PATHINFO_DIRNAME];
}
}
}