diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 24ee17943a..827aed4f2d 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1514,6 +1514,10 @@ namespace MediaBrowser.Api.Playback request.PlaySessionId = val; } else if (i == 22) + { + // api_key + } + else if (i == 23) { request.LiveStreamId = val; } diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 061ee3ef0b..6c46f90098 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -1421,5 +1421,13 @@ "LabelConversionCpuCoreLimitHelp": "Limit the number of CPU cores that will be used during sync conversion.", "OptionEnableFullSpeedConversion": "Enable full speed conversion", "OptionEnableFullSpeedConversionHelp": "By default, sync conversion is performed at a low speed to minimize resource consumption.", - "HeaderPlaylists": "Playlists" + "HeaderPlaylists": "Playlists", + "HeaderSelectDate": "Select Date", + "HeaderWelcomeExclamation": "Welcome!", + "HeaderMyPreferences": "My Preferences", + "ButtonMyPreferencesWelcomeYes": "Yes, I'd like to set my preferences now.", + "ButtonMyPreferencesWelcomeNo": "No thanks, I'll do it later.", + "MyPreferencesWelcomeMessage1": "We've presented your library in a way we think you'll enjoy. The appearance and grouping of content can be changed anytime by adjusting your preferences. Your preferences will apply to all Emby apps.", + "MyPreferencesWelcomeMessage2": "Would you like to set your preferences now?", + "ToAccessPreferencesHelp": "To access your preferences later, click your user icon in the top right header and select My Preferences." } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 69c83bd33d..dbe43c2d12 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -750,6 +750,9 @@ namespace MediaBrowser.Server.Implementations.Sync foreach (var jobItem in jobItemResult.Items) { + var requiresSaving = false; + var removeFromDevice = false; + if (request.LocalItemIds.Contains(jobItem.ItemId, StringComparer.OrdinalIgnoreCase)) { var job = _repo.GetJob(jobItem.JobId); @@ -759,13 +762,13 @@ namespace MediaBrowser.Server.Implementations.Sync { // Tell the device to remove it since it has been marked for removal _logger.Debug("Adding ItemIdsToRemove {0} because IsMarkedForRemoval is set.", jobItem.ItemId); - response.ItemIdsToRemove.Add(jobItem.ItemId); + removeFromDevice = true; } else if (user == null) { // Tell the device to remove it since the user is gone now _logger.Debug("Adding ItemIdsToRemove {0} because the user is no longer valid.", jobItem.ItemId); - response.ItemIdsToRemove.Add(jobItem.ItemId); + removeFromDevice = true; } else if (job.UnwatchedOnly) { @@ -777,23 +780,42 @@ namespace MediaBrowser.Server.Implementations.Sync { // Tell the device to remove it since it has been played _logger.Debug("Adding ItemIdsToRemove {0} because it has been marked played.", jobItem.ItemId); - response.ItemIdsToRemove.Add(jobItem.ItemId); + removeFromDevice = true; } } else { // Tell the device to remove it since it's no longer available _logger.Debug("Adding ItemIdsToRemove {0} because it is no longer available.", jobItem.ItemId); - response.ItemIdsToRemove.Add(jobItem.ItemId); + removeFromDevice = true; } } } else { - _logger.Debug("Setting status to RemovedFromDevice for {0} because it is no longer on the device.", jobItem.ItemId); + _logger.Debug("Setting status to Queued for {0} because it is no longer on the device.", jobItem.ItemId); // Content is no longer on the device - jobItem.Status = SyncJobItemStatus.RemovedFromDevice; + if (jobItem.IsMarkedForRemoval) + { + jobItem.Status = SyncJobItemStatus.RemovedFromDevice; + } + else + { + jobItem.Status = SyncJobItemStatus.Queued; + } + requiresSaving = true; + } + + if (removeFromDevice) + { + response.ItemIdsToRemove.Add(jobItem.ItemId); + jobItem.IsMarkedForRemoval = true; + requiresSaving = true; + } + + if (requiresSaving) + { await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false); } } @@ -837,6 +859,9 @@ namespace MediaBrowser.Server.Implementations.Sync foreach (var jobItem in jobItemResult.Items) { + var requiresSaving = false; + var removeFromDevice = false; + if (request.SyncJobItemIds.Contains(jobItem.Id, StringComparer.OrdinalIgnoreCase)) { var job = _repo.GetJob(jobItem.JobId); @@ -846,13 +871,13 @@ namespace MediaBrowser.Server.Implementations.Sync { // Tell the device to remove it since it has been marked for removal _logger.Debug("Adding ItemIdsToRemove {0} because IsMarkedForRemoval is set.", jobItem.Id); - response.ItemIdsToRemove.Add(jobItem.Id); + removeFromDevice = true; } else if (user == null) { // Tell the device to remove it since the user is gone now _logger.Debug("Adding ItemIdsToRemove {0} because the user is no longer valid.", jobItem.Id); - response.ItemIdsToRemove.Add(jobItem.Id); + removeFromDevice = true; } else if (job.UnwatchedOnly) { @@ -864,23 +889,42 @@ namespace MediaBrowser.Server.Implementations.Sync { // Tell the device to remove it since it has been played _logger.Debug("Adding ItemIdsToRemove {0} because it has been marked played.", jobItem.Id); - response.ItemIdsToRemove.Add(jobItem.Id); + removeFromDevice = true; } } else { // Tell the device to remove it since it's no longer available _logger.Debug("Adding ItemIdsToRemove {0} because it is no longer available.", jobItem.Id); - response.ItemIdsToRemove.Add(jobItem.Id); + removeFromDevice = true; } } } else { - _logger.Debug("Setting status to RemovedFromDevice for {0} because it is no longer on the device.", jobItem.Id); + _logger.Debug("Setting status to Queued for {0} because it is no longer on the device.", jobItem.Id); // Content is no longer on the device - jobItem.Status = SyncJobItemStatus.RemovedFromDevice; + if (jobItem.IsMarkedForRemoval) + { + jobItem.Status = SyncJobItemStatus.RemovedFromDevice; + } + else + { + jobItem.Status = SyncJobItemStatus.Queued; + } + requiresSaving = true; + } + + if (removeFromDevice) + { + response.ItemIdsToRemove.Add(jobItem.Id); + jobItem.IsMarkedForRemoval = true; + requiresSaving = true; + } + + if (requiresSaving) + { await UpdateSyncJobItemInternal(jobItem).ConfigureAwait(false); } } diff --git a/MediaBrowser.ServerApplication/ServerNotifyIcon.cs b/MediaBrowser.ServerApplication/ServerNotifyIcon.cs index 9db3bdb90d..3c5ed6e541 100644 --- a/MediaBrowser.ServerApplication/ServerNotifyIcon.cs +++ b/MediaBrowser.ServerApplication/ServerNotifyIcon.cs @@ -166,6 +166,13 @@ namespace MediaBrowser.ServerApplication contextMenuStrip1.Invoke(action); } + + notifyIcon1.DoubleClick += notifyIcon1_DoubleClick; + } + + void notifyIcon1_DoubleClick(object sender, EventArgs e) + { + BrowserLauncher.OpenDashboard(_appHost, _logger); } private void LocalizeText()