From b7af883204a0b24571f57e8b09477a732ad667e9 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 5 Jan 2015 01:00:13 -0500 Subject: [PATCH 01/11] re-enable sync --- .../Encoder/AudioEncoder.cs | 5 ++ .../Encoder/BaseEncoder.cs | 68 ++++++++++++++++--- .../Encoder/EncodingJob.cs | 7 ++ .../Encoder/VideoEncoder.cs | 5 ++ .../Sync/SyncJobProcessor.cs | 60 +++++++++++++--- .../Sync/SyncScheduledTask.cs | 2 +- .../dashboard-ui/scripts/site.js | 8 +-- .../dashboard-ui/scripts/supporterpage.js | 4 +- .../dashboard-ui/scripts/sync.js | 4 +- SharedVersion.cs | 4 +- 10 files changed, 136 insertions(+), 31 deletions(-) diff --git a/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs index 7054accfad..52221d349e 100644 --- a/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs @@ -82,5 +82,10 @@ protected override string GetOutputFileExtension(EncodingJob state) return null; } + + protected override bool IsVideoEncoder + { + get { return false; } + } } } diff --git a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs index a350d05774..3c30d7cd80 100644 --- a/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs @@ -142,6 +142,8 @@ public async Task Start(EncodingJobOptions options, throw; } + cancellationToken.Register(() => Cancel(process, encodingJob)); + // MUST read both stdout and stderr asynchronously or a deadlock may occurr process.BeginOutputReadLine(); @@ -157,6 +159,16 @@ public async Task Start(EncodingJobOptions options, return encodingJob; } + private void Cancel(Process process, EncodingJob job) + { + Logger.Info("Killing ffmpeg process for {0}", job.OutputFilePath); + + //process.Kill(); + process.StandardInput.WriteLine("q"); + + job.IsCancelled = true; + } + /// /// Processes the exited. /// @@ -169,25 +181,53 @@ private void OnFfMpegProcessExited(Process process, EncodingJob job) Logger.Debug("Disposing stream resources"); job.Dispose(); + var isSuccesful = false; + try { - Logger.Info("FFMpeg exited with code {0}", process.ExitCode); + var exitCode = process.ExitCode; + Logger.Info("FFMpeg exited with code {0}", exitCode); + + isSuccesful = exitCode == 0; + } + catch + { + Logger.Error("FFMpeg exited with an error."); + } + if (isSuccesful && !job.IsCancelled) + { + job.TaskCompletionSource.TrySetResult(true); + } + else if (job.IsCancelled) + { try { - job.TaskCompletionSource.TrySetResult(true); + DeleteFiles(job); + } + catch + { + } + try + { + job.TaskCompletionSource.TrySetException(new OperationCanceledException()); } catch { } } - catch + else { - Logger.Error("FFMpeg exited with an error."); - try { - job.TaskCompletionSource.TrySetException(new ApplicationException()); + DeleteFiles(job); + } + catch + { + } + try + { + job.TaskCompletionSource.TrySetException(new ApplicationException("Encoding failed")); } catch { @@ -206,6 +246,11 @@ private void OnFfMpegProcessExited(Process process, EncodingJob job) //} } + protected virtual void DeleteFiles(EncodingJob job) + { + File.Delete(job.OutputFilePath); + } + private void OnTranscodeBeginning(EncodingJob job) { job.ReportTranscodingProgress(null, null, null, null); @@ -219,10 +264,7 @@ private void OnTranscodeFailedToStart(string path, EncodingJob job) } } - protected virtual bool IsVideoEncoder - { - get { return false; } - } + protected abstract bool IsVideoEncoder { get; } protected virtual string GetWorkingDirectory(EncodingJobOptions options) { @@ -263,6 +305,12 @@ protected virtual string GetOutputFileExtension(EncodingJob state) /// System.Int32. protected int GetNumberOfThreads(EncodingJob job, bool isWebm) { + // Only need one thread for sync + if (job.Options.Context == EncodingContext.Static) + { + return 1; + } + if (isWebm) { // Recommended per docs diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs index 40ca08c405..c8d121eead 100644 --- a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs +++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs @@ -18,6 +18,7 @@ namespace MediaBrowser.MediaEncoding.Encoder public class EncodingJob : IDisposable { public bool HasExited { get; internal set; } + public bool IsCancelled { get; internal set; } public Stream LogFileStream { get; set; } public IProgress Progress { get; set; } @@ -399,6 +400,12 @@ public void ReportTranscodingProgress(TimeSpan? transcodingPosition, float? fram // job.Framerate = framerate; + if (!percentComplete.HasValue && ticks.HasValue && RunTimeTicks.HasValue) + { + var pct = ticks.Value/RunTimeTicks.Value; + percentComplete = pct*100; + } + if (percentComplete.HasValue) { Progress.Report(percentComplete.Value); diff --git a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs index 36406e3a3f..941649addc 100644 --- a/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs +++ b/MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs @@ -173,5 +173,10 @@ protected override string GetOutputFileExtension(EncodingJob state) return null; } + + protected override bool IsVideoEncoder + { + get { return true; } + } } } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs index 7a363c54a9..b09bfe91fb 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.Progress; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.MediaEncoding; @@ -337,7 +338,9 @@ public async Task Sync(IProgress progress, CancellationToken cancellatio cancellationToken.ThrowIfCancellationRequested(); - await ProcessJobItem(item, cancellationToken).ConfigureAwait(false); + var innerProgress = new ActionableProgress(); + + await ProcessJobItem(item, innerProgress, cancellationToken).ConfigureAwait(false); var job = _syncRepo.GetJob(item.JobId); await UpdateJobStatus(job).ConfigureAwait(false); @@ -346,7 +349,7 @@ public async Task Sync(IProgress progress, CancellationToken cancellatio } } - private async Task ProcessJobItem(SyncJobItem jobItem, CancellationToken cancellationToken) + private async Task ProcessJobItem(SyncJobItem jobItem, IProgress progress, CancellationToken cancellationToken) { var item = _libraryManager.GetItemById(jobItem.ItemId); if (item == null) @@ -372,12 +375,12 @@ private async Task ProcessJobItem(SyncJobItem jobItem, CancellationToken cancell var video = item as Video; if (video != null) { - await Sync(jobItem, video, deviceProfile, cancellationToken).ConfigureAwait(false); + await Sync(jobItem, video, deviceProfile, progress, cancellationToken).ConfigureAwait(false); } else if (item is Audio) { - await Sync(jobItem, (Audio)item, deviceProfile, cancellationToken).ConfigureAwait(false); + await Sync(jobItem, (Audio)item, deviceProfile, progress, cancellationToken).ConfigureAwait(false); } else if (item is Photo) @@ -391,7 +394,7 @@ private async Task ProcessJobItem(SyncJobItem jobItem, CancellationToken cancell } } - private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, CancellationToken cancellationToken) + private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, IProgress progress, CancellationToken cancellationToken) { var options = new VideoOptions { @@ -412,7 +415,26 @@ private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, jobItem.Status = SyncJobItemStatus.Converting; await _syncRepo.Update(jobItem).ConfigureAwait(false); - jobItem.OutputPath = await _mediaEncoder.EncodeVideo(new EncodingJobOptions(streamInfo, profile), new Progress(), cancellationToken); + try + { + jobItem.OutputPath = await _mediaEncoder.EncodeVideo(new EncodingJobOptions(streamInfo, profile), progress, + cancellationToken); + } + catch (OperationCanceledException) + { + jobItem.Status = SyncJobItemStatus.Queued; + } + catch (Exception ex) + { + jobItem.Status = SyncJobItemStatus.Failed; + _logger.ErrorException("Error during sync transcoding", ex); + } + + if (jobItem.Status == SyncJobItemStatus.Failed || jobItem.Status == SyncJobItemStatus.Queued) + { + await _syncRepo.Update(jobItem).ConfigureAwait(false); + return; + } } else { @@ -435,7 +457,7 @@ private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, await _syncRepo.Update(jobItem).ConfigureAwait(false); } - private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, CancellationToken cancellationToken) + private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, IProgress progress, CancellationToken cancellationToken) { var options = new AudioOptions { @@ -455,8 +477,26 @@ private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, { jobItem.Status = SyncJobItemStatus.Converting; await _syncRepo.Update(jobItem).ConfigureAwait(false); - - jobItem.OutputPath = await _mediaEncoder.EncodeAudio(new EncodingJobOptions(streamInfo, profile), new Progress(), cancellationToken); + + try + { + jobItem.OutputPath = await _mediaEncoder.EncodeAudio(new EncodingJobOptions(streamInfo, profile), progress, cancellationToken); + } + catch (OperationCanceledException) + { + jobItem.Status = SyncJobItemStatus.Queued; + } + catch (Exception ex) + { + jobItem.Status = SyncJobItemStatus.Failed; + _logger.ErrorException("Error during sync transcoding", ex); + } + + if (jobItem.Status == SyncJobItemStatus.Failed || jobItem.Status == SyncJobItemStatus.Queued) + { + await _syncRepo.Update(jobItem).ConfigureAwait(false); + return; + } } else { diff --git a/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs index c2925551b7..068261ffd3 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncScheduledTask.cs @@ -67,7 +67,7 @@ public IEnumerable GetDefaultTriggers() public bool IsHidden { - get { return true; } + get { return false; } } public bool IsEnabled diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js index 318143933a..20e4ed4f5d 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/site.js @@ -760,10 +760,10 @@ var Dashboard = { name: Globalize.translate('TabPlayback'), href: "playbackconfiguration.html", selected: page.hasClass('playbackConfigurationPage') - //}, { - // name: Globalize.translate('TabSync'), - // href: "syncactivity.html", - // selected: page.hasClass('syncConfigurationPage') + }, { + name: Globalize.translate('TabSync'), + href: "syncactivity.html", + selected: page.hasClass('syncConfigurationPage') }, { divider: true, name: Globalize.translate('TabAutoOrganize'), diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/supporterpage.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/supporterpage.js index 32ba39d685..02965e7b12 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/supporterpage.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/supporterpage.js @@ -43,10 +43,10 @@ return $(".radioDonationType:checked", page).val(); } - var lifeTimeAmount = 30; + var lifeTimeAmount = 40; var dailyAmount = 1; var monthlyAmount = 4; - var yearlyAmount = 20; + var yearlyAmount = 28; function getDonationAmount(page) { var type = getDonationType(page); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/sync.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/sync.js index 12b6387626..4311d1599b 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/sync.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/sync.js @@ -203,7 +203,7 @@ function isAvailable(item, user) { - return false; + //return false; return item.SupportsSync; } @@ -226,7 +226,7 @@ Dashboard.getCurrentUser().done(function (user) { if (user.Policy.EnableSync) { - $('.categorySyncButton', page).hide(); + $('.categorySyncButton', page).show(); } else { $('.categorySyncButton', page).hide(); } diff --git a/SharedVersion.cs b/SharedVersion.cs index d53462b93c..70c7bbf8c4 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,4 +1,4 @@ using System.Reflection; -//[assembly: AssemblyVersion("3.0.*")] -[assembly: AssemblyVersion("3.0.5482.1")] +[assembly: AssemblyVersion("3.0.*")] +//[assembly: AssemblyVersion("3.0.5482.1")] From 2ccd31733102712409d9fb90c0aeb5525c3f54b7 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 5 Jan 2015 22:25:23 -0500 Subject: [PATCH 02/11] sync updates --- .../BaseApplicationHost.cs | 2 +- .../Devices/DeviceId.cs | 24 +--------- MediaBrowser.Model/Sync/SyncJobItem.cs | 5 ++ .../MediaInfo/VideoImageProvider.cs | 21 +++++++- .../Localization/Server/server.json | 5 ++ ...MediaBrowser.Server.Implementations.csproj | 2 +- .../Sync/SyncJobProcessor.cs | 27 +++++++---- .../Sync/SyncManager.cs | 13 ++++- .../Sync/SyncRepository.cs | 27 ++++++----- .../packages.config | 2 +- .../Api/PackageCreator.cs | 1 + .../MediaBrowser.WebDashboard.csproj | 6 +++ .../dashboard-ui/scripts/librarybrowser.js | 2 +- .../dashboard-ui/scripts/wizardagreement.js | 22 +++++++++ .../dashboard-ui/scripts/wizardservice.js | 2 +- .../dashboard-ui/scripts/wizardsettings.js | 2 +- .../dashboard-ui/useredit.html | 4 +- .../dashboard-ui/wizardagreement.html | 45 ++++++++++++++++++ .../MediaBrowser.Naming.1.0.0.24.nupkg | Bin 24031 -> 0 bytes .../MediaBrowser.Naming.dll | Bin 55808 -> 0 bytes .../MediaBrowser.Naming.1.0.0.25.nupkg | Bin 0 -> 24146 bytes .../MediaBrowser.Naming.dll | Bin 0 -> 56320 bytes 22 files changed, 158 insertions(+), 54 deletions(-) create mode 100644 MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardagreement.js create mode 100644 MediaBrowser.WebDashboard/dashboard-ui/wizardagreement.html delete mode 100644 packages/MediaBrowser.Naming.1.0.0.24/MediaBrowser.Naming.1.0.0.24.nupkg delete mode 100644 packages/MediaBrowser.Naming.1.0.0.24/lib/portable-net45+sl4+wp71+win8+wpa81/MediaBrowser.Naming.dll create mode 100644 packages/MediaBrowser.Naming.1.0.0.25/MediaBrowser.Naming.1.0.0.25.nupkg create mode 100644 packages/MediaBrowser.Naming.1.0.0.25/lib/portable-net45+sl4+wp71+win8+wpa81/MediaBrowser.Naming.dll diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index 4de1adcfa8..3e25bb6269 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -186,7 +186,7 @@ public string SystemId { if (_deviceId == null) { - _deviceId = new DeviceId(ApplicationPaths, LogManager.GetLogger("SystemId"), NetworkManager); + _deviceId = new DeviceId(ApplicationPaths, LogManager.GetLogger("SystemId")); } return _deviceId.Value; diff --git a/MediaBrowser.Common.Implementations/Devices/DeviceId.cs b/MediaBrowser.Common.Implementations/Devices/DeviceId.cs index 7c0dc1e1f0..2a1c8877d7 100644 --- a/MediaBrowser.Common.Implementations/Devices/DeviceId.cs +++ b/MediaBrowser.Common.Implementations/Devices/DeviceId.cs @@ -1,6 +1,4 @@ using MediaBrowser.Common.Configuration; -using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.Net; using MediaBrowser.Model.Logging; using System; using System.IO; @@ -11,7 +9,6 @@ namespace MediaBrowser.Common.Implementations.Devices public class DeviceId { private readonly IApplicationPaths _appPaths; - private readonly INetworkManager _networkManager; private readonly ILogger _logger; private readonly object _syncLock = new object(); @@ -73,23 +70,7 @@ private void SaveId(string id) private string GetNewId() { - // When generating an Id, base it off of the app path + mac address - // But we can't fail here, so if we can't get the mac address then just use a random guid - - string mac; - - try - { - mac = _networkManager.GetMacAddress(); - } - catch - { - mac = Guid.NewGuid().ToString("N"); - } - - mac += "-" + _appPaths.ApplicationPath; - - return mac.GetMD5().ToString("N"); + return Guid.NewGuid().ToString("N"); } private string GetDeviceId() @@ -107,11 +88,10 @@ private string GetDeviceId() private string _id; - public DeviceId(IApplicationPaths appPaths, ILogger logger, INetworkManager networkManager) + public DeviceId(IApplicationPaths appPaths, ILogger logger) { _appPaths = appPaths; _logger = logger; - _networkManager = networkManager; } public string Value diff --git a/MediaBrowser.Model/Sync/SyncJobItem.cs b/MediaBrowser.Model/Sync/SyncJobItem.cs index 4090d82b0b..3d06943aa3 100644 --- a/MediaBrowser.Model/Sync/SyncJobItem.cs +++ b/MediaBrowser.Model/Sync/SyncJobItem.cs @@ -73,5 +73,10 @@ public class SyncJobItem /// /// The primary image tag. public string PrimaryImageTag { get; set; } + /// + /// Gets or sets a value indicating whether [requires conversion]. + /// + /// true if [requires conversion]; otherwise, false. + public bool RequiresConversion { get; set; } } } diff --git a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs index 7f55ce1ac2..59db382ead 100644 --- a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs @@ -1,5 +1,6 @@ using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Library; using MediaBrowser.Controller.MediaEncoding; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Drawing; @@ -18,12 +19,14 @@ public class VideoImageProvider : IDynamicImageProvider, IHasItemChangeMonitor, private readonly IIsoManager _isoManager; private readonly IMediaEncoder _mediaEncoder; private readonly IServerConfigurationManager _config; + private readonly ILibraryManager _libraryManager; - public VideoImageProvider(IIsoManager isoManager, IMediaEncoder mediaEncoder, IServerConfigurationManager config) + public VideoImageProvider(IIsoManager isoManager, IMediaEncoder mediaEncoder, IServerConfigurationManager config, ILibraryManager libraryManager) { _isoManager = isoManager; _mediaEncoder = mediaEncoder; _config = config; + _libraryManager = libraryManager; } /// @@ -123,7 +126,21 @@ public bool Supports(IHasImages item) { var video = item as Video; - return item.LocationType == LocationType.FileSystem && video != null && !video.IsPlaceHolder && !video.IsShortcut && !video.IsArchive; + if (item.LocationType == LocationType.FileSystem && video != null && !video.IsPlaceHolder && + !video.IsShortcut && !video.IsArchive) + { + if (video.GetType() == typeof(Video)) + { + if (string.IsNullOrEmpty(_libraryManager.GetContentType(video))) + { + return false; + } + } + + return true; + } + + return false; } public int Order diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index 2d00f3c767..c070f30776 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -35,6 +35,11 @@ "LabelChapterImageExtractionForMoviesHelp": "Extracting chapter images will allow clients to display graphical scene selection menus. The process can be slow, cpu-intensive and may require several gigabytes of space. It runs as a nightly scheduled task at 4am, although this is configurable in the scheduled tasks area. It is not recommended to run this task during peak usage hours.", "LabelEnableAutomaticPortMapping": "Enable automatic port mapping", "LabelEnableAutomaticPortMappingHelp": "UPnP allows automated router configuration for easy remote access. This may not work with some router models.", + "HeaderTermsOfService": "Media Browser Terms of Service", + "MessagePleaseAcceptTermsOfService": "Please accept the terms of service and privacy policy before continuing.", + "OptionIAcceptTermsOfService": "I accept the terms of service", + "ButtonPrivacyPolicy": "Privacy policy", + "ButtonTermsOfService": "Terms of Service", "ButtonOk": "Ok", "ButtonCancel": "Cancel", "ButtonNew": "New", diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index ccc0737e96..81054b3c5a 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -51,7 +51,7 @@ False - ..\packages\MediaBrowser.Naming.1.0.0.24\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll + ..\packages\MediaBrowser.Naming.1.0.0.25\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll False diff --git a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs index b09bfe91fb..698806d09d 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncJobProcessor.cs @@ -340,16 +340,17 @@ public async Task Sync(IProgress progress, CancellationToken cancellatio var innerProgress = new ActionableProgress(); - await ProcessJobItem(item, innerProgress, cancellationToken).ConfigureAwait(false); - var job = _syncRepo.GetJob(item.JobId); + await ProcessJobItem(job, item, innerProgress, cancellationToken).ConfigureAwait(false); + + job = _syncRepo.GetJob(item.JobId); await UpdateJobStatus(job).ConfigureAwait(false); index++; } } - private async Task ProcessJobItem(SyncJobItem jobItem, IProgress progress, CancellationToken cancellationToken) + private async Task ProcessJobItem(SyncJob job, SyncJobItem jobItem, IProgress progress, CancellationToken cancellationToken) { var item = _libraryManager.GetItemById(jobItem.ItemId); if (item == null) @@ -372,15 +373,17 @@ private async Task ProcessJobItem(SyncJobItem jobItem, IProgress progres jobItem.Progress = 0; jobItem.Status = SyncJobItemStatus.Converting; + var user = _userManager.GetUserById(job.UserId); + var video = item as Video; if (video != null) { - await Sync(jobItem, video, deviceProfile, progress, cancellationToken).ConfigureAwait(false); + await Sync(jobItem, video, user, deviceProfile, progress, cancellationToken).ConfigureAwait(false); } else if (item is Audio) { - await Sync(jobItem, (Audio)item, deviceProfile, progress, cancellationToken).ConfigureAwait(false); + await Sync(jobItem, (Audio)item, user, deviceProfile, progress, cancellationToken).ConfigureAwait(false); } else if (item is Photo) @@ -394,7 +397,7 @@ private async Task ProcessJobItem(SyncJobItem jobItem, IProgress progres } } - private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, IProgress progress, CancellationToken cancellationToken) + private async Task Sync(SyncJobItem jobItem, Video item, User user, DeviceProfile profile, IProgress progress, CancellationToken cancellationToken) { var options = new VideoOptions { @@ -402,7 +405,7 @@ private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, ItemId = item.Id.ToString("N"), DeviceId = jobItem.TargetId, Profile = profile, - MediaSources = item.GetMediaSources(false).ToList() + MediaSources = item.GetMediaSources(false, user).ToList() }; var streamInfo = new StreamBuilder().BuildVideoItem(options); @@ -413,6 +416,7 @@ private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, if (streamInfo.PlayMethod == PlayMethod.Transcode) { jobItem.Status = SyncJobItemStatus.Converting; + jobItem.RequiresConversion = true; await _syncRepo.Update(jobItem).ConfigureAwait(false); try @@ -438,6 +442,8 @@ private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, } else { + jobItem.RequiresConversion = false; + if (mediaSource.Protocol == MediaProtocol.File) { jobItem.OutputPath = mediaSource.Path; @@ -457,7 +463,7 @@ private async Task Sync(SyncJobItem jobItem, Video item, DeviceProfile profile, await _syncRepo.Update(jobItem).ConfigureAwait(false); } - private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, IProgress progress, CancellationToken cancellationToken) + private async Task Sync(SyncJobItem jobItem, Audio item, User user, DeviceProfile profile, IProgress progress, CancellationToken cancellationToken) { var options = new AudioOptions { @@ -465,7 +471,7 @@ private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, ItemId = item.Id.ToString("N"), DeviceId = jobItem.TargetId, Profile = profile, - MediaSources = item.GetMediaSources(false).ToList() + MediaSources = item.GetMediaSources(false, user).ToList() }; var streamInfo = new StreamBuilder().BuildAudioItem(options); @@ -476,6 +482,7 @@ private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, if (streamInfo.PlayMethod == PlayMethod.Transcode) { jobItem.Status = SyncJobItemStatus.Converting; + jobItem.RequiresConversion = true; await _syncRepo.Update(jobItem).ConfigureAwait(false); try @@ -500,6 +507,8 @@ private async Task Sync(SyncJobItem jobItem, Audio item, DeviceProfile profile, } else { + jobItem.RequiresConversion = false; + if (mediaSource.Protocol == MediaProtocol.File) { jobItem.OutputPath = mediaSource.Path; diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 3b2d70f849..b8f199e6bc 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -12,7 +12,6 @@ using MediaBrowser.Controller.Sync; using MediaBrowser.Controller.TV; using MediaBrowser.Model.Dlna; -using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; @@ -393,6 +392,18 @@ public async Task ReportSyncJobItemTransferred(string id) jobItem.Status = SyncJobItemStatus.Synced; jobItem.Progress = 100; + if (jobItem.RequiresConversion) + { + try + { + File.Delete(jobItem.OutputPath); + } + catch (Exception ex) + { + _logger.ErrorException("Error deleting temporary job file: {0}", ex, jobItem.OutputPath); + } + } + await _repo.Update(jobItem).ConfigureAwait(false); var processor = new SyncJobProcessor(_libraryManager, _repo, this, _logger, _userManager, _tvSeriesManager, _mediaEncoder()); diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index 09c1b316ef..151860d84c 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -36,7 +36,7 @@ public SyncRepository(ILogger logger, IServerApplicationPaths appPaths) public async Task Initialize() { - var dbFile = Path.Combine(_appPaths.DataPath, "sync10.db"); + var dbFile = Path.Combine(_appPaths.DataPath, "sync11.db"); _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); @@ -45,7 +45,7 @@ public async Task Initialize() "create table if not exists SyncJobs (Id GUID PRIMARY KEY, TargetId TEXT NOT NULL, Name TEXT NOT NULL, Quality TEXT NOT NULL, Status TEXT NOT NULL, Progress FLOAT, UserId TEXT NOT NULL, ItemIds TEXT NOT NULL, Category TEXT, ParentId TEXT, UnwatchedOnly BIT, ItemLimit INT, SyncNewContent BIT, DateCreated DateTime, DateLastModified DateTime, ItemCount int)", "create index if not exists idx_SyncJobs on SyncJobs(Id)", - "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)", + "create table if not exists SyncJobItems (Id GUID PRIMARY KEY, ItemId TEXT, ItemName TEXT, MediaSourceId TEXT, JobId TEXT, RequiresConversion BIT, OutputPath TEXT, Status TEXT, TargetId TEXT, DateCreated DateTime, Progress FLOAT)", "create index if not exists idx_SyncJobItems on SyncJobs(Id)", //pragmas @@ -90,13 +90,14 @@ private void PrepareStatements() _saveJobCommand.Parameters.Add(_saveJobCommand, "@ItemCount"); _saveJobItemCommand = _connection.CreateCommand(); - _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)"; + _saveJobItemCommand.CommandText = "replace into SyncJobItems (Id, ItemId, ItemName, MediaSourceId, JobId, RequiresConversion, OutputPath, Status, TargetId, DateCreated, Progress) values (@Id, @ItemId, @ItemName, @MediaSourceId, @JobId, @RequiresConversion, @OutputPath, @Status, @TargetId, @DateCreated, @Progress)"; _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Id"); _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemId"); _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@ItemName"); _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@MediaSourceId"); _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@JobId"); + _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@RequiresConversion"); _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@OutputPath"); _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@Status"); _saveJobItemCommand.Parameters.Add(_saveJobItemCommand, "@TargetId"); @@ -105,7 +106,7 @@ private void PrepareStatements() } private const string BaseJobSelectText = "select Id, TargetId, Name, Quality, Status, Progress, UserId, ItemIds, Category, ParentId, UnwatchedOnly, ItemLimit, SyncNewContent, DateCreated, DateLastModified, ItemCount from SyncJobs"; - private const string BaseJobItemSelectText = "select Id, ItemId, ItemName, MediaSourceId, JobId, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems"; + private const string BaseJobItemSelectText = "select Id, ItemId, ItemName, MediaSourceId, JobId, RequiresConversion, OutputPath, Status, TargetId, DateCreated, Progress from SyncJobItems"; public SyncJob GetJob(string id) { @@ -556,6 +557,7 @@ public async Task Update(SyncJobItem jobItem) _saveJobItemCommand.GetParameter(index++).Value = jobItem.ItemName; _saveJobItemCommand.GetParameter(index++).Value = jobItem.MediaSourceId; _saveJobItemCommand.GetParameter(index++).Value = jobItem.JobId; + _saveJobItemCommand.GetParameter(index++).Value = jobItem.RequiresConversion; _saveJobItemCommand.GetParameter(index++).Value = jobItem.OutputPath; _saveJobItemCommand.GetParameter(index++).Value = jobItem.Status.ToString(); _saveJobItemCommand.GetParameter(index++).Value = jobItem.TargetId; @@ -618,24 +620,25 @@ private SyncJobItem GetJobItem(IDataReader reader) } info.JobId = reader.GetString(4); + info.RequiresConversion = reader.GetBoolean(5); - if (!reader.IsDBNull(5)) + if (!reader.IsDBNull(6)) { - info.OutputPath = reader.GetString(5); + info.OutputPath = reader.GetString(6); } - if (!reader.IsDBNull(6)) + if (!reader.IsDBNull(7)) { - info.Status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(6), true); + info.Status = (SyncJobItemStatus)Enum.Parse(typeof(SyncJobItemStatus), reader.GetString(7), true); } - info.TargetId = reader.GetString(7); + info.TargetId = reader.GetString(8); - info.DateCreated = reader.GetDateTime(8); + info.DateCreated = reader.GetDateTime(9); - if (!reader.IsDBNull(9)) + if (!reader.IsDBNull(10)) { - info.Progress = reader.GetDouble(9); + info.Progress = reader.GetDouble(10); } return info; diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config index 239bca4059..aba7d0e330 100644 --- a/MediaBrowser.Server.Implementations/packages.config +++ b/MediaBrowser.Server.Implementations/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs index 2f9f3f5f57..a6707bac3a 100644 --- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs +++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs @@ -471,6 +471,7 @@ private IEnumerable GetScriptFiles() "userprofilespage.js", "userparentalcontrol.js", "userlibraryaccess.js", + "wizardagreement.js", "wizardfinishpage.js", "wizardservice.js", "wizardstartpage.js", diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index 1343b1e69f..7979f35aea 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -120,6 +120,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1638,6 +1641,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/librarybrowser.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/librarybrowser.js index 56aeebc958..b5286979d7 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/librarybrowser.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/librarybrowser.js @@ -833,7 +833,7 @@ if (item.Type == 'Series' || item.Type == 'Season' || item.Type == 'BoxSet' || item.MediaType == 'Video') { if (item.UserData.UnplayedItemCount) { - html += '' + item.UserData.UnplayedItemCount + ''; + //html += '' + item.UserData.UnplayedItemCount + ''; } else if (item.UserData.Played && item.Type != 'TvChannel') { html += '
'; } diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardagreement.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardagreement.js new file mode 100644 index 0000000000..781581407b --- /dev/null +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardagreement.js @@ -0,0 +1,22 @@ +(function (window, $) { + + function onSubmit(page) { + + if ($('#chkAccept', page).checked()) { + Dashboard.navigate('wizardfinish.html'); + } + } + + window.WizardAgreementPage = { + + onSubmit: function () { + + var page = $(this).parents('.page'); + + onSubmit(page); + + return false; + } + }; + +})(window, jQuery); \ No newline at end of file diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardservice.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardservice.js index c993ee32b6..dc8922c6c8 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardservice.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardservice.js @@ -6,7 +6,7 @@ $('#btnNextPage', page).on('click', function () { - Dashboard.navigate('wizardfinish.html'); + Dashboard.navigate('wizardagreement.html'); }); }); diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardsettings.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardsettings.js index 6a7dda6b3b..0592698f2f 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardsettings.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/wizardsettings.js @@ -67,7 +67,7 @@ Dashboard.navigate('wizardservice.html'); } else { - Dashboard.navigate('wizardfinish.html'); + Dashboard.navigate('wizardagreement.html'); } }); } diff --git a/MediaBrowser.WebDashboard/dashboard-ui/useredit.html b/MediaBrowser.WebDashboard/dashboard-ui/useredit.html index 0863f77078..59b58b227e 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/useredit.html +++ b/MediaBrowser.WebDashboard/dashboard-ui/useredit.html @@ -49,8 +49,8 @@ - - +
diff --git a/MediaBrowser.WebDashboard/dashboard-ui/wizardagreement.html b/MediaBrowser.WebDashboard/dashboard-ui/wizardagreement.html new file mode 100644 index 0000000000..aef302f697 --- /dev/null +++ b/MediaBrowser.WebDashboard/dashboard-ui/wizardagreement.html @@ -0,0 +1,45 @@ + + + + ${TitleMediaBrowser} + + +
+ +
+ +
+
+ +
+

