5 Commits

Author SHA1 Message Date
501e81c2c5 added tag 2.0.1 to dockerfile
All checks were successful
continuous-integration/drone/push Build is passing
2019-06-04 22:58:33 +02:00
c8e3c1b9f5 updated readme 2019-06-04 22:48:15 +02:00
0b818452b0 Added mass disable / enable 2019-06-04 22:46:26 +02:00
f190d3b5af added emby as hint 2019-06-04 22:12:05 +02:00
babd41055f updated packages 2019-06-04 21:46:42 +02:00
9 changed files with 144 additions and 66 deletions

View File

@@ -5,6 +5,7 @@ pipeline:
tags: tags:
- latest - latest
- 2.0 - 2.0
- 2.0.1
secrets: [ docker_username, docker_password ] secrets: [ docker_username, docker_password ]
debug: true debug: true
when: when:

View File

@@ -12,8 +12,9 @@ There are more features than just changing the URL:
- Resorting of the channel list - Resorting of the channel list
- Enable or disable a channel - Enable or disable a channel
- Override the channel number -> better EPG Detection support in plex - Enable or disable multiple channels at once
- Override the channel name -> better EPG Detection support in plex - Override the channel number -> better EPG Detection support in plex / emby
- Override the channel name -> better EPG Detection support in plex / emby
This is licensed under GPLv2. See License file. This is licensed under GPLv2. See License file.

View File

@@ -5,7 +5,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="2.2.0" />
</ItemGroup> </ItemGroup>

View File

@@ -6,9 +6,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.3" />
</ItemGroup> </ItemGroup>

View File

@@ -12,9 +12,9 @@ namespace Tv7Playlist.Controllers
{ {
public class HomeController : Controller public class HomeController : Controller
{ {
private readonly IAppConfig _appConfig;
private readonly PlaylistContext _playlistContext; private readonly PlaylistContext _playlistContext;
private readonly IPlaylistSynchronizer _playlistSynchronizer; private readonly IPlaylistSynchronizer _playlistSynchronizer;
private readonly IAppConfig _appConfig;
public HomeController(PlaylistContext playlistContext, IPlaylistSynchronizer playlistSynchronizer, IAppConfig appConfig) public HomeController(PlaylistContext playlistContext, IPlaylistSynchronizer playlistSynchronizer, IAppConfig appConfig)
{ {
@@ -26,12 +26,29 @@ namespace Tv7Playlist.Controllers
[HttpGet] [HttpGet]
public async Task<IActionResult> Index() public async Task<IActionResult> Index()
{ {
var playlistEntries = await _playlistContext.PlaylistEntries.AsNoTracking().OrderBy(e => e.Position).ToListAsync(); var playlistEntries = await _playlistContext.PlaylistEntries.AsNoTracking().OrderBy(e => e.Position)
.Select(e => new PlaylistEntryModel(e)).ToListAsync();
var model = new HomeModel(playlistEntries); var model = new HomeModel(playlistEntries);
return View(model); return View(model);
} }
[HttpPost]
public async Task<IActionResult> DisableSelectedEntries([FromForm] HomeModel model)
{
if (ModelState.IsValid) await UpdateEnabledForItems(model, false);
return Redirect("/");
}
[HttpPost]
public async Task<IActionResult> EnableSelectedEntries([FromForm] HomeModel model)
{
if (ModelState.IsValid) await UpdateEnabledForItems(model, true);
return Redirect("/");
}
[HttpGet] [HttpGet]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error() public IActionResult Error()
@@ -54,8 +71,23 @@ namespace Tv7Playlist.Controllers
public async Task<IActionResult> Synchronize(bool ok) public async Task<IActionResult> Synchronize(bool ok)
{ {
await _playlistSynchronizer.SynchronizeAsync(); await _playlistSynchronizer.SynchronizeAsync();
return RedirectToAction("Index", "Home"); return RedirectToAction("Index", "Home");
} }
private async Task UpdateEnabledForItems(HomeModel model, bool isEnabled)
{
if (model == null) throw new ArgumentNullException(nameof(model));
var idsToUpdate = model.PlaylistEntries.Where(e => e.Selected).Select(e => e.Id);
foreach (var id in idsToUpdate)
{
var entry = await _playlistContext.PlaylistEntries.FindAsync(id);
if (entry == null) continue;
entry.IsEnabled = isEnabled;
}
await _playlistContext.SaveChangesAsync();
}
} }
} }

View File

@@ -1,16 +1,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Tv7Playlist.Data;
namespace Tv7Playlist.Models namespace Tv7Playlist.Models
{ {
public class HomeModel public class HomeModel
{ {
public HomeModel(List<PlaylistEntry> playlistEntries) public HomeModel()
{
}
public HomeModel(List<PlaylistEntryModel> playlistEntries)
{ {
PlaylistEntries = playlistEntries ?? throw new ArgumentNullException(nameof(playlistEntries)); PlaylistEntries = playlistEntries ?? throw new ArgumentNullException(nameof(playlistEntries));
} }
public List<PlaylistEntry> PlaylistEntries { get; } public List<PlaylistEntryModel> PlaylistEntries { get; set; }
} }
} }

View File

@@ -0,0 +1,24 @@
using System;
using Tv7Playlist.Data;
namespace Tv7Playlist.Models
{
public class PlaylistEntryModel
{
public PlaylistEntryModel()
{
}
public PlaylistEntryModel(PlaylistEntry entry)
{
Entry = entry ?? throw new ArgumentNullException(nameof(entry));
Id = entry.Id;
}
public Guid Id { get; set; }
public PlaylistEntry Entry { get; set; }
public bool Selected { get; set; }
}
}

View File

@@ -3,14 +3,15 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework> <TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<LangVersion>latest</LangVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" /> <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.4" />
</ItemGroup> </ItemGroup>

View File

@@ -3,56 +3,72 @@
ViewData["Title"] = "TV7 Playlist"; ViewData["Title"] = "TV7 Playlist";
} }
<div class="row"> <form method="post">
<div class="col col-12">
<table class="table table-hover table-striped"> <div class="row">
<tr> <div class="col col-4">
<th></th> <button class="btn btn-warning" asp-action="DisableSelectedEntries" asp-controller="Home">Disable selected</button>
<th>Number Import</th> <button class="btn btn-info" asp-action="EnableSelectedEntries" asp-controller="Home">Enable selected</button>
<th>Number Export</th> </div>
<th>Position</th>
<th>Name</th>
<th>EPG Name</th>
<th>Enabled</th>
<th>Available</th>
<th>URL Proxy</th>
<th>URL Original</th>
<th>Created</th>
<th>Modified</th>
</tr>
@{
foreach (var channel in Model.PlaylistEntries)
{
<tr>
<td>
<a class="btn btn-secondary" asp-area="" asp-controller="PlaylistEntry" asp-action="Edit" asp-route-id="@channel.Id">Edit</a>
<a class="btn btn-danger" asp-area="" asp-controller="PlaylistEntry" asp-action="Delete" asp-route-id="@channel.Id">Delete</a>
@{
if (channel.IsEnabled)
{
<a class="btn btn-warning" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@channel.Id">Disable</a>
}
else
{
<a class="btn btn-info" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@channel.Id">Enable</a>
}
}
</td>
<td>@channel.ChannelNumberImport</td>
<td>@channel.ChannelNumberExport</td>
<td>@channel.Position</td>
<td>@channel.Name</td>
<td>@channel.EpgMatchName</td>
<td class="text-center">@Html.Raw(channel.IsEnabled ? "<span class=\"text-primary\">Enabled</span>" : "<span class=\"text-danger\">Disabled</span>")</td>
<td class="text-center">@Html.Raw(channel.IsAvailable ? "<span class=\"text-primary\">yes</span>" : "<span class=\"text-danger\">no</span>")</td>
<td>@channel.UrlProxy</td>
<td>@channel.UrlOriginal</td>
<td>@channel.Created.ToString("g")</td>
<td>@channel.Modified.ToString("g")</td>
</tr>
}
}
</table>
</div> </div>
</div>
<div class="row">
<div class="col col-12">
<table class="table table-hover table-striped">
<tr>
<th>Selected</th>
<th>Single Action</th>
<th>Number Import</th>
<th>Number Export</th>
<th>Position</th>
<th>Name</th>
<th>EPG Name</th>
<th>Enabled</th>
<th>Available</th>
<th>URL Proxy</th>
<th>URL Original</th>
<th>Created</th>
<th>Modified</th>
</tr>
@{
for (var i = 0; i < Model.PlaylistEntries.Count; i++)
{
@Html.HiddenFor(m => m.PlaylistEntries[i].Id)
<tr>
<td>
<input asp-for="PlaylistEntries[i].Selected" type="checkbox" />
</td>
<td>
<a class="btn btn-secondary" asp-area="" asp-controller="PlaylistEntry" asp-action="Edit" asp-route-id="@Model.PlaylistEntries[i].Id">Edit</a>
<a class="btn btn-danger" asp-area="" asp-controller="PlaylistEntry" asp-action="Delete" asp-route-id="@Model.PlaylistEntries[i].Id">Delete</a>
@{
if (Model.PlaylistEntries[i].Entry.IsEnabled)
{
<a class="btn btn-warning" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@Model.PlaylistEntries[i].Id">Disable</a>
}
else
{
<a class="btn btn-info" asp-area="" asp-controller="PlaylistEntry" asp-action="ToggleEnabled" asp-route-id="@Model.PlaylistEntries[i].Id">Enable</a>
}
}
</td>
<td>@Model.PlaylistEntries[i].Entry.ChannelNumberImport</td>
<td>@Model.PlaylistEntries[i].Entry.ChannelNumberExport</td>
<td>@Model.PlaylistEntries[i].Entry.Position</td>
<td>@Model.PlaylistEntries[i].Entry.Name</td>
<td>@Model.PlaylistEntries[i].Entry.EpgMatchName</td>
<td class="text-center">@Html.Raw(Model.PlaylistEntries[i].Entry.IsEnabled ? "<span class=\"text-primary\">Enabled</span>" : "<span class=\"text-danger\">Disabled</span>")</td>
<td class="text-center">@Html.Raw(Model.PlaylistEntries[i].Entry.IsAvailable ? "<span class=\"text-primary\">yes</span>" : "<span class=\"text-danger\">no</span>")</td>
<td>@Model.PlaylistEntries[i].Entry.UrlProxy</td>
<td>@Model.PlaylistEntries[i].Entry.UrlOriginal</td>
<td>@Model.PlaylistEntries[i].Entry.Created.ToString("g")</td>
<td>@Model.PlaylistEntries[i].Entry.Modified.ToString("g")</td>
</tr>
}
}
</table>
</div>
</div>
</form>