mirror of https://github.com/ErsatzTV/ErsatzTV.git
Browse Source
* wip * remove transcode property; use i18n * add api * use computed table headers for i18npull/769/head
14 changed files with 166 additions and 18 deletions
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
using ErsatzTV.Core.Api.FFmpegProfiles; |
||||
|
||||
namespace ErsatzTV.Application.FFmpegProfiles; |
||||
|
||||
public record GetAllFFmpegProfilesForApi : IRequest<List<FFmpegProfileResponseModel>>; |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
using ErsatzTV.Core.Api.FFmpegProfiles; |
||||
using ErsatzTV.Core.Domain; |
||||
using ErsatzTV.Infrastructure.Data; |
||||
using Microsoft.EntityFrameworkCore; |
||||
using static ErsatzTV.Application.FFmpegProfiles.Mapper; |
||||
|
||||
namespace ErsatzTV.Application.FFmpegProfiles; |
||||
|
||||
public class |
||||
GetAllFFmpegProfilesForApiHandler : IRequestHandler<GetAllFFmpegProfilesForApi, List<FFmpegProfileResponseModel>> |
||||
{ |
||||
private readonly IDbContextFactory<TvContext> _dbContextFactory; |
||||
|
||||
public GetAllFFmpegProfilesForApiHandler(IDbContextFactory<TvContext> dbContextFactory) => |
||||
_dbContextFactory = dbContextFactory; |
||||
|
||||
public async Task<List<FFmpegProfileResponseModel>> Handle( |
||||
GetAllFFmpegProfilesForApi request, |
||||
CancellationToken cancellationToken) |
||||
{ |
||||
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken); |
||||
List<FFmpegProfile> ffmpegProfiles = await dbContext.FFmpegProfiles |
||||
.AsNoTracking() |
||||
.Include(p => p.Resolution) |
||||
.ToListAsync(cancellationToken); |
||||
return ffmpegProfiles.Map(ProjectToResponseModel).ToList(); |
||||
} |
||||
} |
@ -1,9 +1,11 @@
@@ -1,9 +1,11 @@
|
||||
namespace ErsatzTV.Core.Api.Channels; |
||||
using Newtonsoft.Json; |
||||
|
||||
namespace ErsatzTV.Core.Api.Channels; |
||||
|
||||
public record ChannelResponseModel( |
||||
int Id, |
||||
string Number, |
||||
string Name, |
||||
string FFmpegProfile, |
||||
[property: JsonProperty("ffmpegProfile")] string FFmpegProfile, |
||||
string Language, |
||||
string StreamingMode); |
||||
|
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
namespace ErsatzTV.Core.Api.FFmpegProfiles; |
||||
|
||||
public record FFmpegProfileResponseModel( |
||||
int Id, |
||||
string Name, |
||||
string Resolution, |
||||
string Video, |
||||
string Audio); |
@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
|
||||
using ErsatzTV.Application.FFmpegProfiles; |
||||
using ErsatzTV.Core.Api.FFmpegProfiles; |
||||
using MediatR; |
||||
using Microsoft.AspNetCore.Mvc; |
||||
|
||||
namespace ErsatzTV.Controllers.Api; |
||||
|
||||
[ApiController] |
||||
public class FFmpegProfileController |
||||
{ |
||||
private readonly IMediator _mediator; |
||||
|
||||
public FFmpegProfileController(IMediator mediator) => _mediator = mediator; |
||||
|
||||
[HttpGet("/api/ffmpeg/profiles")] |
||||
public async Task<List<FFmpegProfileResponseModel>> GetAll() => |
||||
await _mediator.Send(new GetAllFFmpegProfilesForApi()); |
||||
} |
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
export interface FFmpegProfile { |
||||
id: number; |
||||
name: string; |
||||
resolution: string; |
||||
video: string; |
||||
audio: string; |
||||
} |
@ -0,0 +1,18 @@
@@ -0,0 +1,18 @@
|
||||
import { AbstractApiService } from './AbstractApiService'; |
||||
import { FFmpegProfile } from '@/models/FFmpegProfile'; |
||||
|
||||
class FFmpegProfileApiService extends AbstractApiService { |
||||
public constructor() { |
||||
super(); |
||||
} |
||||
|
||||
public getAll(): Promise<FFmpegProfile[]> { |
||||
return this.http |
||||
.get('/api/ffmpeg/profiles') |
||||
.then(this.handleResponse.bind(this)) |
||||
.catch(this.handleError.bind(this)); |
||||
} |
||||
} |
||||
|
||||
export const ffmpegProfileApiService: FFmpegProfileApiService = |
||||
new FFmpegProfileApiService(); |
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
<template> |
||||
<div> |
||||
<v-data-table |
||||
:headers="headers" |
||||
:items="ffmpegProfiles" |
||||
:sort-by="['name']" |
||||
class="elevation-1" |
||||
> |
||||
</v-data-table> |
||||
</div> |
||||
</template> |
||||
|
||||
<script lang="ts"> |
||||
import { Vue, Component } from 'vue-property-decorator'; |
||||
import { FFmpegProfile } from '@/models/FFmpegProfile'; |
||||
import { ffmpegProfileApiService } from '@/services/FFmpegProfileService'; |
||||
|
||||
@Component |
||||
export default class FFmpegProfiles extends Vue { |
||||
private ffmpegProfiles: FFmpegProfile[] = []; |
||||
|
||||
get headers() { |
||||
return [ |
||||
{ text: this.$t('ffmpeg-profiles.table.name'), value: 'name' }, |
||||
{ |
||||
text: this.$t('ffmpeg-profiles.table.resolution'), |
||||
value: 'resolution' |
||||
}, |
||||
{ text: this.$t('ffmpeg-profiles.table.video'), value: 'video' }, |
||||
{ text: this.$t('ffmpeg-profiles.table.audio'), value: 'audio' } |
||||
]; |
||||
} |
||||
|
||||
title: string = 'FFMpeg Profiles'; |
||||
|
||||
async mounted(): Promise<void> { |
||||
this.ffmpegProfiles = await ffmpegProfileApiService.getAll(); |
||||
} |
||||
} |
||||
</script> |
Loading…
Reference in new issue