Implementing a streaming setup with Usenet

This commit is contained in:
Mukhtar Akere
2025-08-01 15:27:24 +01:00
parent afe577bf2f
commit f9861e3b54
65 changed files with 9437 additions and 924 deletions

View File

@@ -24,6 +24,14 @@
<i class="bi bi-collection text-lg"></i>
<span class="hidden sm:inline">*Arrs</span>
</button>
<button type="button" class="tab-button flex items-center gap-2 py-3 px-1 border-b-2 border-transparent text-base-content/70 hover:text-base-content hover:border-base-300 font-medium text-sm transition-colors" data-tab="usenet">
<i class="bi bi-globe text-lg"></i>
<span class="hidden sm:inline">Usenet</span>
</button>
<button type="button" class="tab-button flex items-center gap-2 py-3 px-1 border-b-2 border-transparent text-base-content/70 hover:text-base-content hover:border-base-300 font-medium text-sm transition-colors" data-tab="sabnzbd">
<i class="bi bi-download text-lg"></i>
<span class="hidden sm:inline">SABnzbd</span>
</button>
<button type="button" class="tab-button flex items-center gap-2 py-3 px-1 border-b-2 border-transparent text-base-content/70 hover:text-base-content hover:border-base-300 font-medium text-sm transition-colors" data-tab="repair">
<i class="bi bi-wrench text-lg"></i>
<span class="hidden sm:inline">Repair</span>
@@ -328,6 +336,146 @@
</div>
</div>
<!-- Usenet Tab Content -->
<div class="tab-content hidden" data-tab-content="usenet">
<div class="space-y-6">
<h2 class="text-2xl font-bold flex items-center mb-6">
<i class="bi bi-globe mr-3 text-info"></i>Usenet Settings
</h2>
<!-- Global Usenet Settings -->
<div class="card bg-base-100 border border-base-300 shadow-sm">
<div class="card-body">
<h3 class="card-title text-lg mb-4">
<i class="bi bi-folder mr-2 text-info"></i>
Main Settings
</h3>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-4">
<div class="form-control">
<label class="label" for="usenet.mount_folder">
<span class="label-text font-medium">Mount Folder</span>
</label>
<input type="text" class="input input-bordered"
name="usenet.mount_folder" id="usenet.mount_folder"
placeholder="/mnt/usenet">
<div class="label">
<span class="label-text-alt">Path where usenet downloads are mounted</span>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-4">
<div class="form-control">
<label class="label" for="usenet.chunks">
<span class="label-text font-medium">Download Chunks</span>
</label>
<input type="text" class="input input-bordered"
name="usenet.chunks" id="usenet.chunks"
placeholder="30">
<div class="label">
<span class="label-text-alt">Number of chunks to pre-cache(default 5)</span>
</div>
</div>
<div class="form-control">
<label class="label cursor-pointer justify-start gap-3">
<input type="checkbox" class="checkbox" name="usenet.skip_pre_cache" id="usenet.skip_pre_cache">
<div>
<span class="label-text font-medium">Skip Pre-Cache</span>
<div class="label-text-alt">Disabling this speeds up import</div>
</div>
</label>
</div>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-4">
<div class="form-control">
<label class="label" for="usenet.rc_url">
<span class="label-text font-medium">Rclone RC URL</span>
</label>
<input type="text" class="input input-bordered"
name="usenet.rc_url" id="usenet.rc_url"
placeholder="http://rclone-usenet:9990">
<div class="label">
<span class="label-text-alt">Rclone RC URL</span>
</div>
</div>
<div class="form-control">
<label class="label" for="usenet.rc_user">
<span class="label-text font-medium">Rclone RC Username</span>
</label>
<input type="text" class="input input-bordered"
name="usenet.rc_user" id="usenet.rc_user"
placeholder="rcuser">
<div class="label">
<span class="label-text-alt">Rclone RC Username</span>
</div>
</div>
<div class="form-control">
<label class="label" for="usenet.rc_pass">
<span class="label-text font-medium">Rclone RC Password</span>
</label>
<div class="password-toggle-container">
<input autocomplete="off" type="password" class="input input-bordered webdav-field input-has-toggle"
name="usenet.rc_pass" id="usenet.rc_pass">
<button type="button" class="password-toggle-btn">
<i class="bi bi-eye" id="usenet.rc_pass_icon"></i>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- Usenet Servers Section -->
<div class="flex justify-between items-center">
<h3 class="text-xl font-bold flex items-center">
<i class="bi bi-server mr-2 text-info"></i>Usenet Servers
</h3>
<button type="button" id="addUsenetBtn" class="btn btn-info">
<i class="bi bi-plus mr-2"></i>Add Usenet Server
</button>
</div>
<div id="usenetConfigs" class="space-y-4">
<!-- Dynamic usenet configurations will be added here -->
</div>
</div>
</div>
<!-- SABnzbd Tab Content -->
<div class="tab-content hidden" data-tab-content="sabnzbd">
<div class="space-y-6">
<h2 class="text-2xl font-bold flex items-center mb-6">
<i class="bi bi-download mr-3 text-accent"></i>SABnzbd Settings
</h2>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-4">
<div class="form-control">
<label class="label" for="sabnzbd.download_folder">
<span class="label-text font-medium">Download Folder</span>
</label>
<input type="text" class="input input-bordered" name="sabnzbd.download_folder" id="sabnzbd.download_folder" placeholder="/downloads/sabnzbd">
<div class="label">
<span class="label-text-alt">Folder where SABnzbd downloads files</span>
</div>
</div>
<div class="form-control">
<label class="label" for="sabnzbd.refresh_interval">
<span class="label-text font-medium">Refresh Interval (seconds)</span>
</label>
<input type="number" class="input input-bordered" name="sabnzbd.refresh_interval" id="sabnzbd.refresh_interval" min="1" max="3600">
</div>
<div class="form-control">
<label class="label" for="sabnzbd.categories">
<span class="label-text font-medium">Default Categories</span>
</label>
<input type="text" class="input input-bordered" name="sabnzbd.categories" id="sabnzbd.categories">
</div>
</div>
</div>
</div>
</div> <!-- End tab-content-container -->
</div>
</div>

View File

@@ -4,8 +4,20 @@
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<form id="downloadForm" enctype="multipart/form-data" class="space-y-3">
<!-- Mode Selection -->
<div class="flex justify-center mb-4">
<div class="join">
<button type="button" class="btn btn-primary join-item" id="torrentMode" data-mode="torrent">
<i class="bi bi-magnet mr-2"></i>Torrents
</button>
<button type="button" class="btn btn-outline join-item" id="nzbMode" data-mode="nzb">
<i class="bi bi-file-zip mr-2"></i>NZBs
</button>
</div>
</div>
<!-- Torrent Input Section -->
<div class="space-y-2">
<div class="space-y-2" id="torrentInputs">
<div class="form-control">
<label class="label" for="magnetURI">
<span class="label-text font-semibold">
@@ -42,6 +54,44 @@
</div>
</div>
<!-- NZB Input Section -->
<div class="space-y-2 hidden" id="nzbInputs">
<div class="form-control">
<label class="label" for="nzbURLs">
<span class="label-text font-semibold">
<i class="bi bi-link-45deg mr-2 text-primary"></i>NZB URLs
</span>
<span class="label-text-alt">Paste NZB download URLs</span>
</label>
<textarea class="textarea textarea-bordered h-32 font-mono text-sm"
id="nzbURLs"
name="nzbUrls"
placeholder="Paste your NZB URLs here, one per line..."></textarea>
</div>
<div class="divider">OR</div>
<div class="form-control">
<label class="label">
<span class="label-text font-semibold">
<i class="bi bi-file-earmark-arrow-up mr-2 text-secondary"></i>Upload NZB Files
</span>
<span class="label-text-alt">Select .nzb files</span>
</label>
<input type="file"
class="file-input file-input-bordered w-full"
id="nzbFiles"
name="nzbs"
multiple
accept=".nzb">
<div class="label">
<span class="label-text-alt">
<i class="bi bi-info-circle mr-1"></i>You can select multiple files at once
</span>
</div>
</div>
</div>
<div class="divider"></div>
<!-- Configuration Section -->
@@ -75,7 +125,7 @@
name="downloadFolder"
placeholder="/downloads/torrents">
<div class="label">
<span class="label-text-alt">Leave empty to use default qBittorrent folder</span>
<span class="label-text-alt" id="downloadFolderHint">Leave empty to use default qBittorrent folder</span>
</div>
</div>
</div>
@@ -131,7 +181,7 @@
<!-- Submit Button -->
<div class="form-control">
<button type="submit" class="btn btn-primary btn-lg" id="submitDownload">
<i class="bi bi-cloud-upload mr-2"></i>Add to Download Queue
<i class="bi bi-cloud-upload mr-2"></i><span id="submitButtonText">Add to Download Queue</span>
</button>
</div>
</form>

View File

