mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 04:14:39 +03:00
feat: Make DLNA port configurable (#4836)
--------- Signed-off-by: Ivan Pedrazas <ipedrazas@gmail.com> Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com>
This commit is contained in:
@@ -469,6 +469,8 @@ input ConfigDLNAInput {
|
|||||||
serverName: String
|
serverName: String
|
||||||
"True if DLNA service should be enabled by default"
|
"True if DLNA service should be enabled by default"
|
||||||
enabled: Boolean
|
enabled: Boolean
|
||||||
|
"Defaults to 1338"
|
||||||
|
port: Int
|
||||||
"List of IPs whitelisted for DLNA service"
|
"List of IPs whitelisted for DLNA service"
|
||||||
whitelistedIPs: [String!]
|
whitelistedIPs: [String!]
|
||||||
"List of interfaces to run DLNA on. Empty for all"
|
"List of interfaces to run DLNA on. Empty for all"
|
||||||
@@ -481,6 +483,8 @@ type ConfigDLNAResult {
|
|||||||
serverName: String!
|
serverName: String!
|
||||||
"True if DLNA service should be enabled by default"
|
"True if DLNA service should be enabled by default"
|
||||||
enabled: Boolean!
|
enabled: Boolean!
|
||||||
|
"Defaults to 1338"
|
||||||
|
port: Int!
|
||||||
"List of IPs whitelisted for DLNA service"
|
"List of IPs whitelisted for DLNA service"
|
||||||
whitelistedIPs: [String!]!
|
whitelistedIPs: [String!]!
|
||||||
"List of interfaces to run DLNA on. Empty for all"
|
"List of interfaces to run DLNA on. Empty for all"
|
||||||
|
|||||||
@@ -576,6 +576,10 @@ func (r *mutationResolver) ConfigureDlna(ctx context.Context, input ConfigDLNAIn
|
|||||||
c.Set(config.DLNAVideoSortOrder, input.VideoSortOrder)
|
c.Set(config.DLNAVideoSortOrder, input.VideoSortOrder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if input.Port != nil {
|
||||||
|
c.Set(config.DLNAPort, *input.Port)
|
||||||
|
}
|
||||||
|
|
||||||
refresh := false
|
refresh := false
|
||||||
if input.Enabled != nil {
|
if input.Enabled != nil {
|
||||||
c.Set(config.DLNADefaultEnabled, *input.Enabled)
|
c.Set(config.DLNADefaultEnabled, *input.Enabled)
|
||||||
|
|||||||
@@ -199,6 +199,7 @@ func makeConfigDLNAResult() *ConfigDLNAResult {
|
|||||||
return &ConfigDLNAResult{
|
return &ConfigDLNAResult{
|
||||||
ServerName: config.GetDLNAServerName(),
|
ServerName: config.GetDLNAServerName(),
|
||||||
Enabled: config.GetDLNADefaultEnabled(),
|
Enabled: config.GetDLNADefaultEnabled(),
|
||||||
|
Port: config.GetDLNAPort(),
|
||||||
WhitelistedIPs: config.GetDLNADefaultIPWhitelist(),
|
WhitelistedIPs: config.GetDLNADefaultIPWhitelist(),
|
||||||
Interfaces: config.GetDLNAInterfaces(),
|
Interfaces: config.GetDLNAInterfaces(),
|
||||||
VideoSortOrder: config.GetVideoSortOrder(),
|
VideoSortOrder: config.GetVideoSortOrder(),
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ type Config interface {
|
|||||||
GetDLNAServerName() string
|
GetDLNAServerName() string
|
||||||
GetDLNADefaultIPWhitelist() []string
|
GetDLNADefaultIPWhitelist() []string
|
||||||
GetVideoSortOrder() string
|
GetVideoSortOrder() string
|
||||||
|
GetDLNAPortAsString() string
|
||||||
}
|
}
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
@@ -138,7 +139,7 @@ func (s *Service) init() error {
|
|||||||
var dmsConfig = &dmsConfig{
|
var dmsConfig = &dmsConfig{
|
||||||
Path: "",
|
Path: "",
|
||||||
IfNames: s.config.GetDLNADefaultIPWhitelist(),
|
IfNames: s.config.GetDLNADefaultIPWhitelist(),
|
||||||
Http: ":1338",
|
Http: s.config.GetDLNAPortAsString(),
|
||||||
FriendlyName: friendlyName,
|
FriendlyName: friendlyName,
|
||||||
LogHeaders: false,
|
LogHeaders: false,
|
||||||
NotifyInterval: 30 * time.Second,
|
NotifyInterval: 30 * time.Second,
|
||||||
@@ -241,7 +242,7 @@ func (s *Service) Start(duration *time.Duration) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
logger.Info("Starting DLNA")
|
logger.Info("Starting DLNA " + s.server.HTTPConn.Addr().String())
|
||||||
if err := s.server.Serve(); err != nil {
|
if err := s.server.Serve(); err != nil {
|
||||||
logger.Error(err)
|
logger.Error(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"sync"
|
"sync"
|
||||||
@@ -237,6 +238,9 @@ const (
|
|||||||
DLNAVideoSortOrder = "dlna.video_sort_order"
|
DLNAVideoSortOrder = "dlna.video_sort_order"
|
||||||
dlnaVideoSortOrderDefault = "title"
|
dlnaVideoSortOrderDefault = "title"
|
||||||
|
|
||||||
|
DLNAPort = "dlna.port"
|
||||||
|
DLNAPortDefault = 1338
|
||||||
|
|
||||||
// Logging options
|
// Logging options
|
||||||
LogFile = "logFile"
|
LogFile = "logFile"
|
||||||
LogOut = "logOut"
|
LogOut = "logOut"
|
||||||
@@ -1477,6 +1481,21 @@ func (i *Config) GetDLNAInterfaces() []string {
|
|||||||
return i.getStringSlice(DLNAInterfaces)
|
return i.getStringSlice(DLNAInterfaces)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDLNAPort returns the port to run the DLNA server on. If empty, 1338
|
||||||
|
// will be used.
|
||||||
|
func (i *Config) GetDLNAPort() int {
|
||||||
|
ret := i.getInt(DLNAPort)
|
||||||
|
if ret == 0 {
|
||||||
|
ret = DLNAPortDefault
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDLNAPortAsString returns the port to run the DLNA server on as a string.
|
||||||
|
func (i *Config) GetDLNAPortAsString() string {
|
||||||
|
return ":" + strconv.Itoa(i.GetDLNAPort())
|
||||||
|
}
|
||||||
|
|
||||||
// GetVideoSortOrder returns the sort order to display videos. If
|
// GetVideoSortOrder returns the sort order to display videos. If
|
||||||
// empty, videos will be sorted by titles.
|
// empty, videos will be sorted by titles.
|
||||||
func (i *Config) GetVideoSortOrder() string {
|
func (i *Config) GetVideoSortOrder() string {
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ func TestConcurrentConfigAccess(t *testing.T) {
|
|||||||
i.Set(DLNADefaultEnabled, i.GetDLNADefaultEnabled())
|
i.Set(DLNADefaultEnabled, i.GetDLNADefaultEnabled())
|
||||||
i.Set(DLNADefaultIPWhitelist, i.GetDLNADefaultIPWhitelist())
|
i.Set(DLNADefaultIPWhitelist, i.GetDLNADefaultIPWhitelist())
|
||||||
i.Set(DLNAInterfaces, i.GetDLNAInterfaces())
|
i.Set(DLNAInterfaces, i.GetDLNAInterfaces())
|
||||||
|
i.Set(DLNAPort, i.GetDLNAPort())
|
||||||
i.Set(LogFile, i.GetLogFile())
|
i.Set(LogFile, i.GetLogFile())
|
||||||
i.Set(LogOut, i.GetLogOut())
|
i.Set(LogOut, i.GetLogOut())
|
||||||
i.Set(LogLevel, i.GetLogLevel())
|
i.Set(LogLevel, i.GetLogLevel())
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ fragment ConfigInterfaceData on ConfigInterfaceResult {
|
|||||||
fragment ConfigDLNAData on ConfigDLNAResult {
|
fragment ConfigDLNAData on ConfigDLNAResult {
|
||||||
serverName
|
serverName
|
||||||
enabled
|
enabled
|
||||||
|
port
|
||||||
whitelistedIPs
|
whitelistedIPs
|
||||||
interfaces
|
interfaces
|
||||||
videoSortOrder
|
videoSortOrder
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import {
|
|||||||
StringListSetting,
|
StringListSetting,
|
||||||
StringSetting,
|
StringSetting,
|
||||||
SelectSetting,
|
SelectSetting,
|
||||||
|
NumberSetting,
|
||||||
} from "./Inputs";
|
} from "./Inputs";
|
||||||
import { useSettings } from "./context";
|
import { useSettings } from "./context";
|
||||||
import {
|
import {
|
||||||
@@ -31,6 +32,8 @@ import {
|
|||||||
faUserClock,
|
faUserClock,
|
||||||
} from "@fortawesome/free-solid-svg-icons";
|
} from "@fortawesome/free-solid-svg-icons";
|
||||||
|
|
||||||
|
const defaultDLNAPort = 1338;
|
||||||
|
|
||||||
export const SettingsServicesPanel: React.FC = () => {
|
export const SettingsServicesPanel: React.FC = () => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const Toast = useToast();
|
const Toast = useToast();
|
||||||
@@ -417,6 +420,15 @@ export const SettingsServicesPanel: React.FC = () => {
|
|||||||
onChange={(v) => saveDLNA({ serverName: v })}
|
onChange={(v) => saveDLNA({ serverName: v })}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<NumberSetting
|
||||||
|
headingID="config.dlna.server_port"
|
||||||
|
subHeading={intl.formatMessage({
|
||||||
|
id: "config.dlna.server_port_desc",
|
||||||
|
})}
|
||||||
|
value={dlna.port ?? undefined}
|
||||||
|
onChange={(v) => saveDLNA({ port: v ? v : defaultDLNAPort })}
|
||||||
|
/>
|
||||||
|
|
||||||
<BooleanSetting
|
<BooleanSetting
|
||||||
id="dlna-enabled-by-default"
|
id="dlna-enabled-by-default"
|
||||||
headingID="config.dlna.enabled_by_default"
|
headingID="config.dlna.enabled_by_default"
|
||||||
|
|||||||
@@ -257,6 +257,8 @@
|
|||||||
"recent_ip_addresses": "Recent IP addresses",
|
"recent_ip_addresses": "Recent IP addresses",
|
||||||
"server_display_name": "Server Display Name",
|
"server_display_name": "Server Display Name",
|
||||||
"server_display_name_desc": "Display name for the DLNA server. Defaults to {server_name} if empty.",
|
"server_display_name_desc": "Display name for the DLNA server. Defaults to {server_name} if empty.",
|
||||||
|
"server_port": "Server Port",
|
||||||
|
"server_port_desc": "Port to run the DLNA server on. Requires DLNA restart after changing.",
|
||||||
"successfully_cancelled_temporary_behaviour": "Successfully cancelled temporary behaviour",
|
"successfully_cancelled_temporary_behaviour": "Successfully cancelled temporary behaviour",
|
||||||
"until_restart": "until restart",
|
"until_restart": "until restart",
|
||||||
"video_sort_order": "Default Video Sort Order",
|
"video_sort_order": "Default Video Sort Order",
|
||||||
|
|||||||
Reference in New Issue
Block a user