commit
bc69aa251b
@ -1,78 +0,0 @@
|
|||||||
parameters:
|
|
||||||
- name: LinuxImage
|
|
||||||
type: string
|
|
||||||
default: "ubuntu-latest"
|
|
||||||
- name: GeneratorVersion
|
|
||||||
type: string
|
|
||||||
default: "5.0.0-beta2"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
- job: GenerateApiClients
|
|
||||||
displayName: 'Generate Api Clients'
|
|
||||||
dependsOn: Test
|
|
||||||
|
|
||||||
pool:
|
|
||||||
vmImage: "${{ parameters.LinuxImage }}"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- task: DownloadPipelineArtifact@2
|
|
||||||
displayName: 'Download OpenAPI Spec Artifact'
|
|
||||||
inputs:
|
|
||||||
source: 'current'
|
|
||||||
artifact: "OpenAPI Spec"
|
|
||||||
path: "$(System.ArtifactsDirectory)/openapispec"
|
|
||||||
runVersion: "latest"
|
|
||||||
|
|
||||||
- task: CmdLine@2
|
|
||||||
displayName: 'Download OpenApi Generator'
|
|
||||||
inputs:
|
|
||||||
script: "wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/${{ parameters.GeneratorVersion }}/openapi-generator-cli-${{ parameters.GeneratorVersion }}.jar -O openapi-generator-cli.jar"
|
|
||||||
|
|
||||||
## Authenticate with npm registry
|
|
||||||
- task: npmAuthenticate@0
|
|
||||||
inputs:
|
|
||||||
workingFile: ./.npmrc
|
|
||||||
customEndpoint: 'jellyfin-bot for NPM'
|
|
||||||
|
|
||||||
## Generate npm api client
|
|
||||||
# Unstable
|
|
||||||
- task: CmdLine@2
|
|
||||||
displayName: 'Build unstable typescript axios client'
|
|
||||||
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
|
|
||||||
inputs:
|
|
||||||
script: "bash ./apiclient/templates/typescript/axios/generate.sh $(System.ArtifactsDirectory) $(Build.BuildNumber)"
|
|
||||||
|
|
||||||
# Stable
|
|
||||||
- task: CmdLine@2
|
|
||||||
displayName: 'Build stable typescript axios client'
|
|
||||||
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
|
|
||||||
inputs:
|
|
||||||
script: "bash ./apiclient/templates/typescript/axios/generate.sh $(System.ArtifactsDirectory)"
|
|
||||||
|
|
||||||
## Run npm install
|
|
||||||
- task: Npm@1
|
|
||||||
displayName: 'Install npm dependencies'
|
|
||||||
inputs:
|
|
||||||
command: install
|
|
||||||
workingDir: ./apiclient/generated/typescript/axios
|
|
||||||
|
|
||||||
## Publish npm packages
|
|
||||||
# Unstable
|
|
||||||
- task: Npm@1
|
|
||||||
displayName: 'Publish unstable typescript axios client'
|
|
||||||
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/master')
|
|
||||||
inputs:
|
|
||||||
command: publish
|
|
||||||
publishRegistry: useFeed
|
|
||||||
publishFeed: 'jellyfin/unstable'
|
|
||||||
workingDir: ./apiclient/generated/typescript/axios
|
|
||||||
|
|
||||||
# Stable
|
|
||||||
- task: Npm@1
|
|
||||||
displayName: 'Publish stable typescript axios client'
|
|
||||||
condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/v')
|
|
||||||
inputs:
|
|
||||||
command: publish
|
|
||||||
publishRegistry: useExternalRegistry
|
|
||||||
publishEndpoint: 'jellyfin-bot for NPM'
|
|
||||||
workingDir: ./apiclient/generated/typescript/axios
|
|
@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: build-debug
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: submodules
|
|
||||||
image: docker:git
|
|
||||||
commands:
|
|
||||||
- git submodule update --init --recursive
|
|
||||||
|
|
||||||
- name: build
|
|
||||||
image: microsoft/dotnet:2-sdk
|
|
||||||
commands:
|
|
||||||
- dotnet publish "Jellyfin.Server" --configuration Debug --output "../ci/ci-debug"
|
|
||||||
|
|
||||||
---
|
|
||||||
kind: pipeline
|
|
||||||
name: build-release
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: submodules
|
|
||||||
image: docker:git
|
|
||||||
commands:
|
|
||||||
- git submodule update --init --recursive
|
|
||||||
|
|
||||||
- name: build
|
|
||||||
image: microsoft/dotnet:2-sdk
|
|
||||||
commands:
|
|
||||||
- dotnet publish "Jellyfin.Server" --configuration Release --output "../ci/ci-release"
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
|||||||
# Joshua must review all changes to deployment and build.sh
|
# Joshua must review all changes to deployment and build.sh
|
||||||
|
.ci/* @joshuaboniface
|
||||||
deployment/* @joshuaboniface
|
deployment/* @joshuaboniface
|
||||||
build.sh @joshuaboniface
|
build.sh @joshuaboniface
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
name: Automation
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request_target:
|
||||||
|
issue_comment:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
label:
|
||||||
|
name: Labeling
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.repository == 'jellyfin/jellyfin' }}
|
||||||
|
steps:
|
||||||
|
- name: Apply label
|
||||||
|
uses: eps1lon/actions-label-merge-conflict@v2.0.1
|
||||||
|
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request_target'}}
|
||||||
|
with:
|
||||||
|
dirtyLabel: 'merge conflict'
|
||||||
|
repoToken: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
|
||||||
|
project:
|
||||||
|
name: Project board
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ github.repository == 'jellyfin/jellyfin' }}
|
||||||
|
steps:
|
||||||
|
- name: Remove from 'Current Release' project
|
||||||
|
uses: alex-page/github-project-automation-plus@v0.8.1
|
||||||
|
if: (github.event.pull_request || github.event.issue.pull_request) && !contains(github.event.*.labels.*.name, 'stable backport')
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
project: Current Release
|
||||||
|
action: delete
|
||||||
|
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
|
||||||
|
- name: Add to 'Release Next' project
|
||||||
|
uses: alex-page/github-project-automation-plus@v0.8.1
|
||||||
|
if: (github.event.pull_request || github.event.issue.pull_request) && github.event.action == 'opened'
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
project: Release Next
|
||||||
|
column: In progress
|
||||||
|
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
|
||||||
|
- name: Add to 'Current Release' project
|
||||||
|
uses: alex-page/github-project-automation-plus@v0.8.1
|
||||||
|
if: (github.event.pull_request || github.event.issue.pull_request) && !contains(github.event.*.labels.*.name, 'stable backport')
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
project: Current Release
|
||||||
|
column: In progress
|
||||||
|
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
|
||||||
|
- name: Check number of comments from the team member
|
||||||
|
if: github.event.issue.pull_request == '' && github.event.comment.author_association == 'MEMBER'
|
||||||
|
id: member_comments
|
||||||
|
run: echo "::set-output name=number::$(curl -s ${{ github.event.issue.comments_url }} | jq '.[] | select(.author_association == "MEMBER") | .author_association' | wc -l)"
|
||||||
|
|
||||||
|
- name: Move issue to needs triage
|
||||||
|
uses: alex-page/github-project-automation-plus@v0.8.1
|
||||||
|
if: github.event.issue.pull_request == '' && github.event.comment.author_association == 'MEMBER' && steps.member_comments.outputs.number <= 1
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
project: Issue Triage for Main Repo
|
||||||
|
column: Needs triage
|
||||||
|
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
|
||||||
|
- name: Add issue to triage project
|
||||||
|
uses: alex-page/github-project-automation-plus@v0.8.1
|
||||||
|
if: github.event.issue.pull_request == '' && github.event.action == 'opened'
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
project: Issue Triage for Main Repo
|
||||||
|
column: Pending response
|
||||||
|
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
@ -0,0 +1,36 @@
|
|||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
schedule:
|
||||||
|
- cron: '24 2 * * 4'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'csharp' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Setup .NET Core
|
||||||
|
uses: actions/setup-dotnet@v1
|
||||||
|
with:
|
||||||
|
dotnet-version: '5.0.x'
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v1
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
queries: +security-extended
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v1
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v1
|
@ -0,0 +1,119 @@
|
|||||||
|
name: Commands
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types:
|
||||||
|
- created
|
||||||
|
- edited
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- labeled
|
||||||
|
- synchronize
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
rebase:
|
||||||
|
name: Rebase
|
||||||
|
if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '@jellyfin-bot rebase') && github.event.comment.author_association == 'MEMBER'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Notify as seen
|
||||||
|
uses: peter-evans/create-or-update-comment@v1.4.5
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
reactions: '+1'
|
||||||
|
|
||||||
|
- name: Checkout the latest code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Automatic Rebase
|
||||||
|
uses: cirrus-actions/rebase@1.4
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
|
||||||
|
check-backport:
|
||||||
|
name: Check Backport
|
||||||
|
if: ${{ ( github.event.issue.pull_request && contains(github.event.comment.body, '@jellyfin-bot check backport') ) || github.event.label.name == 'stable backport' || contains(github.event.pull_request.labels.*.name, 'stable backport' ) }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Notify as seen
|
||||||
|
uses: peter-evans/create-or-update-comment@v1.4.5
|
||||||
|
if: ${{ github.event.comment != null }}
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
comment-id: ${{ github.event.comment.id }}
|
||||||
|
reactions: eyes
|
||||||
|
|
||||||
|
- name: Checkout the latest code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Notify as running
|
||||||
|
id: comment_running
|
||||||
|
uses: peter-evans/create-or-update-comment@v1.4.5
|
||||||
|
if: ${{ github.event.comment != null }}
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
issue-number: ${{ github.event.issue.number }}
|
||||||
|
body: |
|
||||||
|
Running backport tests...
|
||||||
|
|
||||||
|
- name: Perform test backport
|
||||||
|
id: run_tests
|
||||||
|
run: |
|
||||||
|
set +o errexit
|
||||||
|
git config --global user.name "Jellyfin Bot"
|
||||||
|
git config --global user.email "team@jellyfin.org"
|
||||||
|
CURRENT_BRANCH="origin/${GITHUB_HEAD_REF}"
|
||||||
|
git checkout master
|
||||||
|
git merge --no-ff ${CURRENT_BRANCH}
|
||||||
|
MERGE_COMMIT_HASH=$( git log -q -1 | head -1 | awk '{ print $2 }' )
|
||||||
|
git fetch --all
|
||||||
|
CURRENT_STABLE=$( git branch -r | grep 'origin/release' | sort -rV | head -1 | awk -F '/' '{ print $NF }' )
|
||||||
|
stable_branch="Current stable release branch: ${CURRENT_STABLE}"
|
||||||
|
echo ${stable_branch}
|
||||||
|
echo ::set-output name=branch::${stable_branch}
|
||||||
|
git checkout -t origin/${CURRENT_STABLE} -b ${CURRENT_STABLE}
|
||||||
|
git cherry-pick -sx -m1 ${MERGE_COMMIT_HASH} &>output.txt
|
||||||
|
retcode=$?
|
||||||
|
cat output.txt | grep -v 'hint:'
|
||||||
|
output="$( grep -v 'hint:' output.txt )"
|
||||||
|
output="${output//'%'/'%25'}"
|
||||||
|
output="${output//$'\n'/'%0A'}"
|
||||||
|
output="${output//$'\r'/'%0D'}"
|
||||||
|
echo ::set-output name=output::$output
|
||||||
|
exit ${retcode}
|
||||||
|
|
||||||
|
- name: Notify with result success
|
||||||
|
uses: peter-evans/create-or-update-comment@v1.4.5
|
||||||
|
if: ${{ github.event.comment != null && success() }}
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
comment-id: ${{ steps.comment_running.outputs.comment-id }}
|
||||||
|
body: |
|
||||||
|
${{ steps.run_tests.outputs.branch }}
|
||||||
|
Output from `git cherry-pick`:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
${{ steps.run_tests.outputs.output }}
|
||||||
|
reactions: hooray
|
||||||
|
|
||||||
|
- name: Notify with result failure
|
||||||
|
uses: peter-evans/create-or-update-comment@v1.4.5
|
||||||
|
if: ${{ github.event.comment != null && failure() }}
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
|
comment-id: ${{ steps.comment_running.outputs.comment-id }}
|
||||||
|
body: |
|
||||||
|
${{ steps.run_tests.outputs.branch }}
|
||||||
|
Output from `git cherry-pick`:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
${{ steps.run_tests.outputs.output }}
|
||||||
|
reactions: confused
|
@ -0,0 +1,14 @@
|
|||||||
|
<Project>
|
||||||
|
<!-- Sets defaults for all projects in the repo -->
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
|
<CodeAnalysisRuleSet>$(MSBuildThisFileDirectory)/jellyfin.ruleset</CodeAnalysisRuleSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<AnalysisMode>AllEnabledByDefault</AnalysisMode>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
@ -1,13 +1,23 @@
|
|||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
namespace Emby.Dlna.Common
|
namespace Emby.Dlna.Common
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// DLNA Query parameter type, used when querying DLNA devices via SOAP.
|
||||||
|
/// </summary>
|
||||||
public class Argument
|
public class Argument
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets name of the DLNA argument.
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string Direction { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the direction of the parameter.
|
||||||
|
/// </summary>
|
||||||
|
public string Direction { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string RelatedStateVariable { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the related DLNA state variable for this argument.
|
||||||
|
/// </summary>
|
||||||
|
public string RelatedStateVariable { get; set; } = string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,41 @@
|
|||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
|
||||||
namespace Emby.Dlna.Common
|
namespace Emby.Dlna.Common
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the <see cref="DeviceIcon" />.
|
||||||
|
/// </summary>
|
||||||
public class DeviceIcon
|
public class DeviceIcon
|
||||||
{
|
{
|
||||||
public string Url { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the Url.
|
||||||
|
/// </summary>
|
||||||
|
public string Url { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string MimeType { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the MimeType.
|
||||||
|
/// </summary>
|
||||||
|
public string MimeType { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Width.
|
||||||
|
/// </summary>
|
||||||
public int Width { get; set; }
|
public int Width { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Height.
|
||||||
|
/// </summary>
|
||||||
public int Height { get; set; }
|
public int Height { get; set; }
|
||||||
|
|
||||||
public string Depth { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the Depth.
|
||||||
|
/// </summary>
|
||||||
|
public string Depth { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return string.Format(
|
return string.Format(CultureInfo.InvariantCulture, "{0}x{1}", Height, Width);
|
||||||
CultureInfo.InvariantCulture,
|
|
||||||
"{0}x{1}",
|
|
||||||
Height,
|
|
||||||
Width);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,36 @@
|
|||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
namespace Emby.Dlna.Common
|
namespace Emby.Dlna.Common
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the <see cref="DeviceService" />.
|
||||||
|
/// </summary>
|
||||||
public class DeviceService
|
public class DeviceService
|
||||||
{
|
{
|
||||||
public string ServiceType { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the Service Type.
|
||||||
|
/// </summary>
|
||||||
|
public string ServiceType { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string ServiceId { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the Service Id.
|
||||||
|
/// </summary>
|
||||||
|
public string ServiceId { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string ScpdUrl { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the Scpd Url.
|
||||||
|
/// </summary>
|
||||||
|
public string ScpdUrl { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string ControlUrl { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the Control Url.
|
||||||
|
/// </summary>
|
||||||
|
public string ControlUrl { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string EventSubUrl { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the EventSubUrl.
|
||||||
|
/// </summary>
|
||||||
|
public string EventSubUrl { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override string ToString()
|
public override string ToString() => ServiceId;
|
||||||
=> ServiceId;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,31 @@
|
|||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Emby.Dlna.Common
|
namespace Emby.Dlna.Common
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the <see cref="ServiceAction" />.
|
||||||
|
/// </summary>
|
||||||
public class ServiceAction
|
public class ServiceAction
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="ServiceAction"/> class.
|
||||||
|
/// </summary>
|
||||||
public ServiceAction()
|
public ServiceAction()
|
||||||
{
|
{
|
||||||
ArgumentList = new List<Argument>();
|
ArgumentList = new List<Argument>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Name { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the name of the action.
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the ArgumentList.
|
||||||
|
/// </summary>
|
||||||
public List<Argument> ArgumentList { get; }
|
public List<Argument> ArgumentList { get; }
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override string ToString()
|
public override string ToString() => Name;
|
||||||
{
|
|
||||||
return Name;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,27 +1,34 @@
|
|||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Emby.Dlna.Common
|
namespace Emby.Dlna.Common
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the <see cref="StateVariable" />.
|
||||||
|
/// </summary>
|
||||||
public class StateVariable
|
public class StateVariable
|
||||||
{
|
{
|
||||||
public StateVariable()
|
/// <summary>
|
||||||
{
|
/// Gets or sets the name of the state variable.
|
||||||
AllowedValues = Array.Empty<string>();
|
/// </summary>
|
||||||
}
|
public string Name { get; set; } = string.Empty;
|
||||||
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
public string DataType { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the data type of the state variable.
|
||||||
|
/// </summary>
|
||||||
|
public string DataType { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether it sends events.
|
||||||
|
/// </summary>
|
||||||
public bool SendsEvents { get; set; }
|
public bool SendsEvents { get; set; }
|
||||||
|
|
||||||
public IReadOnlyList<string> AllowedValues { get; set; }
|
/// <summary>
|
||||||
|
/// Gets or sets the allowed values range.
|
||||||
|
/// </summary>
|
||||||
|
public IReadOnlyList<string> AllowedValues { get; set; } = Array.Empty<string>();
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override string ToString()
|
public override string ToString() => Name;
|
||||||
=> Name;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,19 +1,25 @@
|
|||||||
#nullable enable
|
|
||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using Emby.Naming.Common;
|
using Emby.Naming.Common;
|
||||||
|
using Jellyfin.Extensions;
|
||||||
|
|
||||||
namespace Emby.Naming.Audio
|
namespace Emby.Naming.Audio
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Static helper class to determine if file at path is audio file.
|
||||||
|
/// </summary>
|
||||||
public static class AudioFileParser
|
public static class AudioFileParser
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Static helper method to determine if file at path is audio file.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Path to file.</param>
|
||||||
|
/// <param name="options"><see cref="NamingOptions"/> containing AudioFileExtensions.</param>
|
||||||
|
/// <returns>True if file at path is audio file.</returns>
|
||||||
public static bool IsAudioFile(string path, NamingOptions options)
|
public static bool IsAudioFile(string path, NamingOptions options)
|
||||||
{
|
{
|
||||||
var extension = Path.GetExtension(path);
|
var extension = Path.GetExtension(path.AsSpan());
|
||||||
return options.AudioFileExtensions.Contains(extension, StringComparer.OrdinalIgnoreCase);
|
return options.AudioFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,18 @@
|
|||||||
#nullable enable
|
|
||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
namespace Emby.Naming.AudioBook
|
namespace Emby.Naming.AudioBook
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Data object for passing result of audiobook part/chapter extraction.
|
||||||
|
/// </summary>
|
||||||
public struct AudioBookFilePathParserResult
|
public struct AudioBookFilePathParserResult
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets optional number of path extracted from audiobook filename.
|
||||||
|
/// </summary>
|
||||||
public int? PartNumber { get; set; }
|
public int? PartNumber { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets optional number of chapter extracted from audiobook filename.
|
||||||
|
/// </summary>
|
||||||
public int? ChapterNumber { get; set; }
|
public int? ChapterNumber { get; set; }
|
||||||
|
|
||||||
public bool Success { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue