Code

< 40 %
40-60 %
> 60 %
1
<?php
2
3
/*
4
 * This file is part of the Mala package.
5
 *
6
 * (c) Chrisyue <http://chrisyue.com/>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Chrisyue\Mala;
13
14
use Chrisyue\Mala\Manager\EpgManagerInterface;
15
use Chrisyue\Mala\Manager\MediaSegmentManagerInterface;
16
use Chrisyue\Mala\Model\ChannelInterface;
17
use Chrisyue\PhpM3u8\Parser;
18
19
class PlaylistScheduler
20
{
21
    private $parser;
22
    private $epgManager;
23
    private $mediaSegmentManager;
24
25 2
    public function __construct(Parser $parser, EpgManagerInterface $epgManager, MediaSegmentManagerInterface $mediaSegmentManager)
26
    {
27 2
        $this->parser = $parser;
28 2
        $this->epgManager = $epgManager;
29 2
        $this->mediaSegmentManager = $mediaSegmentManager;
30 2
    }
31
32 2
    public function schedule(ChannelInterface $channel, \DateTime $startsAt, \DateTime $endsAt)
33
    {
34 2
        $epg = $this->epgManager->find($channel, $startsAt, $endsAt);
35 2
        if (empty($epg)) {
36 1
            throw new \UnexpectedValueException('there is no epg found');
37
        }
38
39 1
        $firstProgramStartsAt = $epg[0]->getStartsAt();
40 1
        $this->mediaSegmentManager->clear($channel, $firstProgramStartsAt);
41
42 1
        $lastMediaSegment = $this->mediaSegmentManager->findLast($channel);
43
44 1
        $sequence = 0;
45 1
        if (null !== $lastMediaSegment && $firstProgramStartsAt->getTimestamp() <= $lastMediaSegment->getEndsAt()->getTimestamp() + 1) {
46 1
            $sequence = $lastMediaSegment->getSequence();
47 1
        }
48
49 1
        foreach ($epg as $program) {
50 1
            $isDiscontinuity = true;
51 1
            $segmentStartsAt = clone $program->getStartsAt();
52 1
            $handledDuration = 0;
53
54 1
            $m3u8 = $this->parser->parseFromUri($program->getVideo()->getUri());
55 1
            foreach ($m3u8->getPlaylist() as $originSegment) {
56 1
                $handledDuration += $originSegment->getDuration();
57 1
                $segmentEndsAt = clone $program->getStartsAt();
58 1
                $segmentEndsAt->modify(sprintf('+%d seconds', round($handledDuration)));
59
60 1
                $segment = $this->mediaSegmentManager->create(
61 1
                    $program, $segmentStartsAt, $segmentEndsAt,
62 1
                    $originSegment->getUri(), $originSegment->getDuration(),
63 1
                    ++$sequence, $isDiscontinuity
64 1
                );
65 1
                $this->mediaSegmentManager->saveDeferred($segment);
66
67 1
                $segmentStartsAt = clone $segmentEndsAt;
68 1
                $isDiscontinuity = false;
69 1
            }
70
71 1
            $this->mediaSegmentManager->commit();
72 1
        }
73 1
    }
74
}
75