@@ -4,6 +4,18 @@
<!-- Controls Section -->
<div class="card bg-base-100 shadow-xl">
<div class="card-body">
<!-- Dashboard Mode Toggle -->
<div class="flex justify-center mb-4">
<div class="join">
<button class="btn btn-primary join-item" id="torrentsMode" data-mode="torrents">
<i class="bi bi-magnet mr-2"></i>Torrents
</button>
<button class="btn btn-outline join-item" id="nzbsMode" data-mode="nzbs">
<i class="bi bi-file-zip mr-2"></i>NZBs
</button>
</div>
</div>
<div class="flex flex-col lg:flex-row justify-between items-start lg:items-center gap-4">
<!-- Batch Actions -->
<div class="flex items-center gap-2">
@@ -47,12 +59,13 @@
</div>
</div>
<!-- Torrents Table -->
<!-- Data Table -->
<div class="card bg-base-100 shadow-xl">
<div class="card-body p-0">
<div class="overflow-x-auto">
<table class="table table-hover">
<thead class="bg-base-200">
<!-- Torrents Headers -->
<thead class="bg-base-200" id="torrentsHeaders">
<tr>
<th class="w-12">
<label class="cursor-pointer">
@@ -86,7 +99,41 @@
<th class="font-semibold w-32">Actions</th>
</tr>
</thead>
<tbody id="torrentsList">
<!-- NZBs Headers -->
<thead class="bg-base-200 hidden" id="nzbsHeaders">
<tr>
<th class="w-12">
<label class="cursor-pointer">
<input type="checkbox" class="checkbox checkbox-sm" id="selectAllNzb">
</label>
</th>
<th class="font-semibold">
<i class="bi bi-file-zip mr-2"></i>Name
</th>
<th class="font-semibold">
<i class="bi bi-hdd mr-2"></i>Size
</th>
<th class="font-semibold">
<i class="bi bi-speedometer2 mr-2"></i>Progress
</th>
<th class="font-semibold">
<i class="bi bi-clock mr-2"></i>ETA
</th>
<th class="font-semibold">
<i class="bi bi-tag mr-2"></i>Category
</th>
<th class="font-semibold">
<i class="bi bi-activity mr-2"></i>Status
</th>
<th class="font-semibold">
<i class="bi bi-calendar mr-2"></i>Age
</th>
<th class="font-semibold w-32">Actions</th>
</tr>
</thead>
<tbody id="dataList">
<!-- Dynamic content will be loaded here -->
</tbody>
</table>
@@ -95,7 +142,7 @@
<!-- Pagination -->
<div class="flex flex-col sm:flex-row justify-between items-center p-6 border-t border-base-200 gap-4">
<div class="text-sm text-base-content/70">
<span id="paginationInfo">Loading torrents...</span>
<span id="paginationInfo">Loading data...</span>
</div>
<div class="join" id="paginationControls"></div>
</div>
@@ -108,8 +155,8 @@
<div class="text-6xl text-base-content/30 mb-4">
<i class="bi bi-inbox"></i>
</div>
<h3 class="text-2xl font-bold mb-2">No Torrents Found</h3>
<p class="text-base-content/70 mb-6">You haven't added any torrents yet. Start by adding your first download!</p>
<h3 class="text-2xl font-bold mb-2" id="emptyStateTitle">No Data Found</h3>
<p class="text-base-content/70 mb-6" id="emptyStateMessage">No downloads found.</p>
<a href="{{.URLBase}}download" class="btn btn-primary">
<i class="bi bi-plus-circle mr-2"></i>Add New Download
</a>
@@ -117,7 +164,7 @@
</div>
</div>
<!-- Context Menu -->
<!-- Torrent Context Menu -->
<ul class="menu bg-base-100 shadow-lg rounded-box context-menu hidden fixed z-50" id="torrentContextMenu">
<li class="menu-title">
<span class="torrent-name text-sm font-bold truncate max-w-48"></span>
@@ -135,9 +182,33 @@
</a></li>
</ul>
<!-- NZB Context Menu -->
<ul class="menu bg-base-100 shadow-lg rounded-box context-menu hidden fixed z-50" id="nzbContextMenu">
<li class="menu-title">
<span class="nzb-name text-sm font-bold truncate max-w-48"></span>
</li>
<hr/>
<li><a class="menu-item text-sm" data-action="pause">
<i class="bi bi-pause text-warning"></i>Pause Download
</a></li>
<li><a class="menu-item text-sm" data-action="resume">
<i class="bi bi-play text-success"></i>Resume Download
</a></li>
<li><a class="menu-item text-sm" data-action="retry">
<i class="bi bi-arrow-clockwise text-info"></i>Retry Download
</a></li>
<li><a class="menu-item text-sm" data-action="copy-name">
<i class="bi bi-clipboard text-info"></i>Copy Name
</a></li>
<hr/>
<li><a class="menu-item text-sm text-error" data-action="delete">
<i class="bi bi-trash"></i>Delete NZB
</a></li>
</ul>
<script>
document.addEventListener('DOMContentLoaded', () => {
window.dashboard = new TorrentDashboard();
window.dashboard = new Dashboard();
});
</script>
{{ end }}