Compare commits
1 Commits
v0.18.19
...
dev-stream
| Author | SHA1 | Date | |
|---|---|---|---|
| eb37df7c3e |
@@ -1,4 +1,5 @@
|
|||||||
import './bootstrap.js';
|
import './bootstrap.js';
|
||||||
|
import Hls from "./vendor/hls.js/hls.js.index.js";
|
||||||
/*
|
/*
|
||||||
* Welcome to your app's main JavaScript file!
|
* Welcome to your app's main JavaScript file!
|
||||||
*
|
*
|
||||||
@@ -18,3 +19,29 @@ var observer = new MutationObserver(function(mutations) {
|
|||||||
|
|
||||||
observer.observe(document, {attributes: false, childList: true, characterData: false, subtree:true});
|
observer.observe(document, {attributes: false, childList: true, characterData: false, subtree:true});
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
const videoUrl = "http://127.0.0.1:11470/hlsv2/2b76fe2ec12c83d264076fb859923c5d/master.m3u8?mediaURL=https%3A%2F%2Ftorrentio.strem.fun%2Frealdebrid%2FQYYBR7OSQ4VEFKWASDEZ2B4VO67KHUJY6IWOT7HHA7ATXO7QCYDQ%2F6bf1938db882f6fcbb0dafa6e7326230e7f4eae0%2Fnull%2F3%2FSurvivor.S48E01.1080p.HEVC.x265-MeGusta.mkv%26videoCodecs%3Dh264%26videoCodecs%3Dh265%26videoCodecs%3Dhevc%26videoCodecs%3Dvp9%26audioCodecs%3Daac%26audioCodecs%3Dmp3%26audioCodecs%3Dopus%26maxAudioChannels%3D2";
|
||||||
|
|
||||||
|
var video = document.getElementById('video');
|
||||||
|
if (Hls.isSupported()) {
|
||||||
|
var hls = new Hls({
|
||||||
|
debug: true,
|
||||||
|
});
|
||||||
|
hls.loadSource(videoUrl);
|
||||||
|
hls.attachMedia(video);
|
||||||
|
hls.on(Hls.Events.MEDIA_ATTACHED, function () {
|
||||||
|
video.muted = true;
|
||||||
|
video.play();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// hls.js is not supported on platforms that do not have Media Source Extensions (MSE) enabled.
|
||||||
|
// When the browser has built-in HLS support (check using `canPlayType`), we can provide an HLS manifest (i.e. .m3u8 URL) directly to the video element through the `src` property.
|
||||||
|
// This is using the built-in support of the plain video element, without using hls.js.
|
||||||
|
else if (video.canPlayType('application/vnd.apple.mpegurl')) {
|
||||||
|
video.src = videoUrl;
|
||||||
|
video.addEventListener('canplay', function () {
|
||||||
|
video.play();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ export default class extends Controller {
|
|||||||
filename: String,
|
filename: String,
|
||||||
mediaType: String,
|
mediaType: String,
|
||||||
imdbId: String,
|
imdbId: String,
|
||||||
episodeId: String
|
|
||||||
}
|
}
|
||||||
|
|
||||||
download() {
|
download() {
|
||||||
@@ -28,7 +27,6 @@ export default class extends Controller {
|
|||||||
filename: this.filenameValue,
|
filename: this.filenameValue,
|
||||||
mediaType: this.mediaTypeValue,
|
mediaType: this.mediaTypeValue,
|
||||||
imdbId: this.imdbIdValue,
|
imdbId: this.imdbIdValue,
|
||||||
episodeId: this.episodeIdValue
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.then(res => res.json())
|
.then(res => res.json())
|
||||||
|
|||||||
@@ -40,4 +40,7 @@ return [
|
|||||||
'stimulus-use' => [
|
'stimulus-use' => [
|
||||||
'version' => '0.52.2',
|
'version' => '0.52.2',
|
||||||
],
|
],
|
||||||
|
'hls.js' => [
|
||||||
|
'version' => '1.6.5',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -26,9 +26,6 @@ class DownloadMediaInput implements InputInterface
|
|||||||
#[SourceRequest('imdbId')]
|
#[SourceRequest('imdbId')]
|
||||||
public string $imdbId,
|
public string $imdbId,
|
||||||
|
|
||||||
#[SourceRequest('episodeId', nullify: true)]
|
|
||||||
public ?string $episodeId = null,
|
|
||||||
|
|
||||||
public ?int $userId = null,
|
public ?int $userId = null,
|
||||||
|
|
||||||
public ?int $downloadId = null,
|
public ?int $downloadId = null,
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ use App\Download\Action\Input\PauseDownloadInput;
|
|||||||
use App\Download\Action\Input\ResumeDownloadInput;
|
use App\Download\Action\Input\ResumeDownloadInput;
|
||||||
use App\Download\Framework\Repository\DownloadRepository;
|
use App\Download\Framework\Repository\DownloadRepository;
|
||||||
use App\Util\Broadcaster;
|
use App\Util\Broadcaster;
|
||||||
use Nihilarr\PTN;
|
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Messenger\MessageBusInterface;
|
use Symfony\Component\Messenger\MessageBusInterface;
|
||||||
@@ -29,13 +28,6 @@ class ApiController extends AbstractController
|
|||||||
public function download(
|
public function download(
|
||||||
DownloadMediaInput $input,
|
DownloadMediaInput $input,
|
||||||
): Response {
|
): Response {
|
||||||
$ptn = (object) new Ptn()->parse($input->filename);
|
|
||||||
if ($input->mediaType === "tvshows" &&
|
|
||||||
!property_exists($ptn, 'episode') && !property_exists($ptn, 'season')
|
|
||||||
) {
|
|
||||||
$input->filename = $input->episodeId . '_' . $input->filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
$download = $this->downloadRepository->insert(
|
$download = $this->downloadRepository->insert(
|
||||||
$this->getUser(),
|
$this->getUser(),
|
||||||
$input->url,
|
$input->url,
|
||||||
|
|||||||
@@ -4,10 +4,7 @@ namespace App\Twig\Extensions;
|
|||||||
|
|
||||||
use App\Monitor\Framework\Entity\Monitor;
|
use App\Monitor\Framework\Entity\Monitor;
|
||||||
use App\Monitor\Service\MediaFiles;
|
use App\Monitor\Service\MediaFiles;
|
||||||
use App\Torrentio\Action\Result\GetTvShowOptionsResult;
|
|
||||||
use App\Torrentio\Result\TorrentioResult;
|
|
||||||
use ChrisUllyott\FileSize;
|
use ChrisUllyott\FileSize;
|
||||||
use Tmdb\Model\Tv\Episode;
|
|
||||||
use Twig\Attribute\AsTwigFilter;
|
use Twig\Attribute\AsTwigFilter;
|
||||||
use Twig\Attribute\AsTwigFunction;
|
use Twig\Attribute\AsTwigFunction;
|
||||||
|
|
||||||
@@ -48,15 +45,4 @@ class UtilExtension
|
|||||||
$path
|
$path
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[AsTwigFilter('episode_id_from_results')]
|
|
||||||
public function episodeId($result): ?string
|
|
||||||
{
|
|
||||||
if (!$result instanceof GetTvShowOptionsResult) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return "S". str_pad($result->season, 2, "0", STR_PAD_LEFT) .
|
|
||||||
"E". str_pad($result->episode, 2, "0", STR_PAD_LEFT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,12 @@
|
|||||||
{% block body %}
|
{% block body %}
|
||||||
<div class="p-4 flex flex-col grow gap-4 z-30">
|
<div class="p-4 flex flex-col grow gap-4 z-30">
|
||||||
<h2 class="mb-2 text-3xl font-bold text-gray-50">Dashboard</h2>
|
<h2 class="mb-2 text-3xl font-bold text-gray-50">Dashboard</h2>
|
||||||
|
<div class="flex flex-row gap-4">
|
||||||
|
<twig:Card title="Play Survivor" class="w-full">
|
||||||
|
<video width="352" height="198" controls>
|
||||||
|
</video>
|
||||||
|
</twig:Card>
|
||||||
|
</div>
|
||||||
<div class="flex flex-row gap-4">
|
<div class="flex flex-row gap-4">
|
||||||
<twig:Card title="Active Downloads" class="w-full">
|
<twig:Card title="Active Downloads" class="w-full">
|
||||||
<twig:DownloadList :type="'active'" />
|
<twig:DownloadList :type="'active'" />
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for result in results.results %}
|
{% for result in results.results %}
|
||||||
<tr class="bg-white border-b dark:bg-slate-700 dark:border-gray-600 border-gray-200" data-provider="{{ result.provider }}" data-languages="{{ result.languages|json_encode }}" {% if "tvshows" == results.media.mediaType %} data-season="{{ results.season }}"{% endif %}>
|
<tr class="bg-white border-b dark:bg-slate-700 dark:border-gray-600 border-gray-200" data-provider="{{ result.provider }}" data-languages="{{ result.languages|json_encode }}" {% if "tvshows" == results.media.mediaType %} data-season="{{ results.season }} {% endif %}">
|
||||||
<td id="size" class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-800 dark:text-gray-50">
|
<td id="size" class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-800 dark:text-gray-50">
|
||||||
{{ result.size }}
|
{{ result.size }}
|
||||||
</td>
|
</td>
|
||||||
@@ -60,8 +60,7 @@
|
|||||||
title: results.media.title,
|
title: results.media.title,
|
||||||
filename: result.filename,
|
filename: result.filename,
|
||||||
mediaType: results.media.mediaType,
|
mediaType: results.media.mediaType,
|
||||||
imdbId: results.media.imdbId,
|
imdbId: results.media.imdbId
|
||||||
episodeId: results|episode_id_from_results
|
|
||||||
}) }}
|
}) }}
|
||||||
{{ stimulus_action('download_button', 'download', 'click') }}
|
{{ stimulus_action('download_button', 'download', 'click') }}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in New Issue
Block a user