From 8cae822d9df91ce17f0503f5d2212289ddbc63be Mon Sep 17 00:00:00 2001 From: shixuesen Date: Tue, 4 May 2021 09:02:11 +0800 Subject: [PATCH] add blog code --- .idea/php.xml | 3 + app/Console/Commands/BiliVideoCode.php | 6 +- app/Console/Commands/HandBrakeCommand.php | 2 +- .../Commands/MediaReplaceAndCompress.php | 46 ++++ app/Console/Commands/RenameTest.php | 6 +- app/Console/Commands/ReplaceBlog.php | 45 +++ app/Services/BilibiliServiceV2.php | 6 + app/Services/ReplaceBlogService.php | 37 +++ .../ReplaceCompressedMediaService.php | 120 ++++++++ .../ReplaceCompressedVideoService.php | 26 +- composer.json | 2 + composer.lock | 260 +++++++++++++++++- fail.log | 1 + 13 files changed, 552 insertions(+), 8 deletions(-) create mode 100644 app/Console/Commands/MediaReplaceAndCompress.php create mode 100644 app/Console/Commands/ReplaceBlog.php create mode 100644 app/Services/ReplaceBlogService.php create mode 100644 app/Services/ReplaceCompressedMediaService.php diff --git a/.idea/php.xml b/.idea/php.xml index 9303ec8..3e60f53 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -166,6 +166,9 @@ + + + diff --git a/app/Console/Commands/BiliVideoCode.php b/app/Console/Commands/BiliVideoCode.php index 16ed9ed..eeecaa7 100644 --- a/app/Console/Commands/BiliVideoCode.php +++ b/app/Console/Commands/BiliVideoCode.php @@ -54,10 +54,10 @@ class BiliVideoCode extends Command // $bilibili->queryDBCollectionList(); // exit; - $bilibili->queryForVideoParts(); - $bilibili->compareAndDownloadUpVideos(); +// $bilibili->queryForVideoParts(); + $bilibili->compareAndDownloadUpVideos(true); // exit; - $bilibili->compareAndDownloadCollectionVideos(); + $bilibili->compareAndDownloadCollectionVideos(true); // $bilibili->queryCollectionList(); // $bilibili->compareAndDownloadNewVideos(); // $bilibili->queryLocalUpVideoList(); diff --git a/app/Console/Commands/HandBrakeCommand.php b/app/Console/Commands/HandBrakeCommand.php index 41ecfff..186f1a2 100644 --- a/app/Console/Commands/HandBrakeCommand.php +++ b/app/Console/Commands/HandBrakeCommand.php @@ -41,9 +41,9 @@ class HandBrakeCommand extends Command { // $path = $this->argument("path"); - echo $path; // $service = new HandBrakeService(); $service = new ReplaceCompressedVideoService(); +// $service->checkFileInfo("!⚠前方危险⚠!迷人的反派角色出没!【aespa】【black mamba】 P1 【横屏】.mp4");exit; $service->processDir(trim($path)); // $service->processUnCompleteDir(); } diff --git a/app/Console/Commands/MediaReplaceAndCompress.php b/app/Console/Commands/MediaReplaceAndCompress.php new file mode 100644 index 0000000..e50d402 --- /dev/null +++ b/app/Console/Commands/MediaReplaceAndCompress.php @@ -0,0 +1,46 @@ +argument("path"); + $service = new ReplaceCompressedMediaService(); + $service->processDir(trim($path)); + // + } +} diff --git a/app/Console/Commands/RenameTest.php b/app/Console/Commands/RenameTest.php index c4c5371..db356dd 100644 --- a/app/Console/Commands/RenameTest.php +++ b/app/Console/Commands/RenameTest.php @@ -12,7 +12,7 @@ class RenameTest extends Command * * @var string */ - protected $signature = 'rename:test'; + protected $signature = 'rename:test {path} {prefix}'; /** * The console command description. @@ -39,8 +39,12 @@ class RenameTest extends Command public function handle() { // + $path = $this->argument("path"); + $prefix = $this->argument("prefix"); $rename = new RenameService(); // $rename->rename("/Volumes/WD/tmp/写真图/猫九", "猫九-"); + $rename->rename($path, $prefix); + return; $rename->rename("/Volumes/Backup/images/写真/pcBack/3/", ""); // $rename->rename(); // $rename->mvFiles("/Users/shixuesen/Documents/tmp/秀人旗下《MFStar模范学院》套图及视频写真-TLoB/视频/"); diff --git a/app/Console/Commands/ReplaceBlog.php b/app/Console/Commands/ReplaceBlog.php new file mode 100644 index 0000000..a55242f --- /dev/null +++ b/app/Console/Commands/ReplaceBlog.php @@ -0,0 +1,45 @@ +replaceFrontMatter("/Users/shixuesen/workspace/dev/src/myHugoBlog/content/posts"); + } +} diff --git a/app/Services/BilibiliServiceV2.php b/app/Services/BilibiliServiceV2.php index bc64ab3..3820609 100644 --- a/app/Services/BilibiliServiceV2.php +++ b/app/Services/BilibiliServiceV2.php @@ -947,4 +947,10 @@ done ' ); usleep(10); } } + + public function searchVideoFiles($filename) + { + $list = BilibiliVideos::where("title", "like", "%". trim($filename) ."%" )->get(); + dump($list); + } } diff --git a/app/Services/ReplaceBlogService.php b/app/Services/ReplaceBlogService.php new file mode 100644 index 0000000..1c2a499 --- /dev/null +++ b/app/Services/ReplaceBlogService.php @@ -0,0 +1,37 @@ +matter()); + dump($object->matter('title')); // => 'Example'; +// dump($object->body()); // => 'Lorem ipsum.' + + + dump($object->title); // => 'Example'; +// $document = $parser->parse($path . "/" . $file); + +// $yaml = $document->getYAML(); +// dump($yaml); +// $html = $document->getContent(); +// dump($html); + exit; + } + } + + + } +} diff --git a/app/Services/ReplaceCompressedMediaService.php b/app/Services/ReplaceCompressedMediaService.php new file mode 100644 index 0000000..912057a --- /dev/null +++ b/app/Services/ReplaceCompressedMediaService.php @@ -0,0 +1,120 @@ +factory = new OptimizerFactory([ + "output_filepath_pattern" => "%basename%/%filename%-new%ext%", + "ignore_errors" => false, + "jpegoptim_options" => array('-m85', '-S20%', '--strip-all', '--all-progressive'), +// "jpegtran_options" => array('-m85', '-S30', '-optimize', '-progressive') + ]); + $this->optimizer = $this->factory->get("jpegoptim"); + } + + public function processDir($baseDir = "/Volumes/WD/tmp/bilibili/aoa") + { + $files = scandir($baseDir); + foreach ($files as $file) { + if ($file == "." || $file == ".." || $file == ".DS_Store") { + continue; + } + $subDir = implode("/", [$baseDir, $file]); + $isDir = is_dir($subDir); + if ($isDir) { + $this->processDir($subDir); + } else { + $this->processFiles($subDir); + } + } + } + + public function processFiles($pathFile) + { + $mime = mime_content_type($pathFile); +// dump("file type", [$mime, $pathFile]);exit; +// continue; + + if (strstr($mime, "video/")) { + $this->processVideo($pathFile); + } elseif (strstr($mime, "image/")) { + $this->processImage($pathFile); + } + } + + public function processVideo($pathFile) { + if (is_file($pathFile)) { + $mediaInfo = new MediaInfo(); + $mediaInfo->setConfig('use_oldxml_mediainfo_output_format', true); + $mediaContainer = $mediaInfo->getInfo($pathFile); + foreach ($mediaContainer->getVideos() as $video) { + $height = $video->get('height')->getAbsoluteValue(); + $width = $video->get('width')->getAbsoluteValue(); + if ($height > $width && $width <= 720) { + echo "$pathFile 分辨率小于 720p 跳过\n"; + return; + } + if ($height <= $width && $height <= 720) { + echo "$pathFile 分辨率小于 720p 跳过\n"; + return; + } + + } + $fileInfo = pathinfo($pathFile); + dump("fileInfo", $fileInfo); + if (ends_with($fileInfo["filename"], "-XXXXX#compressed")) { + return; + } + if (starts_with($fileInfo["filename"], "171221 M!CountDown 光州特辑女团现场合集") || starts_with($fileInfo["filename"], "Rainbow - A 现场合集 P14 Rainbow - A + Mach")) { + return; + } + if (Redis::sismember("unneed", $fileInfo["filename"])) { + return; + } + $targetFile = $fileInfo["dirname"] . '/' .$fileInfo["filename"] . '-XXXXX#compressed'. '.' . $fileInfo["extension"]; + if (is_file($targetFile)) { + unlink($pathFile); + rename($targetFile, $pathFile); + return; + } + dump("targetFile", [$targetFile]); +// $result = shell_exec("handBrakeCli -Z 'Very Fast 720p30' -i '". $subPathFile ."' -o '". $targetFile . " && echo 'success'"); + $result = shell_exec("handBrakeCli --json -Z 'Very Fast 720p30' -i '". $pathFile ."' -o '". $targetFile . "'"); +// echo $result; + preg_match_all("#\"State\"\: \"WORKDONE\"#", $result, $match); + if (count($match) > 0) { + echo "compress work done remove the file \n"; + $oldFileSize = filesize($pathFile); + $newFileSize = filesize($targetFile); + if ($newFileSize >= $oldFileSize) { + Redis::sadd("unneed", $fileInfo["filename"]); + echo "old file size is smaller than new one, old is " . file_size($oldFileSize) . " and new is " . file_size($newFileSize) . ", now remove new one"; + unlink($targetFile); + } else { + echo "new file size is smaller than old one, new is " . file_size($newFileSize) . " and old is " . file_size($oldFileSize) . ", now remove old one"; + unlink($pathFile); + rename($targetFile, $pathFile); + } + } + } + } + + public function processImage($pathFile) { + $this->optimizer->optimize($pathFile); + } + + function human_filesize($bytes, $decimals = 2) { + $sz = 'BKMGTP'; + $factor = floor((strlen($bytes) - 1) / 3); + return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor]; + } + +} diff --git a/app/Services/ReplaceCompressedVideoService.php b/app/Services/ReplaceCompressedVideoService.php index 986eb43..e8eb9e2 100644 --- a/app/Services/ReplaceCompressedVideoService.php +++ b/app/Services/ReplaceCompressedVideoService.php @@ -9,6 +9,12 @@ use Mhor\MediaInfo\MediaInfo; class ReplaceCompressedVideoService { + private $bili; + public function __construct() + { + $this->bili = new BilibiliServiceV2(); + } + public function handleVideos($dir = "/Users/shixuesen/Documents/tmp/柚木/2017/泡泡条纹袜/") { $files = scandir($dir); @@ -58,15 +64,19 @@ class ReplaceCompressedVideoService public function processDir($baseDir = "/Volumes/WD/tmp/bilibili/aoa") { $files = scandir($baseDir); - foreach ($files as $file) { + $files = array_slice($files, 3035); + $count = count($files); + dump("all count is $count"); + foreach ($files as $index => $file) { if ($file == "." || $file == ".." || $file == ".DS_Store") { continue; } $subDir = implode("/", [$baseDir, $file]); $isDir = is_dir($subDir); if ($isDir) { - $this->processDir($subDir); +// $this->processDir($subDir); } else { + dump("[all count] is $count, [current index] is $index"); $this->processVideo($subDir); } } @@ -201,4 +211,16 @@ class ReplaceCompressedVideoService } } + public function checkFileInfo($pathFile) + { + preg_match_all("#([\S|\s]+)P\d+#", $pathFile, $match); + if (count($match) > 1 && count($match[1]) > 0) { + $this->bili->searchVideoFiles($match[1][0]); + } + + +// dump($match[1][0]); + } + + } diff --git a/composer.json b/composer.json index 780b1fd..13a4d00 100644 --- a/composer.json +++ b/composer.json @@ -25,6 +25,7 @@ "mgp25/instagram-php": "dev-master", "mhor/php-mediainfo": "^4.1", "microsoft/microsoft-graph": "^1.6", + "mnapoli/front-yaml": "^1.8", "monolog/monolog": "^1.24", "netresearch/jsonmapper": "^1.6", "norkunas/youtube-dl-php": "^1.4", @@ -32,6 +33,7 @@ "ps/image-optimizer": "^2.0", "qcloud/cos-sdk-v5": ">=1.0", "raiym/instagram-php-scraper": "^0.8.31", + "spatie/yaml-front-matter": "^2.0", "symfony/finder": "^4.4", "tinify/tinify": "^1.5" }, diff --git a/composer.lock b/composer.lock index 9c506b7..d325dcb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "c1e5ebef565e5b9357e36df1deab2b66", + "content-hash": "7dcd4159bc96ec62d11f8ee396e25a1b", "packages": [ { "name": "barryvdh/laravel-ide-helper", @@ -4009,6 +4009,51 @@ }, "time": "2020-12-08T23:43:32+00:00" }, + { + "name": "mnapoli/front-yaml", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/mnapoli/FrontYAML.git", + "reference": "76baa8ca538e111bfe53ac49c6a512ec5ea2bf54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mnapoli/FrontYAML/zipball/76baa8ca538e111bfe53ac49c6a512ec5ea2bf54", + "reference": "76baa8ca538e111bfe53ac49c6a512ec5ea2bf54", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "erusev/parsedown": "~1.0", + "php": ">=7.3", + "symfony/yaml": "~2.1|^3.0|^4.0|^5.0" + }, + "require-dev": { + "league/commonmark": "~1.4", + "phpunit/phpunit": "^9.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Mni\\FrontYAML\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "support": { + "issues": "https://github.com/mnapoli/FrontYAML/issues", + "source": "https://github.com/mnapoli/FrontYAML/tree/1.8.0" + }, + "time": "2020-12-04T10:52:19+00:00" + }, { "name": "monolog/monolog", "version": "1.26.0", @@ -6583,6 +6628,65 @@ }, "time": "2020-07-07T18:42:57+00:00" }, + { + "name": "spatie/yaml-front-matter", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/yaml-front-matter.git", + "reference": "efb5170a92216b8d2f40874301db8eb51b8e73cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/yaml-front-matter/zipball/efb5170a92216b8d2f40874301db8eb51b8e73cc", + "reference": "efb5170a92216b8d2f40874301db8eb51b8e73cc", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0", + "symfony/yaml": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\YamlFrontMatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A to the point yaml front matter parser", + "homepage": "https://github.com/sebastiandedeyne/yaml-front-matter", + "keywords": [ + "front matter", + "jekyll", + "spatie", + "yaml" + ], + "support": { + "issues": "https://github.com/spatie/yaml-front-matter/issues", + "source": "https://github.com/spatie/yaml-front-matter/tree/master" + }, + "time": "2019-12-02T20:50:50+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.2.4", @@ -6905,6 +7009,79 @@ ], "time": "2020-12-10T16:34:26+00:00" }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, { "name": "symfony/dom-crawler", "version": "v4.4.18", @@ -9003,6 +9180,87 @@ ], "time": "2020-12-08T16:59:59+00:00" }, + { + "name": "symfony/yaml", + "version": "v5.2.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "298a08ddda623485208506fcee08817807a251dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/298a08ddda623485208506fcee08817807a251dd", + "reference": "298a08ddda623485208506fcee08817807a251dd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<4.4" + }, + "require-dev": { + "symfony/console": "^4.4|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.2.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-06T07:59:01+00:00" + }, { "name": "tightenco/collect", "version": "v8.0.4", diff --git a/fail.log b/fail.log index a456fc7..df41a0d 100644 --- a/fail.log +++ b/fail.log @@ -1020,3 +1020,4 @@ /Users/shixuesen/OneDrive/Pictures/instagram/weiman_the_real_one/ https://scontent-lax3-1.cdninstagram.com/v/t50.2886-16/79615348_903629410435215_5874278704738433173_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5zdG9yeS5kZWZhdWx0In0&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=103&_nc_ohc=XzlyHme-jssAX9fyNgM&edm=AOVtZ6oAAAAA&vs=17912127361730227_270718654&_nc_vs=HBksFQAYJEdIVFZ2Z1NQZ0FTZTJEVURBSlY0azlOYm9ZVlJidXFIQUFBQRUAAsgBABUAGCRHTEo5LUFtdjRiV2FoelVLQU05S2ZLcVRXTnd2YnBrd0FBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACbmu%2FGjhL%2FRPxUCKAJDMywXQC4AAAAAAAAYEmRhc2hfYmFzZWxpbmVfMV92MREAdegHAA%3D%3D&_nc_rid=aab0d17314&ccb=7-4&oe=60753D3F&oh=21ed37a2c79e1618478d116e6110ca2f&_nc_sid=bab638 /Users/shixuesen/OneDrive/Pictures/instagram/Likes/ https://scontent-lax3-1.cdninstagram.com/v/t51.2885-15/e35/173205557_167251781933216_1150698725227016954_n.jpg?se=7&tp=1&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=1&_nc_ohc=WtORZ2J3Y-UAX_RatNU&edm=APv5SkIAAAAA&ccb=7-4&oh=2b1b884668df7e8e974905edcaf5497f&oe=609CF6BA&_nc_sid=7479f6&ig_cache_key=MjU1MDc4NjM3ODEwNzk3NDI5Nw%3D%3D.2-ccb7-4 /Users/shixuesen/OneDrive/Pictures/instagram/ngoctrinh89/ https://scontent-lax3-1.cdninstagram.com/v/t50.2886-16/98618760_3227004884069355_6044999634251674592_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5zdG9yeS5kZWZhdWx0In0&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=103&_nc_ohc=O_mfjDVyUb0AX8STxQP&edm=AOVtZ6oAAAAA&vs=17882073455230920_638136539&_nc_vs=HBksFQAYJEdJak40QVhycTgyZjhYWUxBT0R6NzdvakpfUlRidXFIQUFBQRUAAsgBABUAGCRHRlpSZUFwdVlmS0p1d1FCQUs0T2dWY3R2ZVlIYnBrd0FBQUYVAgLIAQAoABgAGwGIB3VzZV9vaWwBMRUAACaQ3Oj61OnDPxUCKAJDMywXQCuZmZmZmZoYEmRhc2hfYmFzZWxpbmVfMl92MREAdegHAA%3D%3D&_nc_rid=76a0e8f923&ccb=7-4&oe=60834C43&oh=d715adacda8bb3840e0bf87c8f995ad5&_nc_sid=bab638 +/Users/shixuesen/OneDrive/Pictures/instagram/bivi_0420/ https://scontent-lax3-1.cdninstagram.com/v/t50.2886-16/74963866_2803615776546370_4938313936994023105_n.mp4?efg=eyJ2ZW5jb2RlX3RhZyI6InZ0c192b2RfdXJsZ2VuLjcyMC5zdG9yeS5kZWZhdWx0In0&_nc_ht=scontent-lax3-1.cdninstagram.com&_nc_cat=110&_nc_ohc=Joh1OfK2nVQAX9xVW53&edm=AOVtZ6oBAAAA&vs=17893525949035078_1378283097&_nc_vs=HBkcFQAYJEdKcmJkd1JDbm5LcTMtVUpBTUcyNDROY2FvaEVidXFIQUFBQRUAAsgBACgAGAAbAYgHdXNlX29pbAExFQAAJoyMwoulhMk%2FFQIoAkMzLBdAFbtkWhysCBgSZGFzaF9iYXNlbGluZV8xX3YxEQB16AcA&_nc_rid=a086d64b7d&ccb=7-4&oe=608B28BB&oh=b8298b616f2d5ccfb99724c1ee61ee8a&_nc_sid=bab638