<?php
namespace App\Entity;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
/**
* @ORM\Entity(repositoryClass="App\Repository\VideoRepository")
*/
class Video
{
public const VIDEO_DIR = '/code/var/videos';
public const THUMBNAILS_DIR = '/code/var/videos/thumbnails';
public const OVERLAYS_DIR = '/code/var/videos/overlays';
public const WEB_VIDEO_URL = '/videos';
public const WEB_THUMBNAIL_URL = '/videos/thumbnails';
public const WEB_OVERLAY_URL = '/videos/overlays';
public const MAX_VIDEO_DISPLAY = 10000;
public static function path($name): string
{
if (substr(strtolower($name), -4) === '.mp4') {
return self::VIDEO_DIR.'/'.$name;
}
return self::VIDEO_DIR.'/'.$name.'.mp4';
}
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
* @Groups("list")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Groups("list")
*/
private $name;
/**
* @ORM\Column(type="string", length=255)
* @Groups("list")
*/
private $filename;
/**
* @ORM\Column(type="string", length=30)
* @Groups("list")
*/
private $duration;
/**
* @ORM\Column(type="datetime")
*/
private $created;
/**
* @ORM\Column(type="integer")
* @Groups("list")
*/
private $plays;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Tag", inversedBy="videos")
*/
private $tags;
/**
* @ORM\Column(type="boolean")
*/
private $deleted;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups("list")
*/
private $thumbnailImage;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups("list")
*/
private $overlayImage;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups("list")
*/
private $linkUrl;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $description;
public function __construct()
{
$this->created = new DateTime();
$this->tags = new ArrayCollection();
$this->plays = 0;
$this->deleted = false;
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getFilename(): ?string
{
return $this->filename;
}
public function getFilenameWithExtension(): ?string
{
return $this->filename.'.mp4';
}
public function getFullPath(): ?string
{
return self::VIDEO_DIR.'/'.$this->getFilenameWithExtension();
}
public function setFilename(string $filename): self
{
$this->filename = $filename;
return $this;
}
public function getDuration(): ?string
{
return $this->duration;
}
public function getDurationSeconds() : int
{
list($minutes, $seconds) = explode(':', $this->duration);
return ((int) $minutes * 60) + (int) $seconds;
}
public function setDuration(string $duration): self
{
$this->duration = $duration;
return $this;
}
/**
* @return \DateTimeInterface|null
*/
public function getCreated(): ?\DateTimeInterface
{
return $this->created;
}
/**
* @Groups("list")
* @SerializedName("added")
* @return string|null
*/
public function getCreatedFormatted(): ?string
{
return $this->created->format('d.m.y');
}
public function setCreated(\DateTimeInterface $created): self
{
$this->created = $created;
return $this;
}
public function getPlays(): ?int
{
return $this->plays;
}
public function setPlays(int $plays): self
{
$this->plays = $plays;
return $this;
}
/**
* @return Collection|Tag[]
*/
public function getTags(): Collection
{
return $this->tags;
}
/**
* @Groups("list")
* @SerializedName("tags")
* @return array
*/
public function getTagJson(): array
{
$tags = $this->tags->getValues();
usort($tags, function (Tag $tag){
if ($tag->getParent() !== NULL){
return -1;
}
});
return array_map(function (Tag $tag){
return [
$tag->getId(),
$tag->getName(),
$tag->getParent() === NULL ? $tag->getColor() : NULL
]; }, $tags);
}
public function addTag(Tag $tag): self
{
if (!$this->tags->contains($tag)) {
$this->tags[] = $tag;
}
return $this;
}
public function removeTag(Tag $tag): self
{
if ($this->tags->contains($tag)) {
$this->tags->removeElement($tag);
}
return $this;
}
public function getDeleted(): ?bool
{
return $this->deleted;
}
public function setDeleted(bool $deleted): self
{
$this->deleted = $deleted;
return $this;
}
public function getThumbnailImage(): ?string
{
return $this->thumbnailImage;
}
public function getThumbnailPath(): ?string
{
if ($this->thumbnailImage) {
return self::THUMBNAILS_DIR.'/'.$this->thumbnailImage;
}
return null;
}
public function setThumbnailImage(?string $thumbnailImage): self
{
$this->thumbnailImage = $thumbnailImage;
return $this;
}
public function getOverlayImage(): ?string
{
return $this->overlayImage;
}
public function getOverlayPath(): ?string
{
if ($this->overlayImage) {
return self::OVERLAYS_DIR.'/'.$this->overlayImage;
}
return null;
}
public function setOverlayImage(?string $overlayImage): self
{
$this->overlayImage = $overlayImage;
return $this;
}
public function getLinkUrl(): ?string
{
return $this->linkUrl;
}
public function setLinkUrl(?string $linkUrl): self
{
$this->linkUrl = $linkUrl;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
/**
* @Groups("list")
* @SerializedName("descriptionShort")
* @return string|null
*/
public function getDescriptionShort(): ?string
{
if (!$this->description) {
return null;
}
return strlen($this->description) > 100 ? substr($this->description, 0, 100) . '...' : $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
}