+ ${HeaderTermsOfService} +

+
+ +
+

${MessagePleaseAcceptTermsOfService}

+ +

${ButtonPrivacyPolicy}

+

${ButtonTermsOfService}

+
    +
  • + + +
  • +
+ +
+ +
+
+
+ +
+ + +
+ + diff --git a/packages/MediaBrowser.Naming.1.0.0.24/MediaBrowser.Naming.1.0.0.24.nupkg b/packages/MediaBrowser.Naming.1.0.0.24/MediaBrowser.Naming.1.0.0.24.nupkg deleted file mode 100644 index 02401601ba1a8c6e7eb2dbe74011d83554422ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24031 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 diff --git a/packages/MediaBrowser.Naming.1.0.0.24/lib/portable-net45+sl4+wp71+win8+wpa81/MediaBrowser.Naming.dll b/packages/MediaBrowser.Naming.1.0.0.24/lib/portable-net45+sl4+wp71+win8+wpa81/MediaBrowser.Naming.dll deleted file mode 100644 index e95db7d3cb1862db5e38b76905742612200fe246..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55808 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 XX*^-_h%X*wO-@bm=??4LJ07y+1(tA#y)ndu)( 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 vYx~b_J{#!L6WV2m?fuOnj3d7{H+} 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 W(}`mH;REAuj(Q^S{BS#X7WfbRK6*X? literal 0 HcmV?d00001 From 5621c156b9cad1a2475156bb96a6e54506b9d94e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 8 Jan 2015 22:26:40 -0500 Subject: [PATCH 03/11] fix mp4 seeking in firefox --- .../dashboard-ui/scripts/mediaplayer.js | 2 +- MediaBrowser.sln | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mediaplayer.js b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mediaplayer.js index 0a0c4833b9..50c38932e4 100644 --- a/MediaBrowser.WebDashboard/dashboard-ui/scripts/mediaplayer.js +++ b/MediaBrowser.WebDashboard/dashboard-ui/scripts/mediaplayer.js @@ -343,7 +343,7 @@ } if (extension == 'm4v' || extension == 'mkv') { - return $.browser.chrome; + return $.browser.chrome != null; } return extension == 'mp4'; diff --git a/MediaBrowser.sln b/MediaBrowser.sln index c081917fb7..b25eb58ba7 100644 --- a/MediaBrowser.sln +++ b/MediaBrowser.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30723.0 +VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F0E0E64C-2A6F-4E35-9533-D53AC07C2CD1}" EndProject @@ -518,7 +518,4 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection EndGlobal From b8376007975a95700fe1961468f8f1dd2fb5f3da Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 8 Jan 2015 22:27:44 -0500 Subject: [PATCH 04/11] remove generic video excludes --- MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs | 9 --------- MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs | 8 -------- MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs | 9 --------- 3 files changed, 26 deletions(-) diff --git a/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs index cad08e6383..eb1a0b78c6 100644 --- a/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/MovieXmlSaver.cs @@ -54,15 +54,6 @@ public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) // Check parent for null to avoid running this against things like video backdrops if (video != null && !(item is Episode) && !video.IsOwnedItem) { - // If it's a plain video, skip if content type is unset (unless editing) - if (video.GetType() == typeof(Video)) - { - if (updateType < ItemUpdateType.MetadataEdit && string.IsNullOrEmpty(_libraryManager.GetContentType(video))) - { - return false; - } - } - return updateType >= ItemUpdateType.MetadataDownload; } diff --git a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs index 59db382ead..7c32432251 100644 --- a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs @@ -129,14 +129,6 @@ public bool Supports(IHasImages item) if (item.LocationType == LocationType.FileSystem && video != null && !video.IsPlaceHolder && !video.IsShortcut && !video.IsArchive) { - if (video.GetType() == typeof(Video)) - { - if (string.IsNullOrEmpty(_libraryManager.GetContentType(video))) - { - return false; - } - } - return true; } diff --git a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs index d049843f35..e67aa42c75 100644 --- a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs @@ -7,7 +7,6 @@ using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using System.Collections.Generic; -using System.Globalization; using System.IO; using System.Xml; @@ -55,14 +54,6 @@ public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) // Check parent for null to avoid running this against things like video backdrops if (video != null && !(item is Episode) && !video.IsOwnedItem) { - // If it's a plain video, skip if content type is unset (unless editing) - if (video.GetType() == typeof (Video)) - { - if (updateType < ItemUpdateType.MetadataEdit && string.IsNullOrEmpty(LibraryManager.GetContentType(video))) - { - return false; - } - } return updateType >= MinimumUpdateType; } From 2e9645c1e06428bf3223b015b0eac90afecef84f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 8 Jan 2015 22:34:09 -0500 Subject: [PATCH 05/11] search ignore accent chars --- .../Library/CoreResolutionIgnoreRule.cs | 10 ++++++++-- .../Library/SearchEngine.cs | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs index 1628ccc328..1771bbdb2c 100644 --- a/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs +++ b/MediaBrowser.Server.Implementations/Library/CoreResolutionIgnoreRule.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.IO; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; @@ -114,7 +115,12 @@ public bool ShouldIgnore(ItemResolveArgs args) } // Ignore samples - if (filename.IndexOf(".sample.", StringComparison.OrdinalIgnoreCase) != -1) + var sampleFilename = " " + filename.Replace(".", " ", StringComparison.OrdinalIgnoreCase) + .Replace("-", " ", StringComparison.OrdinalIgnoreCase) + .Replace("_", " ", StringComparison.OrdinalIgnoreCase) + .Replace("!", " ", StringComparison.OrdinalIgnoreCase); + + if (sampleFilename.IndexOf(" sample ", StringComparison.OrdinalIgnoreCase) != -1) { return true; } diff --git a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs index 071031b25b..1c92f6c4af 100644 --- a/MediaBrowser.Server.Implementations/Library/SearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/SearchEngine.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Entities; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; @@ -97,6 +98,8 @@ private Task> GetSearchHints(IEnumerable i throw new ArgumentNullException("searchTerm"); } + searchTerm = searchTerm.RemoveDiacritics(); + var terms = GetWords(searchTerm); var hints = new List>(); @@ -318,6 +321,8 @@ private Tuple GetIndex(string input, string searchInput, List(searchInput, 0); From 34936cf4ef7e2a5b887e2c1365459c9bf4504abe Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 8 Jan 2015 23:05:45 -0500 Subject: [PATCH 06/11] fix multidisc albums --- .../Library/Resolvers/Audio/MusicAlbumResolver.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs index 0f703cb22b..a1c762283b 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs @@ -1,7 +1,5 @@ using MediaBrowser.Common.IO; using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Resolvers; @@ -159,7 +157,7 @@ private static bool ContainsMusic(IEnumerable list, return false; } - return discSubfolderCount > 0 && discSubfolderCount > 10; + return discSubfolderCount > 0; } private static bool IsMultiDiscFolder(string path) From f80bc0cff7e35ed863233f4a17b1b98b8f6862b0 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 8 Jan 2015 23:08:36 -0500 Subject: [PATCH 07/11] fix movie resolver with unset content type --- .../Library/Resolvers/Movies/MovieResolver.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index 441fada6ab..334a994744 100644 --- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -68,12 +68,12 @@ public MultiItemResolverResult ResolveMultiple(Folder parent, return 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 LX1$gfUVQo=5mn<# literal 0 HcmV?d00001 diff --git a/packages/MediaBrowser.Naming.1.0.0.27/lib/portable-net45+sl4+wp71+win8+wpa81/MediaBrowser.Naming.dll b/packages/MediaBrowser.Naming.1.0.0.27/lib/portable-net45+sl4+wp71+win8+wpa81/MediaBrowser.Naming.dll new file mode 100644 index 0000000000000000000000000000000000000000..de98403822c775685e97c4d89e31fb75158d2f62 GIT binary patch literal 56320 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 Date: Sat, 10 Jan 2015 00:53:35 -0500 Subject: [PATCH 10/11] add options for media in archives --- MediaBrowser.Api/PackageService.cs | 4 +- MediaBrowser.Api/PluginService.cs | 27 ++- MediaBrowser.LocalMetadata/BaseXmlProvider.cs | 8 + .../Configuration/ServerConfiguration.cs | 3 + MediaBrowser.Model/Plugins/PluginInfo.cs | 8 +- .../FileOrganization/EpisodeFileOrganizer.cs | 4 +- .../Library/LibraryManager.cs | 35 ++- .../Resolvers/Audio/MusicAlbumResolver.cs | 16 +- .../Resolvers/Audio/MusicArtistResolver.cs | 6 +- .../Library/Resolvers/BaseVideoResolver.cs | 8 +- .../Library/Resolvers/Movies/MovieResolver.cs | 49 +++- .../Library/Resolvers/TV/SeasonResolver.cs | 9 +- .../Library/Resolvers/TV/SeriesResolver.cs | 4 +- .../Localization/JavaScript/javascript.json | 5 +- .../Localization/Server/server.json | 7 +- .../dashboard-ui/css/notifications.css | 2 +- .../dashboard-ui/librarysettings.html | 42 +++- .../dashboard-ui/plugins.html | 4 +- .../dashboard-ui/scripts/librarysettings.js | 6 + .../dashboard-ui/scripts/pluginspage.js | 216 +++++++++++++----- .../dashboard-ui/scripts/useredit.js | 18 +- .../dashboard-ui/scripts/wizardagreement.js | 6 + 22 files changed, 370 insertions(+), 117 deletions(-) diff --git a/MediaBrowser.Api/PackageService.cs b/MediaBrowser.Api/PackageService.cs index 136969b170..1d792fbc16 100644 --- a/MediaBrowser.Api/PackageService.cs +++ b/MediaBrowser.Api/PackageService.cs @@ -186,9 +186,9 @@ public object Get(GetPackage request) ///
/// The request. /// System.Object. - public object Get(GetPackages request) + public async Task Get(GetPackages request) { - var packages = _installationManager.GetAvailablePackages(CancellationToken.None, request.PackageType, _appHost.ApplicationVersion).Result; + var packages = await _installationManager.GetAvailablePackages(CancellationToken.None, request.PackageType, _appHost.ApplicationVersion).ConfigureAwait(false); if (!string.IsNullOrEmpty(request.TargetSystems)) { diff --git a/MediaBrowser.Api/PluginService.cs b/MediaBrowser.Api/PluginService.cs index b4e12184aa..62aa1e755a 100644 --- a/MediaBrowser.Api/PluginService.cs +++ b/MediaBrowser.Api/PluginService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common; +using System.Threading; +using MediaBrowser.Common; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Security; using MediaBrowser.Common.Updates; @@ -13,6 +14,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace MediaBrowser.Api { @@ -155,10 +157,31 @@ public object Get(GetRegistrationStatus request) /// /// The request. /// System.Object. - public object Get(GetPlugins request) + public async Task Get(GetPlugins request) { var result = _appHost.Plugins.OrderBy(p => p.Name).Select(p => p.GetPluginInfo()).ToList(); + // Don't fail just on account of image url's + try + { + var packages = (await _installationManager.GetAvailablePackagesWithoutRegistrationInfo(CancellationToken.None)) + .ToList(); + + foreach (var plugin in result) + { + var pkg = packages.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i.guid) && new Guid(plugin.Id).Equals(new Guid(i.guid))); + + if (pkg != null) + { + plugin.ImageUrl = pkg.thumbImage; + } + } + } + catch + { + + } + return ToOptimizedSerializedResultUsingCache(result); } diff --git a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs index 74e3b61caa..7c60df4cbd 100644 --- a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs @@ -76,6 +76,14 @@ public string Name } } + public int Order + { + get + { + // After Nfo + return 1; + } + } } static class XmlProviderUtils diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index 6c941e8048..241ff61956 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -175,6 +175,9 @@ public class ServerConfiguration : BaseApplicationConfiguration public NameValuePair[] ContentTypes { get; set; } + public bool EnableAudioArchiveFiles { get; set; } + public bool EnableVideoArchiveFiles { get; set; } + /// /// Initializes a new instance of the class. /// diff --git a/MediaBrowser.Model/Plugins/PluginInfo.cs b/MediaBrowser.Model/Plugins/PluginInfo.cs index e84c06c218..06fa2322b3 100644 --- a/MediaBrowser.Model/Plugins/PluginInfo.cs +++ b/MediaBrowser.Model/Plugins/PluginInfo.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Model.Updates; -using System; +using System; namespace MediaBrowser.Model.Plugins { @@ -49,5 +48,10 @@ public class PluginInfo /// /// The unique id. public string Id { get; set; } + /// + /// Gets or sets the image URL. + /// + /// The image URL. + public string ImageUrl { get; set; } } } diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs index a4ac22eea1..611f887eed 100644 --- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs +++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs @@ -16,6 +16,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Server.Implementations.Library; namespace MediaBrowser.Server.Implementations.FileOrganization { @@ -55,7 +56,8 @@ public async Task OrganizeEpisodeFile(string path, TvFil FileSize = new FileInfo(path).Length }; - var resolver = new Naming.TV.EpisodeResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger()); + var namingOptions = ((LibraryManager) _libraryManager).GetNamingOptions(); + var resolver = new Naming.TV.EpisodeResolver(namingOptions, new Naming.Logging.NullLogger()); var episodeInfo = resolver.Resolve(path, FileInfoType.File) ?? new Naming.TV.EpisodeInfo(); diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs index 48bddd6a81..ab72d89fd8 100644 --- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs +++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs @@ -1754,24 +1754,24 @@ await item.RefreshMetadata(new MetadataRefreshOptions public bool IsVideoFile(string path) { - var resolver = new VideoResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger()); + var resolver = new VideoResolver(GetNamingOptions(), new Naming.Logging.NullLogger()); return resolver.IsVideoFile(path); } public bool IsAudioFile(string path) { - var parser = new AudioFileParser(new ExtendedNamingOptions()); + var parser = new AudioFileParser(GetNamingOptions()); return parser.IsAudioFile(path); } public int? GetSeasonNumberFromPath(string path) { - return new SeasonPathParser(new ExtendedNamingOptions(), new RegexProvider()).Parse(path, true, true).SeasonNumber; + return new SeasonPathParser(GetNamingOptions(), new RegexProvider()).Parse(path, true, true).SeasonNumber; } public bool FillMissingEpisodeNumbersFromPath(Episode episode) { - var resolver = new EpisodeResolver(new ExtendedNamingOptions(), + var resolver = new EpisodeResolver(GetNamingOptions(), new Naming.Logging.NullLogger()); var fileType = episode.VideoType == VideoType.BluRay || episode.VideoType == VideoType.Dvd || episode.VideoType == VideoType.HdDvd ? @@ -1889,9 +1889,28 @@ public bool FillMissingEpisodeNumbersFromPath(Episode episode) return changed; } + public NamingOptions GetNamingOptions() + { + var options = new ExtendedNamingOptions(); + + if (!ConfigurationManager.Configuration.EnableAudioArchiveFiles) + { + options.AudioFileExtensions.Remove(".rar"); + options.AudioFileExtensions.Remove(".zip"); + } + + if (!ConfigurationManager.Configuration.EnableVideoArchiveFiles) + { + options.VideoFileExtensions.Remove(".rar"); + options.VideoFileExtensions.Remove(".zip"); + } + + return options; + } + public ItemLookupInfo ParseName(string name) { - var resolver = new VideoResolver(new ExtendedNamingOptions(), new Naming.Logging.NullLogger()); + var resolver = new VideoResolver(GetNamingOptions(), new Naming.Logging.NullLogger()); var result = resolver.CleanDateTime(name); var cleanName = resolver.CleanString(result.Name); @@ -1910,7 +1929,7 @@ public IEnumerable