From 1c341874a0661a53d60fbc65d46b72eb71efefff Mon Sep 17 00:00:00 2001 From: Celestora Date: Wed, 13 Oct 2021 22:51:28 +0300 Subject: [PATCH] Wall [Experimental]: Allow to embed videos in posts --- Web/Models/Entities/Video.php | 22 ++++++-- Web/Models/Repositories/Videos.php | 2 +- Web/Presenters/WallPresenter.php | 56 +++++++++---------- .../templates/components/attachment.xml | 2 + .../templates/components/textArea.xml | 7 ++- Web/static/css/nsfw-posts.css | 4 +- Web/static/css/style.css | 2 +- Web/static/js/al_wall.js | 5 +- install/sqls/00001-unlisted-videos.sql | 1 + 9 files changed, 62 insertions(+), 39 deletions(-) create mode 100644 install/sqls/00001-unlisted-videos.sql diff --git a/Web/Models/Entities/Video.php b/Web/Models/Entities/Video.php index ccb63f13..7b35153f 100644 --- a/Web/Models/Entities/Video.php +++ b/Web/Models/Entities/Video.php @@ -93,10 +93,10 @@ class Video extends Media function isDeleted(): bool { - if ($this->getRecord()->deleted == 1) - return TRUE; - else - return FALSE; + if ($this->getRecord()->deleted == 1) + return TRUE; + else + return FALSE; } function deleteVideo(): void @@ -105,4 +105,18 @@ class Video extends Media $this->unwire(); $this->save(); } + + static function fastMake(int $owner, string $description = "", array $file, bool $unlisted = true): Video + { + $video = new Video; + $video->setOwner($owner); + $video->setName("Unnamed Video.ogv"); + $video->setDescription(ovk_proc_strtr($description, 300)); + $video->setCreated(time()); + $video->setFile($file); + $video->setUnlisted($unlisted); + $video->save(); + + return $video; + } } diff --git a/Web/Models/Repositories/Videos.php b/Web/Models/Repositories/Videos.php index 8d99dd84..2bb459d8 100644 --- a/Web/Models/Repositories/Videos.php +++ b/Web/Models/Repositories/Videos.php @@ -37,7 +37,7 @@ class Videos function getByUser(User $user, int $page = 1, ?int $perPage = NULL): \Traversable { $perPage = $perPage ?? OPENVK_DEFAULT_PER_PAGE; - foreach($this->videos->where("owner", $user->getId())->where("deleted", 0)->page($page, $perPage) as $video) + foreach($this->videos->where("owner", $user->getId())->where(["deleted" => 0, "unlisted" => 0])->page($page, $perPage) as $video) yield new Video($video); } diff --git a/Web/Presenters/WallPresenter.php b/Web/Presenters/WallPresenter.php index 49470646..05a844b4 100644 --- a/Web/Presenters/WallPresenter.php +++ b/Web/Presenters/WallPresenter.php @@ -1,6 +1,6 @@ postParam("force_sign") === "on") $flags |= 0b01000000; - - if($_FILES["_pic_attachment"]["error"] === UPLOAD_ERR_OK) { - try { + try { + $photo = NULL; + $video = NULL; + if($_FILES["_pic_attachment"]["error"] === UPLOAD_ERR_OK) { $album = NULL; if($wall > 0 && $wall === $this->user->id) $album = (new Albums)->getUserWallAlbum($wallOwner); $photo = Photo::fastMake($this->user->id, $this->postParam("text"), $_FILES["_pic_attachment"], $album); - } catch(ISE $ex) { - $this->flashFail("err", "Не удалось опубликовать пост", "Файл изображения повреждён, слишком велик или одна сторона изображения в разы больше другой."); } - $post = new Post; - $post->setOwner($this->user->id); - $post->setWall($wall); - $post->setCreated(time()); - $post->setContent($this->postParam("text")); - $post->setFlags($flags); - $post->setNsfw($this->postParam("nsfw") === "on"); - $post->save(); - $post->attach($photo); - } elseif($this->postParam("text")) { - try { - $post = new Post; - $post->setOwner($this->user->id); - $post->setWall($wall); - $post->setCreated(time()); - $post->setContent($this->postParam("text")); - $post->setFlags($flags); - $post->setNsfw($this->postParam("nsfw") === "on"); - $post->save(); - } catch(\LogicException $ex) { - $this->flashFail("err", "Не удалось опубликовать пост", "Пост пустой или слишком большой."); + if($_FILES["_vid_attachment"]["error"] === UPLOAD_ERR_OK) { + $video = Video::fastMake($this->user->id, $this->postParam("text"), $_FILES["_vid_attachment"]); } - } else { - $this->flashFail("err", "Не удалось опубликовать пост", "Пост пустой или слишком большой."); + } catch(ISE $ex) { + $this->flashFail("err", "Не удалось опубликовать пост", "Файл медиаконтента повреждён или слишком велик."); } + if(empty($this->postParam("text")) && !$photo && !$video) + $this->flashFail("err", "Не удалось опубликовать пост", "Пост пустой или слишком большой."); + + $post = new Post; + $post->setOwner($this->user->id); + $post->setWall($wall); + $post->setCreated(time()); + $post->setContent($this->postParam("text")); + $post->setFlags($flags); + $post->setNsfw($this->postParam("nsfw") === "on"); + $post->save(); + + if(!is_null($photo)) + $post->attach($photo); + + if(!is_null($video)) + $post->attach($video); + if($wall > 0 && $wall !== $this->user->identity->getId()) (new WallPostNotification($wallOwner, $post, $this->user->identity))->emit(); diff --git a/Web/Presenters/templates/components/attachment.xml b/Web/Presenters/templates/components/attachment.xml index 4621a6f9..35f1901a 100644 --- a/Web/Presenters/templates/components/attachment.xml +++ b/Web/Presenters/templates/components/attachment.xml @@ -8,6 +8,8 @@ {_ {/if} +{elseif $attachment instanceof \openvk\Web\Models\Entities\Video} + {elseif $attachment instanceof \openvk\Web\Models\Entities\Post} {php $GLOBALS["_nesAttGloCou"] = (isset($GLOBALS["_nesAttGloCou"]) ? $GLOBALS["_nesAttGloCou"] : 0) + 1} {if $GLOBALS["_nesAttGloCou"] > 2} diff --git a/Web/Presenters/templates/components/textArea.xml b/Web/Presenters/templates/components/textArea.xml index 6f55b579..89b564da 100644 --- a/Web/Presenters/templates/components/textArea.xml +++ b/Web/Presenters/templates/components/textArea.xml @@ -31,7 +31,8 @@ {_"contains_nsfw"} - + +
@@ -46,6 +47,10 @@ {_attach_photo} + + + Прикрепить видео + Нарисовать граффити diff --git a/Web/static/css/nsfw-posts.css b/Web/static/css/nsfw-posts.css index c0bd27be..ed9841ca 100644 --- a/Web/static/css/nsfw-posts.css +++ b/Web/static/css/nsfw-posts.css @@ -1,4 +1,4 @@ -.post-nsfw .post-content img.media { +.post-nsfw .post-content .media { filter: saturate(0.8) blur(15px); } @@ -7,7 +7,7 @@ position: relative; } -.post-nsfw .post-content .attachment:active img.media { +.post-nsfw .post-content .attachment:active .media { filter: none; } diff --git a/Web/static/css/style.css b/Web/static/css/style.css index e3126c3b..b9e90c3e 100644 --- a/Web/static/css/style.css +++ b/Web/static/css/style.css @@ -513,7 +513,7 @@ h4 { width: 102%; } -.post-content img.media { +.post-content .media { max-width: 100%; image-rendering: -webkit-optimize-contrast; } diff --git a/Web/static/js/al_wall.js b/Web/static/js/al_wall.js index 9e70ea77..552d9c92 100644 --- a/Web/static/js/al_wall.js +++ b/Web/static/js/al_wall.js @@ -24,6 +24,9 @@ function trim(string) { function handleUpload() { console.warn("блять..."); + + u(".postFileSel").not("#" + this.id).each(input => input.value = null); + var indicator = u(".post-upload"); var file = this.files[0]; if(typeof file === "undefined") { @@ -108,4 +111,4 @@ u("#wall-post-input").on("input", function(e) { // textArea.style.height = (newHeight > originalHeight ? (newHeight + boost) : originalHeight) + "px"; }); -u("input[name=_pic_attachment]").on("change", handleUpload); +u(".postFileSel").on("change", handleUpload); diff --git a/install/sqls/00001-unlisted-videos.sql b/install/sqls/00001-unlisted-videos.sql new file mode 100644 index 00000000..0eb57d62 --- /dev/null +++ b/install/sqls/00001-unlisted-videos.sql @@ -0,0 +1 @@ +ALTER TABLE `videos` ADD `unlisted` BOOLEAN NOT NULL DEFAULT FALSE AFTER `link`, ADD INDEX (`unlisted`); \ No newline at end of file