aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations
diff options
context:
space:
mode:
authorDavid Ullmer <daullmer@gmail.com>2021-02-11 13:48:58 +0100
committerDavid Ullmer <daullmer@gmail.com>2021-02-11 13:48:58 +0100
commitab5fb1b1f201795041a960c74b540c768fe8d08b (patch)
tree579964cea4db7e04299084d555e493b9dc74ca54 /Emby.Server.Implementations
parentae57ed4ac70eda1046c86e40e41b9683b2115f59 (diff)
parentd490c1c2bcb2852c9159e8578bc7a60e086e4202 (diff)
Merge branch 'master' of github.com:jellyfin/jellyfin into nfo-watched
Diffstat (limited to 'Emby.Server.Implementations')
-rw-r--r--Emby.Server.Implementations/HttpServer/WebSocketConnection.cs52
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs2
-rw-r--r--Emby.Server.Implementations/Localization/Core/eo.json26
-rw-r--r--Emby.Server.Implementations/Localization/Core/fi.json148
-rw-r--r--Emby.Server.Implementations/Localization/Core/hi.json4
-rw-r--r--Emby.Server.Implementations/Plugins/PluginManager.cs4
-rw-r--r--Emby.Server.Implementations/Session/SessionManager.cs7
7 files changed, 133 insertions, 110 deletions
diff --git a/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs b/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
index fed2addf8..7e0c2c1da 100644
--- a/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
+++ b/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
@@ -5,6 +5,7 @@ using System.Buffers;
using System.IO.Pipelines;
using System.Net;
using System.Net.WebSockets;
+using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@@ -138,7 +139,7 @@ namespace Emby.Server.Implementations.HttpServer
writer.Advance(bytesRead);
// Make the data available to the PipeReader
- FlushResult flushResult = await writer.FlushAsync().ConfigureAwait(false);
+ FlushResult flushResult = await writer.FlushAsync(cancellationToken).ConfigureAwait(false);
if (flushResult.IsCompleted)
{
// The PipeReader stopped reading
@@ -181,32 +182,16 @@ namespace Emby.Server.Implementations.HttpServer
}
WebSocketMessage<object>? stub;
+ long bytesConsumed = 0;
try
{
-
- if (buffer.IsSingleSegment)
- {
- stub = JsonSerializer.Deserialize<WebSocketMessage<object>>(buffer.FirstSpan, _jsonOptions);
- }
- else
- {
- var buf = ArrayPool<byte>.Shared.Rent(Convert.ToInt32(buffer.Length));
- try
- {
- buffer.CopyTo(buf);
- stub = JsonSerializer.Deserialize<WebSocketMessage<object>>(buf, _jsonOptions);
- }
- finally
- {
- ArrayPool<byte>.Shared.Return(buf);
- }
- }
+ stub = DeserializeWebSocketMessage(buffer, out bytesConsumed);
}
catch (JsonException ex)
{
// Tell the PipeReader how much of the buffer we have consumed
reader.AdvanceTo(buffer.End);
- _logger.LogError(ex, "Error processing web socket message");
+ _logger.LogError(ex, "Error processing web socket message: {Data}", Encoding.UTF8.GetString(buffer));
return;
}
@@ -217,27 +202,34 @@ namespace Emby.Server.Implementations.HttpServer
}
// Tell the PipeReader how much of the buffer we have consumed
- reader.AdvanceTo(buffer.End);
+ reader.AdvanceTo(buffer.GetPosition(bytesConsumed));
_logger.LogDebug("WS {IP} received message: {@Message}", RemoteEndPoint, stub);
- var info = new WebSocketMessageInfo
- {
- MessageType = stub.MessageType,
- Data = stub.Data?.ToString(), // Data can be null
- Connection = this
- };
-
- if (info.MessageType == SessionMessageType.KeepAlive)
+ if (stub.MessageType == SessionMessageType.KeepAlive)
{
await SendKeepAliveResponse().ConfigureAwait(false);
}
else
{
- await OnReceive(info).ConfigureAwait(false);
+ await OnReceive(
+ new WebSocketMessageInfo
+ {
+ MessageType = stub.MessageType,
+ Data = stub.Data?.ToString(), // Data can be null
+ Connection = this
+ }).ConfigureAwait(false);
}
}
+ internal WebSocketMessage<object>? DeserializeWebSocketMessage(ReadOnlySequence<byte> bytes, out long bytesConsumed)
+ {
+ var jsonReader = new Utf8JsonReader(bytes);
+ var ret = JsonSerializer.Deserialize<WebSocketMessage<object>>(ref jsonReader, _jsonOptions);
+ bytesConsumed = jsonReader.BytesConsumed;
+ return ret;
+ }
+
private Task SendKeepAliveResponse()
{
LastKeepAliveDate = DateTime.UtcNow;
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
index cdc8c6870..f09338330 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
@@ -26,7 +26,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
public LegacyHdHomerunChannelCommands(string url)
{
// parse url for channel and program
- var regExp = new Regex(@"\/ch(\d+)-?(\d*)");
+ var regExp = new Regex(@"\/ch([0-9]+)-?([0-9]*)");
var match = regExp.Match(url);
if (match.Success)
{
diff --git a/Emby.Server.Implementations/Localization/Core/eo.json b/Emby.Server.Implementations/Localization/Core/eo.json
new file mode 100644
index 000000000..3ff7eddae
--- /dev/null
+++ b/Emby.Server.Implementations/Localization/Core/eo.json
@@ -0,0 +1,26 @@
+{
+ "NotificationOptionInstallationFailed": "Instalada fiasko",
+ "NotificationOptionAudioPlaybackStopped": "Sono de ludado haltis",
+ "NotificationOptionAudioPlayback": "Ludado de sono startis",
+ "NameSeasonUnknown": "Sezono Nekonata",
+ "NameSeasonNumber": "Sezono {0}",
+ "NameInstallFailed": "{0} instalado fiaskis",
+ "Music": "Muziko",
+ "Movies": "Filmoj",
+ "ItemRemovedWithName": "{0} forigis el la biblioteko",
+ "ItemAddedWithName": "{0} aldonis al la biblioteko",
+ "HeaderLiveTV": "Viva Televido",
+ "HeaderContinueWatching": "Daŭrigi Spektado",
+ "HeaderAlbumArtists": "Artistoj de Albumo",
+ "Folders": "Dosierujoj",
+ "DeviceOnlineWithName": "{0} estas konektita",
+ "Default": "Defaŭlte",
+ "Collections": "Kolektoj",
+ "ChapterNameValue": "Ĉapitro {0}",
+ "Channels": "Kanaloj",
+ "Books": "Libroj",
+ "Artists": "Artistoj",
+ "Application": "Aplikaĵo",
+ "AppDeviceValues": "Aplikaĵo: {0}, Aparato: {1}",
+ "Albums": "Albumoj"
+}
diff --git a/Emby.Server.Implementations/Localization/Core/fi.json b/Emby.Server.Implementations/Localization/Core/fi.json
index b45bdcbad..fd6148e78 100644
--- a/Emby.Server.Implementations/Localization/Core/fi.json
+++ b/Emby.Server.Implementations/Localization/Core/fi.json
@@ -1,121 +1,121 @@
{
- "HeaderLiveTV": "Live-TV",
- "NewVersionIsAvailable": "Uusi versio Jellyfin palvelimesta on ladattavissa.",
+ "HeaderLiveTV": "Live TV",
+ "NewVersionIsAvailable": "Uusi versio Jellyfin-palvelimesta on ladattavissa.",
"NameSeasonUnknown": "Tuntematon kausi",
"NameSeasonNumber": "Kausi {0}",
"NameInstallFailed": "{0} asennus epäonnistui",
"MusicVideos": "Musiikkivideot",
"Music": "Musiikki",
"Movies": "Elokuvat",
- "MixedContent": "Sekoitettu sisältö",
+ "MixedContent": "Sekalainen sisältö",
"MessageServerConfigurationUpdated": "Palvelimen asetukset on päivitetty",
- "MessageNamedServerConfigurationUpdatedWithValue": "Palvelimen asetusryhmä {0} on päivitetty",
- "MessageApplicationUpdatedTo": "Jellyfin palvelin on päivitetty versioon {0}",
- "MessageApplicationUpdated": "Jellyfin palvelin on päivitetty",
- "Latest": "Uusimmat",
- "LabelRunningTimeValue": "Toiston kesto: {0}",
+ "MessageNamedServerConfigurationUpdatedWithValue": "Palvelimen asetusten osio {0} on päivitetty",
+ "MessageApplicationUpdatedTo": "Jellyfin-palvelin on päivitetty versioon {0}",
+ "MessageApplicationUpdated": "Jellyfin-palvelin on päivitetty",
+ "Latest": "Viimeisimmät",
+ "LabelRunningTimeValue": "Kesto: {0}",
"LabelIpAddressValue": "IP-osoite: {0}",
"ItemRemovedWithName": "{0} poistettiin kirjastosta",
"ItemAddedWithName": "{0} lisättiin kirjastoon",
- "Inherit": "Periytyä",
+ "Inherit": "Peri",
"HomeVideos": "Kotivideot",
"HeaderRecordingGroups": "Tallennusryhmät",
"HeaderNextUp": "Seuraavaksi",
"HeaderFavoriteSongs": "Suosikkikappaleet",
"HeaderFavoriteShows": "Suosikkisarjat",
"HeaderFavoriteEpisodes": "Suosikkijaksot",
- "HeaderFavoriteArtists": "Suosikkiartistit",
+ "HeaderFavoriteArtists": "Suosikkiesittäjät",
"HeaderFavoriteAlbums": "Suosikkialbumit",
- "HeaderContinueWatching": "Jatka katsomista",
- "HeaderAlbumArtists": "Albumin artistit",
+ "HeaderContinueWatching": "Jatka katselua",
+ "HeaderAlbumArtists": "Albumin esittäjät",
"Genres": "Tyylilajit",
"Folders": "Kansiot",
"Favorites": "Suosikit",
- "FailedLoginAttemptWithUserName": "Kirjautuminen epäonnistui kohteesta {0}",
+ "FailedLoginAttemptWithUserName": "Epäonnistunut kirjautumisyritys lähteestä \"{0}\"",
"DeviceOnlineWithName": "{0} on yhdistetty",
- "DeviceOfflineWithName": "{0} yhteys on katkaistu",
+ "DeviceOfflineWithName": "{0} on katkaissut yhteyden",
"Collections": "Kokoelmat",
- "ChapterNameValue": "Jakso: {0}",
+ "ChapterNameValue": "Kappale {0}",
"Channels": "Kanavat",
- "CameraImageUploadedFrom": "Uusi kamerakuva on ladattu {0}",
+ "CameraImageUploadedFrom": "Uusi kameran kuva on sirretty lähteestä {0}",
"Books": "Kirjat",
- "AuthenticationSucceededWithUserName": "Käyttäjän {0} todennus onnistui",
- "Artists": "Artistit",
+ "AuthenticationSucceededWithUserName": "{0} on todennettu",
+ "Artists": "Esittäjät",
"Application": "Sovellus",
"AppDeviceValues": "Sovellus: {0}, Laite: {1}",
"Albums": "Albumit",
"User": "Käyttäjä",
"System": "Järjestelmä",
"ScheduledTaskFailedWithName": "{0} epäonnistui",
- "PluginUpdatedWithName": "{0} päivitetty",
- "PluginInstalledWithName": "{0} asennettu",
- "Photos": "Kuvat",
- "ScheduledTaskStartedWithName": "{0} aloitettu",
- "PluginUninstalledWithName": "{0} poistettu",
+ "PluginUpdatedWithName": "{0} päivitettiin",
+ "PluginInstalledWithName": "{0} asennettiin",
+ "Photos": "Valokuvat",
+ "ScheduledTaskStartedWithName": "\"{0}\" käynnistetty",
+ "PluginUninstalledWithName": "{0} poistettiin",
"Playlists": "Soittolistat",
"VersionNumber": "Versio {0}",
- "ValueSpecialEpisodeName": "Erikois - {0}",
- "ValueHasBeenAddedToLibrary": "{0} lisättiin mediakirjastoon",
- "UserStoppedPlayingItemWithValues": "{0} toistaminen valmistui {1} laitteella {2}",
- "UserStartedPlayingItemWithValues": "{0} toistaa {1} laitteella {2}",
- "UserPolicyUpdatedWithName": "Käyttöoikeudet päivitetty käyttäjälle {0}",
- "UserPasswordChangedWithName": "Salasana vaihdettu käyttäjälle {0}",
- "UserOnlineFromDevice": "{0} on paikalla osoitteesta {1}",
- "UserOfflineFromDevice": "{0} yhteys katkaistu kohteesta {1}",
- "UserLockedOutWithName": "Käyttäjä {0} lukittu",
- "UserDownloadingItemWithValues": "{0} lataa {1}",
- "UserDeletedWithName": "Käyttäjä {0} poistettu",
- "UserCreatedWithName": "Käyttäjä {0} luotu",
- "TvShows": "TV-ohjelmat",
- "Sync": "Synkronoi",
- "SubtitleDownloadFailureFromForItem": "Tekstitystä ei voitu ladata osoitteesta {0} kohteelle {1}",
- "StartupEmbyServerIsLoading": "Jellyfin palvelin latautuu. Yritä hetken kuluttua uudelleen.",
+ "ValueSpecialEpisodeName": "Erikoisjakso - {0}",
+ "ValueHasBeenAddedToLibrary": "\"{0}\" on lisätty mediakirjastoon",
+ "UserStoppedPlayingItemWithValues": "{0} lopetti kohteen \"{1}\" toiston sijainnissa \"{2}\"",
+ "UserStartedPlayingItemWithValues": "{0} toistaa kohdetta \"{1}\" sijainnissa \"{2}\"",
+ "UserPolicyUpdatedWithName": "Käyttäjän {0} käyttöoikeudet on päivitetty",
+ "UserPasswordChangedWithName": "Käyttäjän {0} salasana on vaihdettu",
+ "UserOnlineFromDevice": "{0} on yhdistänyt sijainnista \"{1}\"",
+ "UserOfflineFromDevice": "{0} on katkaissut yhteyden sijainnista \"{1}\"",
+ "UserLockedOutWithName": "Käyttäjä {0} on lukittu",
+ "UserDownloadingItemWithValues": "{0} lataa kohdetta \"{1}\"",
+ "UserDeletedWithName": "Käyttäjä {0} on poistettu",
+ "UserCreatedWithName": "Käyttäjä {0} on luotu",
+ "TvShows": "Sarjat",
+ "Sync": "Synkronointi",
+ "SubtitleDownloadFailureFromForItem": "Tekstityksen lataus lähteestä \"{0}\" kohteelle \"{1}\" epäonnistui",
+ "StartupEmbyServerIsLoading": "Jellyfin-palvelin latautuu. Yritä hetken kuluttua uudelleen.",
"Songs": "Kappaleet",
- "Shows": "Ohjelmat",
- "ServerNameNeedsToBeRestarted": "{0} on käynnistettävä uudelleen",
- "ProviderValue": "Tarjoaja: {0}",
- "Plugin": "Liitännäinen",
- "NotificationOptionVideoPlaybackStopped": "Videon toisto pysäytetty",
- "NotificationOptionVideoPlayback": "Videota toistetaan",
- "NotificationOptionUserLockedOut": "Käyttäjä kirjautui ulos",
- "NotificationOptionTaskFailed": "Ajastettu tehtävä epäonnistui",
- "NotificationOptionServerRestartRequired": "Palvelin on käynnistettävä uudelleen",
- "NotificationOptionPluginUpdateInstalled": "Liitännäinen päivitetty",
- "NotificationOptionPluginUninstalled": "Liitännäinen poistettu",
- "NotificationOptionPluginInstalled": "Liitännäinen asennettu",
- "NotificationOptionPluginError": "Ongelma liitännäisessä",
- "NotificationOptionNewLibraryContent": "Uutta sisältöä lisätty",
+ "Shows": "Sarjat",
+ "ServerNameNeedsToBeRestarted": "\"{0}\" on käynnistettävä uudelleen",
+ "ProviderValue": "Lähde: {0}",
+ "Plugin": "Laajennus",
+ "NotificationOptionVideoPlaybackStopped": "Videon toisto lopetettu",
+ "NotificationOptionVideoPlayback": "Videon toisto aloitettu",
+ "NotificationOptionUserLockedOut": "Käyttäjä on lukittu",
+ "NotificationOptionTaskFailed": "Ajoitettu tehtävä epäonnistui",
+ "NotificationOptionServerRestartRequired": "Tarvitaan palvelimen uudelleenkäynnistys",
+ "NotificationOptionPluginUpdateInstalled": "Laajennus on päivitetty",
+ "NotificationOptionPluginUninstalled": "Laajennus on poistettu",
+ "NotificationOptionPluginInstalled": "Laajennus on asennettu",
+ "NotificationOptionPluginError": "Laajennuksen virhe",
+ "NotificationOptionNewLibraryContent": "Sisältöä on lisätty",
"NotificationOptionInstallationFailed": "Asennus epäonnistui",
- "NotificationOptionCameraImageUploaded": "Kameran kuva ladattu",
+ "NotificationOptionCameraImageUploaded": "Kameran kuva on tallennettu",
"NotificationOptionAudioPlaybackStopped": "Äänen toisto lopetettu",
- "NotificationOptionAudioPlayback": "Toistetaan ääntä",
- "NotificationOptionApplicationUpdateInstalled": "Sovelluspäivitys asennettu",
- "NotificationOptionApplicationUpdateAvailable": "Ohjelmistopäivitys saatavilla",
+ "NotificationOptionAudioPlayback": "Äänen toisto aloitettu",
+ "NotificationOptionApplicationUpdateInstalled": "Sovelluspäivitys asennettiin",
+ "NotificationOptionApplicationUpdateAvailable": "Sovelluspäivitys on saatavilla",
"TasksMaintenanceCategory": "Ylläpito",
- "TaskDownloadMissingSubtitlesDescription": "Etsii puuttuvia tekstityksiä videon metadatatietojen pohjalta.",
+ "TaskDownloadMissingSubtitlesDescription": "Etsii puuttuvia tekstityksiä määritettyjen metatietoasetusten mukaisesti.",
"TaskDownloadMissingSubtitles": "Lataa puuttuvat tekstitykset",
"TaskRefreshChannelsDescription": "Päivittää internet-kanavien tiedot.",
"TaskRefreshChannels": "Päivitä kanavat",
- "TaskCleanTranscodeDescription": "Poistaa transkoodatut tiedostot jotka ovat yli päivän vanhoja.",
- "TaskCleanTranscode": "Puhdista transkoodaushakemisto",
- "TaskUpdatePluginsDescription": "Lataa ja asentaa päivitykset liitännäisille jotka on asetettu päivittymään automaattisesti.",
- "TaskUpdatePlugins": "Päivitä liitännäiset",
- "TaskRefreshPeopleDescription": "Päivittää näyttelijöiden ja ohjaajien mediatiedot kirjastossasi.",
+ "TaskCleanTranscodeDescription": "Poistaa päivää vanhemmat transkoodaustiedostot.",
+ "TaskCleanTranscode": "Puhdista transkoodauskansio",
+ "TaskUpdatePluginsDescription": "Lataa ja asentaa päivitykset laajennuksille, jotka on määritetty päivittymään automaattisesti.",
+ "TaskUpdatePlugins": "Päivitä laajennukset",
+ "TaskRefreshPeopleDescription": "Päivittää mediakirjaston näyttelijöiden ja ohjaajien metatiedot.",
"TaskRefreshPeople": "Päivitä henkilöt",
- "TaskCleanLogsDescription": "Poistaa lokitiedostot jotka ovat yli {0} päivää vanhoja.",
- "TaskCleanLogs": "Puhdista lokihakemisto",
- "TaskRefreshLibraryDescription": "Skannaa mediakirjastosi uudet tiedostot ja päivittää metatiedot.",
- "TaskRefreshLibrary": "Skannaa mediakirjasto",
- "TaskRefreshChapterImagesDescription": "Luo pienoiskuvat videoille joissa on jaksoja.",
- "TaskRefreshChapterImages": "Pura jakson kuvat",
- "TaskCleanCacheDescription": "Poistaa järjestelmälle tarpeettomat väliaikaistiedostot.",
- "TaskCleanCache": "Tyhjennä välimuisti-hakemisto",
- "TasksChannelsCategory": "Internet kanavat",
+ "TaskCleanLogsDescription": "Poistaa {0} päivää vanhemmat lokitiedostot.",
+ "TaskCleanLogs": "Siivoa lokikansio",
+ "TaskRefreshLibraryDescription": "Tarkastaa mediakirjastosi sisällön uusien tiedostojen varalta ja päivittää metatiedot.",
+ "TaskRefreshLibrary": "Päivitä mediakirjasto",
+ "TaskRefreshChapterImagesDescription": "Luo esikatselukuvat videoille, jotka sisältävät kappalejaon.",
+ "TaskRefreshChapterImages": "Pura kappalejaon kuvat",
+ "TaskCleanCacheDescription": "Poistaa tarpeettomiksi jääneet väliaikaistiedostot.",
+ "TaskCleanCache": "Tyhjennä välimuistikansio",
+ "TasksChannelsCategory": "Internet-kanavat",
"TasksApplicationCategory": "Sovellus",
"TasksLibraryCategory": "Kirjasto",
"Forced": "Pakotettu",
"Default": "Oletus",
- "TaskCleanActivityLogDescription": "Poistaa määritettyä vanhemmat tapahtumat aktiviteettilokista.",
- "TaskCleanActivityLog": "Tyhjennä aktiviteettiloki",
+ "TaskCleanActivityLogDescription": "Poistaa määritettyä ikää vanhemmat tapahtumat toimintahistoriasta.",
+ "TaskCleanActivityLog": "Tyhjennä toimintahistoria",
"Undefined": "Määrittelemätön"
}
diff --git a/Emby.Server.Implementations/Localization/Core/hi.json b/Emby.Server.Implementations/Localization/Core/hi.json
index b9e5f301d..ef3697b15 100644
--- a/Emby.Server.Implementations/Localization/Core/hi.json
+++ b/Emby.Server.Implementations/Localization/Core/hi.json
@@ -1,5 +1,5 @@
{
- "Albums": "संग्रह",
+ "Albums": "एल्बम",
"HeaderRecordingGroups": "रिकॉर्डिंग समूह",
"HeaderNextUp": "इसके बाद",
"HeaderLiveTV": "लाइव टीवी",
@@ -26,7 +26,7 @@
"AuthenticationSucceededWithUserName": "सफलता से प्रमाणीकृत",
"Artists": "कलाकारों",
"Application": "एप्लिकेशन",
- "AppDeviceValues": "एप: {0}, मशीन: {1}",
+ "AppDeviceValues": "एप: {0}, उपकरण: {1}",
"NotificationOptionPluginUninstalled": "प्लगइन अनइंस्टाल हो गया",
"NotificationOptionPluginInstalled": "प्लगइन इनस्टॉल हो गया",
"NotificationOptionPluginError": "प्लगइन फ़ैल हो गया",
diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs
index 8e5987026..c26ccfd88 100644
--- a/Emby.Server.Implementations/Plugins/PluginManager.cs
+++ b/Emby.Server.Implementations/Plugins/PluginManager.cs
@@ -348,7 +348,7 @@ namespace Emby.Server.Implementations.Plugins
try
{
var data = JsonSerializer.Serialize(manifest, _jsonOptions);
- File.WriteAllText(Path.Combine(path, "meta.json"), data, Encoding.UTF8);
+ File.WriteAllText(Path.Combine(path, "meta.json"), data);
return true;
}
#pragma warning disable CA1031 // Do not catch general exception types
@@ -519,7 +519,7 @@ namespace Emby.Server.Implementations.Plugins
return _plugins.Remove(plugin);
}
- private LocalPlugin LoadManifest(string dir)
+ internal LocalPlugin LoadManifest(string dir)
{
Version? version;
PluginManifest? manifest = null;
diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs
index 4e026a0e6..10e28c33a 100644
--- a/Emby.Server.Implementations/Session/SessionManager.cs
+++ b/Emby.Server.Implementations/Session/SessionManager.cs
@@ -1456,7 +1456,12 @@ namespace Emby.Server.Implementations.Session
throw new SecurityException("Unknown quick connect token");
}
- request.UserId = result.Items[0].UserId;
+ var info = result.Items[0];
+ request.UserId = info.UserId;
+
+ // There's no need to keep the quick connect token in the database, as AuthenticateNewSessionInternal() issues a long lived token.
+ _authRepo.Delete(info);
+
return AuthenticateNewSessionInternal(request, false);
}