...
 
Commits (2)
......@@ -18,11 +18,12 @@ class Transcode extends Cli\Controller implements Interfaces\CliControllerInterf
{
$this->out('TBD');
}
public function exec()
{
$transcoder = new Core\Media\Services\FFMpeg;
$transcoder->setKey($this->getOpt('guid'));
$transcoder->transcode();
$transcoder->setFullHD($this->getOpt('full_hd') ?? false);
$transcoder->onQueue();
}
}
......@@ -50,10 +50,12 @@ class media implements Interfaces\Api, Interfaces\ApiIgnorePam
if (isset($pages[1]) && $pages[1] == 'play') {
http_response_code(302);
$res = !empty($_GET['res']) && in_array($_GET['res'], ['360', '720', '1080'], true) ?$_GET['res'] : '360';
if ($entity->subtype == 'audio') {
\forward($entity->getSourceUrl('128.mp3'));
} else {
\forward($entity->getSourceUrl('360.mp4'));
\forward($entity->getSourceUrl("{$res}.mp4"));
}
exit;
......@@ -65,8 +67,11 @@ class media implements Interfaces\Api, Interfaces\ApiIgnorePam
$response = $entities[0];
$response['transcodes'] = [
'360.mp4' => $entity->getSourceUrl('360.mp4'),
'720.mp4' => $entity->getSourceUrl('720.mp4')
'720.mp4' => $entity->getSourceUrl('720.mp4'),
];
if ($entity->getFlag('full_hd')) {
$response['transcodes']['1080.mp4'] = $entity->getSourceUrl('1080.mp4');
}
}
if (method_exists($entity, 'getWireThreshold')) {
......@@ -165,6 +170,7 @@ class media implements Interfaces\Api, Interfaces\ApiIgnorePam
$body = $req['body'];
fwrite($fp, $body);
$video->access_id = 0;
$video->patch(['full_hd', Core\Session::getLoggedinUser()->isPro()]);
$video->upload($tmpFilename);
$guid = $video->save();
fclose($fp);
......@@ -265,7 +271,8 @@ class media implements Interfaces\Api, Interfaces\ApiIgnorePam
'access_id' => 0,
'owner_guid' => $user->guid,
'hidden' => $container_guid !== null,
'container_guid' => $container_guid
'container_guid' => $container_guid,
'full_hd' => $user->isPro(),
]);
$assets = Core\Media\AssetsFactory::build($entity);
......
......@@ -358,7 +358,8 @@ class newsfeed implements Interfaces\Api
->setCustom('video', [
'thumbnail_src' => $embeded->getIconUrl(),
'guid' => $embeded->guid,
'mature' => $embeded instanceof Flaggable ? $embeded->getFlag('mature') : false
'mature' => $embeded instanceof Flaggable ? $embeded->getFlag('mature') : false,
'full_hd' => $embeded->getFlag('full_hd') ?? false,
])
->setTitle($embeded->title)
->setBlurb($embeded->description)
......@@ -525,7 +526,7 @@ class newsfeed implements Interfaces\Api
]);
}
}
$save->setEntity($activity)
->save();
......
......@@ -10,6 +10,8 @@ namespace Minds\Controllers\api\v2\media;
use Minds\Api\Factory;
use Minds\Core\Di\Di;
use Minds\Core\Media\ClientUpload\Manager;
use Minds\Core\Session;
use Minds\Interfaces;
use Minds\Core\Media\ClientUpload\ClientUploadLease;
......@@ -38,6 +40,7 @@ class upload implements Interfaces\Api
*/
public function put($pages)
{
/** @var Manager $manager */
$manager = Di::_()->get("Media\ClientUpload\Manager");
switch ($pages[0]) {
case 'prepare':
......@@ -55,7 +58,9 @@ class upload implements Interfaces\Api
$lease->setGuid($guid)
->setMediaType($mediaType);
$manager->complete($lease);
$manager
->setFullHD(Session::getLoggedinUser()->isPro())
->complete($lease);
break;
}
return Factory::response([]);
......
......@@ -12,15 +12,29 @@ use Minds\Entities\Video;
class Manager
{
/** @var FFMepg */
/** @var FFMpeg */
private $ffmpeg;
/** @var Guid $guid */
private $guid;
/** @var bool */
private $full_hd;
/** @var Save $save */
private $save;
/**
* @param bool $value
* @return Manager
*/
public function setFullHD(bool $value): Manager
{
$this->full_hd = $value;
return $this;
}
public function __construct(
FFMpeg $FFMpeg = null,
GuidBuilder $guid = null,
......@@ -70,12 +84,16 @@ class Manager
$video->set('guid', $lease->getGuid());
$video->set('cinemr_guid', $lease->getGuid());
$video->set('access_id', 0); // Hide until published
$video->setFlag('full_hd', $this->full_hd);
// Save the video
$this->save->setEntity($video)->save();
$this->ffmpeg->setKey($lease->getGuid());
// Set the full hd flag
$this->ffmpeg->setFullHD($this->full_hd);
// Start the transcoding process
$this->ffmpeg->transcode();
......
......@@ -38,6 +38,9 @@ class FFMpeg implements ServiceInterface
/** @var string $dir */
private $dir = 'cinemr_data';
/** @var bool $full_hd */
private $full_hd = false;
public function __construct(
$queue = null,
$ffmpeg = null,
......@@ -71,6 +74,10 @@ class FFMpeg implements ServiceInterface
$this->dir = $this->config->get('transcoder')['dir'];
}
/**
* @param $key
* @return FFMpeg
*/
public function setKey($key)
{
$this->key = $key;
......@@ -78,6 +85,16 @@ class FFMpeg implements ServiceInterface
return $this;
}
/**
* @param bool $value
* @return FFMpeg
*/
public function setFullHD(bool $value)
{
$this->full_hd = $value;
return $this;
}
/**
* Create a PresignedUr for client based uploads
* @return string
......@@ -136,6 +153,7 @@ class FFMpeg implements ServiceInterface
->setQueue('Transcode')
->send([
'key' => $this->key,
'full_hd' => $this->full_hd,
]);
return $this;
......@@ -207,6 +225,10 @@ class FFMpeg implements ServiceInterface
'formats' => ['mp4', 'webm'],
], $opts);
if ($opts['pro'] && !$this->full_hd) {
continue;
}
if ($rotated) {
$ratio = $videostream->get('width') / $videostream->get('height');
$width = round($opts['height'] * $ratio);
......
......@@ -13,9 +13,11 @@ class Transcode implements Interfaces\QueueRunner
$client = Core\Queue\Client::Build();
$client->setQueue("Transcode")
->receive(function ($data) {
$d = $data->getData();
echo "Received a transcode request \n";
$transcoder = new Core\Media\Services\FFMpeg();
$transcoder->setKey($data->getData()['key']);
$transcoder->setKey($d['key']);
$transcoder->setFullHD($d['full_hd']);
$transcoder->onQueue();
}, [ 'max_messages' => 1 ]);
}
......
......@@ -55,8 +55,9 @@ class Video extends Object
$transcoder = ServiceFactory::build('FFMpeg');
$transcoder->setKey($this->getGuid())
->saveToFilestore($filepath)
->transcode();
->setFullHD($this->getFlag('full_hd'))
->saveToFilestore($filepath)
->transcode();
$this->cinemr_guid = $this->getGuid();
}
......@@ -193,6 +194,7 @@ class Video extends Object
'container_guid' => null,
'rating' => 2, //open by default
'time_sent' => time(),
'full_hd' => false,
], $data);
$allowed = [
......@@ -205,7 +207,8 @@ class Video extends Object
'mature',
'boost_rejection_reason',
'rating',
'time_sent'
'time_sent',
'full_hd',
];
foreach ($allowed as $field) {
......@@ -215,8 +218,8 @@ class Video extends Object
if ($field == 'access_id') {
$data[$field] = (int) $data[$field];
} elseif ($field == 'mature') {
$this->setFlag('mature', !!$data['mature']);
} elseif (in_array($field, ['mature', 'full_hd'], true)) {
$this->setFlag($field, !!$data[$field]);
continue;
}
......@@ -253,6 +256,7 @@ class Video extends Object
'thumbnail_src' => $this->getIconUrl(),
'guid' => $this->guid,
'mature' => $this->getFlag('mature'),
'full_hd' => $this->getFlag('full_hd'),
'license' => $this->license ?? '',
]
];
......
......@@ -58,7 +58,7 @@ class ManagerSpec extends ObjectBehavior
$lease->getGuid()
->willReturn(456);
$this->save->setEntity(Argument::that(function ($video) {
return $video->guid == 456
&& $video->access_id == 0;
......@@ -72,10 +72,14 @@ class ManagerSpec extends ObjectBehavior
$this->ffmpeg->setKey(456)
->shouldBeCalled();
$this->ffmpeg->setFullHD(false)
->shouldBeCalled();
$this->ffmpeg->transcode()
->shouldBeCalled();
$this->complete($lease)
$this->setFullHD(false)
->complete($lease)
->shouldReturn(true);
}
}
......@@ -540,7 +540,7 @@ $CONFIG->set('transcoder', [
'bitrate' => 500,
'audio_bitrate' => 80,
'formats' => [ 'mp4', 'webm' ],
'charge' => false,
'pro' => false,
],
[
'width' => 1280,
......@@ -548,7 +548,7 @@ $CONFIG->set('transcoder', [
'bitrate' => 2000,
'audio_bitrate' => 128,
'formats' => [ 'mp4', 'webm' ],
'charge' => false,
'pro' => false,
],
[
'width' => 1920,
......@@ -556,7 +556,7 @@ $CONFIG->set('transcoder', [
'bitrate' => 2000,
'audio_bitrate' => 128,
'formats' => [ 'mp4', 'webm' ],
'charge' => true,
'pro' => true,
],
]
]);
......