aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2017-05-31 15:40:34 -0400
committerGitHub <noreply@github.com>2017-05-31 15:40:34 -0400
commit91176d9ccc1dde8155c10411c70e62a9f4b059d5 (patch)
tree21365f5a8dd09534a53d9f88d2a7a3116f3f3f98
parentc37c9a75073b1b9caa3af2c3bc62abd837bd630e (diff)
parent4e10daf646e0788409f2bc52ef70effa2616e3f3 (diff)
Merge pull request #2677 from MediaBrowser/beta
Beta
-rw-r--r--Emby.Common.Implementations/BaseApplicationHost.cs60
-rw-r--r--Emby.Common.Implementations/Diagnostics/CommonProcess.cs7
-rw-r--r--Emby.Common.Implementations/Emby.Common.Implementations.csproj381
-rw-r--r--Emby.Common.Implementations/Emby.Common.Implementations.xproj23
-rw-r--r--Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs46
-rw-r--r--Emby.Common.Implementations/HttpClientManager/HttpClientManager.cs38
-rw-r--r--Emby.Common.Implementations/IO/ProgressStream.cs (renamed from MediaBrowser.Common/IO/ProgressStream.cs)32
-rw-r--r--Emby.Common.Implementations/Net/NetAcceptSocket.cs45
-rw-r--r--Emby.Common.Implementations/Net/SocketFactory.cs96
-rw-r--r--Emby.Common.Implementations/Net/UdpSocket.cs213
-rw-r--r--Emby.Common.Implementations/Properties/AssemblyInfo.cs23
-rw-r--r--Emby.Common.Implementations/Reflection/AssemblyInfo.cs6
-rw-r--r--Emby.Common.Implementations/Serialization/XmlSerializer.cs10
-rw-r--r--Emby.Common.Implementations/Xml/XmlReaderSettingsFactory.cs2
-rw-r--r--Emby.Common.Implementations/packages.config7
-rw-r--r--Emby.Common.Implementations/project.json71
-rw-r--r--Emby.Dlna/ContentDirectory/ControlHandler.cs58
-rw-r--r--Emby.Dlna/Didl/DidlBuilder.cs21
-rw-r--r--Emby.Dlna/PlayTo/PlayToController.cs1
-rw-r--r--Emby.Dlna/Profiles/DefaultProfile.cs12
-rw-r--r--Emby.Dlna/Profiles/Xml/Default.xml2
-rw-r--r--Emby.Dlna/Profiles/Xml/Denon AVR.xml2
-rw-r--r--Emby.Dlna/Profiles/Xml/MediaMonkey.xml2
-rw-r--r--Emby.Dlna/Profiles/Xml/foobar2000.xml2
-rw-r--r--Emby.Drawing.ImageMagick/ImageMagickEncoder.cs18
-rw-r--r--Emby.Drawing.ImageMagick/PlayedIndicatorDrawer.cs2
-rw-r--r--Emby.Drawing.ImageMagick/StripCollageBuilder.cs2
-rw-r--r--Emby.Drawing.ImageMagick/UnplayedCountIndicator.cs2
-rw-r--r--Emby.Drawing.Skia/Emby.Drawing.Skia.csproj9
-rw-r--r--Emby.Drawing.Skia/PlayedIndicatorDrawer.cs2
-rw-r--r--Emby.Drawing.Skia/SkiaEncoder.cs44
-rw-r--r--Emby.Drawing.Skia/UnplayedCountIndicator.cs2
-rw-r--r--Emby.Drawing.Skia/packages.config2
-rw-r--r--Emby.Drawing/Common/ImageHeader.cs2
-rw-r--r--Emby.Drawing/ImageProcessor.cs109
-rw-r--r--Emby.Drawing/NullImageEncoder.cs2
-rw-r--r--Emby.Server.Core/ApplicationHost.cs8
-rw-r--r--Emby.Server.Core/ApplicationPathHelper.cs (renamed from MediaBrowser.Server.Startup.Common/ApplicationPathHelper.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/ASN1.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/ASN1.cs)3
-rw-r--r--Emby.Server.Core/Cryptography/ASN1Convert.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/ASN1Convert.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/BitConverterLE.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/BitConverterLE.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/CertificateGenerator.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/CertificateGenerator.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/CryptoConvert.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/CryptoConvert.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/PKCS1.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/PKCS1.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/PKCS12.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/PKCS12.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/PKCS7.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/PKCS7.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/PKCS8.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/PKCS8.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/PfxGenerator.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/PfxGenerator.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X501Name.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X501Name.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X509Builder.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X509Builder.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X509Certificate.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X509Certificate.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X509CertificateBuilder.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X509CertificateBuilder.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X509CertificateCollection.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X509CertificateCollection.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X509Extension.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X509Extension.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X509Extensions.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X509Extensions.cs)2
-rw-r--r--Emby.Server.Core/Cryptography/X520Attributes.cs (renamed from MediaBrowser.Server.Startup.Common/Cryptography/X520Attributes.cs)2
-rw-r--r--Emby.Server.Core/Emby.Server.Core.csproj (renamed from MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj)87
-rw-r--r--Emby.Server.Core/Emby.Server.Core.xproj33
-rw-r--r--Emby.Server.Core/HttpServerFactory.cs27
-rw-r--r--Emby.Server.Core/IO/MemoryStreamProvider.cs (renamed from MediaBrowser.Server.Startup.Common/IO/MemoryStreamProvider.cs)2
-rw-r--r--Emby.Server.Core/Properties/AssemblyInfo.cs23
-rw-r--r--Emby.Server.Core/SystemEvents.cs (renamed from MediaBrowser.Server.Startup.Common/SystemEvents.cs)0
-rw-r--r--Emby.Server.Core/app.config11
-rw-r--r--Emby.Server.Core/packages.config6
-rw-r--r--Emby.Server.Core/project.json125
-rw-r--r--Emby.Server.Implementations/Channels/ChannelManager.cs16
-rw-r--r--Emby.Server.Implementations/Collections/CollectionImageProvider.cs6
-rw-r--r--Emby.Server.Implementations/Collections/CollectionManager.cs5
-rw-r--r--Emby.Server.Implementations/Collections/CollectionsDynamicFolder.cs2
-rw-r--r--Emby.Server.Implementations/Data/SqliteItemRepository.cs652
-rw-r--r--Emby.Server.Implementations/Devices/CameraUploadsDynamicFolder.cs2
-rw-r--r--Emby.Server.Implementations/Devices/DeviceManager.cs1
-rw-r--r--Emby.Server.Implementations/Dto/DtoService.cs149
-rw-r--r--Emby.Server.Implementations/Emby.Server.Implementations.csproj26
-rw-r--r--Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs2
-rw-r--r--Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs8
-rw-r--r--Emby.Server.Implementations/FileOrganization/FileOrganizationService.cs2
-rw-r--r--Emby.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs2
-rw-r--r--Emby.Server.Implementations/FileOrganization/TvFolderOrganizer.cs2
-rw-r--r--Emby.Server.Implementations/HttpServer/HttpListenerHost.cs8
-rw-r--r--Emby.Server.Implementations/HttpServer/HttpResultFactory.cs18
-rw-r--r--Emby.Server.Implementations/HttpServer/IHttpListener.cs3
-rw-r--r--Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs18
-rw-r--r--Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs5
-rw-r--r--Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs10
-rw-r--r--Emby.Server.Implementations/HttpServer/StreamWriter.cs2
-rw-r--r--Emby.Server.Implementations/IO/AsyncStreamCopier.cs459
-rw-r--r--Emby.Server.Implementations/IO/FileRefresher.cs16
-rw-r--r--Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs2
-rw-r--r--Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs59
-rw-r--r--Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs2
-rw-r--r--Emby.Server.Implementations/Library/LibraryManager.cs123
-rw-r--r--Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs7
-rw-r--r--Emby.Server.Implementations/Library/MusicManager.cs48
-rw-r--r--Emby.Server.Implementations/Library/ResolverHelper.cs2
-rw-r--r--Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs2
-rw-r--r--Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs2
-rw-r--r--Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs2
-rw-r--r--Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs2
-rw-r--r--Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs2
-rw-r--r--Emby.Server.Implementations/Library/SearchEngine.cs13
-rw-r--r--Emby.Server.Implementations/Library/UserDataManager.cs8
-rw-r--r--Emby.Server.Implementations/Library/UserViewManager.cs10
-rw-r--r--Emby.Server.Implementations/Library/Validators/PeopleValidator.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs33
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs47
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs32
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs9
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs2
-rw-r--r--Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs8
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs30
-rw-r--r--Emby.Server.Implementations/LiveTv/LiveTvManager.cs66
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs23
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs88
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs53
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs193
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs9
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs1
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs59
-rw-r--r--Emby.Server.Implementations/MediaEncoder/EncodingManager.cs2
-rw-r--r--Emby.Server.Implementations/Migrations/GuideMigration.cs4
-rw-r--r--Emby.Server.Implementations/Migrations/LibraryScanMigration.cs4
-rw-r--r--Emby.Server.Implementations/Migrations/UpdateLevelMigration.cs130
-rw-r--r--Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs6
-rw-r--r--Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs21
-rw-r--r--Emby.Server.Implementations/Playlists/PlaylistManager.cs28
-rw-r--r--Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs6
-rw-r--r--Emby.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs2
-rw-r--r--Emby.Server.Implementations/ServerManager/ServerManager.cs2
-rw-r--r--Emby.Server.Implementations/ServerManager/WebSocketConnection.cs1
-rw-r--r--Emby.Server.Implementations/Services/ResponseHelper.cs37
-rw-r--r--Emby.Server.Implementations/Services/ServiceController.cs6
-rw-r--r--Emby.Server.Implementations/Services/ServiceHandler.cs8
-rw-r--r--Emby.Server.Implementations/Session/HttpSessionController.cs26
-rw-r--r--Emby.Server.Implementations/Session/SessionManager.cs36
-rw-r--r--Emby.Server.Implementations/Session/SessionWebSocketListener.cs23
-rw-r--r--Emby.Server.Implementations/TV/SeriesPostScanTask.cs7
-rw-r--r--Emby.Server.Implementations/TV/TVSeriesManager.cs34
-rw-r--r--Emby.Server.Implementations/Udp/UdpServer.cs64
-rw-r--r--Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs28
-rw-r--r--Emby.Server.Implementations/UserViews/DynamicImageProvider.cs22
-rw-r--r--Emby.Server.sln289
-rw-r--r--MediaBrowser.Api/ApiEntryPoint.cs4
-rw-r--r--MediaBrowser.Api/BaseApiService.cs60
-rw-r--r--MediaBrowser.Api/ConfigurationService.cs5
-rw-r--r--MediaBrowser.Api/Dlna/DlnaServerService.cs2
-rw-r--r--MediaBrowser.Api/FilterService.cs4
-rw-r--r--MediaBrowser.Api/GamesService.cs18
-rw-r--r--MediaBrowser.Api/Images/ImageByNameService.cs2
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs9
-rw-r--r--MediaBrowser.Api/Images/RemoteImageService.cs7
-rw-r--r--MediaBrowser.Api/ItemRefreshService.cs2
-rw-r--r--MediaBrowser.Api/Library/LibraryService.cs26
-rw-r--r--MediaBrowser.Api/Library/LibraryStructureService.cs2
-rw-r--r--MediaBrowser.Api/LiveTv/LiveTvService.cs16
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj8
-rw-r--r--MediaBrowser.Api/Movies/MoviesService.cs18
-rw-r--r--MediaBrowser.Api/Music/InstantMixService.cs54
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs2
-rw-r--r--MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs85
-rw-r--r--MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs2
-rw-r--r--MediaBrowser.Api/Playback/MediaInfoService.cs2
-rw-r--r--MediaBrowser.Api/Playback/Progressive/AudioService.cs11
-rw-r--r--MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs11
-rw-r--r--MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs97
-rw-r--r--MediaBrowser.Api/Playback/Progressive/VideoService.cs3
-rw-r--r--MediaBrowser.Api/Playback/StreamState.cs57
-rw-r--r--MediaBrowser.Api/Playback/UniversalAudioService.cs97
-rw-r--r--MediaBrowser.Api/Reports/ReportsService.cs25
-rw-r--r--MediaBrowser.Api/StartupWizardService.cs2
-rw-r--r--MediaBrowser.Api/Subtitles/SubtitleService.cs2
-rw-r--r--MediaBrowser.Api/System/SystemService.cs2
-rw-r--r--MediaBrowser.Api/TvShowsService.cs22
-rw-r--r--MediaBrowser.Api/UserLibrary/ArtistsService.cs4
-rw-r--r--MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs7
-rw-r--r--MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs9
-rw-r--r--MediaBrowser.Api/UserLibrary/GameGenresService.cs6
-rw-r--r--MediaBrowser.Api/UserLibrary/GenresService.cs6
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs29
-rw-r--r--MediaBrowser.Api/UserLibrary/MusicGenresService.cs4
-rw-r--r--MediaBrowser.Api/UserLibrary/PersonsService.cs4
-rw-r--r--MediaBrowser.Api/UserLibrary/PlaystateService.cs20
-rw-r--r--MediaBrowser.Api/UserLibrary/StudiosService.cs6
-rw-r--r--MediaBrowser.Api/UserLibrary/UserLibraryService.cs29
-rw-r--r--MediaBrowser.Api/UserLibrary/UserViewsService.cs2
-rw-r--r--MediaBrowser.Api/VideosService.cs2
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj10
-rw-r--r--MediaBrowser.Controller/Channels/Channel.cs6
-rw-r--r--MediaBrowser.Controller/Channels/IChannelManager.cs2
-rw-r--r--MediaBrowser.Controller/Drawing/IImageEncoder.cs2
-rw-r--r--MediaBrowser.Controller/Drawing/IImageProcessor.cs4
-rw-r--r--MediaBrowser.Controller/Drawing/ImageHelper.cs10
-rw-r--r--MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs2
-rw-r--r--MediaBrowser.Controller/Dto/DtoOptions.cs21
-rw-r--r--MediaBrowser.Controller/Entities/AggregateFolder.cs1
-rw-r--r--MediaBrowser.Controller/Entities/Audio/Audio.cs4
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs25
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicArtist.cs14
-rw-r--r--MediaBrowser.Controller/Entities/Audio/MusicGenre.cs10
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs118
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs116
-rw-r--r--MediaBrowser.Controller/Entities/GameGenre.cs10
-rw-r--r--MediaBrowser.Controller/Entities/Genre.cs10
-rw-r--r--MediaBrowser.Controller/Entities/IHasImages.cs2
-rw-r--r--MediaBrowser.Controller/Entities/IHasUserData.cs2
-rw-r--r--MediaBrowser.Controller/Entities/IItemByName.cs7
-rw-r--r--MediaBrowser.Controller/Entities/InternalItemsQuery.cs51
-rw-r--r--MediaBrowser.Controller/Entities/Movies/BoxSet.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Person.cs16
-rw-r--r--MediaBrowser.Controller/Entities/Studio.cs10
-rw-r--r--MediaBrowser.Controller/Entities/TV/Episode.cs2
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs27
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs65
-rw-r--r--MediaBrowser.Controller/Entities/UserRootFolder.cs8
-rw-r--r--MediaBrowser.Controller/Entities/UserView.cs16
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs73
-rw-r--r--MediaBrowser.Controller/Entities/Video.cs41
-rw-r--r--MediaBrowser.Controller/Entities/Year.cs20
-rw-r--r--MediaBrowser.Controller/IO/FileData.cs2
-rw-r--r--MediaBrowser.Controller/Library/ILibraryManager.cs24
-rw-r--r--MediaBrowser.Controller/Library/IMusicManager.cs18
-rw-r--r--MediaBrowser.Controller/Library/IUserDataManager.cs4
-rw-r--r--MediaBrowser.Controller/Library/IUserViewManager.cs3
-rw-r--r--MediaBrowser.Controller/Library/ItemResolveArgs.cs2
-rw-r--r--MediaBrowser.Controller/LiveTv/ILiveTvManager.cs11
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveStream.cs50
-rw-r--r--MediaBrowser.Controller/LiveTv/LiveTvChannel.cs4
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj8
-rw-r--r--MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs20
-rw-r--r--MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs2
-rw-r--r--MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs2
-rw-r--r--MediaBrowser.Controller/Net/IHttpResultFactory.cs4
-rw-r--r--MediaBrowser.Controller/Net/StaticResultOptions.cs2
-rw-r--r--MediaBrowser.Controller/Playlists/Playlist.cs26
-rw-r--r--MediaBrowser.Controller/Providers/DirectoryService.cs2
-rw-r--r--MediaBrowser.Controller/Providers/IDirectoryService.cs2
-rw-r--r--MediaBrowser.Controller/Providers/LocalImageInfo.cs2
-rw-r--r--MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs3
-rw-r--r--MediaBrowser.Controller/Resolvers/IItemResolver.cs2
-rw-r--r--MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs2
-rw-r--r--MediaBrowser.Controller/TV/ITVSeriesManager.cs10
-rw-r--r--MediaBrowser.LocalMetadata/BaseXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs5
-rw-r--r--MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs2
-rw-r--r--MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs18
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs1
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/FontConfigLoader.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs6
-rw-r--r--MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj5
-rw-r--r--MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs2
-rw-r--r--MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs8
-rw-r--r--MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs5
-rw-r--r--MediaBrowser.Model/Configuration/ServerConfiguration.cs5
-rw-r--r--MediaBrowser.Model/Diagnostics/IProcess.cs2
-rw-r--r--MediaBrowser.Model/Dlna/ConditionProcessor.cs3
-rw-r--r--MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs2
-rw-r--r--MediaBrowser.Model/Dlna/DeviceProfile.cs3
-rw-r--r--MediaBrowser.Model/Dlna/StreamBuilder.cs10
-rw-r--r--MediaBrowser.Model/Dlna/StreamInfo.cs18
-rw-r--r--MediaBrowser.Model/Dto/BaseItemDto.cs4
-rw-r--r--MediaBrowser.Model/Dto/StudioDto.cs22
-rw-r--r--MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs8
-rw-r--r--MediaBrowser.Model/Net/IAcceptSocket.cs5
-rw-r--r--MediaBrowser.Model/Net/ISocket.cs15
-rw-r--r--MediaBrowser.Model/Net/ISocketFactory.cs4
-rw-r--r--MediaBrowser.Model/Querying/ItemFields.cs14
-rw-r--r--MediaBrowser.Model/Services/IAsyncStreamWriter.cs5
-rw-r--r--MediaBrowser.Mono.sln410
-rw-r--r--MediaBrowser.Mono.userprefs17
-rw-r--r--MediaBrowser.Providers/Books/AudioBookMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Books/AudioPodcastMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Books/BookMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs6
-rw-r--r--MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs2
-rw-r--r--MediaBrowser.Providers/Channels/ChannelMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Folders/FolderMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Folders/UserViewMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Games/GameMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Games/GameSystemMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Genres/GenreMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/LiveTv/AudioRecordingService.cs2
-rw-r--r--MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/LiveTv/VideoRecordingService.cs2
-rw-r--r--MediaBrowser.Providers/Manager/ImageSaver.cs7
-rw-r--r--MediaBrowser.Providers/Manager/ItemImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs10
-rw-r--r--MediaBrowser.Providers/Manager/ProviderManager.cs29
-rw-r--r--MediaBrowser.Providers/MediaBrowser.Providers.csproj8
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs2
-rw-r--r--MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs4
-rw-r--r--MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs2
-rw-r--r--MediaBrowser.Providers/Movies/MovieDbProvider.cs2
-rw-r--r--MediaBrowser.Providers/Movies/MovieMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Music/AlbumMetadataService.cs5
-rw-r--r--MediaBrowser.Providers/Music/ArtistMetadataService.cs6
-rw-r--r--MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs6
-rw-r--r--MediaBrowser.Providers/Music/AudioDbArtistProvider.cs6
-rw-r--r--MediaBrowser.Providers/Music/AudioMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Music/FanArtAlbumProvider.cs2
-rw-r--r--MediaBrowser.Providers/Music/FanArtArtistProvider.cs2
-rw-r--r--MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs4
-rw-r--r--MediaBrowser.Providers/Music/MusicVideoMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbItemProvider.cs2
-rw-r--r--MediaBrowser.Providers/Omdb/OmdbProvider.cs6
-rw-r--r--MediaBrowser.Providers/People/MovieDbPersonProvider.cs2
-rw-r--r--MediaBrowser.Providers/People/PersonMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/People/TvdbPersonImageProvider.cs7
-rw-r--r--MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Photos/PhotoMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Studios/StudioMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Subtitles/SubtitleManager.cs7
-rw-r--r--MediaBrowser.Providers/TV/DummySeasonProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/EpisodeMetadataService.cs6
-rw-r--r--MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/MissingEpisodeProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/SeasonMetadataService.cs6
-rw-r--r--MediaBrowser.Providers/TV/SeriesMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs8
-rw-r--r--MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs14
-rw-r--r--MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/Users/UserMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Videos/VideoMetadataService.cs2
-rw-r--r--MediaBrowser.Providers/Years/YearMetadataService.cs2
-rw-r--r--MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs5
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj8
-rw-r--r--MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs2
-rw-r--r--MediaBrowser.Server.Mac.sln240
-rw-r--r--MediaBrowser.Server.Mac/Emby.Server.Mac.csproj56
-rw-r--r--MediaBrowser.Server.Mac/Main.cs6
-rw-r--r--MediaBrowser.Server.Mac/packages.config2
-rw-r--r--MediaBrowser.Server.Mono/ImageEncoderHelper.cs10
-rw-r--r--MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj85
-rw-r--r--MediaBrowser.Server.Mono/MonoAppHost.cs5
-rw-r--r--MediaBrowser.Server.Mono/Program.cs22
-rw-r--r--MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config1
-rw-r--r--MediaBrowser.Server.Mono/app.config24
-rw-r--r--MediaBrowser.Server.Mono/packages.config6
-rw-r--r--MediaBrowser.Server.Startup.Common/UpdateLevelHelper.cs27
-rw-r--r--MediaBrowser.Server.Startup.Common/app.config11
-rw-r--r--MediaBrowser.Server.Startup.Common/packages.config4
-rw-r--r--MediaBrowser.ServerApplication/App.config2
-rw-r--r--MediaBrowser.ServerApplication/ImageEncoderHelper.cs29
-rw-r--r--MediaBrowser.ServerApplication/MainStartup.cs4
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj62
-rw-r--r--MediaBrowser.ServerApplication/WindowsAppHost.cs10
-rw-r--r--MediaBrowser.ServerApplication/packages.config8
-rw-r--r--MediaBrowser.ServerApplication/x64/libSkiaSharp.dll.REMOVED.git-id1
-rw-r--r--MediaBrowser.Tests/MediaBrowser.Tests.csproj13
-rw-r--r--MediaBrowser.Tests/app.config2
-rw-r--r--MediaBrowser.WebDashboard/Api/DashboardService.cs10
-rw-r--r--MediaBrowser.WebDashboard/Api/PackageCreator.cs8
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj8
-rw-r--r--MediaBrowser.XbmcMetadata/EntryPoint.cs4
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs7
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs2
-rw-r--r--MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs2
-rw-r--r--MediaBrowser.sln724
-rw-r--r--Mono.Nat/Mono.Nat.csproj98
-rw-r--r--Mono.Nat/Mono.Nat.xproj23
-rw-r--r--Mono.Nat/Properties/AssemblyInfo.cs24
-rw-r--r--Mono.Nat/project.json41
-rw-r--r--Nuget/MediaBrowser.Common.nuspec2
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec4
-rw-r--r--OpenSubtitlesHandler/OpenSubtitlesHandler.csproj5
-rw-r--r--RSSDP/SsdpCommunicationsServer.cs6
-rw-r--r--SocketHttpListener.Portable/Net/ChunkedInputStream.cs160
-rw-r--r--SocketHttpListener.Portable/Net/HttpConnection.cs558
-rw-r--r--SocketHttpListener.Portable/Net/HttpStreamAsyncResult.cs77
-rw-r--r--SocketHttpListener.Portable/Net/RequestStream.cs231
-rw-r--r--SocketHttpListener.Portable/Net/ResponseStream.cs453
-rw-r--r--SocketHttpListener.Portable/Primitives/HttpListenerException.cs17
-rw-r--r--SocketHttpListener.Portable/Properties/AssemblyInfo.cs30
-rw-r--r--SocketHttpListener.Portable/SocketHttpListener.Portable.nuget.targets6
-rw-r--r--SocketHttpListener.Portable/packages.config5
-rw-r--r--SocketHttpListener.Portable/project.json17
-rw-r--r--SocketHttpListener/ByteOrder.cs (renamed from SocketHttpListener.Portable/ByteOrder.cs)0
-rw-r--r--SocketHttpListener/CloseEventArgs.cs (renamed from SocketHttpListener.Portable/CloseEventArgs.cs)0
-rw-r--r--SocketHttpListener/CloseStatusCode.cs (renamed from SocketHttpListener.Portable/CloseStatusCode.cs)0
-rw-r--r--SocketHttpListener/CompressionMethod.cs (renamed from SocketHttpListener.Portable/CompressionMethod.cs)0
-rw-r--r--SocketHttpListener/ErrorEventArgs.cs (renamed from SocketHttpListener.Portable/ErrorEventArgs.cs)0
-rw-r--r--SocketHttpListener/Ext.cs (renamed from SocketHttpListener.Portable/Ext.cs)0
-rw-r--r--SocketHttpListener/Fin.cs (renamed from SocketHttpListener.Portable/Fin.cs)0
-rw-r--r--SocketHttpListener/HttpBase.cs (renamed from SocketHttpListener.Portable/HttpBase.cs)0
-rw-r--r--SocketHttpListener/HttpResponse.cs (renamed from SocketHttpListener.Portable/HttpResponse.cs)0
-rw-r--r--SocketHttpListener/Mask.cs (renamed from SocketHttpListener.Portable/Mask.cs)0
-rw-r--r--SocketHttpListener/MessageEventArgs.cs (renamed from SocketHttpListener.Portable/MessageEventArgs.cs)0
-rw-r--r--SocketHttpListener/Net/AuthenticationSchemeSelector.cs (renamed from SocketHttpListener.Portable/Net/AuthenticationSchemeSelector.cs)0
-rw-r--r--SocketHttpListener/Net/ChunkStream.cs (renamed from SocketHttpListener.Portable/Net/ChunkStream.cs)224
-rw-r--r--SocketHttpListener/Net/ChunkedInputStream.cs172
-rw-r--r--SocketHttpListener/Net/CookieHelper.cs (renamed from SocketHttpListener.Portable/Net/CookieHelper.cs)0
-rw-r--r--SocketHttpListener/Net/EndPointListener.cs (renamed from SocketHttpListener.Portable/Net/EndPointListener.cs)0
-rw-r--r--SocketHttpListener/Net/EndPointManager.cs (renamed from SocketHttpListener.Portable/Net/EndPointManager.cs)0
-rw-r--r--SocketHttpListener/Net/HttpConnection.cs536
-rw-r--r--SocketHttpListener/Net/HttpListener.cs (renamed from SocketHttpListener.Portable/Net/HttpListener.cs)0
-rw-r--r--SocketHttpListener/Net/HttpListenerBasicIdentity.cs (renamed from SocketHttpListener.Portable/Net/HttpListenerBasicIdentity.cs)0
-rw-r--r--SocketHttpListener/Net/HttpListenerContext.cs (renamed from SocketHttpListener.Portable/Net/HttpListenerContext.cs)0
-rw-r--r--SocketHttpListener/Net/HttpListenerPrefixCollection.cs (renamed from SocketHttpListener.Portable/Net/HttpListenerPrefixCollection.cs)0
-rw-r--r--SocketHttpListener/Net/HttpListenerRequest.cs (renamed from SocketHttpListener.Portable/Net/HttpListenerRequest.cs)2
-rw-r--r--SocketHttpListener/Net/HttpListenerResponse.cs (renamed from SocketHttpListener.Portable/Net/HttpListenerResponse.cs)49
-rw-r--r--SocketHttpListener/Net/HttpRequestStream.Managed.cs196
-rw-r--r--SocketHttpListener/Net/HttpRequestStream.cs144
-rw-r--r--SocketHttpListener/Net/HttpResponseStream.Managed.cs451
-rw-r--r--SocketHttpListener/Net/HttpResponseStream.cs139
-rw-r--r--SocketHttpListener/Net/HttpStatusCode.cs (renamed from SocketHttpListener.Portable/Net/HttpStatusCode.cs)0
-rw-r--r--SocketHttpListener/Net/HttpStreamAsyncResult.cs85
-rw-r--r--SocketHttpListener/Net/HttpVersion.cs (renamed from SocketHttpListener.Portable/Net/HttpVersion.cs)0
-rw-r--r--SocketHttpListener/Net/ListenerPrefix.cs (renamed from SocketHttpListener.Portable/Net/ListenerPrefix.cs)0
-rw-r--r--SocketHttpListener/Net/WebHeaderCollection.cs (renamed from SocketHttpListener.Portable/Net/WebHeaderCollection.cs)0
-rw-r--r--SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs (renamed from SocketHttpListener.Portable/Net/WebSockets/HttpListenerWebSocketContext.cs)0
-rw-r--r--SocketHttpListener/Net/WebSockets/WebSocketContext.cs (renamed from SocketHttpListener.Portable/Net/WebSockets/WebSocketContext.cs)0
-rw-r--r--SocketHttpListener/Opcode.cs (renamed from SocketHttpListener.Portable/Opcode.cs)0
-rw-r--r--SocketHttpListener/PayloadData.cs (renamed from SocketHttpListener.Portable/PayloadData.cs)0
-rw-r--r--SocketHttpListener/Primitives/ICertificate.cs (renamed from SocketHttpListener.Portable/Primitives/ICertificate.cs)0
-rw-r--r--SocketHttpListener/Primitives/IStreamFactory.cs (renamed from SocketHttpListener.Portable/Primitives/IStreamFactory.cs)0
-rw-r--r--SocketHttpListener/Primitives/ITextEncoding.cs (renamed from SocketHttpListener.Portable/Primitives/ITextEncoding.cs)0
-rw-r--r--SocketHttpListener/Properties/AssemblyInfo.cs (renamed from MediaBrowser.Server.Startup.Common/Properties/AssemblyInfo.cs)14
-rw-r--r--SocketHttpListener/Rsv.cs (renamed from SocketHttpListener.Portable/Rsv.cs)0
-rw-r--r--SocketHttpListener/SocketHttpListener.csproj (renamed from SocketHttpListener.Portable/SocketHttpListener.Portable.csproj)42
-rw-r--r--SocketHttpListener/WebSocket.cs (renamed from SocketHttpListener.Portable/WebSocket.cs)0
-rw-r--r--SocketHttpListener/WebSocketException.cs (renamed from SocketHttpListener.Portable/WebSocketException.cs)0
-rw-r--r--SocketHttpListener/WebSocketFrame.cs (renamed from SocketHttpListener.Portable/WebSocketFrame.cs)0
-rw-r--r--SocketHttpListener/WebSocketState.cs (renamed from SocketHttpListener.Portable/WebSocketState.cs)0
-rw-r--r--global.json6
-rw-r--r--src/Emby.Server/ApplicationPathHelper.cs40
-rw-r--r--src/Emby.Server/CoreAppHost.cs57
-rw-r--r--src/Emby.Server/CoreSystemEvents.cs13
-rw-r--r--src/Emby.Server/Emby.Server.xproj45
-rw-r--r--src/Emby.Server/IO/MemoryStreamFactory.cs33
-rw-r--r--src/Emby.Server/PowerManagement.cs15
-rw-r--r--src/Emby.Server/Program.cs346
-rw-r--r--src/Emby.Server/Properties/AssemblyInfo.cs19
-rw-r--r--src/Emby.Server/project.json122
483 files changed, 6737 insertions, 6655 deletions
diff --git a/Emby.Common.Implementations/BaseApplicationHost.cs b/Emby.Common.Implementations/BaseApplicationHost.cs
index d3d8672bea..d16afbce3d 100644
--- a/Emby.Common.Implementations/BaseApplicationHost.cs
+++ b/Emby.Common.Implementations/BaseApplicationHost.cs
@@ -31,7 +31,6 @@ using Emby.Common.Implementations.Net;
using Emby.Common.Implementations.EnvironmentInfo;
using Emby.Common.Implementations.Threading;
using MediaBrowser.Common;
-using MediaBrowser.Common.IO;
using MediaBrowser.Model.Cryptography;
using MediaBrowser.Model.Diagnostics;
using MediaBrowser.Model.Net;
@@ -39,10 +38,6 @@ using MediaBrowser.Model.System;
using MediaBrowser.Model.Tasks;
using MediaBrowser.Model.Threading;
-#if NETSTANDARD1_6
-using System.Runtime.Loader;
-#endif
-
namespace Emby.Common.Implementations
{
/// <summary>
@@ -179,9 +174,15 @@ namespace Emby.Common.Implementations
}
}
- public virtual PackageVersionClass SystemUpdateLevel
+ public PackageVersionClass SystemUpdateLevel
{
- get { return PackageVersionClass.Release; }
+ get {
+
+#if BETA
+ return PackageVersionClass.Beta;
+#endif
+ return PackageVersionClass.Release;
+ }
}
public virtual string OperatingSystemDisplayName
@@ -306,7 +307,6 @@ namespace Emby.Common.Implementations
builder.AppendLine(string.Format("Command line: {0}", string.Join(" ", Environment.GetCommandLineArgs())));
-#if NET46
builder.AppendLine(string.Format("Operating system: {0}", Environment.OSVersion));
builder.AppendLine(string.Format("64-Bit OS: {0}", Environment.Is64BitOperatingSystem));
builder.AppendLine(string.Format("64-Bit Process: {0}", Environment.Is64BitProcess));
@@ -320,7 +320,6 @@ namespace Emby.Common.Implementations
builder.AppendLine("Mono: " + displayName.Invoke(null, null));
}
}
-#endif
builder.AppendLine(string.Format("Processor count: {0}", Environment.ProcessorCount));
builder.AppendLine(string.Format("Program data path: {0}", appPaths.ProgramDataPath));
@@ -336,9 +335,7 @@ namespace Emby.Common.Implementations
try
{
// Increase the max http request limit
-#if NET46
ServicePointManager.DefaultConnectionLimit = Math.Max(96, ServicePointManager.DefaultConnectionLimit);
-#endif
}
catch (Exception ex)
{
@@ -436,7 +433,6 @@ namespace Emby.Common.Implementations
if (assemblyPlugin != null)
{
-#if NET46
var assembly = plugin.GetType().Assembly;
var assemblyName = assembly.GetName();
@@ -447,21 +443,6 @@ namespace Emby.Common.Implementations
var assemblyFilePath = Path.Combine(ApplicationPaths.PluginsPath, assemblyFileName);
assemblyPlugin.SetAttributes(assemblyFilePath, assemblyFileName, assemblyName.Version, assemblyId);
-#elif NETSTANDARD1_6
- var typeInfo = plugin.GetType().GetTypeInfo();
- var assembly = typeInfo.Assembly;
- var assemblyName = assembly.GetName();
-
- var attribute = (GuidAttribute)assembly.GetCustomAttribute(typeof(GuidAttribute));
- var assemblyId = new Guid(attribute.Value);
-
- var assemblyFileName = assemblyName.Name + ".dll";
- var assemblyFilePath = Path.Combine(ApplicationPaths.PluginsPath, assemblyFileName);
-
- assemblyPlugin.SetAttributes(assemblyFilePath, assemblyFileName, assemblyName.Version, assemblyId);
-#else
-return null;
-#endif
}
var isFirstRun = !File.Exists(plugin.ConfigurationFilePath);
@@ -492,17 +473,7 @@ return null;
AllConcreteTypes = assemblies
.SelectMany(GetTypes)
- .Where(t =>
- {
-#if NET46
- return t.IsClass && !t.IsAbstract && !t.IsInterface && !t.IsGenericType;
-#endif
-#if NETSTANDARD1_6
- var typeInfo = t.GetTypeInfo();
- return typeInfo.IsClass && !typeInfo.IsAbstract && !typeInfo.IsInterface && !typeInfo.IsGenericType;
-#endif
- return false;
- })
+ .Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface && !t.IsGenericType)
.ToArray();
}
@@ -717,13 +688,7 @@ return null;
{
try
{
-#if NET46
return Assembly.Load(File.ReadAllBytes(file));
-#elif NETSTANDARD1_6
-
- return AssemblyLoadContext.Default.LoadFromStream(new MemoryStream(File.ReadAllBytes(file)));
-#endif
- return null;
}
catch (Exception ex)
{
@@ -742,14 +707,7 @@ return null;
{
var currentType = typeof(T);
-#if NET46
return AllConcreteTypes.Where(currentType.IsAssignableFrom);
-#elif NETSTANDARD1_6
- var currentTypeInfo = currentType.GetTypeInfo();
-
- return AllConcreteTypes.Where(currentTypeInfo.IsAssignableFrom);
-#endif
- return new List<Type>();
}
/// <summary>
diff --git a/Emby.Common.Implementations/Diagnostics/CommonProcess.cs b/Emby.Common.Implementations/Diagnostics/CommonProcess.cs
index 462345ced5..afd30bc47f 100644
--- a/Emby.Common.Implementations/Diagnostics/CommonProcess.cs
+++ b/Emby.Common.Implementations/Diagnostics/CommonProcess.cs
@@ -31,14 +31,12 @@ namespace Emby.Common.Implementations.Diagnostics
RedirectStandardOutput = options.RedirectStandardOutput
};
-#if NET46
startInfo.ErrorDialog = options.ErrorDialog;
if (options.IsHidden)
{
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
}
-#endif
_process = new Process
{
@@ -100,6 +98,11 @@ namespace Emby.Common.Implementations.Diagnostics
return _process.WaitForExit(timeMs);
}
+ public Task<bool> WaitForExitAsync(int timeMs)
+ {
+ return Task.FromResult(_process.WaitForExit(timeMs));
+ }
+
public void Dispose()
{
_process.Dispose();
diff --git a/Emby.Common.Implementations/Emby.Common.Implementations.csproj b/Emby.Common.Implementations/Emby.Common.Implementations.csproj
new file mode 100644
index 0000000000..bf52ff0c7e
--- /dev/null
+++ b/Emby.Common.Implementations/Emby.Common.Implementations.csproj
@@ -0,0 +1,381 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{1E37A338-9F57-4B70-BD6D-BB9C591E319B}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>Emby.Common.Implementations</RootNamespace>
+ <AssemblyName>Emby.Common.Implementations</AssemblyName>
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
+ <HintPath>..\packages\NLog.4.4.9\lib\net45\NLog.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
+ <Reference Include="SharpCompress, Version=0.14.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
+ <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="..\SharedVersion.cs">
+ <Link>Properties\SharedVersion.cs</Link>
+ </Compile>
+ <Compile Include="Archiving\ZipClient.cs" />
+ <Compile Include="BaseApplicationHost.cs" />
+ <Compile Include="Cryptography\CryptographyProvider.cs" />
+ <Compile Include="Devices\DeviceId.cs" />
+ <Compile Include="Diagnostics\CommonProcess.cs" />
+ <Compile Include="Diagnostics\ProcessFactory.cs" />
+ <Compile Include="EnvironmentInfo\EnvironmentInfo.cs" />
+ <Compile Include="HttpClientManager\HttpClientInfo.cs" />
+ <Compile Include="HttpClientManager\HttpClientManager.cs" />
+ <Compile Include="IO\IsoManager.cs" />
+ <Compile Include="IO\LnkShortcutHandler.cs" />
+ <Compile Include="IO\ManagedFileSystem.cs" />
+ <Compile Include="IO\ProgressStream.cs" />
+ <Compile Include="IO\SharpCifsFileSystem.cs" />
+ <Compile Include="IO\SharpCifs\Config.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcBind.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcBinding.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcConstants.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcError.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcException.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcHandle.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcMessage.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcPipeHandle.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\DcerpcSecurityProvider.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\LsaPolicyHandle.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\Lsarpc.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\LsarSidArrayX.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcDfsRootEnum.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcEnumerateAliasesInDomain.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcGetMembersInAlias.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcLookupSids.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcLsarOpenPolicy2.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcQueryInformationPolicy.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcSamrConnect2.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcSamrConnect4.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcSamrOpenAlias.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcSamrOpenDomain.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcShareEnum.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\MsrpcShareGetInfo.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\Netdfs.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\Samr.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\SamrAliasHandle.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\SamrDomainHandle.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\SamrPolicyHandle.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Msrpc\Srvsvc.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Ndr\NdrBuffer.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Ndr\NdrException.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Ndr\NdrHyper.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Ndr\NdrLong.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Ndr\NdrObject.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Ndr\NdrShort.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Ndr\NdrSmall.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\Rpc.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\UnicodeString.cs" />
+ <Compile Include="IO\SharpCifs\Dcerpc\UUID.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\Lmhosts.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\Name.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NameQueryRequest.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NameQueryResponse.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NameServiceClient.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NameServicePacket.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NbtAddress.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NbtException.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NodeStatusRequest.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\NodeStatusResponse.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\SessionRequestPacket.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\SessionRetargetResponsePacket.cs" />
+ <Compile Include="IO\SharpCifs\Netbios\SessionServicePacket.cs" />
+ <Compile Include="IO\SharpCifs\Ntlmssp\NtlmFlags.cs" />
+ <Compile Include="IO\SharpCifs\Ntlmssp\NtlmMessage.cs" />
+ <Compile Include="IO\SharpCifs\Ntlmssp\Type1Message.cs" />
+ <Compile Include="IO\SharpCifs\Ntlmssp\Type2Message.cs" />
+ <Compile Include="IO\SharpCifs\Ntlmssp\Type3Message.cs" />
+ <Compile Include="IO\SharpCifs\Smb\ACE.cs" />
+ <Compile Include="IO\SharpCifs\Smb\AllocInfo.cs" />
+ <Compile Include="IO\SharpCifs\Smb\AndXServerMessageBlock.cs" />
+ <Compile Include="IO\SharpCifs\Smb\BufferCache.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Dfs.cs" />
+ <Compile Include="IO\SharpCifs\Smb\DfsReferral.cs" />
+ <Compile Include="IO\SharpCifs\Smb\DosError.cs" />
+ <Compile Include="IO\SharpCifs\Smb\DosFileFilter.cs" />
+ <Compile Include="IO\SharpCifs\Smb\FileEntry.cs" />
+ <Compile Include="IO\SharpCifs\Smb\IInfo.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NetServerEnum2.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NetServerEnum2Response.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NetShareEnum.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NetShareEnumResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NtlmAuthenticator.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NtlmChallenge.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NtlmContext.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NtlmPasswordAuthentication.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NtStatus.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NtTransQuerySecurityDesc.cs" />
+ <Compile Include="IO\SharpCifs\Smb\NtTransQuerySecurityDescResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Principal.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SecurityDescriptor.cs" />
+ <Compile Include="IO\SharpCifs\Smb\ServerMessageBlock.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SID.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SigningDigest.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbAuthException.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComBlankResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComClose.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComCreateDirectory.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComDelete.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComDeleteDirectory.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComFindClose2.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComLogoffAndX.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComNegotiate.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComNegotiateResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComNTCreateAndX.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComNTCreateAndXResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComNtTransaction.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComNtTransactionResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComOpenAndX.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComOpenAndXResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComQueryInformation.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComQueryInformationResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComReadAndX.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComReadAndXResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComRename.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComSessionSetupAndX.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComSessionSetupAndXResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComTransaction.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComTransactionResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComTreeConnectAndX.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComTreeConnectAndXResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComTreeDisconnect.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComWrite.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComWriteAndX.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComWriteAndXResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbComWriteResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbConstants.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbException.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbFile.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbFileExtensions.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbFileFilter.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbFileInputStream.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbFilenameFilter.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbFileOutputStream.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbNamedPipe.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbRandomAccessFile.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbSession.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbShareInfo.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbTransport.cs" />
+ <Compile Include="IO\SharpCifs\Smb\SmbTree.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2FindFirst2.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2FindFirst2Response.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2FindNext2.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2GetDfsReferral.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2GetDfsReferralResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2QueryFSInformation.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2QueryFSInformationResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2QueryPathInformation.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2QueryPathInformationResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2SetFileInformation.cs" />
+ <Compile Include="IO\SharpCifs\Smb\Trans2SetFileInformationResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransactNamedPipeInputStream.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransactNamedPipeOutputStream.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransCallNamedPipe.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransCallNamedPipeResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransPeekNamedPipe.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransPeekNamedPipeResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransTransactNamedPipe.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransTransactNamedPipeResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransWaitNamedPipe.cs" />
+ <Compile Include="IO\SharpCifs\Smb\TransWaitNamedPipeResponse.cs" />
+ <Compile Include="IO\SharpCifs\Smb\WinError.cs" />
+ <Compile Include="IO\SharpCifs\UniAddress.cs" />
+ <Compile Include="IO\SharpCifs\Util\Base64.cs" />
+ <Compile Include="IO\SharpCifs\Util\DES.cs" />
+ <Compile Include="IO\SharpCifs\Util\Encdec.cs" />
+ <Compile Include="IO\SharpCifs\Util\Hexdump.cs" />
+ <Compile Include="IO\SharpCifs\Util\HMACT64.cs" />
+ <Compile Include="IO\SharpCifs\Util\LogStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\MD4.cs" />
+ <Compile Include="IO\SharpCifs\Util\RC4.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\AbstractMap.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Arrays.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\BufferedReader.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\BufferedWriter.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\CharBuffer.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\CharSequence.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Collections.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\ConcurrentHashMap.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\DateFormat.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\EnumeratorWrapper.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Exceptions.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Extensions.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\FileInputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\FileOutputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\FilePath.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\FileReader.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\FileWriter.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\FilterInputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\FilterOutputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Hashtable.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\HttpURLConnection.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\ICallable.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\IConcurrentMap.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\IExecutor.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\IFilenameFilter.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\IFuture.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\InputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\InputStreamReader.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\IPrivilegedAction.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\IRunnable.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Iterator.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\LinkageError.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Matcher.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\MD5.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\MD5Managed.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\MessageDigest.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\NetworkStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\ObjectInputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\ObjectOutputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\OutputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\OutputStreamWriter.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\PipedInputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\PipedOutputStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\PrintWriter.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Properties.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\RandomAccessFile.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\ReentrantLock.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Reference.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Runtime.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\SimpleDateFormat.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\SocketEx.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\StringTokenizer.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\SynchronizedList.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\Thread.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\ThreadFactory.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\ThreadPoolExecutor.cs" />
+ <Compile Include="IO\SharpCifs\Util\Sharpen\WrappedSystemStream.cs" />
+ <Compile Include="IO\SharpCifs\Util\Transport\Request.cs" />
+ <Compile Include="IO\SharpCifs\Util\Transport\Response.cs" />
+ <Compile Include="IO\SharpCifs\Util\Transport\Transport.cs" />
+ <Compile Include="IO\SharpCifs\Util\Transport\TransportException.cs" />
+ <Compile Include="Logging\NLogger.cs" />
+ <Compile Include="Logging\NlogManager.cs" />
+ <Compile Include="Networking\NetworkManager.cs" />
+ <Compile Include="Net\DisposableManagedObjectBase.cs" />
+ <Compile Include="Net\NetAcceptSocket.cs" />
+ <Compile Include="Net\SocketAcceptor.cs" />
+ <Compile Include="Net\SocketFactory.cs" />
+ <Compile Include="Net\UdpSocket.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Reflection\AssemblyInfo.cs" />
+ <Compile Include="ScheduledTasks\DailyTrigger.cs" />
+ <Compile Include="ScheduledTasks\IntervalTrigger.cs" />
+ <Compile Include="ScheduledTasks\ScheduledTaskWorker.cs" />
+ <Compile Include="ScheduledTasks\StartupTrigger.cs" />
+ <Compile Include="ScheduledTasks\SystemEventTrigger.cs" />
+ <Compile Include="ScheduledTasks\TaskManager.cs" />
+ <Compile Include="ScheduledTasks\Tasks\DeleteCacheFileTask.cs" />
+ <Compile Include="ScheduledTasks\Tasks\DeleteLogFileTask.cs" />
+ <Compile Include="ScheduledTasks\Tasks\ReloadLoggerFileTask.cs" />
+ <Compile Include="ScheduledTasks\WeeklyTrigger.cs" />
+ <Compile Include="Serialization\JsonSerializer.cs" />
+ <Compile Include="Serialization\XmlSerializer.cs" />
+ <Compile Include="TextEncoding\TextEncoding.cs" />
+ <Compile Include="TextEncoding\TextEncodingDetect.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\CharsetDetector.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\Big5Prober.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\BitPackage.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\CharDistributionAnalyser.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\CharsetProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\Charsets.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\CodingStateMachine.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\EscCharsetProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\EscSM.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\EUCJPProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\EUCKRProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\EUCTWProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\GB18030Prober.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\HebrewProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\JapaneseContextAnalyser.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\LangBulgarianModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\LangCyrillicModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\LangGreekModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\LangHebrewModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\LangHungarianModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\LangThaiModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\Latin1Prober.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\MBCSGroupProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\MBCSSM.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\SBCharsetProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\SBCSGroupProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\SequenceModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\SJISProber.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\SMModel.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\UniversalDetector.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\Core\UTF8Prober.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\DetectionConfidence.cs" />
+ <Compile Include="TextEncoding\UniversalDetector\ICharsetDetector.cs" />
+ <Compile Include="Threading\CommonTimer.cs" />
+ <Compile Include="Threading\TimerFactory.cs" />
+ <Compile Include="Xml\XmlReaderSettingsFactory.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
+ <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
+ <Name>MediaBrowser.Common</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
+ <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
+ <Name>MediaBrowser.Model</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project> \ No newline at end of file
diff --git a/Emby.Common.Implementations/Emby.Common.Implementations.xproj b/Emby.Common.Implementations/Emby.Common.Implementations.xproj
deleted file mode 100644
index 5bb6e4e589..0000000000
--- a/Emby.Common.Implementations/Emby.Common.Implementations.xproj
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
- <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
- </PropertyGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
- <PropertyGroup Label="Globals">
- <ProjectGuid>5a27010a-09c6-4e86-93ea-437484c10917</ProjectGuid>
- <RootNamespace>Emby.Common.Implementations</RootNamespace>
- <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
- <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
- <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
- </PropertyGroup>
- <PropertyGroup>
- <SchemaVersion>2.0</SchemaVersion>
- </PropertyGroup>
- <ItemGroup>
- <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
- <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
- </ItemGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
-</Project> \ No newline at end of file
diff --git a/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs b/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs
index 27fc642f14..89aa787b56 100644
--- a/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs
+++ b/Emby.Common.Implementations/EnvironmentInfo/EnvironmentInfo.cs
@@ -10,7 +10,7 @@ namespace Emby.Common.Implementations.EnvironmentInfo
{
public class EnvironmentInfo : IEnvironmentInfo
{
- public MediaBrowser.Model.System.Architecture? CustomArchitecture { get; set; }
+ public Architecture? CustomArchitecture { get; set; }
public MediaBrowser.Model.System.OperatingSystem? CustomOperatingSystem { get; set; }
public virtual MediaBrowser.Model.System.OperatingSystem OperatingSystem
@@ -22,7 +22,6 @@ namespace Emby.Common.Implementations.EnvironmentInfo
return CustomOperatingSystem.Value;
}
-#if NET46
switch (Environment.OSVersion.Platform)
{
case PlatformID.MacOSX:
@@ -32,20 +31,7 @@ namespace Emby.Common.Implementations.EnvironmentInfo
case PlatformID.Unix:
return MediaBrowser.Model.System.OperatingSystem.Linux;
}
-#elif NETSTANDARD1_6
- if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
- {
- return OperatingSystem.OSX;
- }
- if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
- {
- return OperatingSystem.Windows;
- }
- if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
- {
- return OperatingSystem.Linux;
- }
-#endif
+
return MediaBrowser.Model.System.OperatingSystem.Windows;
}
}
@@ -54,12 +40,7 @@ namespace Emby.Common.Implementations.EnvironmentInfo
{
get
{
-#if NET46
return Environment.OSVersion.Platform.ToString();
-#elif NETSTANDARD1_6
- return System.Runtime.InteropServices.RuntimeInformation.OSDescription;
-#endif
- return "Operating System";
}
}
@@ -67,12 +48,7 @@ namespace Emby.Common.Implementations.EnvironmentInfo
{
get
{
-#if NET46
return Environment.OSVersion.Version.ToString() + " " + Environment.OSVersion.ServicePack.ToString();
-#elif NETSTANDARD1_6
- return System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription;
-#endif
- return "1.0";
}
}
@@ -84,7 +60,7 @@ namespace Emby.Common.Implementations.EnvironmentInfo
}
}
- public MediaBrowser.Model.System.Architecture SystemArchitecture
+ public Architecture SystemArchitecture
{
get
{
@@ -92,22 +68,8 @@ namespace Emby.Common.Implementations.EnvironmentInfo
{
return CustomArchitecture.Value;
}
-#if NET46
+
return Environment.Is64BitOperatingSystem ? MediaBrowser.Model.System.Architecture.X64 : MediaBrowser.Model.System.Architecture.X86;
-#elif NETSTANDARD1_6
- switch(System.Runtime.InteropServices.RuntimeInformation.OSArchitecture)
- {
- case System.Runtime.InteropServices.Architecture.Arm:
- return MediaBrowser.Model.System.Architecture.Arm;
- case System.Runtime.InteropServices.Architecture.Arm64:
- return MediaBrowser.Model.System.Architecture.Arm64;
- case System.Runtime.InteropServices.Architecture.X64:
- return MediaBrowser.Model.System.Architecture.X64;
- case System.Runtime.InteropServices.Architecture.X86:
- return MediaBrowser.Model.System.Architecture.X86;
- }
-#endif
- return MediaBrowser.Model.System.Architecture.X64;
}
}
diff --git a/Emby.Common.Implementations/HttpClientManager/HttpClientManager.cs b/Emby.Common.Implementations/HttpClientManager/HttpClientManager.cs
index eb9bc1bd06..5bd18cb808 100644
--- a/Emby.Common.Implementations/HttpClientManager/HttpClientManager.cs
+++ b/Emby.Common.Implementations/HttpClientManager/HttpClientManager.cs
@@ -1,7 +1,6 @@
using System.Net.Sockets;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
@@ -17,6 +16,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Emby.Common.Implementations.HttpClientManager;
+using Emby.Common.Implementations.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Common;
@@ -66,13 +66,11 @@ namespace Emby.Common.Implementations.HttpClientManager
_appPaths = appPaths;
_defaultUserAgentFn = defaultUserAgentFn;
-#if NET46
// http://stackoverflow.com/questions/566437/http-post-returns-the-error-417-expectation-failed-c
ServicePointManager.Expect100Continue = false;
// Trakt requests sometimes fail without this
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;
-#endif
}
/// <summary>
@@ -129,7 +127,6 @@ namespace Emby.Common.Implementations.HttpClientManager
private void AddIpv4Option(HttpWebRequest request, HttpRequestOptions options)
{
-#if NET46
request.ServicePoint.BindIPEndPointDelegate = (servicePount, remoteEndPoint, retryCount) =>
{
if (remoteEndPoint.AddressFamily == AddressFamily.InterNetwork)
@@ -138,7 +135,6 @@ namespace Emby.Common.Implementations.HttpClientManager
}
throw new InvalidOperationException("no IPv4 address");
};
-#endif
}
private WebRequest GetRequest(HttpRequestOptions options, string method)
@@ -165,7 +161,6 @@ namespace Emby.Common.Implementations.HttpClientManager
AddRequestHeaders(httpWebRequest, options);
-#if NET46
if (options.EnableHttpCompression)
{
if (options.DecompressionMethod.HasValue)
@@ -183,48 +178,33 @@ namespace Emby.Common.Implementations.HttpClientManager
{
httpWebRequest.AutomaticDecompression = DecompressionMethods.None;
}
-#endif
}
-#if NET46
request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
-#endif
if (httpWebRequest != null)
{
if (options.EnableKeepAlive)
{
-#if NET46
httpWebRequest.KeepAlive = true;
-#endif
}
}
request.Method = method;
-#if NET46
request.Timeout = options.TimeoutMs;
-#endif
if (httpWebRequest != null)
{
if (!string.IsNullOrEmpty(options.Host))
{
-#if NET46
httpWebRequest.Host = options.Host;
-#elif NETSTANDARD1_6
- httpWebRequest.Headers["Host"] = options.Host;
-#endif
}
if (!string.IsNullOrEmpty(options.Referer))
{
-#if NET46
httpWebRequest.Referer = options.Referer;
-#elif NETSTANDARD1_6
- httpWebRequest.Headers["Referer"] = options.Referer;
-#endif
}
}
@@ -235,9 +215,7 @@ namespace Emby.Common.Implementations.HttpClientManager
{
request.Credentials = GetCredential(url, parts[0], parts[1]);
// TODO: .net core ??
-#if NET46
request.PreAuthenticate = true;
-#endif
}
}
@@ -269,11 +247,7 @@ namespace Emby.Common.Implementations.HttpClientManager
}
else
{
-#if NET46
request.Headers.Set(header.Key, header.Value);
-#elif NETSTANDARD1_6
- request.Headers[header.Key] = header.Value;
-#endif
}
}
@@ -285,11 +259,7 @@ namespace Emby.Common.Implementations.HttpClientManager
private void SetUserAgent(HttpWebRequest request, string userAgent)
{
-#if NET46
request.UserAgent = userAgent;
-#elif NETSTANDARD1_6
- request.Headers["User-Agent"] = userAgent;
-#endif
}
/// <summary>
@@ -465,9 +435,7 @@ namespace Emby.Common.Implementations.HttpClientManager
httpWebRequest.ContentType = options.RequestContentType ?? "application/x-www-form-urlencoded";
-#if NET46
httpWebRequest.ContentLength = bytes.Length;
-#endif
(await httpWebRequest.GetRequestStreamAsync().ConfigureAwait(false)).Write(bytes, 0, bytes.Length);
}
catch (Exception ex)
@@ -950,7 +918,6 @@ namespace Emby.Common.Implementations.HttpClientManager
private Task<WebResponse> GetResponseAsync(WebRequest request, TimeSpan timeout)
{
-#if NET46
var taskCompletion = new TaskCompletionSource<WebResponse>();
Task<WebResponse> asyncTask = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
@@ -963,9 +930,6 @@ namespace Emby.Common.Implementations.HttpClientManager
asyncTask.ContinueWith(callback.OnError, TaskContinuationOptions.OnlyOnFaulted);
return taskCompletion.Task;
-#endif
-
- return request.GetResponseAsync();
}
private static void TimeoutCallback(object state, bool timedOut)
diff --git a/MediaBrowser.Common/IO/ProgressStream.cs b/Emby.Common.Implementations/IO/ProgressStream.cs
index 468b3d3456..fb8cf86dfc 100644
--- a/MediaBrowser.Common/IO/ProgressStream.cs
+++ b/Emby.Common.Implementations/IO/ProgressStream.cs
@@ -1,7 +1,7 @@
using System;
using System.IO;
-namespace MediaBrowser.Common.IO
+namespace Emby.Common.Implementations.IO
{
/// <summary>
/// Measures progress when reading from a stream or writing to one
@@ -155,6 +155,21 @@ namespace MediaBrowser.Common.IO
return read;
}
+ public override int EndRead(IAsyncResult asyncResult)
+ {
+ var read = base.EndRead(asyncResult);
+
+ BytesProcessed += read;
+
+ double percent = BytesProcessed;
+ percent /= ReadLength ?? BaseStream.Length;
+ percent *= 100;
+
+ ProgressAction(percent);
+
+ return read;
+ }
+
/// <summary>
/// When overridden in a derived class, sets the position within the current stream.
/// </summary>
@@ -194,6 +209,21 @@ namespace MediaBrowser.Common.IO
ProgressAction(percent);
}
+ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
+ {
+ var result = base.BeginWrite(buffer, offset, count, callback, state);
+
+ BytesProcessed += count;
+
+ double percent = BytesProcessed;
+ percent /= WriteLength;
+ percent *= 100;
+
+ ProgressAction(percent);
+
+ return result;
+ }
+
/// <summary>
/// Releases the unmanaged resources used by the <see cref="T:System.IO.Stream" /> and optionally releases the managed resources.
/// </summary>
diff --git a/Emby.Common.Implementations/Net/NetAcceptSocket.cs b/Emby.Common.Implementations/Net/NetAcceptSocket.cs
index 82e7e9b009..5e831ac7ab 100644
--- a/Emby.Common.Implementations/Net/NetAcceptSocket.cs
+++ b/Emby.Common.Implementations/Net/NetAcceptSocket.cs
@@ -97,7 +97,6 @@ namespace Emby.Common.Implementations.Net
_acceptor.StartAccept();
}
-#if NET46
public Task SendFile(string path, byte[] preBuffer, byte[] postBuffer, CancellationToken cancellationToken)
{
var options = TransmitFileOptions.UseDefaultWorkerThread;
@@ -109,6 +108,18 @@ namespace Emby.Common.Implementations.Net
return completionSource.Task;
}
+ public IAsyncResult BeginSendFile(string path, byte[] preBuffer, byte[] postBuffer, AsyncCallback callback, object state)
+ {
+ var options = TransmitFileOptions.UseDefaultWorkerThread;
+
+ return Socket.BeginSendFile(path, preBuffer, postBuffer, options, new AsyncCallback(FileSendCallback), state);
+ }
+
+ public void EndSendFile(IAsyncResult result)
+ {
+ Socket.EndSendFile(result);
+ }
+
private void FileSendCallback(IAsyncResult ar)
{
// Retrieve the socket from the state object.
@@ -117,25 +128,23 @@ namespace Emby.Common.Implementations.Net
var client = data.Item1;
var path = data.Item2;
var taskCompletion = data.Item3;
-
+
// Complete sending the data to the remote device.
- try {
- client.EndSendFile(ar);
- taskCompletion.TrySetResult(true);
-}
- catch(SocketException ex){
- _logger.Info("Socket.SendFile failed for {0}. error code {1}", path, ex.SocketErrorCode);
- taskCompletion.TrySetException(ex);
-}catch(Exception ex){
- taskCompletion.TrySetException(ex);
-}
- }
-#else
- public Task SendFile(string path, byte[] preBuffer, byte[] postBuffer, CancellationToken cancellationToken)
- {
- throw new NotImplementedException();
+ try
+ {
+ client.EndSendFile(ar);
+ taskCompletion.TrySetResult(true);
+ }
+ catch (SocketException ex)
+ {
+ _logger.Info("Socket.SendFile failed for {0}. error code {1}", path, ex.SocketErrorCode);
+ taskCompletion.TrySetException(ex);
+ }
+ catch (Exception ex)
+ {
+ taskCompletion.TrySetException(ex);
+ }
}
-#endif
public void Dispose()
{
diff --git a/Emby.Common.Implementations/Net/SocketFactory.cs b/Emby.Common.Implementations/Net/SocketFactory.cs
index 39f236afaa..0a1232a400 100644
--- a/Emby.Common.Implementations/Net/SocketFactory.cs
+++ b/Emby.Common.Implementations/Net/SocketFactory.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
@@ -188,16 +189,7 @@ namespace Emby.Common.Implementations.Net
try
{
-#if NET46
- retVal.ExclusiveAddressUse = false;
-#else
- // The ExclusiveAddressUse acceptSocket option is a Windows-specific option that, when set to "true," tells Windows not to allow another acceptSocket to use the same local address as this acceptSocket
- // See https://github.com/dotnet/corefx/pull/11509 for more details
- if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows))
- {
- retVal.ExclusiveAddressUse = false;
- }
-#endif
+ retVal.ExclusiveAddressUse = false;
//retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
retVal.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, multicastTimeToLive);
@@ -217,5 +209,89 @@ namespace Emby.Common.Implementations.Net
throw;
}
}
+
+ public Stream CreateNetworkStream(ISocket socket, bool ownsSocket)
+ {
+ var netSocket = (UdpSocket)socket;
+
+ return new SocketStream(netSocket.Socket, ownsSocket);
+ }
}
+
+ public class SocketStream : Stream
+ {
+ private readonly Socket _socket;
+
+ public SocketStream(Socket socket, bool ownsSocket)
+ {
+ _socket = socket;
+ }
+
+ public override void Flush()
+ {
+ }
+
+ public override bool CanRead
+ {
+ get { return true; }
+ }
+ public override bool CanSeek
+ {
+ get { return false; }
+ }
+ public override bool CanWrite
+ {
+ get { return true; }
+ }
+ public override long Length
+ {
+ get { throw new NotImplementedException(); }
+ }
+ public override long Position
+ {
+ get { throw new NotImplementedException(); }
+ set { throw new NotImplementedException(); }
+ }
+
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ _socket.Send(buffer, offset, count, SocketFlags.None);
+ }
+
+ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
+ {
+ return _socket.BeginSend(buffer, offset, count, SocketFlags.None, callback, state);
+ }
+
+ public override void EndWrite(IAsyncResult asyncResult)
+ {
+ _socket.EndSend(asyncResult);
+ }
+
+ public override void SetLength(long value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ return _socket.Receive(buffer, offset, count, SocketFlags.None);
+ }
+
+ public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
+ {
+ return _socket.BeginReceive(buffer, offset, count, SocketFlags.None, callback, state);
+ }
+
+ public override int EndRead(IAsyncResult asyncResult)
+ {
+ return _socket.EndReceive(asyncResult);
+ }
+ }
+
}
diff --git a/Emby.Common.Implementations/Net/UdpSocket.cs b/Emby.Common.Implementations/Net/UdpSocket.cs
index f9181eb6ab..578610b4c3 100644
--- a/Emby.Common.Implementations/Net/UdpSocket.cs
+++ b/Emby.Common.Implementations/Net/UdpSocket.cs
@@ -14,11 +14,16 @@ namespace Emby.Common.Implementations.Net
// THIS IS A LINKED FILE - SHARED AMONGST MULTIPLE PLATFORMS
// Be careful to check any changes compile and work for all platform projects it is shared in.
- internal sealed class UdpSocket : DisposableManagedObjectBase, ISocket
+ public sealed class UdpSocket : DisposableManagedObjectBase, ISocket
{
private Socket _Socket;
private int _LocalPort;
+ public Socket Socket
+ {
+ get { return _Socket; }
+ }
+
private readonly SocketAsyncEventArgs _receiveSocketAsyncEventArgs = new SocketAsyncEventArgs()
{
SocketFlags = SocketFlags.None
@@ -116,129 +121,104 @@ namespace Emby.Common.Implementations.Net
private set;
}
- public Task<SocketReceiveResult> ReceiveAsync(CancellationToken cancellationToken)
+ public IAsyncResult BeginReceive(byte[] buffer, int offset, int count, AsyncCallback callback)
{
- ThrowIfDisposed();
- var tcs = new TaskCompletionSource<SocketReceiveResult>();
EndPoint receivedFromEndPoint = new IPEndPoint(IPAddress.Any, 0);
- var state = new AsyncReceiveState(_Socket, receivedFromEndPoint);
- state.TaskCompletionSource = tcs;
-
- cancellationToken.Register(() => tcs.TrySetCanceled());
-
- _receiveSocketAsyncEventArgs.RemoteEndPoint = receivedFromEndPoint;
- _currentReceiveTaskCompletionSource = tcs;
-
- try
- {
- var willRaiseEvent = _Socket.ReceiveFromAsync(_receiveSocketAsyncEventArgs);
-
- if (!willRaiseEvent)
- {
- _receiveSocketAsyncEventArgs_Completed(this, _receiveSocketAsyncEventArgs);
- }
- }
- catch (Exception ex)
- {
- tcs.TrySetException(ex);
- }
-
- return tcs.Task;
+ return _Socket.BeginReceiveFrom(buffer, offset, count, SocketFlags.None, ref receivedFromEndPoint, callback, buffer);
}
- public Task SendAsync(byte[] buffer, int size, IpEndPointInfo endPoint, CancellationToken cancellationToken)
+ public SocketReceiveResult EndReceive(IAsyncResult result)
{
- ThrowIfDisposed();
-
- if (buffer == null) throw new ArgumentNullException("messageData");
- if (endPoint == null) throw new ArgumentNullException("endPoint");
+ IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
+ EndPoint remoteEndPoint = (EndPoint)sender;
- var ipEndPoint = NetworkManager.ToIPEndPoint(endPoint);
+ var receivedBytes = _Socket.EndReceiveFrom(result, ref remoteEndPoint);
-#if NETSTANDARD1_6
+ var buffer = (byte[]) result.AsyncState;
- if (size != buffer.Length)
+ return new SocketReceiveResult
{
- byte[] copy = new byte[size];
- Buffer.BlockCopy(buffer, 0, copy, 0, size);
- buffer = copy;
- }
-
- cancellationToken.ThrowIfCancellationRequested();
+ ReceivedBytes = receivedBytes,
+ RemoteEndPoint = ToIpEndPointInfo((IPEndPoint)remoteEndPoint),
+ Buffer = buffer,
+ LocalIPAddress = LocalIPAddress
+ };
+ }
- _Socket.SendTo(buffer, ipEndPoint);
- return Task.FromResult(true);
-#else
- var taskSource = new TaskCompletionSource<bool>();
+ public Task<SocketReceiveResult> ReceiveAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ var taskCompletion = new TaskCompletionSource<SocketReceiveResult>();
- try
+ Action<IAsyncResult> callback = callbackResult =>
{
- _Socket.BeginSendTo(buffer, 0, size, SocketFlags.None, ipEndPoint, result =>
+ try
{
- if (cancellationToken.IsCancellationRequested)
- {
- taskSource.TrySetCanceled();
- return;
- }
- try
- {
- _Socket.EndSend(result);
- taskSource.TrySetResult(true);
- }
- catch (Exception ex)
- {
- taskSource.TrySetException(ex);
- }
+ taskCompletion.TrySetResult(EndReceive(callbackResult));
+ }
+ catch (Exception ex)
+ {
+ taskCompletion.TrySetException(ex);
+ }
+ };
- }, null);
- }
- catch (Exception ex)
+ var result = BeginReceive(buffer, offset, count, new AsyncCallback(callback));
+
+ if (result.CompletedSynchronously)
{
- taskSource.TrySetException(ex);
+ callback(result);
}
- return taskSource.Task;
-#endif
- //ThrowIfDisposed();
+ cancellationToken.Register(() => taskCompletion.TrySetCanceled());
+
+ return taskCompletion.Task;
+ }
- //if (buffer == null) throw new ArgumentNullException("messageData");
- //if (endPoint == null) throw new ArgumentNullException("endPoint");
+ public Task<SocketReceiveResult> ReceiveAsync(CancellationToken cancellationToken)
+ {
+ var buffer = new byte[8192];
- //cancellationToken.ThrowIfCancellationRequested();
+ return ReceiveAsync(buffer, 0, buffer.Length, cancellationToken);
+ }
- //var tcs = new TaskCompletionSource<int>();
+ public Task SendToAsync(byte[] buffer, int offset, int size, IpEndPointInfo endPoint, CancellationToken cancellationToken)
+ {
+ var taskCompletion = new TaskCompletionSource<int>();
- //cancellationToken.Register(() => tcs.TrySetCanceled());
+ Action<IAsyncResult> callback = callbackResult =>
+ {
+ try
+ {
+ taskCompletion.TrySetResult(EndSendTo(callbackResult));
+ }
+ catch (Exception ex)
+ {
+ taskCompletion.TrySetException(ex);
+ }
+ };
- //_sendSocketAsyncEventArgs.SetBuffer(buffer, 0, size);
- //_sendSocketAsyncEventArgs.RemoteEndPoint = NetworkManager.ToIPEndPoint(endPoint);
- //_currentSendTaskCompletionSource = tcs;
+ var result = BeginSendTo(buffer, offset, size, endPoint, new AsyncCallback(callback), null);
- //var willRaiseEvent = _Socket.SendAsync(_sendSocketAsyncEventArgs);
+ if (result.CompletedSynchronously)
+ {
+ callback(result);
+ }
- //if (!willRaiseEvent)
- //{
- // _sendSocketAsyncEventArgs_Completed(this, _sendSocketAsyncEventArgs);
- //}
+ cancellationToken.Register(() => taskCompletion.TrySetCanceled());
- //return tcs.Task;
+ return taskCompletion.Task;
}
- public async Task SendWithLockAsync(byte[] buffer, int size, IpEndPointInfo endPoint, CancellationToken cancellationToken)
+ public IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, IpEndPointInfo endPoint, AsyncCallback callback, object state)
{
- ThrowIfDisposed();
+ var ipEndPoint = NetworkManager.ToIPEndPoint(endPoint);
- //await _sendLock.WaitAsync(cancellationToken).ConfigureAwait(false);
+ return _Socket.BeginSendTo(buffer, offset, size, SocketFlags.None, ipEndPoint, callback, state);
+ }
- try
- {
- await SendAsync(buffer, size, endPoint, cancellationToken).ConfigureAwait(false);
- }
- finally
- {
- //_sendLock.Release();
- }
+ public int EndSendTo(IAsyncResult result)
+ {
+ return _Socket.EndSendTo(result);
}
protected override void Dispose(bool disposing)
@@ -273,52 +253,5 @@ namespace Emby.Common.Implementations.Net
return NetworkManager.ToIpEndPointInfo(endpoint);
}
-
- private void ProcessResponse(IAsyncResult asyncResult)
- {
-#if NET46
- var state = asyncResult.AsyncState as AsyncReceiveState;
- try
- {
- var bytesRead = state.Socket.EndReceiveFrom(asyncResult, ref state.RemoteEndPoint);
-
- var ipEndPoint = state.RemoteEndPoint as IPEndPoint;
- state.TaskCompletionSource.SetResult(
- new SocketReceiveResult
- {
- Buffer = state.Buffer,
- ReceivedBytes = bytesRead,
- RemoteEndPoint = ToIpEndPointInfo(ipEndPoint),
- LocalIPAddress = LocalIPAddress
- }
- );
- }
- catch (ObjectDisposedException)
- {
- state.TaskCompletionSource.SetCanceled();
- }
- catch (Exception ex)
- {
- state.TaskCompletionSource.SetException(ex);
- }
-#endif
- }
-
- private class AsyncReceiveState
- {
- public AsyncReceiveState(Socket socket, EndPoint remoteEndPoint)
- {
- this.Socket = socket;
- this.RemoteEndPoint = remoteEndPoint;
- }
-
- public EndPoint RemoteEndPoint;
- public byte[] Buffer = new byte[8192];
-
- public Socket Socket { get; private set; }
-
- public TaskCompletionSource<SocketReceiveResult> TaskCompletionSource { get; set; }
-
- }
}
}
diff --git a/Emby.Common.Implementations/Properties/AssemblyInfo.cs b/Emby.Common.Implementations/Properties/AssemblyInfo.cs
index 1a5abcb274..787f18997c 100644
--- a/Emby.Common.Implementations/Properties/AssemblyInfo.cs
+++ b/Emby.Common.Implementations/Properties/AssemblyInfo.cs
@@ -2,18 +2,33 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
-// General Information about an assembly is controlled through the following
+// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
+[assembly: AssemblyTitle("Emby.Common.Implementations")]
+[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Emby.Common.Implementations")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("5a27010a-09c6-4e86-93ea-437484c10917")]
+[assembly: Guid("1e37a338-9f57-4b70-bd6d-bb9c591e319b")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")] \ No newline at end of file
diff --git a/Emby.Common.Implementations/Reflection/AssemblyInfo.cs b/Emby.Common.Implementations/Reflection/AssemblyInfo.cs
index 7a92f02d6b..87821bf7ab 100644
--- a/Emby.Common.Implementations/Reflection/AssemblyInfo.cs
+++ b/Emby.Common.Implementations/Reflection/AssemblyInfo.cs
@@ -9,18 +9,12 @@ namespace Emby.Common.Implementations.Reflection
{
public Stream GetManifestResourceStream(Type type, string resource)
{
-#if NET46
return type.Assembly.GetManifestResourceStream(resource);
-#endif
- return type.GetTypeInfo().Assembly.GetManifestResourceStream(resource);
}
public string[] GetManifestResourceNames(Type type)
{
-#if NET46
return type.Assembly.GetManifestResourceNames();
-#endif
- return type.GetTypeInfo().Assembly.GetManifestResourceNames();
}
public Assembly[] GetCurrentAssemblies()
diff --git a/Emby.Common.Implementations/Serialization/XmlSerializer.cs b/Emby.Common.Implementations/Serialization/XmlSerializer.cs
index 3583f998e5..b5896e6b0e 100644
--- a/Emby.Common.Implementations/Serialization/XmlSerializer.cs
+++ b/Emby.Common.Implementations/Serialization/XmlSerializer.cs
@@ -5,7 +5,6 @@ using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
-using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
@@ -78,18 +77,11 @@ namespace Emby.Common.Implementations.Serialization
/// <param name="stream">The stream.</param>
public void SerializeToStream(object obj, Stream stream)
{
-#if NET46
- using (var writer = new XmlTextWriter(stream, null))
+ using (var writer = new XmlTextWriter(stream, null))
{
writer.Formatting = Formatting.Indented;
SerializeToWriter(obj, writer);
}
-#else
- using (var writer = XmlWriter.Create(stream))
- {
- SerializeToWriter(obj, writer);
- }
-#endif
}
/// <summary>
diff --git a/Emby.Common.Implementations/Xml/XmlReaderSettingsFactory.cs b/Emby.Common.Implementations/Xml/XmlReaderSettingsFactory.cs
index 806290cf44..35c266cdb2 100644
--- a/Emby.Common.Implementations/Xml/XmlReaderSettingsFactory.cs
+++ b/Emby.Common.Implementations/Xml/XmlReaderSettingsFactory.cs
@@ -11,9 +11,7 @@ namespace Emby.Common.Implementations.Xml
if (!enableValidation)
{
-#if NET46
settings.ValidationType = ValidationType.None;
-#endif
}
return settings;
diff --git a/Emby.Common.Implementations/packages.config b/Emby.Common.Implementations/packages.config
new file mode 100644
index 0000000000..ec0fc45bcf
--- /dev/null
+++ b/Emby.Common.Implementations/packages.config
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="NLog" version="4.4.9" targetFramework="net46" />
+ <package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
+ <package id="SharpCompress" version="0.14.0" targetFramework="net462" />
+ <package id="SimpleInjector" version="4.0.7" targetFramework="net462" />
+</packages> \ No newline at end of file
diff --git a/Emby.Common.Implementations/project.json b/Emby.Common.Implementations/project.json
deleted file mode 100644
index ff60c740e8..0000000000
--- a/Emby.Common.Implementations/project.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "version": "1.0.0-*",
-
- "dependencies": {
-
- },
-
- "frameworks": {
- "net46": {
- "frameworkAssemblies": {
- "System.Collections": "4.0.0.0",
- "System.IO": "4.0.0.0",
- "System.Net": "4.0.0.0",
- "System.Net.Http": "4.0.0.0",
- "System.Net.Primitives": "4.0.0.0",
- "System.Net.Http.WebRequest": "4.0.0.0",
- "System.Reflection": "4.0.0.0",
- "System.Runtime": "4.0.0.0",
- "System.Runtime.Extensions": "4.0.0.0",
- "System.Text.Encoding": "4.0.0.0",
- "System.Threading": "4.0.0.0",
- "System.Threading.Tasks": "4.0.0.0",
- "System.Xml.ReaderWriter": "4.0.0"
- },
- "dependencies": {
- "SimpleInjector": "3.2.4",
- "ServiceStack.Text": "4.5.4",
- "NLog": "4.4.0-betaV15",
- "sharpcompress": "0.14.0",
- "MediaBrowser.Model": {
- "target": "project"
- },
- "MediaBrowser.Common": {
- "target": "project"
- }
- }
- },
- "netstandard1.6": {
- "imports": "dnxcore50",
- "dependencies": {
- "NETStandard.Library": "1.6.1",
- "System.IO.FileSystem.DriveInfo": "4.3.0",
- "System.Diagnostics.Process": "4.3.0",
- "System.Threading.Timer": "4.3.0",
- "System.Net.Requests": "4.3.0",
- "System.Xml.ReaderWriter": "4.3.0",
- "System.Xml.XmlSerializer": "4.3.0",
- "System.Net.Http": "4.3.2",
- "System.Net.Primitives": "4.3.0",
- "System.Net.Sockets": "4.3.0",
- "System.Net.NetworkInformation": "4.3.0",
- "System.Net.NameResolution": "4.3.0",
- "System.Runtime.InteropServices.RuntimeInformation": "4.3.0",
- "System.Reflection": "4.3.0",
- "System.Reflection.Primitives": "4.3.0",
- "System.Runtime.Loader": "4.3.0",
- "SimpleInjector": "3.2.4",
- "ServiceStack.Text.Core": "1.0.27",
- "NLog": "4.4.0-betaV15",
- "sharpcompress": "0.14.0",
- "System.AppDomain": "2.0.11",
- "MediaBrowser.Model": {
- "target": "project"
- },
- "MediaBrowser.Common": {
- "target": "project"
- }
- }
- }
- }
-}
diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs
index 2251a8f58c..e93ee5990d 100644
--- a/Emby.Dlna/ContentDirectory/ControlHandler.cs
+++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs
@@ -23,6 +23,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Globalization;
@@ -85,7 +86,7 @@ namespace Emby.Dlna.ContentDirectory
return HandleGetSystemUpdateID();
if (string.Equals(methodName, "Browse", StringComparison.OrdinalIgnoreCase))
- return HandleBrowse(methodParams, user, deviceId).Result;
+ return HandleBrowse(methodParams, user, deviceId);
if (string.Equals(methodName, "X_GetFeatureList", StringComparison.OrdinalIgnoreCase))
return HandleXGetFeatureList();
@@ -97,10 +98,10 @@ namespace Emby.Dlna.ContentDirectory
return HandleXSetBookmark(methodParams, user);
if (string.Equals(methodName, "Search", StringComparison.OrdinalIgnoreCase))
- return HandleSearch(methodParams, user, deviceId).Result;
+ return HandleSearch(methodParams, user, deviceId);
if (string.Equals(methodName, "X_BrowseByLetter", StringComparison.OrdinalIgnoreCase))
- return HandleX_BrowseByLetter(methodParams, user, deviceId).Result;
+ return HandleX_BrowseByLetter(methodParams, user, deviceId);
throw new ResourceNotFoundException("Unexpected control request name: " + methodName);
}
@@ -202,7 +203,7 @@ namespace Emby.Dlna.ContentDirectory
return defaultValue;
}
- private async Task<IEnumerable<KeyValuePair<string, string>>> HandleBrowse(IDictionary<string, string> sparams, User user, string deviceId)
+ private IEnumerable<KeyValuePair<string, string>> HandleBrowse(IDictionary<string, string> sparams, User user, string deviceId)
{
var id = sparams["ObjectID"];
var flag = sparams["BrowseFlag"];
@@ -262,7 +263,7 @@ namespace Emby.Dlna.ContentDirectory
if (item.IsDisplayedAsFolder || serverItem.StubType.HasValue)
{
- var childrenResult = (await GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requestedCount).ConfigureAwait(false));
+ var childrenResult = (GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requestedCount));
_didlBuilder.WriteFolderElement(writer, item, serverItem.StubType, null, childrenResult.TotalRecordCount, filter, id);
}
@@ -275,7 +276,7 @@ namespace Emby.Dlna.ContentDirectory
}
else
{
- var childrenResult = (await GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requestedCount).ConfigureAwait(false));
+ var childrenResult = (GetUserItems(item, serverItem.StubType, user, sortCriteria, start, requestedCount));
totalCount = childrenResult.TotalRecordCount;
provided = childrenResult.Items.Length;
@@ -287,7 +288,7 @@ namespace Emby.Dlna.ContentDirectory
if (childItem.IsDisplayedAsFolder || displayStubType.HasValue)
{
- var childCount = (await GetUserItems(childItem, displayStubType, user, sortCriteria, null, 0).ConfigureAwait(false))
+ var childCount = (GetUserItems(childItem, displayStubType, user, sortCriteria, null, 0))
.TotalRecordCount;
_didlBuilder.WriteFolderElement(writer, childItem, displayStubType, item, childCount, filter);
@@ -313,13 +314,13 @@ namespace Emby.Dlna.ContentDirectory
};
}
- private Task<IEnumerable<KeyValuePair<string, string>>> HandleX_BrowseByLetter(IDictionary<string, string> sparams, User user, string deviceId)
+ private IEnumerable<KeyValuePair<string, string>> HandleX_BrowseByLetter(IDictionary<string, string> sparams, User user, string deviceId)
{
// TODO: Implement this method
return HandleSearch(sparams, user, deviceId);
}
- private async Task<IEnumerable<KeyValuePair<string, string>>> HandleSearch(IDictionary<string, string> sparams, User user, string deviceId)
+ private IEnumerable<KeyValuePair<string, string>> HandleSearch(IDictionary<string, string> sparams, User user, string deviceId)
{
var searchCriteria = new SearchCriteria(GetValueOrDefault(sparams, "SearchCriteria", ""));
var sortCriteria = new SortCriteria(GetValueOrDefault(sparams, "SortCriteria", ""));
@@ -373,7 +374,7 @@ namespace Emby.Dlna.ContentDirectory
var item = serverItem.Item;
- var childrenResult = (await GetChildrenSorted(item, user, searchCriteria, sortCriteria, start, requestedCount).ConfigureAwait(false));
+ var childrenResult = (GetChildrenSorted(item, user, searchCriteria, sortCriteria, start, requestedCount));
totalCount = childrenResult.TotalRecordCount;
@@ -383,7 +384,7 @@ namespace Emby.Dlna.ContentDirectory
{
if (i.IsDisplayedAsFolder)
{
- var childCount = (await GetChildrenSorted(i, user, searchCriteria, sortCriteria, null, 0).ConfigureAwait(false))
+ var childCount = (GetChildrenSorted(i, user, searchCriteria, sortCriteria, null, 0))
.TotalRecordCount;
_didlBuilder.WriteFolderElement(writer, i, null, item, childCount, filter);
@@ -409,7 +410,7 @@ namespace Emby.Dlna.ContentDirectory
};
}
- private Task<QueryResult<BaseItem>> GetChildrenSorted(BaseItem item, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit)
+ private QueryResult<BaseItem> GetChildrenSorted(BaseItem item, User user, SearchCriteria search, SortCriteria sort, int? startIndex, int? limit)
{
var folder = (Folder)item;
@@ -459,11 +460,17 @@ namespace Emby.Dlna.ContentDirectory
IsMissing = false,
ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name },
IsFolder = isFolder,
- MediaTypes = mediaTypes.ToArray()
+ MediaTypes = mediaTypes.ToArray(),
+ DtoOptions = GetDtoOptions()
});
}
- private async Task<QueryResult<ServerItem>> GetUserItems(BaseItem item, StubType? stubType, User user, SortCriteria sort, int? startIndex, int? limit)
+ private DtoOptions GetDtoOptions()
+ {
+ return new DtoOptions(true);
+ }
+
+ private QueryResult<ServerItem> GetUserItems(BaseItem item, StubType? stubType, User user, SortCriteria sort, int? startIndex, int? limit)
{
if (item is MusicGenre)
{
@@ -511,14 +518,15 @@ namespace Emby.Dlna.ContentDirectory
StartIndex = startIndex,
User = user,
IsMissing = false,
- PresetViews = new[] {CollectionType.Movies, CollectionType.TvShows, CollectionType.Music},
- ExcludeItemTypes = new[] {typeof (Game).Name, typeof (Book).Name},
- IsPlaceHolder = false
+ PresetViews = new[] { CollectionType.Movies, CollectionType.TvShows, CollectionType.Music },
+ ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name },
+ IsPlaceHolder = false,
+ DtoOptions = GetDtoOptions()
};
SetSorting(query, sort, folder.IsPreSorted);
- var queryResult = await folder.GetItems(query).ConfigureAwait(false);
+ var queryResult = folder.GetItems(query);
return ToResult(queryResult);
}
@@ -532,7 +540,8 @@ namespace Emby.Dlna.ContentDirectory
ArtistIds = new[] { item.Id.ToString("N") },
IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
Limit = limit,
- StartIndex = startIndex
+ StartIndex = startIndex,
+ DtoOptions = GetDtoOptions()
};
SetSorting(query, sort, false);
@@ -548,10 +557,11 @@ namespace Emby.Dlna.ContentDirectory
{
Recursive = true,
ParentId = parentId,
- GenreIds = new[] {item.Id.ToString("N")},
- IncludeItemTypes = new[] {typeof (MusicAlbum).Name},
+ GenreIds = new[] { item.Id.ToString("N") },
+ IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
Limit = limit,
- StartIndex = startIndex
+ StartIndex = startIndex,
+ DtoOptions = GetDtoOptions()
};
SetSorting(query, sort, false);
@@ -595,8 +605,8 @@ namespace Emby.Dlna.ContentDirectory
IncludeItemTypes = new[] { typeof(Movie).Name, typeof(Series).Name, typeof(Trailer).Name },
SortBy = new[] { ItemSortBy.SortName },
Limit = limit,
- StartIndex = startIndex
-
+ StartIndex = startIndex,
+ DtoOptions = GetDtoOptions()
});
var serverItems = itemsResult.Items.Select(i => new ServerItem(i))
diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs
index c308d9c632..4d003ca7cb 100644
--- a/Emby.Dlna/Didl/DidlBuilder.cs
+++ b/Emby.Dlna/Didl/DidlBuilder.cs
@@ -18,6 +18,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
+using System.Threading.Tasks;
using System.Xml;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Configuration;
@@ -111,14 +112,14 @@ namespace Emby.Dlna.Didl
}
}
- public void WriteItemElement(DlnaOptions options,
- XmlWriter writer,
- BaseItem item,
+ public void WriteItemElement(DlnaOptions options,
+ XmlWriter writer,
+ BaseItem item,
User user,
- BaseItem context,
- StubType? contextStubType,
- string deviceId,
- Filter filter,
+ BaseItem context,
+ StubType? contextStubType,
+ string deviceId,
+ Filter filter,
StreamInfo streamInfo = null)
{
var clientId = GetClientId(item, null);
@@ -223,6 +224,7 @@ namespace Emby.Dlna.Didl
streamInfo.TargetPacketLength,
streamInfo.TranscodeSeekInfo,
streamInfo.IsTargetAnamorphic,
+ streamInfo.IsTargetInterlaced,
streamInfo.TargetRefFrames,
streamInfo.TargetVideoStreamCount,
streamInfo.TargetAudioStreamCount,
@@ -363,6 +365,7 @@ namespace Emby.Dlna.Didl
streamInfo.TargetPacketLength,
streamInfo.TargetTimestamp,
streamInfo.IsTargetAnamorphic,
+ streamInfo.IsTargetInterlaced,
streamInfo.TargetRefFrames,
streamInfo.TargetVideoStreamCount,
streamInfo.TargetAudioStreamCount,
@@ -920,7 +923,7 @@ namespace Emby.Dlna.Didl
if (item is Video)
{
- var userData = _userDataManager.GetUserDataDto(item, _user).Result;
+ var userData = _userDataManager.GetUserDataDto(item, _user);
playbackPercentage = Convert.ToInt32(userData.PlayedPercentage ?? 0);
if (playbackPercentage >= 100 || userData.Played)
@@ -930,7 +933,7 @@ namespace Emby.Dlna.Didl
}
else if (item is Series || item is Season || item is BoxSet)
{
- var userData = _userDataManager.GetUserDataDto(item, _user).Result;
+ var userData = _userDataManager.GetUserDataDto(item, _user);
if (userData.Played)
{
diff --git a/Emby.Dlna/PlayTo/PlayToController.cs b/Emby.Dlna/PlayTo/PlayToController.cs
index 3a7e753819..8c168dc231 100644
--- a/Emby.Dlna/PlayTo/PlayToController.cs
+++ b/Emby.Dlna/PlayTo/PlayToController.cs
@@ -556,6 +556,7 @@ namespace Emby.Dlna.PlayTo
streamInfo.TargetPacketLength,
streamInfo.TranscodeSeekInfo,
streamInfo.IsTargetAnamorphic,
+ streamInfo.IsTargetInterlaced,
streamInfo.TargetRefFrames,
streamInfo.TargetVideoStreamCount,
streamInfo.TargetAudioStreamCount,
diff --git a/Emby.Dlna/Profiles/DefaultProfile.cs b/Emby.Dlna/Profiles/DefaultProfile.cs
index 1413e89d2a..70d08f9a9c 100644
--- a/Emby.Dlna/Profiles/DefaultProfile.cs
+++ b/Emby.Dlna/Profiles/DefaultProfile.cs
@@ -135,6 +135,18 @@ namespace Emby.Dlna.Profiles
{
Format = "sub",
Method = SubtitleDeliveryMethod.Embed
+ },
+
+ new SubtitleProfile
+ {
+ Format = "subrip",
+ Method = SubtitleDeliveryMethod.Embed
+ },
+
+ new SubtitleProfile
+ {
+ Format = "vtt",
+ Method = SubtitleDeliveryMethod.Embed
}
};
diff --git a/Emby.Dlna/Profiles/Xml/Default.xml b/Emby.Dlna/Profiles/Xml/Default.xml
index 9c4e68d965..fe783e0059 100644
--- a/Emby.Dlna/Profiles/Xml/Default.xml
+++ b/Emby.Dlna/Profiles/Xml/Default.xml
@@ -55,5 +55,7 @@
<SubtitleProfile format="pgs" method="Embed" />
<SubtitleProfile format="pgssub" method="Embed" />
<SubtitleProfile format="sub" method="Embed" />
+ <SubtitleProfile format="subrip" method="Embed" />
+ <SubtitleProfile format="vtt" method="Embed" />
</SubtitleProfiles>
</Profile> \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Xml/Denon AVR.xml b/Emby.Dlna/Profiles/Xml/Denon AVR.xml
index 772e9a41c0..c1d0a67ea5 100644
--- a/Emby.Dlna/Profiles/Xml/Denon AVR.xml
+++ b/Emby.Dlna/Profiles/Xml/Denon AVR.xml
@@ -55,5 +55,7 @@
<SubtitleProfile format="pgs" method="Embed" />
<SubtitleProfile format="pgssub" method="Embed" />
<SubtitleProfile format="sub" method="Embed" />
+ <SubtitleProfile format="subrip" method="Embed" />
+ <SubtitleProfile format="vtt" method="Embed" />
</SubtitleProfiles>
</Profile> \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Xml/MediaMonkey.xml b/Emby.Dlna/Profiles/Xml/MediaMonkey.xml
index 325c2e8368..d51cae988d 100644
--- a/Emby.Dlna/Profiles/Xml/MediaMonkey.xml
+++ b/Emby.Dlna/Profiles/Xml/MediaMonkey.xml
@@ -61,5 +61,7 @@
<SubtitleProfile format="pgs" method="Embed" />
<SubtitleProfile format="pgssub" method="Embed" />
<SubtitleProfile format="sub" method="Embed" />
+ <SubtitleProfile format="subrip" method="Embed" />
+ <SubtitleProfile format="vtt" method="Embed" />
</SubtitleProfiles>
</Profile> \ No newline at end of file
diff --git a/Emby.Dlna/Profiles/Xml/foobar2000.xml b/Emby.Dlna/Profiles/Xml/foobar2000.xml
index febc12a8fa..b22a0ee160 100644
--- a/Emby.Dlna/Profiles/Xml/foobar2000.xml
+++ b/Emby.Dlna/Profiles/Xml/foobar2000.xml
@@ -61,5 +61,7 @@
<SubtitleProfile format="pgs" method="Embed" />
<SubtitleProfile format="pgssub" method="Embed" />
<SubtitleProfile format="sub" method="Embed" />
+ <SubtitleProfile format="subrip" method="Embed" />
+ <SubtitleProfile format="vtt" method="Embed" />
</SubtitleProfiles>
</Profile> \ No newline at end of file
diff --git a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs
index 13bde3ca5d..4c911cc7a3 100644
--- a/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs
+++ b/Emby.Drawing.ImageMagick/ImageMagickEncoder.cs
@@ -130,7 +130,7 @@ namespace Emby.Drawing.ImageMagick
string.Equals(ext, ".webp", StringComparison.OrdinalIgnoreCase);
}
- public void EncodeImage(string inputPath, ImageSize? originalImageSize, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
+ public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{
// Even if the caller specified 100, don't use it because it takes forever
quality = Math.Min(quality, 99);
@@ -144,9 +144,13 @@ namespace Emby.Drawing.ImageMagick
originalImage.CurrentImage.TrimImage(10);
}
- if (options.CropWhiteSpace || !originalImageSize.HasValue)
+ var originalImageSize = new ImageSize(originalImage.CurrentImage.Width, originalImage.CurrentImage.Height);
+ ImageHelper.SaveImageSize(inputPath, dateModified, originalImageSize);
+
+ if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize))
{
- originalImageSize = new ImageSize(originalImage.CurrentImage.Width, originalImage.CurrentImage.Height);
+ // Just spit out the original file if all the options are default
+ return inputPath;
}
var newImageSize = ImageHelper.GetNewImageSize(options, originalImageSize);
@@ -174,10 +178,8 @@ namespace Emby.Drawing.ImageMagick
{
using (var originalImage = new MagickWand(inputPath))
{
- if (options.CropWhiteSpace || !originalImageSize.HasValue)
- {
- originalImageSize = new ImageSize(originalImage.CurrentImage.Width, originalImage.CurrentImage.Height);
- }
+ var originalImageSize = new ImageSize(originalImage.CurrentImage.Width, originalImage.CurrentImage.Height);
+ ImageHelper.SaveImageSize(inputPath, dateModified, originalImageSize);
var newImageSize = ImageHelper.GetNewImageSize(options, originalImageSize);
@@ -205,6 +207,8 @@ namespace Emby.Drawing.ImageMagick
}
}
}
+
+ return outputPath;
}
private void AddForegroundLayer(MagickWand wand, ImageProcessingOptions options)
diff --git a/Emby.Drawing.ImageMagick/PlayedIndicatorDrawer.cs b/Emby.Drawing.ImageMagick/PlayedIndicatorDrawer.cs
index 58c6cfe82a..2ec58ff288 100644
--- a/Emby.Drawing.ImageMagick/PlayedIndicatorDrawer.cs
+++ b/Emby.Drawing.ImageMagick/PlayedIndicatorDrawer.cs
@@ -5,7 +5,7 @@ using MediaBrowser.Model.Drawing;
using System;
using System.IO;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Drawing.ImageMagick/StripCollageBuilder.cs b/Emby.Drawing.ImageMagick/StripCollageBuilder.cs
index 715ab46800..63cf8fe5f9 100644
--- a/Emby.Drawing.ImageMagick/StripCollageBuilder.cs
+++ b/Emby.Drawing.ImageMagick/StripCollageBuilder.cs
@@ -2,7 +2,7 @@
using MediaBrowser.Common.Configuration;
using System;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Drawing.ImageMagick/UnplayedCountIndicator.cs b/Emby.Drawing.ImageMagick/UnplayedCountIndicator.cs
index c531400992..ee685c3c5f 100644
--- a/Emby.Drawing.ImageMagick/UnplayedCountIndicator.cs
+++ b/Emby.Drawing.ImageMagick/UnplayedCountIndicator.cs
@@ -2,8 +2,6 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Model.Drawing;
using System.Globalization;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace Emby.Drawing.ImageMagick
diff --git a/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj b/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj
index d7b33b9507..a4ab19f838 100644
--- a/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj
+++ b/Emby.Drawing.Skia/Emby.Drawing.Skia.csproj
@@ -60,13 +60,14 @@
<Compile Include="UnplayedCountIndicator.cs" />
</ItemGroup>
<ItemGroup>
- <Reference Include="SkiaSharp, Version=1.57.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
- <HintPath>..\packages\SkiaSharp.1.57.1\lib\portable-net45+win8+wpa81+wp8\SkiaSharp.dll</HintPath>
- <Private>True</Private>
+ <EmbeddedResource Include="fonts\robotoregular.ttf" />
+ </ItemGroup>
+ <ItemGroup>
+ <Reference Include="SkiaSharp, Version=1.58.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+ <HintPath>..\packages\SkiaSharp.1.58.0\lib\portable-net45+win8+wpa81+wp8\SkiaSharp.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
- <EmbeddedResource Include="fonts\robotoregular.ttf" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
diff --git a/Emby.Drawing.Skia/PlayedIndicatorDrawer.cs b/Emby.Drawing.Skia/PlayedIndicatorDrawer.cs
index 9f3a74eb7f..ad3b5226ca 100644
--- a/Emby.Drawing.Skia/PlayedIndicatorDrawer.cs
+++ b/Emby.Drawing.Skia/PlayedIndicatorDrawer.cs
@@ -5,7 +5,7 @@ using MediaBrowser.Model.Drawing;
using System;
using System.IO;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using System.Reflection;
diff --git a/Emby.Drawing.Skia/SkiaEncoder.cs b/Emby.Drawing.Skia/SkiaEncoder.cs
index 018de5bc96..222ecf733d 100644
--- a/Emby.Drawing.Skia/SkiaEncoder.cs
+++ b/Emby.Drawing.Skia/SkiaEncoder.cs
@@ -191,18 +191,18 @@ namespace Emby.Drawing.Skia
}
private string[] TransparentImageTypes = new string[] { ".png", ".gif", ".webp" };
- private SKBitmap Decode(string path)
+ private SKBitmap Decode(string path, bool forceCleanBitmap = false)
{
var requiresTransparencyHack = TransparentImageTypes.Contains(Path.GetExtension(path) ?? string.Empty);
- if (requiresTransparencyHack)
+ if (requiresTransparencyHack || forceCleanBitmap)
{
using (var stream = new SKFileStream(path))
{
var codec = SKCodec.Create(stream);
// create the bitmap
- var bitmap = new SKBitmap(codec.Info.Width, codec.Info.Height);
+ var bitmap = new SKBitmap(codec.Info.Width, codec.Info.Height, !requiresTransparencyHack);
// decode
codec.GetPixels(bitmap.Info, bitmap.GetPixels());
@@ -210,7 +210,23 @@ namespace Emby.Drawing.Skia
}
}
- return SKBitmap.Decode(path);
+ var resultBitmap = SKBitmap.Decode(path);
+
+ if (resultBitmap == null)
+ {
+ return Decode(path, true);
+ }
+
+ // If we have to resize these they often end up distorted
+ if (resultBitmap.ColorType == SKColorType.Gray8)
+ {
+ using (resultBitmap)
+ {
+ return Decode(path, true);
+ }
+ }
+
+ return resultBitmap;
}
private SKBitmap GetBitmap(string path, bool cropWhitespace)
@@ -226,7 +242,7 @@ namespace Emby.Drawing.Skia
return Decode(path);
}
- public void EncodeImage(string inputPath, ImageSize? originalImageSize, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
+ public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{
if (string.IsNullOrWhiteSpace(inputPath))
{
@@ -246,9 +262,20 @@ namespace Emby.Drawing.Skia
using (var bitmap = GetBitmap(inputPath, options.CropWhiteSpace))
{
- if (options.CropWhiteSpace || !originalImageSize.HasValue)
+ if (bitmap == null)
+ {
+ throw new Exception(string.Format("Skia unable to read image {0}", inputPath));
+ }
+
+ //_logger.Info("Color type {0}", bitmap.Info.ColorType);
+
+ var originalImageSize = new ImageSize(bitmap.Width, bitmap.Height);
+ ImageHelper.SaveImageSize(inputPath, dateModified, originalImageSize);
+
+ if (!options.CropWhiteSpace && options.HasDefaultOptions(inputPath, originalImageSize))
{
- originalImageSize = new ImageSize(bitmap.Width, bitmap.Height);
+ // Just spit out the original file if all the options are default
+ return inputPath;
}
var newImageSize = ImageHelper.GetNewImageSize(options, originalImageSize);
@@ -269,7 +296,7 @@ namespace Emby.Drawing.Skia
using (var outputStream = new SKFileWStream(outputPath))
{
resizedBitmap.Encode(outputStream, skiaOutputFormat, quality);
- return;
+ return outputPath;
}
}
@@ -326,6 +353,7 @@ namespace Emby.Drawing.Skia
}
}
}
+ return outputPath;
}
public void CreateImageCollage(ImageCollageOptions options)
diff --git a/Emby.Drawing.Skia/UnplayedCountIndicator.cs b/Emby.Drawing.Skia/UnplayedCountIndicator.cs
index f0283ad23e..56a2519a3a 100644
--- a/Emby.Drawing.Skia/UnplayedCountIndicator.cs
+++ b/Emby.Drawing.Skia/UnplayedCountIndicator.cs
@@ -4,7 +4,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Model.Drawing;
using System.Globalization;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Drawing.Skia/packages.config b/Emby.Drawing.Skia/packages.config
index 0743c38094..9d21b2864a 100644
--- a/Emby.Drawing.Skia/packages.config
+++ b/Emby.Drawing.Skia/packages.config
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="SkiaSharp" version="1.57.1" targetFramework="portable45-net45+win8" />
+ <package id="SkiaSharp" version="1.58.0" targetFramework="portable45-net45+win8" />
</packages> \ No newline at end of file
diff --git a/Emby.Drawing/Common/ImageHeader.cs b/Emby.Drawing/Common/ImageHeader.cs
index c385779a1e..4f56498a50 100644
--- a/Emby.Drawing/Common/ImageHeader.cs
+++ b/Emby.Drawing/Common/ImageHeader.cs
@@ -4,7 +4,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs
index 3fa6f64503..a1543382f2 100644
--- a/Emby.Drawing/ImageProcessor.cs
+++ b/Emby.Drawing/ImageProcessor.cs
@@ -17,7 +17,7 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using Emby.Drawing.Common;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Net;
@@ -75,6 +75,7 @@ namespace Emby.Drawing
ImageEnhancers = new List<IImageEnhancer>();
_saveImageSizeTimer = timerFactory.Create(SaveImageSizeCallback, null, Timeout.Infinite, Timeout.Infinite);
+ ImageHelper.ImageProcessor = this;
Dictionary<Guid, ImageSize> sizeDictionary;
@@ -178,10 +179,15 @@ namespace Emby.Drawing
}
var originalImage = options.Image;
+ IHasImages item = options.Item;
if (!originalImage.IsLocalFile)
{
- originalImage = await _libraryManager().ConvertImageToLocal(options.Item, originalImage, options.ImageIndex).ConfigureAwait(false);
+ if (item == null)
+ {
+ item = _libraryManager().GetItemById(options.ItemId);
+ }
+ originalImage = await _libraryManager().ConvertImageToLocal(item, originalImage, options.ImageIndex).ConfigureAwait(false);
}
var originalImagePath = originalImage.Path;
@@ -194,13 +200,18 @@ namespace Emby.Drawing
if (options.Enhancers.Count > 0)
{
+ if (item == null)
+ {
+ item = _libraryManager().GetItemById(options.ItemId);
+ }
+
var tuple = await GetEnhancedImage(new ItemImageInfo
{
DateModified = dateModified,
Type = originalImage.Type,
Path = originalImagePath
- }, options.Item, options.ImageIndex, options.Enhancers).ConfigureAwait(false);
+ }, item, options.ImageIndex, options.Enhancers).ConfigureAwait(false);
originalImagePath = tuple.Item1;
dateModified = tuple.Item2;
@@ -212,19 +223,12 @@ namespace Emby.Drawing
return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
}
- ImageSize? originalImageSize = null;
- try
+ ImageSize? originalImageSize = GetSavedImageSize(originalImagePath, dateModified);
+ if (originalImageSize.HasValue && options.HasDefaultOptions(originalImagePath, originalImageSize.Value))
{
- originalImageSize = GetImageSize(originalImagePath, dateModified, true);
- if (options.HasDefaultOptions(originalImagePath, originalImageSize.Value))
- {
- // Just spit out the original file if all the options are default
- return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
- }
- }
- catch
- {
- originalImageSize = null;
+ // Just spit out the original file if all the options are default
+ _logger.Info("Returning original image {0}", originalImagePath);
+ return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
}
var newSize = ImageHelper.GetNewImageSize(options, originalImageSize);
@@ -243,7 +247,18 @@ namespace Emby.Drawing
var tmpPath = Path.ChangeExtension(Path.Combine(_appPaths.TempDirectory, Guid.NewGuid().ToString("N")), Path.GetExtension(cacheFilePath));
_fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(tmpPath));
- _imageEncoder.EncodeImage(originalImagePath, originalImageSize, tmpPath, AutoOrient(options.Item), quality, options, outputFormat);
+ if (item == null && string.Equals(options.ItemType, typeof(Photo).Name, StringComparison.OrdinalIgnoreCase))
+ {
+ item = _libraryManager().GetItemById(options.ItemId);
+ }
+
+ var resultPath =_imageEncoder.EncodeImage(originalImagePath, dateModified, tmpPath, AutoOrient(item), quality, options, outputFormat);
+
+ if (string.Equals(resultPath, originalImagePath, StringComparison.OrdinalIgnoreCase))
+ {
+ return new Tuple<string, string, DateTime>(originalImagePath, MimeTypes.GetMimeType(originalImagePath), dateModified);
+ }
+
CopyFile(tmpPath, cacheFilePath);
return new Tuple<string, string, DateTime>(tmpPath, GetMimeType(outputFormat, cacheFilePath), _fileSystem.GetLastWriteTimeUtc(tmpPath));
@@ -422,24 +437,70 @@ namespace Emby.Drawing
throw new ArgumentNullException("path");
}
- var name = path + "datemodified=" + imageDateModified.Ticks;
-
ImageSize size;
- var cacheHash = name.GetMD5();
+ var cacheHash = GetImageSizeKey(path, imageDateModified);
if (!_cachedImagedSizes.TryGetValue(cacheHash, out size))
{
size = GetImageSizeInternal(path, allowSlowMethod);
- if (size.Width > 0 && size.Height > 0)
+ SaveImageSize(size, cacheHash, false);
+ }
+
+ return size;
+ }
+
+ public void SaveImageSize(string path, DateTime imageDateModified, ImageSize size)
+ {
+ var cacheHash = GetImageSizeKey(path, imageDateModified);
+ SaveImageSize(size, cacheHash, true);
+ }
+
+ private void SaveImageSize(ImageSize size, Guid cacheHash, bool checkExists)
+ {
+ if (size.Width <= 0 || size.Height <= 0)
+ {
+ return;
+ }
+
+ if (checkExists && _cachedImagedSizes.ContainsKey(cacheHash))
+ {
+ return;
+ }
+
+ if (checkExists)
+ {
+ if (_cachedImagedSizes.TryAdd(cacheHash, size))
{
StartSaveImageSizeTimer();
- _cachedImagedSizes.AddOrUpdate(cacheHash, size, (keyName, oldValue) => size);
}
}
+ else
+ {
+ StartSaveImageSizeTimer();
+ _cachedImagedSizes.AddOrUpdate(cacheHash, size, (keyName, oldValue) => size);
+ }
+ }
- return size;
+ private Guid GetImageSizeKey(string path, DateTime imageDateModified)
+ {
+ var name = path + "datemodified=" + imageDateModified.Ticks;
+ return name.GetMD5();
+ }
+
+ public ImageSize? GetSavedImageSize(string path, DateTime imageDateModified)
+ {
+ ImageSize size;
+
+ var cacheHash = GetImageSizeKey(path, imageDateModified);
+
+ if (_cachedImagedSizes.TryGetValue(cacheHash, out size))
+ {
+ return size;
+ }
+
+ return null;
}
/// <summary>
@@ -624,7 +685,7 @@ namespace Emby.Drawing
var ehnancedImagePath = await GetEnhancedImageInternal(originalImagePath, item, imageType, imageIndex, enhancers, cacheGuid).ConfigureAwait(false);
// If the path changed update dateModified
- if (!ehnancedImagePath.Equals(originalImagePath, StringComparison.OrdinalIgnoreCase))
+ if (!string.Equals(ehnancedImagePath, originalImagePath, StringComparison.OrdinalIgnoreCase))
{
return GetResult(ehnancedImagePath);
}
@@ -783,7 +844,7 @@ namespace Emby.Drawing
return Path.Combine(path, filename);
}
- public async Task CreateImageCollage(ImageCollageOptions options)
+ public void CreateImageCollage(ImageCollageOptions options)
{
_logger.Info("Creating image collage and saving to {0}", options.OutputPath);
diff --git a/Emby.Drawing/NullImageEncoder.cs b/Emby.Drawing/NullImageEncoder.cs
index 1723e0637b..2241c5a868 100644
--- a/Emby.Drawing/NullImageEncoder.cs
+++ b/Emby.Drawing/NullImageEncoder.cs
@@ -32,7 +32,7 @@ namespace Emby.Drawing
throw new NotImplementedException();
}
- public void EncodeImage(string inputPath, ImageSize? originalImageSize, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
+ public string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat selectedOutputFormat)
{
throw new NotImplementedException();
}
diff --git a/Emby.Server.Core/ApplicationHost.cs b/Emby.Server.Core/ApplicationHost.cs
index 0fe30eb80c..5e9024e1d3 100644
--- a/Emby.Server.Core/ApplicationHost.cs
+++ b/Emby.Server.Core/ApplicationHost.cs
@@ -492,7 +492,6 @@ namespace Emby.Server.Core
{
var migrations = new List<IVersionMigration>
{
- new UpdateLevelMigration(ServerConfigurationManager, this, HttpClient, JsonSerializer, _releaseAssetFilename, Logger)
};
foreach (var task in migrations)
@@ -589,7 +588,7 @@ namespace Emby.Server.Core
FileOrganizationRepository = GetFileOrganizationRepository();
RegisterSingleInstance(FileOrganizationRepository);
- AuthenticationRepository = await GetAuthenticationRepository().ConfigureAwait(false);
+ AuthenticationRepository = GetAuthenticationRepository();
RegisterSingleInstance(AuthenticationRepository);
UserManager = new UserManager(LogManager.GetLogger("UserManager"), ServerConfigurationManager, UserRepository, XmlSerializer, NetworkManager, () => ImageProcessor, () => DtoService, () => ConnectManager, this, JsonSerializer, FileSystemManager, CryptographyProvider, _defaultUserNameFactory());
@@ -948,7 +947,7 @@ namespace Emby.Server.Core
return repo;
}
- private async Task<IAuthenticationRepository> GetAuthenticationRepository()
+ private IAuthenticationRepository GetAuthenticationRepository()
{
var repo = new AuthenticationRepository(LogManager.GetLogger("AuthenticationRepository"), ServerConfigurationManager.ApplicationPaths);
@@ -1278,9 +1277,6 @@ namespace Emby.Server.Core
// Emby.Server implementations
list.Add(GetAssembly(typeof(InstallationManager)));
- // Emby.Server.Core
- list.Add(GetAssembly(typeof(ApplicationHost)));
-
// MediaEncoding
list.Add(GetAssembly(typeof(MediaEncoder)));
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationPathHelper.cs b/Emby.Server.Core/ApplicationPathHelper.cs
index 254a782db9..e83d5444aa 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationPathHelper.cs
+++ b/Emby.Server.Core/ApplicationPathHelper.cs
@@ -2,7 +2,7 @@
using System.Configuration;
using System.IO;
-namespace MediaBrowser.Server.Startup.Common
+namespace Emby.Server.Core
{
public static class ApplicationPathHelper
{
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/ASN1.cs b/Emby.Server.Core/Cryptography/ASN1.cs
index a25c270734..f5c826436e 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/ASN1.cs
+++ b/Emby.Server.Core/Cryptography/ASN1.cs
@@ -34,7 +34,8 @@ using System.Collections;
using System.IO;
using System.Text;
-namespace Emby.Common.Implementations.Security {
+namespace Emby.Server.Core.Cryptography
+{
// References:
// a. ITU ASN.1 standards (free download)
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/ASN1Convert.cs b/Emby.Server.Core/Cryptography/ASN1Convert.cs
index 8a2a487c82..851d36dc70 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/ASN1Convert.cs
+++ b/Emby.Server.Core/Cryptography/ASN1Convert.cs
@@ -34,7 +34,7 @@ using System.Globalization;
using System.Security.Cryptography;
using System.Text;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
// References:
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/BitConverterLE.cs b/Emby.Server.Core/Cryptography/BitConverterLE.cs
index 240c958a3a..34e6bf6dce 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/BitConverterLE.cs
+++ b/Emby.Server.Core/Cryptography/BitConverterLE.cs
@@ -29,7 +29,7 @@
using System;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
internal sealed class BitConverterLE
{
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/CertificateGenerator.cs b/Emby.Server.Core/Cryptography/CertificateGenerator.cs
index 4f5b3d0042..2600d74702 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/CertificateGenerator.cs
+++ b/Emby.Server.Core/Cryptography/CertificateGenerator.cs
@@ -3,7 +3,7 @@ using System;
using System.Collections;
using System.Security.Cryptography;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
public class CertificateGenerator
{
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/CryptoConvert.cs b/Emby.Server.Core/Cryptography/CryptoConvert.cs
index c6e466534b..70a91bfff1 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/CryptoConvert.cs
+++ b/Emby.Server.Core/Cryptography/CryptoConvert.cs
@@ -32,7 +32,7 @@ using System.Globalization;
using System.Security.Cryptography;
using System.Text;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
public sealed class CryptoConvert {
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS1.cs b/Emby.Server.Core/Cryptography/PKCS1.cs
index 85bf9db380..24c0708c54 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS1.cs
+++ b/Emby.Server.Core/Cryptography/PKCS1.cs
@@ -31,7 +31,7 @@
using System;
using System.Security.Cryptography;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
// References:
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS12.cs b/Emby.Server.Core/Cryptography/PKCS12.cs
index 2205a71604..50f3776d9d 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS12.cs
+++ b/Emby.Server.Core/Cryptography/PKCS12.cs
@@ -37,7 +37,7 @@ using System.IO;
using System.Security.Cryptography;
using System.Text;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
public class PKCS5 {
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS7.cs b/Emby.Server.Core/Cryptography/PKCS7.cs
index 1b1a3295b4..475854500c 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS7.cs
+++ b/Emby.Server.Core/Cryptography/PKCS7.cs
@@ -33,7 +33,7 @@ using System;
using System.Collections;
using System.Security.Cryptography;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
public sealed class PKCS7 {
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS8.cs b/Emby.Server.Core/Cryptography/PKCS8.cs
index b58ebdaf99..7e9a272987 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/PKCS8.cs
+++ b/Emby.Server.Core/Cryptography/PKCS8.cs
@@ -33,7 +33,7 @@ using System;
using System.Collections;
using System.Security.Cryptography;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
public sealed class PKCS8 {
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/PfxGenerator.cs b/Emby.Server.Core/Cryptography/PfxGenerator.cs
index 3f9b90ac16..2d1dd649ea 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/PfxGenerator.cs
+++ b/Emby.Server.Core/Cryptography/PfxGenerator.cs
@@ -2,7 +2,7 @@
using System.Collections;
using System.Security.Cryptography;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
public class PFXGenerator
{
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X501Name.cs b/Emby.Server.Core/Cryptography/X501Name.cs
index 93e1a6bef4..3318f95e2b 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X501Name.cs
+++ b/Emby.Server.Core/Cryptography/X501Name.cs
@@ -31,7 +31,7 @@ using System;
using System.Globalization;
using System.Text;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
// References:
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X509Builder.cs b/Emby.Server.Core/Cryptography/X509Builder.cs
index e168559591..a2e292350b 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X509Builder.cs
+++ b/Emby.Server.Core/Cryptography/X509Builder.cs
@@ -33,7 +33,7 @@ using System;
using System.Globalization;
using System.Security.Cryptography;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
public abstract class X509Builder {
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X509Certificate.cs b/Emby.Server.Core/Cryptography/X509Certificate.cs
index f49445f0e7..3de58cfeea 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X509Certificate.cs
+++ b/Emby.Server.Core/Cryptography/X509Certificate.cs
@@ -34,7 +34,7 @@ using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
// References:
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X509CertificateBuilder.cs b/Emby.Server.Core/Cryptography/X509CertificateBuilder.cs
index fb6f8ec727..cecff65784 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X509CertificateBuilder.cs
+++ b/Emby.Server.Core/Cryptography/X509CertificateBuilder.cs
@@ -32,7 +32,7 @@
using System;
using System.Security.Cryptography;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
// From RFC3280
/*
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X509CertificateCollection.cs b/Emby.Server.Core/Cryptography/X509CertificateCollection.cs
index 5d353f9cfd..a129bfc1a1 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X509CertificateCollection.cs
+++ b/Emby.Server.Core/Cryptography/X509CertificateCollection.cs
@@ -31,7 +31,7 @@
using System;
using System.Collections;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
[Serializable]
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X509Extension.cs b/Emby.Server.Core/Cryptography/X509Extension.cs
index e82f52bac7..36b17deba0 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X509Extension.cs
+++ b/Emby.Server.Core/Cryptography/X509Extension.cs
@@ -31,7 +31,7 @@ using System;
using System.Globalization;
using System.Text;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
/*
* Extension ::= SEQUENCE {
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X509Extensions.cs b/Emby.Server.Core/Cryptography/X509Extensions.cs
index c7d5f0046e..018a04d796 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X509Extensions.cs
+++ b/Emby.Server.Core/Cryptography/X509Extensions.cs
@@ -32,7 +32,7 @@
using System;
using System.Collections;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
/*
* Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
diff --git a/MediaBrowser.Server.Startup.Common/Cryptography/X520Attributes.cs b/Emby.Server.Core/Cryptography/X520Attributes.cs
index 5062bf80ad..da7fd2b82c 100644
--- a/MediaBrowser.Server.Startup.Common/Cryptography/X520Attributes.cs
+++ b/Emby.Server.Core/Cryptography/X520Attributes.cs
@@ -30,7 +30,7 @@
using System;
using System.Text;
-namespace Emby.Common.Implementations.Security
+namespace Emby.Server.Core.Cryptography
{
// References:
diff --git a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj b/Emby.Server.Core/Emby.Server.Core.csproj
index 5955d4c96c..01193bb6cd 100644
--- a/MediaBrowser.Server.Startup.Common/MediaBrowser.Server.Startup.Common.csproj
+++ b/Emby.Server.Core/Emby.Server.Core.csproj
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProjectGuid>{B90AB8F2-1BFF-4568-A3FD-2A338A435A75}</ProjectGuid>
+ <ProjectGuid>{776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>MediaBrowser.Server.Startup.Common</RootNamespace>
- <AssemblyName>MediaBrowser.Server.Startup.Common</AssemblyName>
+ <RootNamespace>Emby.Server.Core</RootNamespace>
+ <AssemblyName>Emby.Server.Core</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
- <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
@@ -25,7 +24,7 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DebugType>None</DebugType>
+ <DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
@@ -34,13 +33,18 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
- <Reference Include="Emby.Server.Core">
- <HintPath>..\ThirdParty\emby\Emby.Server.Core.dll</HintPath>
- </Reference>
<Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=1.2.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
<Private>True</Private>
</Reference>
+ <Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
+ <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
@@ -48,12 +52,14 @@
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
+ <Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
+ <Compile Include="ApplicationHost.cs" />
<Compile Include="ApplicationPathHelper.cs" />
<Compile Include="Cryptography\ASN1.cs" />
<Compile Include="Cryptography\ASN1Convert.cs" />
@@ -73,16 +79,40 @@
<Compile Include="Cryptography\X509Extension.cs" />
<Compile Include="Cryptography\X509Extensions.cs" />
<Compile Include="Cryptography\X520Attributes.cs" />
+ <Compile Include="EntryPoints\ExternalPortForwarding.cs" />
+ <Compile Include="HttpServerFactory.cs" />
+ <Compile Include="IO\LibraryMonitor.cs" />
<Compile Include="IO\MemoryStreamProvider.cs" />
+ <Compile Include="Localization\TextLocalizer.cs" />
+ <Compile Include="Logging\ConsoleLogger.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SystemEvents.cs" />
- <Compile Include="UpdateLevelHelper.cs" />
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\Emby.Common.Implementations\Emby.Common.Implementations.csproj">
+ <Project>{1e37a338-9f57-4b70-bd6d-bb9c591e319b}</Project>
+ <Name>Emby.Common.Implementations</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Emby.Dlna\Emby.Dlna.csproj">
+ <Project>{805844ab-e92f-45e6-9d99-4f6d48d129a5}</Project>
+ <Name>Emby.Dlna</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj">
+ <Project>{08fff49b-f175-4807-a2b5-73b0ebd9f716}</Project>
+ <Name>Emby.Drawing</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Emby.Photos\Emby.Photos.csproj">
+ <Project>{89ab4548-770d-41fd-a891-8daff44f452c}</Project>
+ <Name>Emby.Photos</Name>
+ </ProjectReference>
<ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj">
<Project>{e383961b-9356-4d5d-8233-9a1079d03055}</Project>
<Name>Emby.Server.Implementations</Name>
</ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Api\MediaBrowser.Api.csproj">
+ <Project>{4fd51ac5-2c16-4308-a993-c3a84f3b4582}</Project>
+ <Name>MediaBrowser.Api</Name>
+ </ProjectReference>
<ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
<Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
<Name>MediaBrowser.Common</Name>
@@ -91,16 +121,51 @@
<Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
<Name>MediaBrowser.Controller</Name>
</ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj">
+ <Project>{7ef9f3e0-697d-42f3-a08f-19deb5f84392}</Project>
+ <Name>MediaBrowser.LocalMetadata</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj">
+ <Project>{0bd82fa6-eb8a-4452-8af5-74f9c3849451}</Project>
+ <Name>MediaBrowser.MediaEncoding</Name>
+ </ProjectReference>
<ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
<Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
<Name>MediaBrowser.Model</Name>
</ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Providers\MediaBrowser.Providers.csproj">
+ <Project>{442b5058-dcaf-4263-bb6a-f21e31120a1b}</Project>
+ <Name>MediaBrowser.Providers</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj">
+ <Project>{2e781478-814d-4a48-9d80-bff206441a65}</Project>
+ <Name>MediaBrowser.Server.Implementations</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj">
+ <Project>{5624b7b5-b5a7-41d8-9f10-cc5611109619}</Project>
+ <Name>MediaBrowser.WebDashboard</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj">
+ <Project>{23499896-b135-4527-8574-c26e926ea99e}</Project>
+ <Name>MediaBrowser.XbmcMetadata</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
+ <Project>{cb7f2326-6497-4a3d-ba03-48513b17a7be}</Project>
+ <Name>Mono.Nat</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj">
+ <Project>{4a4402d4-e910-443b-b8fc-2c18286a2ca0}</Project>
+ <Name>OpenSubtitlesHandler</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\SocketHttpListener\SocketHttpListener.csproj">
+ <Project>{1d74413b-e7cf-455b-b021-f52bdf881542}</Project>
+ <Name>SocketHttpListener</Name>
+ </ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
- <ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
diff --git a/Emby.Server.Core/Emby.Server.Core.xproj b/Emby.Server.Core/Emby.Server.Core.xproj
deleted file mode 100644
index fefaa6284e..0000000000
--- a/Emby.Server.Core/Emby.Server.Core.xproj
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
- <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
- </PropertyGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
- <PropertyGroup Label="Globals">
- <ProjectGuid>65aa7d67-8059-40cd-91f1-16d02687226c</ProjectGuid>
- <RootNamespace>Emby.Server.Core</RootNamespace>
- <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
- <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
- <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
- </PropertyGroup>
- <PropertyGroup>
- <SchemaVersion>2.0</SchemaVersion>
- </PropertyGroup>
- <ItemGroup>
- <ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj" />
- <ProjectReference Include="..\Emby.Photos\Emby.Photos.csproj" />
- <ProjectReference Include="..\MediaBrowser.Api\MediaBrowser.Api.csproj" />
- <ProjectReference Include="..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj" />
- <ProjectReference Include="..\MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj" />
- <ProjectReference Include="..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj" />
- <ProjectReference Include="..\MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj" />
- <ProjectReference Include="..\Emby.Dlna\Emby.Dlna.csproj" />
- <ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj" />
- <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />
- <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
- <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
- </ItemGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
-</Project> \ No newline at end of file
diff --git a/Emby.Server.Core/HttpServerFactory.cs b/Emby.Server.Core/HttpServerFactory.cs
index dfd435c337..e16cbea0e3 100644
--- a/Emby.Server.Core/HttpServerFactory.cs
+++ b/Emby.Server.Core/HttpServerFactory.cs
@@ -3,6 +3,7 @@ using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
+using System.Threading;
using System.Threading.Tasks;
using Emby.Common.Implementations.Net;
using Emby.Server.Implementations.HttpServer;
@@ -33,10 +34,10 @@ namespace Emby.Server.Core
/// <returns>IHttpServer.</returns>
public static IHttpServer CreateServer(IServerApplicationHost applicationHost,
ILogManager logManager,
- IServerConfigurationManager config,
+ IServerConfigurationManager config,
INetworkManager networkmanager,
IMemoryStreamFactory streamProvider,
- string serverName,
+ string serverName,
string defaultRedirectpath,
ITextEncoding textEncoding,
ISocketFactory socketFactory,
@@ -51,16 +52,16 @@ namespace Emby.Server.Core
var logger = logManager.GetLogger("HttpServer");
return new HttpListenerHost(applicationHost,
- logger,
- config,
- serverName,
- defaultRedirectpath,
- networkmanager,
- streamProvider,
- textEncoding,
- socketFactory,
- cryptoProvider,
- json,
+ logger,
+ config,
+ serverName,
+ defaultRedirectpath,
+ networkmanager,
+ streamProvider,
+ textEncoding,
+ socketFactory,
+ cryptoProvider,
+ json,
xml,
environment,
certificate,
@@ -82,7 +83,7 @@ namespace Emby.Server.Core
{
var netSocket = (NetAcceptSocket)acceptSocket;
- return new NetworkStream(netSocket.Socket, ownsSocket);
+ return new SocketStream(netSocket.Socket, ownsSocket);
}
public Task AuthenticateSslStreamAsServer(Stream stream, ICertificate certificate)
diff --git a/MediaBrowser.Server.Startup.Common/IO/MemoryStreamProvider.cs b/Emby.Server.Core/IO/MemoryStreamProvider.cs
index 3ca0f4db5a..f6dd1ecbc2 100644
--- a/MediaBrowser.Server.Startup.Common/IO/MemoryStreamProvider.cs
+++ b/Emby.Server.Core/IO/MemoryStreamProvider.cs
@@ -2,7 +2,7 @@
using MediaBrowser.Model.IO;
using Microsoft.IO;
-namespace MediaBrowser.Server.Startup.Common.IO
+namespace Emby.Server.Core.IO
{
public class RecyclableMemoryStreamProvider : IMemoryStreamFactory
{
diff --git a/Emby.Server.Core/Properties/AssemblyInfo.cs b/Emby.Server.Core/Properties/AssemblyInfo.cs
index 69df3d58db..ead0429819 100644
--- a/Emby.Server.Core/Properties/AssemblyInfo.cs
+++ b/Emby.Server.Core/Properties/AssemblyInfo.cs
@@ -2,18 +2,33 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
-// General Information about an assembly is controlled through the following
+// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
+[assembly: AssemblyTitle("Emby.Server.Core")]
+[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Emby.Server.Core")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("65aa7d67-8059-40cd-91f1-16d02687226c")]
+[assembly: Guid("776b9f0c-5195-45e3-9a36-1cc1f0d8e0b0")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")] \ No newline at end of file
diff --git a/MediaBrowser.Server.Startup.Common/SystemEvents.cs b/Emby.Server.Core/SystemEvents.cs
index 8d5cd4ad8c..8d5cd4ad8c 100644
--- a/MediaBrowser.Server.Startup.Common/SystemEvents.cs
+++ b/Emby.Server.Core/SystemEvents.cs
diff --git a/Emby.Server.Core/app.config b/Emby.Server.Core/app.config
new file mode 100644
index 0000000000..57ff623921
--- /dev/null
+++ b/Emby.Server.Core/app.config
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral"/>
+ <bindingRedirect oldVersion="0.0.0.0-4.0.7.0" newVersion="4.0.7.0"/>
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>
diff --git a/Emby.Server.Core/packages.config b/Emby.Server.Core/packages.config
new file mode 100644
index 0000000000..24e8a26b60
--- /dev/null
+++ b/Emby.Server.Core/packages.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="Microsoft.IO.RecyclableMemoryStream" version="1.2.2" targetFramework="net462" />
+ <package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
+ <package id="SimpleInjector" version="4.0.7" targetFramework="net462" />
+</packages> \ No newline at end of file
diff --git a/Emby.Server.Core/project.json b/Emby.Server.Core/project.json
deleted file mode 100644
index fd4f9d6cf7..0000000000
--- a/Emby.Server.Core/project.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "version": "1.0.0-*",
-
- "dependencies": {
-
- },
-
- "frameworks": {
- "net46": {
- "frameworkAssemblies": {
- "System.Runtime": "4.0.0"
- },
- "dependencies": {
- "MediaBrowser.Model": {
- "target": "project"
- },
- "MediaBrowser.Common": {
- "target": "project"
- },
- "MediaBrowser.Controller": {
- "target": "project"
- },
- "Emby.Common.Implementations": {
- "target": "project"
- },
- "Mono.Nat": {
- "target": "project"
- },
- "Emby.Server.Implementations": {
- "target": "project"
- },
- "MediaBrowser.Server.Implementations": {
- "target": "project"
- },
- "Emby.Dlna": {
- "target": "project"
- },
- "Emby.Photos": {
- "target": "project"
- },
- "MediaBrowser.Api": {
- "target": "project"
- },
- "MediaBrowser.MediaEncoding": {
- "target": "project"
- },
- "MediaBrowser.XbmcMetadata": {
- "target": "project"
- },
- "MediaBrowser.LocalMetadata": {
- "target": "project"
- },
- "MediaBrowser.WebDashboard": {
- "target": "project"
- },
- "Emby.Drawing": {
- "target": "project"
- },
- "SocketHttpListener.Portable": {
- "target": "project"
- }
- }
- },
- "netstandard1.6": {
- "imports": "dnxcore50",
- "dependencies": {
- "NETStandard.Library": "1.6.1",
- "System.AppDomain": "2.0.11",
- "System.Globalization.Extensions": "4.3.0",
- "System.IO.FileSystem.Watcher": "4.3.0",
- "System.Net.Security": "4.3.1",
- "System.Security.Cryptography.X509Certificates": "4.3.0",
- "System.Runtime.Extensions": "4.3.0",
- "MediaBrowser.Model": {
- "target": "project"
- },
- "MediaBrowser.Common": {
- "target": "project"
- },
- "MediaBrowser.Controller": {
- "target": "project"
- },
- "Emby.Common.Implementations": {
- "target": "project"
- },
- "Mono.Nat": {
- "target": "project"
- },
- "Emby.Server.Implementations": {
- "target": "project"
- },
- "MediaBrowser.Server.Implementations": {
- "target": "project"
- },
- "Emby.Dlna": {
- "target": "project"
- },
- "Emby.Photos": {
- "target": "project"
- },
- "MediaBrowser.Api": {
- "target": "project"
- },
- "MediaBrowser.MediaEncoding": {
- "target": "project"
- },
- "MediaBrowser.XbmcMetadata": {
- "target": "project"
- },
- "MediaBrowser.LocalMetadata": {
- "target": "project"
- },
- "MediaBrowser.WebDashboard": {
- "target": "project"
- },
- "Emby.Drawing": {
- "target": "project"
- },
- "SocketHttpListener.Portable": {
- "target": "project"
- }
- }
- }
- }
-}
diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs
index 0cdd934b7a..809771b045 100644
--- a/Emby.Server.Implementations/Channels/ChannelManager.cs
+++ b/Emby.Server.Implementations/Channels/ChannelManager.cs
@@ -23,7 +23,7 @@ using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
@@ -120,7 +120,7 @@ namespace Emby.Server.Implementations.Channels
if (query.IsFavorite.HasValue)
{
var val = query.IsFavorite.Value;
- channels = channels.Where(i => _userDataManager.GetUserData(user, i).IsFavorite == val)
+ channels = channels.Where(i => _userDataManager.GetUserData(user, i).IsFavorite == val)
.ToList();
}
@@ -263,7 +263,7 @@ namespace Emby.Server.Implementations.Channels
}
catch
{
-
+
}
return;
}
@@ -273,7 +273,7 @@ namespace Emby.Server.Implementations.Channels
_jsonSerializer.SerializeToFile(mediaSources, path);
}
- public async Task<IEnumerable<MediaSourceInfo>> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken)
+ public IEnumerable<MediaSourceInfo> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken)
{
IEnumerable<ChannelMediaInfo> results = GetSavedMediaSources(item);
@@ -460,12 +460,12 @@ namespace Emby.Server.Implementations.Channels
public IEnumerable<ChannelFeatures> GetAllChannelFeatures()
{
- return _libraryManager.GetItemList(new InternalItemsQuery
+ return _libraryManager.GetItemIds(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(Channel).Name },
SortBy = new[] { ItemSortBy.SortName }
- }).Select(i => GetChannelFeatures(i.Id.ToString("N")));
+ }).Select(i => GetChannelFeatures(i.ToString("N")));
}
public ChannelFeatures GetChannelFeatures(string id)
@@ -963,7 +963,7 @@ namespace Emby.Server.Implementations.Channels
}
}
- return await GetReturnItems(internalItems, providerTotalRecordCount, user, query).ConfigureAwait(false);
+ return GetReturnItems(internalItems, providerTotalRecordCount, user, query);
}
public async Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken)
@@ -1154,7 +1154,7 @@ namespace Emby.Server.Implementations.Channels
filename + ".json");
}
- private async Task<QueryResult<BaseItem>> GetReturnItems(IEnumerable<BaseItem> items,
+ private QueryResult<BaseItem> GetReturnItems(IEnumerable<BaseItem> items,
int? totalCountFromProvider,
User user,
ChannelItemQuery query)
diff --git a/Emby.Server.Implementations/Collections/CollectionImageProvider.cs b/Emby.Server.Implementations/Collections/CollectionImageProvider.cs
index b82d4e44e0..463d276e5e 100644
--- a/Emby.Server.Implementations/Collections/CollectionImageProvider.cs
+++ b/Emby.Server.Implementations/Collections/CollectionImageProvider.cs
@@ -32,7 +32,7 @@ namespace Emby.Server.Implementations.Collections
return base.Supports(item);
}
- protected override Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var playlist = (BoxSet)item;
@@ -73,10 +73,10 @@ namespace Emby.Server.Implementations.Collections
.DistinctBy(i => i.Id)
.ToList();
- return Task.FromResult(GetFinalItems(items, 2));
+ return GetFinalItems(items, 2);
}
- protected override Task<string> CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
+ protected override string CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
{
return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary);
}
diff --git a/Emby.Server.Implementations/Collections/CollectionManager.cs b/Emby.Server.Implementations/Collections/CollectionManager.cs
index 9c26655fc7..4e5d344a3f 100644
--- a/Emby.Server.Implementations/Collections/CollectionManager.cs
+++ b/Emby.Server.Implementations/Collections/CollectionManager.cs
@@ -170,6 +170,11 @@ namespace Emby.Server.Implementations.Collections
{
var item = _libraryManager.GetItemById(itemId);
+ if (string.IsNullOrWhiteSpace(item.Path))
+ {
+ continue;
+ }
+
if (item == null)
{
throw new ArgumentException("No item exists with the supplied Id");
diff --git a/Emby.Server.Implementations/Collections/CollectionsDynamicFolder.cs b/Emby.Server.Implementations/Collections/CollectionsDynamicFolder.cs
index 4ff33e6451..c7bcdfe256 100644
--- a/Emby.Server.Implementations/Collections/CollectionsDynamicFolder.cs
+++ b/Emby.Server.Implementations/Collections/CollectionsDynamicFolder.cs
@@ -1,7 +1,7 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using System.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.IO;
diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
index 451ec2dfe6..3c4b50edaf 100644
--- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs
+++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs
@@ -207,8 +207,6 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "DateCreated", "DATETIME", existingColumnNames);
AddColumn(db, "TypedBaseItems", "DateModified", "DATETIME", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "ForcedSortName", "Text", existingColumnNames);
-
AddColumn(db, "TypedBaseItems", "IsSeries", "BIT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "IsLive", "BIT", existingColumnNames);
AddColumn(db, "TypedBaseItems", "IsNews", "BIT", existingColumnNames);
@@ -241,7 +239,6 @@ namespace Emby.Server.Implementations.Data
AddColumn(db, "TypedBaseItems", "InheritedTags", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "CleanName", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "PresentationUniqueKey", "Text", existingColumnNames);
- AddColumn(db, "TypedBaseItems", "SlugName", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "OriginalTitle", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "PrimaryVersionId", "Text", existingColumnNames);
AddColumn(db, "TypedBaseItems", "DateLastMediaAdded", "DATETIME", existingColumnNames);
@@ -427,7 +424,7 @@ namespace Emby.Server.Implementations.Data
"OfficialRating",
"HomePageUrl",
"DisplayMediaType",
- "ForcedSortName",
+ "SortName",
"RunTimeTicks",
"VoteCount",
"DateCreated",
@@ -550,7 +547,6 @@ namespace Emby.Server.Implementations.Data
"DisplayMediaType",
"DateCreated",
"DateModified",
- "ForcedSortName",
"PreferredMetadataLanguage",
"PreferredMetadataCountryCode",
"IsHD",
@@ -573,7 +569,6 @@ namespace Emby.Server.Implementations.Data
"InheritedTags",
"CleanName",
"PresentationUniqueKey",
- "SlugName",
"OriginalTitle",
"PrimaryVersionId",
"DateLastMediaAdded",
@@ -828,8 +823,6 @@ namespace Emby.Server.Implementations.Data
saveItemStatement.TryBind("@DateCreated", item.DateCreated);
saveItemStatement.TryBind("@DateModified", item.DateModified);
- saveItemStatement.TryBind("@ForcedSortName", item.ForcedSortName);
-
saveItemStatement.TryBind("@PreferredMetadataLanguage", item.PreferredMetadataLanguage);
saveItemStatement.TryBind("@PreferredMetadataCountryCode", item.PreferredMetadataCountryCode);
saveItemStatement.TryBind("@IsHD", item.IsHD);
@@ -950,7 +943,6 @@ namespace Emby.Server.Implementations.Data
}
saveItemStatement.TryBind("@PresentationUniqueKey", item.PresentationUniqueKey);
- saveItemStatement.TryBind("@SlugName", item.SlugName);
saveItemStatement.TryBind("@OriginalTitle", item.OriginalTitle);
var video = item as Video;
@@ -1240,7 +1232,7 @@ namespace Emby.Server.Implementations.Data
foreach (var row in statement.ExecuteQuery())
{
- return GetItem(row);
+ return GetItem(row, new InternalItemsQuery());
}
}
@@ -1249,19 +1241,10 @@ namespace Emby.Server.Implementations.Data
}
}
- private BaseItem GetItem(IReadOnlyList<IResultSetValue> reader)
- {
- return GetItem(reader, new InternalItemsQuery());
- }
-
private bool TypeRequiresDeserialization(Type type)
{
if (_config.Configuration.SkipDeserializationForBasicTypes)
{
- if (type == typeof(Person))
- {
- return false;
- }
if (type == typeof(Channel))
{
return false;
@@ -1280,6 +1263,10 @@ namespace Emby.Server.Implementations.Data
}
}
+ if (type == typeof(Person))
+ {
+ return false;
+ }
if (type == typeof(MusicGenre))
{
return false;
@@ -1361,6 +1348,11 @@ namespace Emby.Server.Implementations.Data
private BaseItem GetItem(IReadOnlyList<IResultSetValue> reader, InternalItemsQuery query)
{
+ return GetItem(reader, query, HasProgramAttributes(query), HasEpisodeAttributes(query), HasStartDate(query), HasTrailerTypes(query), HasArtistFields(query), HasSeriesFields(query));
+ }
+
+ private BaseItem GetItem(IReadOnlyList<IResultSetValue> reader, InternalItemsQuery query, bool enableProgramAttributes, bool hasEpisodeAttributes, bool queryHasStartDate, bool hasTrailerTypes, bool hasArtistFields, bool hasSeriesFields)
+ {
var typeString = reader.GetString(0);
var type = _typeMapper.GetType(typeString);
@@ -1407,87 +1399,96 @@ namespace Emby.Server.Implementations.Data
return null;
}
- if (!reader.IsDBNull(2))
+ var index = 2;
+
+ if (queryHasStartDate)
{
- var hasStartDate = item as IHasStartDate;
- if (hasStartDate != null)
+ if (!reader.IsDBNull(index))
{
- hasStartDate.StartDate = reader[2].ReadDateTime();
+ var hasStartDate = item as IHasStartDate;
+ if (hasStartDate != null)
+ {
+ hasStartDate.StartDate = reader[index].ReadDateTime();
+ }
}
+ index++;
}
- if (!reader.IsDBNull(3))
+ if (!reader.IsDBNull(index))
{
- item.EndDate = reader[3].ReadDateTime();
+ item.EndDate = reader[index].ReadDateTime();
}
+ index++;
- if (!reader.IsDBNull(4))
+ if (!reader.IsDBNull(index))
{
- item.ChannelId = reader.GetString(4);
+ item.ChannelId = reader.GetString(index);
}
+ index++;
- var index = 5;
-
- var hasProgramAttributes = item as IHasProgramAttributes;
- if (hasProgramAttributes != null)
+ if (enableProgramAttributes)
{
- if (!reader.IsDBNull(index))
+ var hasProgramAttributes = item as IHasProgramAttributes;
+ if (hasProgramAttributes != null)
{
- hasProgramAttributes.IsMovie = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsMovie = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsSports = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsSports = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsKids = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsKids = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsSeries = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsSeries = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsLive = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsLive = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsNews = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsNews = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.IsPremiere = reader.GetBoolean(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsPremiere = reader.GetBoolean(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
- {
- hasProgramAttributes.EpisodeTitle = reader.GetString(index);
- }
- index++;
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.EpisodeTitle = reader.GetString(index);
+ }
+ index++;
- if (!reader.IsDBNull(index))
+ if (!reader.IsDBNull(index))
+ {
+ hasProgramAttributes.IsRepeat = reader.GetBoolean(index);
+ }
+ index++;
+ }
+ else
{
- hasProgramAttributes.IsRepeat = reader.GetBoolean(index);
+ index += 9;
}
- index++;
- }
- else
- {
- index += 9;
}
if (!reader.IsDBNull(index))
@@ -1496,7 +1497,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.CustomRating))
+ if (HasField(query, ItemFields.CustomRating))
{
if (!reader.IsDBNull(index))
{
@@ -1511,7 +1512,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.Settings))
+ if (HasField(query, ItemFields.Settings))
{
if (!reader.IsDBNull(index))
{
@@ -1538,17 +1539,23 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.ExternalEtag))
{
- item.ExternalEtag = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ item.ExternalEtag = reader.GetString(index);
+ }
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.DateLastRefreshed))
{
- item.DateLastRefreshed = reader[index].ReadDateTime();
+ if (!reader.IsDBNull(index))
+ {
+ item.DateLastRefreshed = reader[index].ReadDateTime();
+ }
+ index++;
}
- index++;
if (!reader.IsDBNull(index))
{
@@ -1568,7 +1575,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.Overview))
+ if (HasField(query, ItemFields.Overview))
{
if (!reader.IsDBNull(index))
{
@@ -1595,7 +1602,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.HomePageUrl))
+ if (HasField(query, ItemFields.HomePageUrl))
{
if (!reader.IsDBNull(index))
{
@@ -1604,7 +1611,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.DisplayMediaType))
+ if (HasField(query, ItemFields.DisplayMediaType))
{
if (!reader.IsDBNull(index))
{
@@ -1613,11 +1620,11 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.SortName))
+ if (HasField(query, ItemFields.SortName))
{
if (!reader.IsDBNull(index))
{
- item.ForcedSortName = reader.GetString(index);
+ item.SortName = reader.GetString(index);
}
index++;
}
@@ -1628,7 +1635,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.VoteCount))
+ if (HasField(query, ItemFields.VoteCount))
{
if (!reader.IsDBNull(index))
{
@@ -1637,7 +1644,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.DateCreated))
+ if (HasField(query, ItemFields.DateCreated))
{
if (!reader.IsDBNull(index))
{
@@ -1655,7 +1662,7 @@ namespace Emby.Server.Implementations.Data
item.Id = reader.GetGuid(index);
index++;
- if (query.HasField(ItemFields.Genres))
+ if (HasField(query, ItemFields.Genres))
{
if (!reader.IsDBNull(index))
{
@@ -1690,13 +1697,16 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.DateLastSaved))
{
- item.DateLastSaved = reader[index].ReadDateTime();
+ if (!reader.IsDBNull(index))
+ {
+ item.DateLastSaved = reader[index].ReadDateTime();
+ }
+ index++;
}
- index++;
- if (query.HasField(ItemFields.Settings))
+ if (HasField(query, ItemFields.Settings))
{
if (!reader.IsDBNull(index))
{
@@ -1705,7 +1715,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.Studios))
+ if (HasField(query, ItemFields.Studios))
{
if (!reader.IsDBNull(index))
{
@@ -1714,7 +1724,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.Tags))
+ if (HasField(query, ItemFields.Tags))
{
if (!reader.IsDBNull(index))
{
@@ -1729,17 +1739,20 @@ namespace Emby.Server.Implementations.Data
}
index++;
- var trailer = item as Trailer;
- if (trailer != null)
+ if (hasTrailerTypes)
{
- if (!reader.IsDBNull(index))
+ var trailer = item as Trailer;
+ if (trailer != null)
{
- trailer.TrailerTypes = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList();
+ if (!reader.IsDBNull(index))
+ {
+ trailer.TrailerTypes = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true)).ToList();
+ }
}
+ index++;
}
- index++;
- if (query.HasField(ItemFields.OriginalTitle))
+ if (HasField(query, ItemFields.OriginalTitle))
{
if (!reader.IsDBNull(index))
{
@@ -1758,7 +1771,7 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (query.HasField(ItemFields.DateLastMediaAdded))
+ if (HasField(query, ItemFields.DateLastMediaAdded))
{
var folder = item as Folder;
if (folder != null && !reader.IsDBNull(index))
@@ -1787,68 +1800,89 @@ namespace Emby.Server.Implementations.Data
index++;
var hasSeries = item as IHasSeries;
- if (hasSeries != null)
+ if (hasSeriesFields)
{
- if (!reader.IsDBNull(index))
+ if (hasSeries != null)
{
- hasSeries.SeriesName = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ hasSeries.SeriesName = reader.GetString(index);
+ }
}
+ index++;
}
- index++;
- var episode = item as Episode;
- if (episode != null)
+ if (hasEpisodeAttributes)
{
- if (!reader.IsDBNull(index))
+ var episode = item as Episode;
+ if (episode != null)
{
- episode.SeasonName = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ episode.SeasonName = reader.GetString(index);
+ }
+ index++;
+ if (!reader.IsDBNull(index))
+ {
+ episode.SeasonId = reader.GetGuid(index);
+ }
}
- index++;
- if (!reader.IsDBNull(index))
+ else
{
- episode.SeasonId = reader.GetGuid(index);
+ index++;
}
+ index++;
}
- else
+
+ if (hasSeriesFields)
{
+ if (hasSeries != null)
+ {
+ if (!reader.IsDBNull(index))
+ {
+ hasSeries.SeriesId = reader.GetGuid(index);
+ }
+ }
index++;
}
- index++;
- if (hasSeries != null)
+ if (HasField(query, ItemFields.PresentationUniqueKey))
{
if (!reader.IsDBNull(index))
{
- hasSeries.SeriesId = reader.GetGuid(index);
+ item.PresentationUniqueKey = reader.GetString(index);
}
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.InheritedParentalRatingValue))
{
- item.PresentationUniqueKey = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ item.InheritedParentalRatingValue = reader.GetInt32(index);
+ }
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.Tags))
{
- item.InheritedParentalRatingValue = reader.GetInt32(index);
- }
- index++;
-
- if (!reader.IsDBNull(index))
- {
- item.InheritedTags = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ if (!reader.IsDBNull(index))
+ {
+ item.InheritedTags = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ }
+ index++;
}
- index++;
- if (!reader.IsDBNull(index))
+ if (HasField(query, ItemFields.ExternalSeriesId))
{
- item.ExternalSeriesId = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ item.ExternalSeriesId = reader.GetString(index);
+ }
+ index++;
}
- index++;
- if (query.HasField(ItemFields.Taglines))
+ if (HasField(query, ItemFields.Taglines))
{
if (!reader.IsDBNull(index))
{
@@ -1857,7 +1891,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.Keywords))
+ if (HasField(query, ItemFields.Keywords))
{
if (!reader.IsDBNull(index))
{
@@ -1881,7 +1915,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.ProductionLocations))
+ if (HasField(query, ItemFields.ProductionLocations))
{
if (!reader.IsDBNull(index))
{
@@ -1890,7 +1924,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.ThemeSongIds))
+ if (HasField(query, ItemFields.ThemeSongIds))
{
if (!reader.IsDBNull(index))
{
@@ -1899,7 +1933,7 @@ namespace Emby.Server.Implementations.Data
index++;
}
- if (query.HasField(ItemFields.ThemeVideoIds))
+ if (HasField(query, ItemFields.ThemeVideoIds))
{
if (!reader.IsDBNull(index))
{
@@ -1920,19 +1954,22 @@ namespace Emby.Server.Implementations.Data
}
index++;
- var hasArtists = item as IHasArtist;
- if (hasArtists != null && !reader.IsDBNull(index))
+ if (hasArtistFields)
{
- hasArtists.Artists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
- }
- index++;
+ var hasArtists = item as IHasArtist;
+ if (hasArtists != null && !reader.IsDBNull(index))
+ {
+ hasArtists.Artists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ }
+ index++;
- var hasAlbumArtists = item as IHasAlbumArtist;
- if (hasAlbumArtists != null && !reader.IsDBNull(index))
- {
- hasAlbumArtists.AlbumArtists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ var hasAlbumArtists = item as IHasAlbumArtist;
+ if (hasAlbumArtists != null && !reader.IsDBNull(index))
+ {
+ hasAlbumArtists.AlbumArtists = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList();
+ }
+ index++;
}
- index++;
if (!reader.IsDBNull(index))
{
@@ -1940,14 +1977,17 @@ namespace Emby.Server.Implementations.Data
}
index++;
- if (hasSeries != null)
+ if (HasField(query, ItemFields.SeriesPresentationUniqueKey))
{
- if (!reader.IsDBNull(index))
+ if (hasSeries != null)
{
- hasSeries.SeriesPresentationUniqueKey = reader.GetString(index);
+ if (!reader.IsDBNull(index))
+ {
+ hasSeries.SeriesPresentationUniqueKey = reader.GetString(index);
+ }
}
+ index++;
}
- index++;
return item;
}
@@ -2243,23 +2283,225 @@ namespace Emby.Server.Implementations.Data
}
if (field == ItemFields.SortName)
{
- return new[] { "ForcedSortName" };
+ return new[] { "SortName" };
}
if (field == ItemFields.Taglines)
{
return new[] { "Tagline" };
}
+ if (field == ItemFields.Tags)
+ {
+ return new[] { "Tags", "InheritedTags" };
+ }
return new[] { field.ToString() };
}
+ private bool HasField(InternalItemsQuery query, ItemFields name)
+ {
+ var fields = query.DtoOptions.Fields;
+
+ switch (name)
+ {
+ case ItemFields.HomePageUrl:
+ case ItemFields.Keywords:
+ case ItemFields.DisplayMediaType:
+ case ItemFields.VoteCount:
+ case ItemFields.CustomRating:
+ case ItemFields.ProductionLocations:
+ case ItemFields.Settings:
+ case ItemFields.OriginalTitle:
+ case ItemFields.Taglines:
+ case ItemFields.SortName:
+ case ItemFields.Studios:
+ case ItemFields.Tags:
+ case ItemFields.ThemeSongIds:
+ case ItemFields.ThemeVideoIds:
+ case ItemFields.DateCreated:
+ case ItemFields.Overview:
+ case ItemFields.Genres:
+ case ItemFields.DateLastMediaAdded:
+ case ItemFields.ExternalEtag:
+ case ItemFields.PresentationUniqueKey:
+ case ItemFields.InheritedParentalRatingValue:
+ case ItemFields.ExternalSeriesId:
+ case ItemFields.SeriesPresentationUniqueKey:
+ case ItemFields.DateLastRefreshed:
+ case ItemFields.DateLastSaved:
+ return fields.Contains(name);
+ case ItemFields.ServiceName:
+ return true;
+ default:
+ return true;
+ }
+ }
+
+ private bool HasProgramAttributes(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "Series",
+ "Season",
+ "MusicAlbum",
+ "MusicArtist",
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Program",
+ "Recording",
+ "TvChannel",
+ "LiveTvAudioRecording",
+ "LiveTvVideoRecording",
+ "LiveTvProgram",
+ "LiveTvTvChannel"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasStartDate(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "Series",
+ "Season",
+ "MusicAlbum",
+ "MusicArtist",
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Program",
+ "Recording",
+ "LiveTvAudioRecording",
+ "LiveTvVideoRecording",
+ "LiveTvProgram"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasEpisodeAttributes(InternalItemsQuery query)
+ {
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Episode"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasTrailerTypes(InternalItemsQuery query)
+ {
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Trailer"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasArtistFields(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "Series",
+ "Season",
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Audio",
+ "MusicAlbum",
+ "MusicVideo",
+ "AudioBook",
+ "AudioPodcast",
+ "LiveTvAudioRecording",
+ "Recording"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
+ private bool HasSeriesFields(InternalItemsQuery query)
+ {
+ var excludeParentTypes = new string[]
+ {
+ "PhotoAlbum"
+ };
+
+ if (excludeParentTypes.Contains(query.ParentType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
+ {
+ return false;
+ }
+
+ if (query.IncludeItemTypes.Length == 0)
+ {
+ return true;
+ }
+
+ var types = new string[]
+ {
+ "Book",
+ "AudioBook",
+ "Episode",
+ "Season"
+ };
+
+ return types.Any(i => query.IncludeItemTypes.Contains(i, StringComparer.OrdinalIgnoreCase));
+ }
+
private string[] GetFinalColumnsToSelect(InternalItemsQuery query, string[] startColumns)
{
var list = startColumns.ToList();
foreach (var field in allFields)
{
- if (!query.HasField(field))
+ if (!HasField(query, field))
{
foreach (var fieldToRemove in GetColumnNamesFromField(field).ToList())
{
@@ -2268,6 +2510,53 @@ namespace Emby.Server.Implementations.Data
}
}
+ if (!HasProgramAttributes(query))
+ {
+ list.Remove("IsKids");
+ list.Remove("IsMovie");
+ list.Remove("IsSports");
+ list.Remove("IsSeries");
+ list.Remove("IsLive");
+ list.Remove("IsNews");
+ list.Remove("IsPremiere");
+ list.Remove("EpisodeTitle");
+ list.Remove("IsRepeat");
+ }
+
+ if (!HasEpisodeAttributes(query))
+ {
+ list.Remove("SeasonName");
+ list.Remove("SeasonId");
+ }
+
+ if (!HasStartDate(query))
+ {
+ list.Remove("StartDate");
+ }
+
+ if (!HasTrailerTypes(query))
+ {
+ list.Remove("TrailerTypes");
+ }
+
+ if (!HasArtistFields(query))
+ {
+ list.Remove("AlbumArtists");
+ list.Remove("Artists");
+ }
+
+ if (!HasSeriesFields(query))
+ {
+ list.Remove("SeriesId");
+ list.Remove("SeriesName");
+ }
+
+ if (!HasEpisodeAttributes(query))
+ {
+ list.Remove("SeasonName");
+ list.Remove("SeasonId");
+ }
+
if (!query.DtoOptions.EnableImages)
{
list.Remove("Images");
@@ -2394,7 +2683,7 @@ namespace Emby.Server.Implementations.Data
query.Limit = query.Limit.Value + 4;
}
- var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, new [] { "count(distinct PresentationUniqueKey)" })) + GetFromText();
+ var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count(distinct PresentationUniqueKey)" })) + GetFromText();
commandText += GetJoinUserDataText(query);
var whereClauses = GetWhereClauses(query, null);
@@ -2499,9 +2788,16 @@ namespace Emby.Server.Implementations.Data
// Running this again will bind the params
GetWhereClauses(query, statement);
+ var hasEpisodeAttributes = HasEpisodeAttributes(query);
+ var hasProgramAttributes = HasProgramAttributes(query);
+ var hasStartDate = HasStartDate(query);
+ var hasTrailerTypes = HasTrailerTypes(query);
+ var hasArtistFields = HasArtistFields(query);
+ var hasSeriesFields = HasSeriesFields(query);
+
foreach (var row in statement.ExecuteQuery())
{
- var item = GetItem(row, query);
+ var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
if (item != null)
{
list.Add(item);
@@ -2701,9 +2997,16 @@ namespace Emby.Server.Implementations.Data
// Running this again will bind the params
GetWhereClauses(query, statement);
+ var hasEpisodeAttributes = HasEpisodeAttributes(query);
+ var hasProgramAttributes = HasProgramAttributes(query);
+ var hasStartDate = HasStartDate(query);
+ var hasTrailerTypes = HasTrailerTypes(query);
+ var hasArtistFields = HasArtistFields(query);
+ var hasSeriesFields = HasSeriesFields(query);
+
foreach (var row in statement.ExecuteQuery())
{
- var item = GetItem(row, query);
+ var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
if (item != null)
{
list.Add(item);
@@ -3471,6 +3774,15 @@ namespace Emby.Server.Implementations.Data
}
}
+ if (query.MinDateLastSavedForUser.HasValue)
+ {
+ whereClauses.Add("DateLastSaved>=@MinDateLastSaved");
+ if (statement != null)
+ {
+ statement.TryBind("@MinDateLastSaved", query.MinDateLastSavedForUser.Value);
+ }
+ }
+
//if (query.MinPlayers.HasValue)
//{
// whereClauses.Add("Players>=@MinPlayers");
@@ -3665,10 +3977,10 @@ namespace Emby.Server.Implementations.Data
if (!string.IsNullOrWhiteSpace(query.SlugName))
{
- whereClauses.Add("SlugName=@SlugName");
+ whereClauses.Add("CleanName=@SlugName");
if (statement != null)
{
- statement.TryBind("@SlugName", query.SlugName);
+ statement.TryBind("@SlugName", GetCleanValue(query.SlugName));
}
}
@@ -4919,7 +5231,9 @@ namespace Emby.Server.Implementations.Data
var columns = _retriveItemColumns.ToList();
columns.AddRange(itemCountColumns.Select(i => i.Item2).ToArray());
- var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, columns.ToArray())) + GetFromText();
+ columns = GetFinalColumnsToSelect(query, columns.ToArray()).ToList();
+
+ var commandText = "select " + string.Join(",", columns.ToArray()) + GetFromText();
commandText += GetJoinUserDataText(query);
var innerQuery = new InternalItemsQuery(query.User)
@@ -4962,7 +5276,6 @@ namespace Emby.Server.Implementations.Data
NameLessThan = query.NameLessThan,
NameStartsWith = query.NameStartsWith,
NameStartsWithOrGreater = query.NameStartsWithOrGreater,
- AlbumArtistStartsWithOrGreater = query.AlbumArtistStartsWithOrGreater,
Tags = query.Tags,
OfficialRatings = query.OfficialRatings,
GenreIds = query.GenreIds,
@@ -5043,9 +5356,16 @@ namespace Emby.Server.Implementations.Data
GetWhereClauses(innerQuery, statement);
GetWhereClauses(outerQuery, statement);
+ var hasEpisodeAttributes = HasEpisodeAttributes(query);
+ var hasProgramAttributes = HasProgramAttributes(query);
+ var hasStartDate = HasStartDate(query);
+ var hasTrailerTypes = HasTrailerTypes(query);
+ var hasArtistFields = HasArtistFields(query);
+ var hasSeriesFields = HasSeriesFields(query);
+
foreach (var row in statement.ExecuteQuery())
{
- var item = GetItem(row);
+ var item = GetItem(row, query, hasProgramAttributes, hasEpisodeAttributes, hasStartDate, hasTrailerTypes, hasArtistFields, hasSeriesFields);
if (item != null)
{
var countStartColumn = columns.Count - 1;
diff --git a/Emby.Server.Implementations/Devices/CameraUploadsDynamicFolder.cs b/Emby.Server.Implementations/Devices/CameraUploadsDynamicFolder.cs
index e2d5d0272f..52979f085c 100644
--- a/Emby.Server.Implementations/Devices/CameraUploadsDynamicFolder.cs
+++ b/Emby.Server.Implementations/Devices/CameraUploadsDynamicFolder.cs
@@ -5,7 +5,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Providers;
diff --git a/Emby.Server.Implementations/Devices/DeviceManager.cs b/Emby.Server.Implementations/Devices/DeviceManager.cs
index b246ef1962..027a55516c 100644
--- a/Emby.Server.Implementations/Devices/DeviceManager.cs
+++ b/Emby.Server.Implementations/Devices/DeviceManager.cs
@@ -16,7 +16,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs
index d784bcb09b..45fbd69dc6 100644
--- a/Emby.Server.Implementations/Dto/DtoService.cs
+++ b/Emby.Server.Implementations/Dto/DtoService.cs
@@ -24,7 +24,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Extensions;
@@ -107,7 +107,7 @@ namespace Emby.Server.Implementations.Dto
foreach (var item in items)
{
- var dto = await GetBaseItemDtoInternal(item, options, user, owner).ConfigureAwait(false);
+ var dto = GetBaseItemDtoInternal(item, options, user, owner);
var tvChannel = item as LiveTvChannel;
if (tvChannel != null)
@@ -127,7 +127,11 @@ namespace Emby.Server.Implementations.Dto
{
var libraryItems = byName.GetTaggedItems(new InternalItemsQuery(user)
{
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
});
SetItemByNameInfo(item, dto, libraryItems.ToList(), user);
@@ -156,7 +160,7 @@ namespace Emby.Server.Implementations.Dto
{
var syncDictionary = GetSyncedItemProgress(options);
- var dto = GetBaseItemDtoInternal(item, options, user, owner).Result;
+ var dto = GetBaseItemDtoInternal(item, options, user, owner);
var tvChannel = item as LiveTvChannel;
if (tvChannel != null)
{
@@ -177,7 +181,11 @@ namespace Emby.Server.Implementations.Dto
{
if (options.Fields.Contains(ItemFields.ItemCounts))
{
- SetItemByNameInfo(item, dto, GetTaggedItems(byName, user), user);
+ SetItemByNameInfo(item, dto, GetTaggedItems(byName, user, new DtoOptions(false)
+ {
+ EnableImages = false
+
+ }), user);
}
FillSyncInfo(dto, item, options, user, syncDictionary);
@@ -189,11 +197,12 @@ namespace Emby.Server.Implementations.Dto
return dto;
}
- private List<BaseItem> GetTaggedItems(IItemByName byName, User user)
+ private List<BaseItem> GetTaggedItems(IItemByName byName, User user, DtoOptions options)
{
var items = byName.GetTaggedItems(new InternalItemsQuery(user)
{
- Recursive = true
+ Recursive = true,
+ DtoOptions = options
}).ToList();
@@ -283,7 +292,7 @@ namespace Emby.Server.Implementations.Dto
}
}
- private async Task<BaseItemDto> GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
+ private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
{
var fields = options.Fields;
@@ -332,7 +341,7 @@ namespace Emby.Server.Implementations.Dto
if (user != null)
{
- await AttachUserSpecificInfo(dto, item, user, options).ConfigureAwait(false);
+ AttachUserSpecificInfo(dto, item, user, options);
}
var hasMediaSources = item as IHasMediaSources;
@@ -393,7 +402,7 @@ namespace Emby.Server.Implementations.Dto
public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem> taggedItems, Dictionary<string, SyncedItemProgress> syncProgress, User user = null)
{
- var dto = GetBaseItemDtoInternal(item, options, user).Result;
+ var dto = GetBaseItemDtoInternal(item, options, user);
if (taggedItems != null && options.Fields.Contains(ItemFields.ItemCounts))
{
@@ -446,7 +455,7 @@ namespace Emby.Server.Implementations.Dto
/// <summary>
/// Attaches the user specific info.
/// </summary>
- private async Task AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, DtoOptions dtoOptions)
+ private void AttachUserSpecificInfo(BaseItemDto dto, BaseItem item, User user, DtoOptions dtoOptions)
{
var fields = dtoOptions.Fields;
@@ -456,7 +465,7 @@ namespace Emby.Server.Implementations.Dto
if (dtoOptions.EnableUserData)
{
- dto.UserData = await _userDataRepository.GetUserDataDto(item, dto, user, dtoOptions.Fields).ConfigureAwait(false);
+ dto.UserData = _userDataRepository.GetUserDataDto(item, dto, user, dtoOptions.Fields);
}
if (!dto.ChildCount.HasValue && item.SourceType == SourceType.Library)
@@ -488,7 +497,7 @@ namespace Emby.Server.Implementations.Dto
{
if (dtoOptions.EnableUserData)
{
- dto.UserData = await _userDataRepository.GetUserDataDto(item, user).ConfigureAwait(false);
+ dto.UserData = _userDataRepository.GetUserDataDto(item, user);
}
}
@@ -595,16 +604,17 @@ namespace Emby.Server.Implementations.Dto
{
if (!string.IsNullOrEmpty(item.Album))
{
- var parentAlbum = _libraryManager.GetItemList(new InternalItemsQuery
+ var parentAlbumIds = _libraryManager.GetItemIds(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
- Name = item.Album
+ Name = item.Album,
+ Limit = 1
- }).FirstOrDefault();
+ });
- if (parentAlbum != null)
+ if (parentAlbumIds.Count > 0)
{
- dto.AlbumId = GetDtoId(parentAlbum);
+ dto.AlbumId = parentAlbumIds[0].ToString("N");
}
}
@@ -751,45 +761,41 @@ namespace Emby.Server.Implementations.Dto
/// <returns>Task.</returns>
private void AttachStudios(BaseItemDto dto, BaseItem item)
{
- var studios = item.Studios.ToList();
-
- dto.Studios = new StudioDto[studios.Count];
-
- var dictionary = studios.Distinct(StringComparer.OrdinalIgnoreCase).Select(name =>
- {
- try
- {
- return _libraryManager.GetStudio(name);
- }
- catch (IOException ex)
+ dto.Studios = item.Studios
+ .Where(i => !string.IsNullOrWhiteSpace(i))
+ .Select(i => new NameIdPair
{
- _logger.ErrorException("Error getting studio {0}", ex, name);
- return null;
- }
- })
- .Where(i => i != null)
- .DistinctBy(i => i.Name, StringComparer.OrdinalIgnoreCase)
- .ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase);
-
- for (var i = 0; i < studios.Count; i++)
- {
- var studio = studios[i];
+ Name = i,
+ Id = _libraryManager.GetStudioId(i).ToString("N")
+ })
+ .ToArray();
+ }
- var studioDto = new StudioDto
+ private void AttachGenreItems(BaseItemDto dto, BaseItem item)
+ {
+ dto.GenreItems = item.Genres
+ .Where(i => !string.IsNullOrWhiteSpace(i))
+ .Select(i => new NameIdPair
{
- Name = studio
- };
-
- Studio entity;
+ Name = i,
+ Id = GetStudioId(i, item)
+ })
+ .ToArray();
+ }
- if (dictionary.TryGetValue(studio, out entity))
- {
- studioDto.Id = entity.Id.ToString("N");
- studioDto.PrimaryImageTag = GetImageCacheTag(entity, ImageType.Primary);
- }
+ private string GetStudioId(string name, BaseItem owner)
+ {
+ if (owner is IHasMusicGenres)
+ {
+ return _libraryManager.GetGameGenreId(name).ToString("N");
+ }
- dto.Studios[i] = studioDto;
+ if (owner is Game || owner is GameSystem)
+ {
+ return _libraryManager.GetGameGenreId(name).ToString("N");
}
+
+ return _libraryManager.GetGenreId(name).ToString("N");
}
/// <summary>
@@ -901,6 +907,7 @@ namespace Emby.Server.Implementations.Dto
if (fields.Contains(ItemFields.Genres))
{
dto.Genres = item.Genres;
+ AttachGenreItems(dto, item);
}
if (options.EnableImages)
@@ -1130,7 +1137,10 @@ namespace Emby.Server.Implementations.Dto
return null;
}
- var artist = _libraryManager.GetArtist(i);
+ var artist = _libraryManager.GetArtist(i, new DtoOptions(false)
+ {
+ EnableImages = false
+ });
if (artist != null)
{
return new NameIdPair
@@ -1179,7 +1189,10 @@ namespace Emby.Server.Implementations.Dto
return null;
}
- var artist = _libraryManager.GetArtist(i);
+ var artist = _libraryManager.GetArtist(i, new DtoOptions(false)
+ {
+ EnableImages = false
+ });
if (artist != null)
{
return new NameIdPair
@@ -1449,7 +1462,7 @@ namespace Emby.Server.Implementations.Dto
var musicAlbum = item as MusicAlbum;
if (musicAlbum != null)
{
- var artist = musicAlbum.MusicArtist;
+ var artist = musicAlbum.GetMusicArtist(new DtoOptions(false));
if (artist != null)
{
return artist;
@@ -1582,24 +1595,30 @@ namespace Emby.Server.Implementations.Dto
ImageSize size;
- if (supportedEnhancers.Count == 0)
- {
- var defaultAspectRatio = item.GetDefaultPrimaryImageAspectRatio();
+ var defaultAspectRatio = item.GetDefaultPrimaryImageAspectRatio();
- if (defaultAspectRatio.HasValue)
+ if (defaultAspectRatio.HasValue)
+ {
+ if (supportedEnhancers.Count == 0)
{
return defaultAspectRatio.Value;
}
- }
- try
- {
- size = _imageProcessor.GetImageSize(imageInfo);
+ double dummyWidth = 200;
+ double dummyHeight = dummyWidth / defaultAspectRatio.Value;
+ size = new ImageSize(dummyWidth, dummyHeight);
}
- catch
+ else
{
- //_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path);
- return null;
+ try
+ {
+ size = _imageProcessor.GetImageSize(imageInfo);
+ }
+ catch
+ {
+ //_logger.ErrorException("Failed to determine primary image aspect ratio for {0}", ex, path);
+ return null;
+ }
}
foreach (var enhancer in supportedEnhancers)
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
index b2f1f0ceb6..14d9763252 100644
--- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj
+++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
@@ -10,9 +10,8 @@
<RootNamespace>Emby.Server.Implementations</RootNamespace>
<AssemblyName>Emby.Server.Implementations</AssemblyName>
<FileAlignment>512</FileAlignment>
- <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
- <TargetFrameworkProfile>Profile7</TargetFrameworkProfile>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <TargetFrameworkProfile />
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -103,6 +102,7 @@
<Compile Include="HttpServer\SocketSharp\WebSocketSharpResponse.cs" />
<Compile Include="HttpServer\StreamWriter.cs" />
<Compile Include="Images\BaseDynamicImageProvider.cs" />
+ <Compile Include="IO\AsyncStreamCopier.cs" />
<Compile Include="IO\FileRefresher.cs" />
<Compile Include="IO\MbLinkShortcutHandler.cs" />
<Compile Include="IO\ThrottledStream.cs" />
@@ -182,7 +182,6 @@
<Compile Include="Migrations\IVersionMigration.cs" />
<Compile Include="Migrations\LibraryScanMigration.cs" />
<Compile Include="Migrations\GuideMigration.cs" />
- <Compile Include="Migrations\UpdateLevelMigration.cs" />
<Compile Include="News\NewsEntryPoint.cs" />
<Compile Include="News\NewsService.cs" />
<Compile Include="Notifications\CoreNotificationTypes.cs" />
@@ -291,9 +290,9 @@
<Project>{2e781478-814d-4a48-9d80-bff206441a65}</Project>
<Name>MediaBrowser.Server.Implementations</Name>
</ProjectReference>
- <ProjectReference Include="..\SocketHttpListener.Portable\SocketHttpListener.Portable.csproj">
- <Project>{4f26d5d8-a7b0-42b3-ba42-7cb7d245934e}</Project>
- <Name>SocketHttpListener.Portable</Name>
+ <ProjectReference Include="..\SocketHttpListener\SocketHttpListener.csproj">
+ <Project>{1d74413b-e7cf-455b-b021-f52bdf881542}</Project>
+ <Name>SocketHttpListener</Name>
</ProjectReference>
<Reference Include="Emby.XmlTv, Version=1.0.6299.28292, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Emby.XmlTv.1.0.8\lib\portable-net45+win8\Emby.XmlTv.dll</HintPath>
@@ -313,6 +312,17 @@
</Reference>
</ItemGroup>
<ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Runtime.Serialization" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
<EmbeddedResource Include="Localization\Core\ar.json" />
<EmbeddedResource Include="Localization\Core\bg-BG.json" />
<EmbeddedResource Include="Localization\Core\ca.json" />
@@ -410,7 +420,7 @@
<ItemGroup>
<EmbeddedResource Include="Localization\Ratings\uk.txt" />
</ItemGroup>
- <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
diff --git a/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs b/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
index b934101809..71e31d4d4f 100644
--- a/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
+++ b/Emby.Server.Implementations/EntryPoints/UserDataChangeNotifier.cs
@@ -122,7 +122,7 @@ namespace Emby.Server.Implementations.EntryPoints
.DistinctBy(i => i.Id)
.Select(i =>
{
- var dto = _userDataManager.GetUserDataDto(i, user).Result;
+ var dto = _userDataManager.GetUserDataDto(i, user);
dto.ItemId = i.Id.ToString("N");
return dto;
})
diff --git a/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
index 86c8c5f68e..cf9fdbb161 100644
--- a/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
+++ b/Emby.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
@@ -15,7 +15,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Emby.Server.Implementations.Library;
-using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -588,7 +588,8 @@ namespace Emby.Server.Implementations.FileOrganization
var series = _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(Series).Name },
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(true)
})
.Cast<Series>()
.Select(i => NameUtils.GetMatchScore(nameWithoutYear, yearInName, i))
@@ -607,7 +608,8 @@ namespace Emby.Server.Implementations.FileOrganization
{
IncludeItemTypes = new[] { typeof(Series).Name },
Recursive = true,
- Name = info.ItemName
+ Name = info.ItemName,
+ DtoOptions = new DtoOptions(true)
}).Cast<Series>().FirstOrDefault();
}
diff --git a/Emby.Server.Implementations/FileOrganization/FileOrganizationService.cs b/Emby.Server.Implementations/FileOrganization/FileOrganizationService.cs
index 4094e6b9b8..d95bd87346 100644
--- a/Emby.Server.Implementations/FileOrganization/FileOrganizationService.cs
+++ b/Emby.Server.Implementations/FileOrganization/FileOrganizationService.cs
@@ -17,7 +17,7 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Events;
using MediaBrowser.Common.Events;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Tasks;
diff --git a/Emby.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs b/Emby.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs
index 5be7ba7ada..b71a3975fb 100644
--- a/Emby.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs
+++ b/Emby.Server.Implementations/FileOrganization/OrganizerScheduledTask.cs
@@ -8,7 +8,7 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Tasks;
diff --git a/Emby.Server.Implementations/FileOrganization/TvFolderOrganizer.cs b/Emby.Server.Implementations/FileOrganization/TvFolderOrganizer.cs
index 2cbf2613ec..0dbd6f8375 100644
--- a/Emby.Server.Implementations/FileOrganization/TvFolderOrganizer.cs
+++ b/Emby.Server.Implementations/FileOrganization/TvFolderOrganizer.cs
@@ -10,7 +10,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
index 5e96eda94a..79209d438b 100644
--- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
+++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
@@ -8,6 +8,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
using Emby.Server.Implementations.HttpServer;
using Emby.Server.Implementations.HttpServer.SocketSharp;
@@ -445,10 +446,7 @@ namespace Emby.Server.Implementations.HttpServer
/// <summary>
/// Overridable method that can be used to implement a custom hnandler
/// </summary>
- /// <param name="httpReq">The HTTP req.</param>
- /// <param name="url">The URL.</param>
- /// <returns>Task.</returns>
- protected async Task RequestHandler(IHttpRequest httpReq, Uri url)
+ protected async Task RequestHandler(IHttpRequest httpReq, Uri url, CancellationToken cancellationToken)
{
var date = DateTime.Now;
var httpRes = httpReq.Response;
@@ -589,7 +587,7 @@ namespace Emby.Server.Implementations.HttpServer
if (handler != null)
{
- await handler.ProcessRequestAsync(this, httpReq, httpRes, Logger, operationName).ConfigureAwait(false);
+ await handler.ProcessRequestAsync(this, httpReq, httpRes, Logger, operationName, cancellationToken).ConfigureAwait(false);
}
else
{
diff --git a/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs b/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs
index 0af88595f9..6c37d5f7a4 100644
--- a/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs
+++ b/Emby.Server.Implementations/HttpServer/HttpResultFactory.cs
@@ -58,6 +58,18 @@ namespace Emby.Server.Implementations.HttpServer
return GetHttpResult(content, contentType, true, responseHeaders);
}
+ public object GetRedirectResult(string url)
+ {
+ var responseHeaders = new Dictionary<string, string>();
+ responseHeaders["Location"] = url;
+
+ var result = new HttpResult(new byte[] { }, "text/plain", HttpStatusCode.Redirect);
+
+ AddResponseHeaders(result, responseHeaders);
+
+ return result;
+ }
+
/// <summary>
/// Gets the HTTP result.
/// </summary>
@@ -599,9 +611,9 @@ namespace Emby.Server.Implementations.HttpServer
}
}
- private async Task<IHasHeaders> GetCompressedResult(Stream stream,
- string requestedCompressionType,
- IDictionary<string,string> responseHeaders,
+ private async Task<IHasHeaders> GetCompressedResult(Stream stream,
+ string requestedCompressionType,
+ IDictionary<string, string> responseHeaders,
bool isHeadRequest,
string contentType)
{
diff --git a/Emby.Server.Implementations/HttpServer/IHttpListener.cs b/Emby.Server.Implementations/HttpServer/IHttpListener.cs
index 18df5682d7..82175dbed6 100644
--- a/Emby.Server.Implementations/HttpServer/IHttpListener.cs
+++ b/Emby.Server.Implementations/HttpServer/IHttpListener.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Net;
using System;
using System.Collections.Generic;
+using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.Services;
@@ -18,7 +19,7 @@ namespace Emby.Server.Implementations.HttpServer
/// Gets or sets the request handler.
/// </summary>
/// <value>The request handler.</value>
- Func<IHttpRequest, Uri, Task> RequestHandler { get; set; }
+ Func<IHttpRequest, Uri, CancellationToken, Task> RequestHandler { get; set; }
/// <summary>
/// Gets or sets the web socket handler.
diff --git a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
index 682fa7a0b8..e648838b2f 100644
--- a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
+++ b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs
@@ -4,6 +4,7 @@ using SocketHttpListener.Net;
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Cryptography;
@@ -33,6 +34,9 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
private readonly bool _enableDualMode;
private readonly IEnvironmentInfo _environment;
+ private CancellationTokenSource _disposeCancellationTokenSource = new CancellationTokenSource();
+ private CancellationToken _disposeCancellationToken;
+
public WebSocketSharpListener(ILogger logger, ICertificate certificate, IMemoryStreamFactory memoryStreamProvider, ITextEncoding textEncoding, INetworkManager networkManager, ISocketFactory socketFactory, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, bool enableDualMode, Func<HttpListenerContext, IHttpRequest> httpRequestFactory, IFileSystem fileSystem, IEnvironmentInfo environment)
{
_logger = logger;
@@ -47,10 +51,12 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
_httpRequestFactory = httpRequestFactory;
_fileSystem = fileSystem;
_environment = environment;
+
+ _disposeCancellationToken = _disposeCancellationTokenSource.Token;
}
public Action<Exception, IRequest, bool> ErrorHandler { get; set; }
- public Func<IHttpRequest, Uri, Task> RequestHandler { get; set; }
+ public Func<IHttpRequest, Uri, CancellationToken, Task> RequestHandler { get; set; }
public Action<WebSocketConnectingEventArgs> WebSocketConnecting { get; set; }
@@ -81,11 +87,11 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
private void ProcessContext(HttpListenerContext context)
{
- //Task.Factory.StartNew(() => InitTask(context), TaskCreationOptions.DenyChildAttach | TaskCreationOptions.PreferFairness);
- Task.Run(() => InitTask(context));
+ InitTask(context, _disposeCancellationToken);
+ //Task.Run(() => InitTask(context, _disposeCancellationToken));
}
- private Task InitTask(HttpListenerContext context)
+ private Task InitTask(HttpListenerContext context, CancellationToken cancellationToken)
{
IHttpRequest httpReq = null;
var request = context.Request;
@@ -111,7 +117,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
return Task.FromResult(true);
}
- return RequestHandler(httpReq, request.Url);
+ return RequestHandler(httpReq, request.Url, cancellationToken);
}
private void ProcessWebSocketRequest(HttpListenerContext ctx)
@@ -172,6 +178,8 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
public void Stop()
{
+ _disposeCancellationTokenSource.Cancel();
+
if (_listener != null)
{
foreach (var prefix in _listener.Prefixes.ToList())
diff --git a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
index b3fcde7456..2dfe6a9e3e 100644
--- a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
+++ b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpRequest.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
-using System.Net;
using System.Text;
using Emby.Server.Implementations.HttpServer;
using Emby.Server.Implementations.HttpServer.SocketSharp;
@@ -374,7 +373,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
this.pathInfo = request.RawUrl;
}
- this.pathInfo = WebUtility.UrlDecode(pathInfo);
+ this.pathInfo = System.Net.WebUtility.UrlDecode(pathInfo);
this.pathInfo = NormalizePathInfo(pathInfo, mode);
}
return this.pathInfo;
@@ -440,7 +439,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
cookies = new Dictionary<string, System.Net.Cookie>();
foreach (var cookie in this.request.Cookies)
{
- var httpCookie = (Cookie) cookie;
+ var httpCookie = (System.Net.Cookie) cookie;
cookies[httpCookie.Name] = new System.Net.Cookie(httpCookie.Name, httpCookie.Value, httpCookie.Path, httpCookie.Domain);
}
}
diff --git a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
index 9e58ee57cd..d6762d94b0 100644
--- a/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
+++ b/Emby.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpResponse.cs
@@ -114,15 +114,9 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
var outputStream = response.OutputStream;
// This is needed with compression
- if (outputStream is ResponseStream)
- {
- //if (!string.IsNullOrWhiteSpace(GetHeader("Content-Encoding")))
- {
- outputStream.Flush();
- }
+ outputStream.Flush();
+ outputStream.Dispose();
- outputStream.Dispose();
- }
response.Close();
}
catch (Exception ex)
diff --git a/Emby.Server.Implementations/HttpServer/StreamWriter.cs b/Emby.Server.Implementations/HttpServer/StreamWriter.cs
index 33378949c3..5d42f42fa0 100644
--- a/Emby.Server.Implementations/HttpServer/StreamWriter.cs
+++ b/Emby.Server.Implementations/HttpServer/StreamWriter.cs
@@ -5,7 +5,7 @@ using System.Globalization;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.Services;
namespace Emby.Server.Implementations.HttpServer
diff --git a/Emby.Server.Implementations/IO/AsyncStreamCopier.cs b/Emby.Server.Implementations/IO/AsyncStreamCopier.cs
new file mode 100644
index 0000000000..9e5ce0604c
--- /dev/null
+++ b/Emby.Server.Implementations/IO/AsyncStreamCopier.cs
@@ -0,0 +1,459 @@
+using System;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Emby.Server.Implementations.IO
+{
+ public class AsyncStreamCopier : IDisposable
+ {
+ // size in bytes of the buffers in the buffer pool
+ private const int DefaultBufferSize = 81920;
+ private readonly int _bufferSize;
+ // number of buffers in the pool
+ private const int DefaultBufferCount = 4;
+ private readonly int _bufferCount;
+
+ // indexes of the next buffer to read into/write from
+ private int _nextReadBuffer = -1;
+ private int _nextWriteBuffer = -1;
+
+ // the buffer pool, implemented as an array, and used in a cyclic way
+ private readonly byte[][] _buffers;
+ // sizes in bytes of the available (read) data in the buffers
+ private readonly int[] _sizes;
+ // the streams...
+ private Stream _source;
+ private Stream _target;
+ private readonly bool _closeStreamsOnEnd;
+
+ // number of buffers that are ready to be written
+ private int _buffersToWrite;
+ // flag indicating that there is still a read operation to be scheduled
+ // (source end of stream not reached)
+ private volatile bool _moreDataToRead;
+ // the result of the whole operation, returned by BeginCopy()
+ private AsyncResult _asyncResult;
+ // any exception that occurs during an async operation
+ // stored here for rethrow
+ private Exception _exception;
+
+ public TaskCompletionSource<long> TaskCompletionSource;
+ private long _bytesToRead;
+ private long _totalBytesWritten;
+ private CancellationToken _cancellationToken;
+ public int IndividualReadOffset = 0;
+
+ public AsyncStreamCopier(Stream source,
+ Stream target,
+ long bytesToRead,
+ CancellationToken cancellationToken,
+ bool closeStreamsOnEnd = false,
+ int bufferSize = DefaultBufferSize,
+ int bufferCount = DefaultBufferCount)
+ {
+ if (source == null)
+ throw new ArgumentNullException("source");
+ if (target == null)
+ throw new ArgumentNullException("target");
+ if (!source.CanRead)
+ throw new ArgumentException("Cannot copy from a non-readable stream.");
+ if (!target.CanWrite)
+ throw new ArgumentException("Cannot copy to a non-writable stream.");
+ _source = source;
+ _target = target;
+ _moreDataToRead = true;
+ _closeStreamsOnEnd = closeStreamsOnEnd;
+ _bufferSize = bufferSize;
+ _bufferCount = bufferCount;
+ _buffers = new byte[_bufferCount][];
+ _sizes = new int[_bufferCount];
+ _bytesToRead = bytesToRead;
+ _cancellationToken = cancellationToken;
+ }
+
+ ~AsyncStreamCopier()
+ {
+ // ensure any exception cannot be ignored
+ ThrowExceptionIfNeeded();
+ }
+
+ public static Task<long> CopyStream(Stream source, Stream target, int bufferSize, int bufferCount, CancellationToken cancellationToken)
+ {
+ return CopyStream(source, target, 0, bufferSize, bufferCount, cancellationToken);
+ }
+
+ public static Task<long> CopyStream(Stream source, Stream target, long size, int bufferSize, int bufferCount, CancellationToken cancellationToken)
+ {
+ var copier = new AsyncStreamCopier(source, target, size, cancellationToken, false, bufferSize, bufferCount);
+ var taskCompletion = new TaskCompletionSource<long>();
+
+ copier.TaskCompletionSource = taskCompletion;
+
+ var result = copier.BeginCopy(StreamCopyCallback, copier);
+
+ if (result.CompletedSynchronously)
+ {
+ StreamCopyCallback(result);
+ }
+
+ cancellationToken.Register(() => taskCompletion.TrySetCanceled());
+
+ return taskCompletion.Task;
+ }
+
+ private static void StreamCopyCallback(IAsyncResult result)
+ {
+ var copier = (AsyncStreamCopier)result.AsyncState;
+ var taskCompletion = copier.TaskCompletionSource;
+
+ try
+ {
+ copier.EndCopy(result);
+ taskCompletion.TrySetResult(copier._totalBytesWritten);
+ }
+ catch (Exception ex)
+ {
+ taskCompletion.TrySetException(ex);
+ }
+ }
+
+ public void Dispose()
+ {
+ if (_asyncResult != null)
+ _asyncResult.Dispose();
+ if (_closeStreamsOnEnd)
+ {
+ if (_source != null)
+ {
+ _source.Dispose();
+ _source = null;
+ }
+ if (_target != null)
+ {
+ _target.Dispose();
+ _target = null;
+ }
+ }
+ GC.SuppressFinalize(this);
+ ThrowExceptionIfNeeded();
+ }
+
+ public IAsyncResult BeginCopy(AsyncCallback callback, object state)
+ {
+ // avoid concurrent start of the copy on separate threads
+ if (Interlocked.CompareExchange(ref _asyncResult, new AsyncResult(callback, state), null) != null)
+ throw new InvalidOperationException("A copy operation has already been started on this object.");
+ // allocate buffers
+ for (int i = 0; i < _bufferCount; i++)
+ _buffers[i] = new byte[_bufferSize];
+
+ // we pass false to BeginRead() to avoid completing the async result
+ // immediately which would result in invoking the callback
+ // when the method fails synchronously
+ BeginRead(false);
+ // throw exception synchronously if there is one
+ ThrowExceptionIfNeeded();
+ return _asyncResult;
+ }
+
+ public void EndCopy(IAsyncResult ar)
+ {
+ if (ar != _asyncResult)
+ throw new InvalidOperationException("Invalid IAsyncResult object.");
+
+ if (!_asyncResult.IsCompleted)
+ _asyncResult.AsyncWaitHandle.WaitOne();
+
+ if (_closeStreamsOnEnd)
+ {
+ _source.Close();
+ _source = null;
+ _target.Close();
+ _target = null;
+ }
+
+ //_logger.Info("AsyncStreamCopier {0} bytes requested. {1} bytes transferred", _bytesToRead, _totalBytesWritten);
+ ThrowExceptionIfNeeded();
+ }
+
+ /// <summary>
+ /// Here we'll throw a pending exception if there is one,
+ /// and remove it from our instance, so we know it has been consumed.
+ /// </summary>
+ private void ThrowExceptionIfNeeded()
+ {
+ if (_exception != null)
+ {
+ var exception = _exception;
+ _exception = null;
+ throw exception;
+ }
+ }
+
+ private void BeginRead(bool completeOnError = true)
+ {
+ if (!_moreDataToRead)
+ {
+ return;
+ }
+ if (_asyncResult.IsCompleted)
+ return;
+ int bufferIndex = Interlocked.Increment(ref _nextReadBuffer) % _bufferCount;
+
+ try
+ {
+ _source.BeginRead(_buffers[bufferIndex], 0, _bufferSize, EndRead, bufferIndex);
+ }
+ catch (Exception exception)
+ {
+ _exception = exception;
+ if (completeOnError)
+ _asyncResult.Complete(false);
+ }
+ }
+
+ private void BeginWrite()
+ {
+ if (_asyncResult.IsCompleted)
+ return;
+ // this method can actually be called concurrently!!
+ // indeed, let's say we call a BeginWrite, and the thread gets interrupted
+ // just after making the IO request.
+ // At that moment, the thread is still in the method. And then the IO request
+ // ends (extremely fast io, or caching...), EndWrite gets called
+ // on another thread, and calls BeginWrite again! There we have it!
+ // That is the reason why an Interlocked is needed here.
+ int bufferIndex = Interlocked.Increment(ref _nextWriteBuffer) % _bufferCount;
+
+ try
+ {
+ int bytesToWrite;
+ if (_bytesToRead > 0)
+ {
+ var bytesLeftToWrite = _bytesToRead - _totalBytesWritten;
+ bytesToWrite = Convert.ToInt32(Math.Min(_sizes[bufferIndex], bytesLeftToWrite));
+ }
+ else
+ {
+ bytesToWrite = _sizes[bufferIndex];
+ }
+
+ _target.BeginWrite(_buffers[bufferIndex], IndividualReadOffset, bytesToWrite - IndividualReadOffset, EndWrite, null);
+
+ _totalBytesWritten += bytesToWrite;
+ }
+ catch (Exception exception)
+ {
+ _exception = exception;
+ _asyncResult.Complete(false);
+ }
+ }
+
+ private void EndRead(IAsyncResult ar)
+ {
+ try
+ {
+ int read = _source.EndRead(ar);
+ _moreDataToRead = read > 0;
+ var bufferIndex = (int)ar.AsyncState;
+ _sizes[bufferIndex] = read;
+ }
+ catch (Exception exception)
+ {
+ _exception = exception;
+ _asyncResult.Complete(false);
+ return;
+ }
+
+ if (_moreDataToRead && !_cancellationToken.IsCancellationRequested)
+ {
+ int usedBuffers = Interlocked.Increment(ref _buffersToWrite);
+ // if we incremented from zero to one, then it means we just
+ // added the single buffer to write, so a writer could not
+ // be busy, and we have to schedule one.
+ if (usedBuffers == 1)
+ BeginWrite();
+ // test if there is at least a free buffer, and schedule
+ // a read, as we have read some data
+ if (usedBuffers < _bufferCount)
+ BeginRead();
+ }
+ else
+ {
+ // we did not add a buffer, because no data was read, and
+ // there is no buffer left to write so this is the end...
+ if (Thread.VolatileRead(ref _buffersToWrite) == 0)
+ {
+ _asyncResult.Complete(false);
+ }
+ }
+ }
+
+ private void EndWrite(IAsyncResult ar)
+ {
+ try
+ {
+ _target.EndWrite(ar);
+ }
+ catch (Exception exception)
+ {
+ _exception = exception;
+ _asyncResult.Complete(false);
+ return;
+ }
+
+ int buffersLeftToWrite = Interlocked.Decrement(ref _buffersToWrite);
+ // no reader could be active if all buffers were full of data waiting to be written
+ bool noReaderIsBusy = buffersLeftToWrite == _bufferCount - 1;
+ // note that it is possible that both a reader and
+ // a writer see the end of the copy and call Complete
+ // on the _asyncResult object. That race condition is handled by
+ // Complete that ensures it is only executed fully once.
+
+ long bytesLeftToWrite;
+ if (_bytesToRead > 0)
+ {
+ bytesLeftToWrite = _bytesToRead - _totalBytesWritten;
+ }
+ else
+ {
+ bytesLeftToWrite = 1;
+ }
+
+ if (!_moreDataToRead || bytesLeftToWrite <= 0 || _cancellationToken.IsCancellationRequested)
+ {
+ // at this point we know no reader can schedule a read or write
+ if (Thread.VolatileRead(ref _buffersToWrite) == 0)
+ {
+ // nothing left to write, so it is the end
+ _asyncResult.Complete(false);
+ return;
+ }
+ }
+ else
+ // here, we know we have something left to read,
+ // so schedule a read if no read is busy
+ if (noReaderIsBusy)
+ BeginRead();
+
+ // also schedule a write if we are sure we did not write the last buffer
+ // note that if buffersLeftToWrite is zero and a reader has put another
+ // buffer to write between the time we decremented _buffersToWrite
+ // and now, that reader will also schedule another write,
+ // as it will increment _buffersToWrite from zero to one
+ if (buffersLeftToWrite > 0)
+ BeginWrite();
+ }
+ }
+
+ internal class AsyncResult : IAsyncResult, IDisposable
+ {
+ // Fields set at construction which never change while
+ // operation is pending
+ private readonly AsyncCallback _asyncCallback;
+ private readonly object _asyncState;
+
+ // Fields set at construction which do change after
+ // operation completes
+ private const int StatePending = 0;
+ private const int StateCompletedSynchronously = 1;
+ private const int StateCompletedAsynchronously = 2;
+ private int _completedState = StatePending;
+
+ // Field that may or may not get set depending on usage
+ private ManualResetEvent _waitHandle;
+
+ internal AsyncResult(
+ AsyncCallback asyncCallback,
+ object state)
+ {
+ _asyncCallback = asyncCallback;
+ _asyncState = state;
+ }
+
+ internal bool Complete(bool completedSynchronously)
+ {
+ bool result = false;
+
+ // The _completedState field MUST be set prior calling the callback
+ int prevState = Interlocked.CompareExchange(ref _completedState,
+ completedSynchronously ? StateCompletedSynchronously :
+ StateCompletedAsynchronously, StatePending);
+ if (prevState == StatePending)
+ {
+ // If the event exists, set it
+ if (_waitHandle != null)
+ _waitHandle.Set();
+
+ if (_asyncCallback != null)
+ _asyncCallback(this);
+
+ result = true;
+ }
+
+ return result;
+ }
+
+ #region Implementation of IAsyncResult
+
+ public Object AsyncState { get { return _asyncState; } }
+
+ public bool CompletedSynchronously
+ {
+ get
+ {
+ return Thread.VolatileRead(ref _completedState) ==
+ StateCompletedSynchronously;
+ }
+ }
+
+ public WaitHandle AsyncWaitHandle
+ {
+ get
+ {
+ if (_waitHandle == null)
+ {
+ bool done = IsCompleted;
+ var mre = new ManualResetEvent(done);
+ if (Interlocked.CompareExchange(ref _waitHandle,
+ mre, null) != null)
+ {
+ // Another thread created this object's event; dispose
+ // the event we just created
+ mre.Close();
+ }
+ else
+ {
+ if (!done && IsCompleted)
+ {
+ // If the operation wasn't done when we created
+ // the event but now it is done, set the event
+ _waitHandle.Set();
+ }
+ }
+ }
+ return _waitHandle;
+ }
+ }
+
+ public bool IsCompleted
+ {
+ get
+ {
+ return Thread.VolatileRead(ref _completedState) !=
+ StatePending;
+ }
+ }
+ #endregion
+
+ public void Dispose()
+ {
+ if (_waitHandle != null)
+ {
+ _waitHandle.Dispose();
+ _waitHandle = null;
+ }
+ }
+ }
+}
diff --git a/Emby.Server.Implementations/IO/FileRefresher.cs b/Emby.Server.Implementations/IO/FileRefresher.cs
index edff251563..9606b60b80 100644
--- a/Emby.Server.Implementations/IO/FileRefresher.cs
+++ b/Emby.Server.Implementations/IO/FileRefresher.cs
@@ -6,7 +6,7 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Events;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
@@ -180,7 +180,7 @@ namespace Emby.Server.Implementations.IO
try
{
- await item.ChangedExternally().ConfigureAwait(false);
+ item.ChangedExternally();
}
catch (IOException ex)
{
@@ -231,7 +231,7 @@ namespace Emby.Server.Implementations.IO
private bool IsFileLocked(string path)
{
- if (_environmentInfo.OperatingSystem != OperatingSystem.Windows)
+ if (_environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows)
{
// Causing lockups on linux
return false;
@@ -282,11 +282,11 @@ namespace Emby.Server.Implementations.IO
return false;
}
}
- //catch (DirectoryNotFoundException)
- //{
- // // File may have been deleted
- // return false;
- //}
+ catch (DirectoryNotFoundException)
+ {
+ // File may have been deleted
+ return false;
+ }
catch (FileNotFoundException)
{
// File may have been deleted
diff --git a/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs b/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
index 0b1391ae02..aef53751ee 100644
--- a/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
+++ b/Emby.Server.Implementations/IO/MbLinkShortcutHandler.cs
@@ -1,6 +1,6 @@
using System;
using System.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs
index b2ec84a82a..b8ce23a42f 100644
--- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs
+++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs
@@ -12,7 +12,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.IO;
@@ -59,33 +59,6 @@ namespace Emby.Server.Implementations.Images
//return GetSupportedImages(item).Where(i => IsEnabled(options, i, item)).ToList();
}
- private bool IsEnabled(MetadataOptions options, ImageType type, IHasImages item)
- {
- if (type == ImageType.Backdrop)
- {
- if (item.LockedFields.Contains(MetadataFields.Backdrops))
- {
- return false;
- }
- }
- else if (type == ImageType.Screenshot)
- {
- if (item.LockedFields.Contains(MetadataFields.Screenshots))
- {
- return false;
- }
- }
- else
- {
- if (item.LockedFields.Contains(MetadataFields.Images))
- {
- return false;
- }
- }
-
- return options.IsEnabled(type);
- }
-
public async Task<ItemUpdateType> FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken)
{
if (!Supports(item))
@@ -128,7 +101,7 @@ namespace Emby.Server.Implementations.Images
}
}
- var items = await GetItemsWithImages(item).ConfigureAwait(false);
+ var items = GetItemsWithImages(item);
return await FetchToFileInternal(item, items, imageType, cancellationToken).ConfigureAwait(false);
}
@@ -140,7 +113,7 @@ namespace Emby.Server.Implementations.Images
{
var outputPathWithoutExtension = Path.Combine(ApplicationPaths.TempDirectory, Guid.NewGuid().ToString("N"));
FileSystem.CreateDirectory(FileSystem.GetDirectoryName(outputPathWithoutExtension));
- string outputPath = await CreateImage(item, itemsWithImages, outputPathWithoutExtension, imageType, 0).ConfigureAwait(false);
+ string outputPath = CreateImage(item, itemsWithImages, outputPathWithoutExtension, imageType, 0);
if (string.IsNullOrWhiteSpace(outputPath))
{
@@ -159,9 +132,9 @@ namespace Emby.Server.Implementations.Images
return ItemUpdateType.ImageUpdate;
}
- protected abstract Task<List<BaseItem>> GetItemsWithImages(IHasImages item);
+ protected abstract List<BaseItem> GetItemsWithImages(IHasImages item);
- protected Task<string> CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
+ protected string CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
{
return CreateCollage(primaryItem, items, outputPath, 640, 360);
}
@@ -188,22 +161,22 @@ namespace Emby.Server.Implementations.Images
.Where(i => !string.IsNullOrWhiteSpace(i));
}
- protected Task<string> CreatePosterCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
+ protected string CreatePosterCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
{
return CreateCollage(primaryItem, items, outputPath, 400, 600);
}
- protected Task<string> CreateSquareCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
+ protected string CreateSquareCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath)
{
return CreateCollage(primaryItem, items, outputPath, 600, 600);
}
- protected Task<string> CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height)
+ protected string CreateThumbCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height)
{
return CreateCollage(primaryItem, items, outputPath, width, height);
}
- private async Task<string> CreateCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height)
+ private string CreateCollage(IHasImages primaryItem, List<BaseItem> items, string outputPath, int width, int height)
{
FileSystem.CreateDirectory(FileSystem.GetDirectoryName(outputPath));
@@ -225,7 +198,7 @@ namespace Emby.Server.Implementations.Images
return null;
}
- await ImageProcessor.CreateImageCollage(options).ConfigureAwait(false);
+ ImageProcessor.CreateImageCollage(options);
return outputPath;
}
@@ -234,7 +207,7 @@ namespace Emby.Server.Implementations.Images
get { return "Dynamic Image Provider"; }
}
- protected virtual async Task<string> CreateImage(IHasImages item,
+ protected virtual string CreateImage(IHasImages item,
List<BaseItem> itemsWithImages,
string outputPathWithoutExtension,
ImageType imageType,
@@ -249,20 +222,20 @@ namespace Emby.Server.Implementations.Images
if (imageType == ImageType.Thumb)
{
- return await CreateThumbCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
+ return CreateThumbCollage(item, itemsWithImages, outputPath);
}
if (imageType == ImageType.Primary)
{
if (item is UserView)
{
- return await CreateSquareCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
+ return CreateSquareCollage(item, itemsWithImages, outputPath);
}
if (item is Playlist || item is MusicGenre || item is Genre || item is GameGenre || item is PhotoAlbum)
{
- return await CreateSquareCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
+ return CreateSquareCollage(item, itemsWithImages, outputPath);
}
- return await CreatePosterCollage(item, itemsWithImages, outputPath).ConfigureAwait(false);
+ return CreatePosterCollage(item, itemsWithImages, outputPath);
}
throw new ArgumentException("Unexpected image type");
@@ -346,7 +319,7 @@ namespace Emby.Server.Implementations.Images
}
}
- protected async Task<string> CreateSingleImage(List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType)
+ protected string CreateSingleImage(List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType)
{
var image = itemsWithImages
.Where(i => i.HasImage(imageType) && i.GetImageInfo(imageType, 0).IsLocalFile && Path.HasExtension(i.GetImagePath(imageType)))
diff --git a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
index 64f025d93f..54f9ca3920 100644
--- a/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
+++ b/Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
@@ -6,7 +6,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index 3c94f97842..42eda00b7c 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -40,7 +40,8 @@ using MediaBrowser.Model.Net;
using SortOrder = MediaBrowser.Model.Entities.SortOrder;
using VideoResolver = MediaBrowser.Naming.Video.VideoResolver;
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
+
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Tasks;
@@ -313,7 +314,8 @@ namespace Emby.Server.Implementations.Library
{
IncludeItemTypes = new[] { typeof(Season).Name },
Recursive = true,
- IndexNumber = 0
+ IndexNumber = 0,
+ DtoOptions = new DtoOptions(true)
}).Cast<Season>()
.Where(i => !string.Equals(i.Name, newName, StringComparison.Ordinal))
@@ -342,7 +344,7 @@ namespace Emby.Server.Implementations.Library
}
if (item is IItemByName)
{
- if (!(item is MusicArtist) && !(item is Studio))
+ if (!(item is MusicArtist))
{
return;
}
@@ -862,13 +864,19 @@ namespace Emby.Server.Implementations.Library
// If this returns multiple items it could be tricky figuring out which one is correct.
// In most cases, the newest one will be and the others obsolete but not yet cleaned up
+ if (string.IsNullOrWhiteSpace(path))
+ {
+ throw new ArgumentNullException("path");
+ }
+
var query = new InternalItemsQuery
{
Path = path,
IsFolder = isFolder,
SortBy = new[] { ItemSortBy.DateCreated },
SortOrder = SortOrder.Descending,
- Limit = 1
+ Limit = 1,
+ DtoOptions = new DtoOptions(true)
};
return GetItemList(query)
@@ -882,7 +890,7 @@ namespace Emby.Server.Implementations.Library
/// <returns>Task{Person}.</returns>
public Person GetPerson(string name)
{
- return CreateItemByName<Person>(Person.GetPath, name);
+ return CreateItemByName<Person>(Person.GetPath, name, new DtoOptions(true));
}
/// <summary>
@@ -892,7 +900,27 @@ namespace Emby.Server.Implementations.Library
/// <returns>Task{Studio}.</returns>
public Studio GetStudio(string name)
{
- return CreateItemByName<Studio>(Studio.GetPath, name);
+ return CreateItemByName<Studio>(Studio.GetPath, name, new DtoOptions(true));
+ }
+
+ public Guid GetStudioId(string name)
+ {
+ return GetItemByNameId<Studio>(Studio.GetPath, name);
+ }
+
+ public Guid GetGenreId(string name)
+ {
+ return GetItemByNameId<Genre>(Genre.GetPath, name);
+ }
+
+ public Guid GetMusicGenreId(string name)
+ {
+ return GetItemByNameId<MusicGenre>(MusicGenre.GetPath, name);
+ }
+
+ public Guid GetGameGenreId(string name)
+ {
+ return GetItemByNameId<GameGenre>(GameGenre.GetPath, name);
}
/// <summary>
@@ -902,7 +930,7 @@ namespace Emby.Server.Implementations.Library
/// <returns>Task{Genre}.</returns>
public Genre GetGenre(string name)
{
- return CreateItemByName<Genre>(Genre.GetPath, name);
+ return CreateItemByName<Genre>(Genre.GetPath, name, new DtoOptions(true));
}
/// <summary>
@@ -912,7 +940,7 @@ namespace Emby.Server.Implementations.Library
/// <returns>Task{MusicGenre}.</returns>
public MusicGenre GetMusicGenre(string name)
{
- return CreateItemByName<MusicGenre>(MusicGenre.GetPath, name);
+ return CreateItemByName<MusicGenre>(MusicGenre.GetPath, name, new DtoOptions(true));
}
/// <summary>
@@ -922,7 +950,7 @@ namespace Emby.Server.Implementations.Library
/// <returns>Task{GameGenre}.</returns>
public GameGenre GetGameGenre(string name)
{
- return CreateItemByName<GameGenre>(GameGenre.GetPath, name);
+ return CreateItemByName<GameGenre>(GameGenre.GetPath, name, new DtoOptions(true));
}
/// <summary>
@@ -940,7 +968,7 @@ namespace Emby.Server.Implementations.Library
var name = value.ToString(CultureInfo.InvariantCulture);
- return CreateItemByName<Year>(Year.GetPath, name);
+ return CreateItemByName<Year>(Year.GetPath, name, new DtoOptions(true));
}
/// <summary>
@@ -950,10 +978,15 @@ namespace Emby.Server.Implementations.Library
/// <returns>Task{Genre}.</returns>
public MusicArtist GetArtist(string name)
{
- return CreateItemByName<MusicArtist>(MusicArtist.GetPath, name);
+ return GetArtist(name, new DtoOptions(true));
+ }
+
+ public MusicArtist GetArtist(string name, DtoOptions options)
+ {
+ return CreateItemByName<MusicArtist>(MusicArtist.GetPath, name, options);
}
- private T CreateItemByName<T>(Func<string, string> getPathFn, string name)
+ private T CreateItemByName<T>(Func<string, string> getPathFn, string name, DtoOptions options)
where T : BaseItem, new()
{
if (typeof(T) == typeof(MusicArtist))
@@ -961,7 +994,8 @@ namespace Emby.Server.Implementations.Library
var existing = GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(T).Name },
- Name = name
+ Name = name,
+ DtoOptions = options
}).Cast<MusicArtist>()
.OrderBy(i => i.IsAccessedByName ? 1 : 0)
@@ -974,14 +1008,13 @@ namespace Emby.Server.Implementations.Library
}
}
- var path = getPathFn(name);
- var forceCaseInsensitiveId = ConfigurationManager.Configuration.EnableNormalizedItemByNameIds;
- var id = GetNewItemIdInternal(path, typeof(T), forceCaseInsensitiveId);
+ var id = GetItemByNameId<T>(getPathFn, name);
var item = GetItemById(id) as T;
if (item == null)
{
+ var path = getPathFn(name);
item = new T
{
Name = name,
@@ -998,52 +1031,12 @@ namespace Emby.Server.Implementations.Library
return item;
}
- public IEnumerable<MusicArtist> GetAlbumArtists(IEnumerable<IHasAlbumArtist> items)
- {
- var names = items
- .SelectMany(i => i.AlbumArtists)
- .DistinctNames()
- .Select(i =>
- {
- try
- {
- var artist = GetArtist(i);
-
- return artist;
- }
- catch
- {
- // Already logged at lower levels
- return null;
- }
- })
- .Where(i => i != null);
-
- return names;
- }
-
- public IEnumerable<MusicArtist> GetArtists(IEnumerable<IHasArtist> items)
+ private Guid GetItemByNameId<T>(Func<string, string> getPathFn, string name)
+ where T : BaseItem, new()
{
- var names = items
- .SelectMany(i => i.AllArtists)
- .DistinctNames()
- .Select(i =>
- {
- try
- {
- var artist = GetArtist(i);
-
- return artist;
- }
- catch
- {
- // Already logged at lower levels
- return null;
- }
- })
- .Where(i => i != null);
-
- return names;
+ var path = getPathFn(name);
+ var forceCaseInsensitiveId = ConfigurationManager.Configuration.EnableNormalizedItemByNameIds;
+ return GetNewItemIdInternal(path, typeof(T), forceCaseInsensitiveId);
}
/// <summary>
@@ -1098,12 +1091,6 @@ namespace Emby.Server.Implementations.Library
try
{
await PerformLibraryValidation(progress, cancellationToken).ConfigureAwait(false);
-
- if (!ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey)
- {
- ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey = true;
- ConfigurationManager.SaveConfiguration();
- }
}
finally
{
@@ -1558,7 +1545,7 @@ namespace Emby.Server.Implementations.Library
}
}
- query.ParentId = null;
+ query.Parent = null;
}
private void AddUserToQuery(InternalItemsQuery query, User user)
diff --git a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs
index 7424ed5e5e..e64980dff8 100644
--- a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs
+++ b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs
@@ -6,6 +6,7 @@ using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
@@ -27,7 +28,8 @@ namespace Emby.Server.Implementations.Library
var items = _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(BoxSet).Name, typeof(Game).Name, typeof(Movie).Name, typeof(Series).Name },
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(true)
}).OfType<IHasTrailers>().ToList();
@@ -40,7 +42,8 @@ namespace Emby.Server.Implementations.Library
{
IncludeItemTypes = new[] { typeof(Trailer).Name },
TrailerTypes = trailerTypes,
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(false)
}).ToArray();
diff --git a/Emby.Server.Implementations/Library/MusicManager.cs b/Emby.Server.Implementations/Library/MusicManager.cs
index b15c011254..f0d07cc3c4 100644
--- a/Emby.Server.Implementations/Library/MusicManager.cs
+++ b/Emby.Server.Implementations/Library/MusicManager.cs
@@ -5,6 +5,7 @@ using MediaBrowser.Controller.Playlists;
using System;
using System.Collections.Generic;
using System.Linq;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.Querying;
namespace Emby.Server.Implementations.Library
@@ -18,47 +19,48 @@ namespace Emby.Server.Implementations.Library
_libraryManager = libraryManager;
}
- public IEnumerable<Audio> GetInstantMixFromSong(Audio item, User user)
+ public IEnumerable<Audio> GetInstantMixFromSong(Audio item, User user, DtoOptions dtoOptions)
{
var list = new List<Audio>
{
item
};
- return list.Concat(GetInstantMixFromGenres(item.Genres, user));
+ return list.Concat(GetInstantMixFromGenres(item.Genres, user, dtoOptions));
}
- public IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist item, User user)
+ public IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist item, User user, DtoOptions dtoOptions)
{
- return GetInstantMixFromGenres(item.Genres, user);
+ return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
}
- public IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user)
+ public IEnumerable<Audio> GetInstantMixFromAlbum(MusicAlbum item, User user, DtoOptions dtoOptions)
{
- return GetInstantMixFromGenres(item.Genres, user);
+ return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
}
- public IEnumerable<Audio> GetInstantMixFromFolder(Folder item, User user)
+ public IEnumerable<Audio> GetInstantMixFromFolder(Folder item, User user, DtoOptions dtoOptions)
{
var genres = item
.GetRecursiveChildren(user, new InternalItemsQuery(user)
{
- IncludeItemTypes = new[] { typeof(Audio).Name }
+ IncludeItemTypes = new[] { typeof(Audio).Name },
+ DtoOptions = dtoOptions
})
.Cast<Audio>()
.SelectMany(i => i.Genres)
.Concat(item.Genres)
.DistinctNames();
- return GetInstantMixFromGenres(genres, user);
+ return GetInstantMixFromGenres(genres, user, dtoOptions);
}
- public IEnumerable<Audio> GetInstantMixFromPlaylist(Playlist item, User user)
+ public IEnumerable<Audio> GetInstantMixFromPlaylist(Playlist item, User user, DtoOptions dtoOptions)
{
- return GetInstantMixFromGenres(item.Genres, user);
+ return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
}
- public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user)
+ public IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user, DtoOptions dtoOptions)
{
var genreIds = genres.DistinctNames().Select(i =>
{
@@ -73,10 +75,10 @@ namespace Emby.Server.Implementations.Library
}).Where(i => i != null);
- return GetInstantMixFromGenreIds(genreIds, user);
+ return GetInstantMixFromGenreIds(genreIds, user, dtoOptions);
}
- public IEnumerable<Audio> GetInstantMixFromGenreIds(IEnumerable<string> genreIds, User user)
+ public IEnumerable<Audio> GetInstantMixFromGenreIds(IEnumerable<string> genreIds, User user, DtoOptions dtoOptions)
{
return _libraryManager.GetItemList(new InternalItemsQuery(user)
{
@@ -86,47 +88,49 @@ namespace Emby.Server.Implementations.Library
Limit = 200,
- SortBy = new[] { ItemSortBy.Random }
+ SortBy = new[] { ItemSortBy.Random },
+
+ DtoOptions = dtoOptions
}).Cast<Audio>();
}
- public IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user)
+ public IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions)
{
var genre = item as MusicGenre;
if (genre != null)
{
- return GetInstantMixFromGenreIds(new[] { item.Id.ToString("N") }, user);
+ return GetInstantMixFromGenreIds(new[] { item.Id.ToString("N") }, user, dtoOptions);
}
var playlist = item as Playlist;
if (playlist != null)
{
- return GetInstantMixFromPlaylist(playlist, user);
+ return GetInstantMixFromPlaylist(playlist, user, dtoOptions);
}
var album = item as MusicAlbum;
if (album != null)
{
- return GetInstantMixFromAlbum(album, user);
+ return GetInstantMixFromAlbum(album, user, dtoOptions);
}
var artist = item as MusicArtist;
if (artist != null)
{
- return GetInstantMixFromArtist(artist, user);
+ return GetInstantMixFromArtist(artist, user, dtoOptions);
}
var song = item as Audio;
if (song != null)
{
- return GetInstantMixFromSong(song, user);
+ return GetInstantMixFromSong(song, user, dtoOptions);
}
var folder = item as Folder;
if (folder != null)
{
- return GetInstantMixFromFolder(folder, user);
+ return GetInstantMixFromFolder(folder, user, dtoOptions);
}
return new Audio[] { };
diff --git a/Emby.Server.Implementations/Library/ResolverHelper.cs b/Emby.Server.Implementations/Library/ResolverHelper.cs
index 1d3cacc1dc..24dc1104aa 100644
--- a/Emby.Server.Implementations/Library/ResolverHelper.cs
+++ b/Emby.Server.Implementations/Library/ResolverHelper.cs
@@ -5,8 +5,6 @@ using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace Emby.Server.Implementations.Library
diff --git a/Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
index b3d6d4ad7a..806e20f00a 100644
--- a/Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
+++ b/Emby.Server.Implementations/Library/Resolvers/Audio/MusicAlbumResolver.cs
@@ -8,7 +8,7 @@ using MediaBrowser.Naming.Audio;
using System;
using System.Collections.Generic;
using System.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
diff --git a/Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
index 2971405b94..2ad8396731 100644
--- a/Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
+++ b/Emby.Server.Implementations/Library/Resolvers/Audio/MusicArtistResolver.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Logging;
using System;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 3550a83b9b..69563e5a0c 100644
--- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -11,7 +11,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
diff --git a/Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs b/Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
index 1bec1073d7..6c7c1f052f 100644
--- a/Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
+++ b/Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
@@ -5,7 +5,7 @@ using MediaBrowser.Controller.Resolvers;
using System;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs b/Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
index e5cad9f91b..60260e98a9 100644
--- a/Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
+++ b/Emby.Server.Implementations/Library/Resolvers/TV/SeriesResolver.cs
@@ -10,7 +10,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
diff --git a/Emby.Server.Implementations/Library/SearchEngine.cs b/Emby.Server.Implementations/Library/SearchEngine.cs
index 5f88a6c662..6f63322c80 100644
--- a/Emby.Server.Implementations/Library/SearchEngine.cs
+++ b/Emby.Server.Implementations/Library/SearchEngine.cs
@@ -8,6 +8,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Extensions;
namespace Emby.Server.Implementations.Library
@@ -175,7 +176,17 @@ namespace Emby.Server.Implementations.Library
IsNews = query.IsNews,
IsSeries = query.IsSeries,
IsSports = query.IsSports,
- MediaTypes = query.MediaTypes
+ MediaTypes = query.MediaTypes,
+
+ DtoOptions = new DtoOptions
+ {
+ Fields = new List<ItemFields>
+ {
+ ItemFields.AirTime,
+ ItemFields.DateCreated,
+ ItemFields.ChannelInfo
+ }
+ }
});
// Add search hints based on item name
diff --git a/Emby.Server.Implementations/Library/UserDataManager.cs b/Emby.Server.Implementations/Library/UserDataManager.cs
index 5a14edf135..e066ab61bd 100644
--- a/Emby.Server.Implementations/Library/UserDataManager.cs
+++ b/Emby.Server.Implementations/Library/UserDataManager.cs
@@ -182,21 +182,21 @@ namespace Emby.Server.Implementations.Library
return GetUserData(userId, item.Id, item.GetUserDataKeys());
}
- public async Task<UserItemDataDto> GetUserDataDto(IHasUserData item, User user)
+ public UserItemDataDto GetUserDataDto(IHasUserData item, User user)
{
var userData = GetUserData(user.Id, item);
var dto = GetUserItemDataDto(userData);
- await item.FillUserDataDtoValues(dto, userData, null, user, new List<ItemFields>()).ConfigureAwait(false);
+ item.FillUserDataDtoValues(dto, userData, null, user, new List<ItemFields>());
return dto;
}
- public async Task<UserItemDataDto> GetUserDataDto(IHasUserData item, BaseItemDto itemDto, User user, List<ItemFields> fields)
+ public UserItemDataDto GetUserDataDto(IHasUserData item, BaseItemDto itemDto, User user, List<ItemFields> fields)
{
var userData = GetUserData(user.Id, item);
var dto = GetUserItemDataDto(userData);
- await item.FillUserDataDtoValues(dto, userData, itemDto, user, fields).ConfigureAwait(false);
+ item.FillUserDataDtoValues(dto, userData, itemDto, user, fields);
return dto;
}
diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs
index 9e1291847e..f403ca266f 100644
--- a/Emby.Server.Implementations/Library/UserViewManager.cs
+++ b/Emby.Server.Implementations/Library/UserViewManager.cs
@@ -12,6 +12,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Model.Globalization;
@@ -190,11 +191,11 @@ namespace Emby.Server.Implementations.Library
return _libraryManager.GetShadowView(parent, viewType, sortName, cancellationToken);
}
- public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request)
+ public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options)
{
var user = _userManager.GetUserById(request.UserId);
- var libraryItems = GetItemsForLatestItems(user, request);
+ var libraryItems = GetItemsForLatestItems(user, request, options);
var list = new List<Tuple<BaseItem, List<BaseItem>>>();
@@ -230,7 +231,7 @@ namespace Emby.Server.Implementations.Library
return list;
}
- private IEnumerable<BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request)
+ private IEnumerable<BaseItem> GetItemsForLatestItems(User user, LatestItemsQuery request, DtoOptions options)
{
var parentId = request.ParentId;
@@ -289,7 +290,8 @@ namespace Emby.Server.Implementations.Library
IsVirtualItem = false,
Limit = limit * 5,
SourceTypes = parents.Count == 0 ? new[] { SourceType.Library } : new SourceType[] { },
- IsPlayed = isPlayed
+ IsPlayed = isPlayed,
+ DtoOptions = options
}, parents);
}
diff --git a/Emby.Server.Implementations/Library/Validators/PeopleValidator.cs b/Emby.Server.Implementations/Library/Validators/PeopleValidator.cs
index 7ebfd71c09..ef3b86abf7 100644
--- a/Emby.Server.Implementations/Library/Validators/PeopleValidator.cs
+++ b/Emby.Server.Implementations/Library/Validators/PeopleValidator.cs
@@ -11,7 +11,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
index ef440899cb..dcfaaa9d70 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs
@@ -3,9 +3,10 @@ using System.IO;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.IO;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Logging;
@@ -29,7 +30,35 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
return targetFile;
}
- public async Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
+ public Task Record(IDirectStreamProvider directStreamProvider, MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
+ {
+ if (directStreamProvider != null)
+ {
+ return RecordFromDirectStreamProvider(directStreamProvider, targetFile, duration, onStarted, cancellationToken);
+ }
+
+ return RecordFromMediaSource(mediaSource, targetFile, duration, onStarted, cancellationToken);
+ }
+
+ private async Task RecordFromDirectStreamProvider(IDirectStreamProvider directStreamProvider, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
+ {
+ using (var output = _fileSystem.GetFileStream(targetFile, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
+ {
+ onStarted();
+
+ _logger.Info("Copying recording stream to file {0}", targetFile);
+
+ // The media source if infinite so we need to handle stopping ourselves
+ var durationToken = new CancellationTokenSource(duration);
+ cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
+
+ await directStreamProvider.CopyToAsync(output, cancellationToken).ConfigureAwait(false);
+ }
+
+ _logger.Info("Recording completed to file {0}", targetFile);
+ }
+
+ private async Task RecordFromMediaSource(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
{
var httpRequestOptions = new HttpRequestOptions
{
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index f1b3f41b42..6ce2b88f12 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -28,8 +28,9 @@ using System.Xml;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.IO;
@@ -1232,7 +1233,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
RequiresClosing = false,
Protocol = MediaBrowser.Model.MediaInfo.MediaProtocol.Http,
BufferMs = 0,
- IgnoreDts = true
+ IgnoreDts = true,
+ IgnoreIndex = true
};
var isAudio = false;
@@ -1517,7 +1519,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
EnforceKeepUpTo(timer, seriesPath);
};
- await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false);
+ await recorder.Record(liveStreamInfo.Item1 as IDirectStreamProvider, mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false);
recordingStatus = RecordingStatus.Completed;
_logger.Info("Recording completed: {0}", recordPath);
@@ -1634,15 +1636,16 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
return;
}
- var episodesToDelete = (await librarySeries.GetItems(new InternalItemsQuery
+ var episodesToDelete = (librarySeries.GetItems(new InternalItemsQuery
{
SortBy = new[] { ItemSortBy.DateCreated },
SortOrder = SortOrder.Descending,
IsVirtualItem = false,
IsFolder = false,
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(true)
- }).ConfigureAwait(false))
+ }))
.Items
.Where(i => i.LocationType == LocationType.FileSystem && _fileSystem.FileExists(i.Path))
.Skip(seriesTimer.KeepUpTo - 1)
@@ -1759,20 +1762,30 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
var config = GetConfiguration();
- if (config.EnableRecordingEncoding)
- {
- var regInfo = await _liveTvManager.GetRegistrationInfo("embytvrecordingconversion").ConfigureAwait(false);
+ var regInfo = await _liveTvManager.GetRegistrationInfo("embytvrecordingconversion").ConfigureAwait(false);
- if (regInfo.IsValid)
+ if (regInfo.IsValid)
+ {
+ if (config.EnableRecordingEncoding)
{
return new EncodedRecorder(_logger, _fileSystem, _mediaEncoder, _config.ApplicationPaths, _jsonSerializer, config, _httpClient, _processFactory, _config);
}
+
+ return new DirectRecorder(_logger, _httpClient, _fileSystem);
+
+ //var options = new LiveTvOptions
+ //{
+ // EnableOriginalAudioWithEncodedRecordings = true,
+ // RecordedVideoCodec = "copy",
+ // RecordingEncodingFormat = "ts"
+ //};
+ //return new EncodedRecorder(_logger, _fileSystem, _mediaEncoder, _config.ApplicationPaths, _jsonSerializer, options, _httpClient, _processFactory, _config);
}
- return new DirectRecorder(_logger, _httpClient, _fileSystem);
+ throw new InvalidOperationException("Emby DVR Requires an active Emby Premiere subscription.");
}
- private async void OnSuccessfulRecording(TimerInfo timer, string path)
+ private void OnSuccessfulRecording(TimerInfo timer, string path)
{
//if (timer.IsProgramSeries && GetConfiguration().EnableAutoOrganize)
//{
@@ -1967,7 +1980,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
Limit = 1,
- ExternalId = timer.ProgramId
+ ExternalId = timer.ProgramId,
+ DtoOptions = new DtoOptions(true)
}).FirstOrDefault() as LiveTvProgram;
@@ -2501,16 +2515,17 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
if (program.EpisodeNumber.HasValue && program.SeasonNumber.HasValue)
{
- var result = _libraryManager.GetItemsResult(new InternalItemsQuery
+ var result = _libraryManager.GetItemIds(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(Episode).Name },
ParentIndexNumber = program.SeasonNumber.Value,
IndexNumber = program.EpisodeNumber.Value,
AncestorIds = seriesIds,
- IsVirtualItem = false
+ IsVirtualItem = false,
+ Limit = 1
});
- if (result.TotalRecordCount > 0)
+ if (result.Count > 0)
{
return true;
}
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
index 790e6c27d1..6173068cc6 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
@@ -8,7 +8,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
@@ -21,6 +21,7 @@ using MediaBrowser.Model.LiveTv;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Library;
namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
@@ -64,6 +65,10 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
return "mkv";
}
+ if (string.Equals(format, "ts", StringComparison.OrdinalIgnoreCase))
+ {
+ return "ts";
+ }
return "mp4";
}
@@ -90,7 +95,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
return Path.ChangeExtension(targetFile, "." + extension);
}
- public async Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
+ public async Task Record(IDirectStreamProvider directStreamProvider, MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
{
//var durationToken = new CancellationTokenSource(duration);
//cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
@@ -177,6 +182,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
videoArgs = "-codec:v:0 copy";
}
+ videoArgs += " -fflags +genpts";
+
var durationParam = " -t " + _mediaEncoder.GetTimeParameter(duration.Ticks);
var flags = new List<string>();
@@ -188,28 +195,37 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
{
flags.Add("+ignidx");
}
+ if (mediaSource.GenPtsInput)
+ {
+ flags.Add("+genpts");
+ }
- var inputModifiers = "-async 1 -vsync -1";
+ var inputModifier = "-async 1 -vsync -1";
if (flags.Count > 0)
{
- inputModifiers += " -fflags " + string.Join("", flags.ToArray());
+ inputModifier += " -fflags " + string.Join("", flags.ToArray());
}
if (!string.IsNullOrWhiteSpace(GetEncodingOptions().HardwareAccelerationType))
{
- inputModifiers += " -hwaccel auto";
+ inputModifier += " -hwaccel auto";
}
if (mediaSource.ReadAtNativeFramerate)
{
- inputModifiers += " -re";
+ inputModifier += " -re";
+ }
+
+ if (mediaSource.RequiresLooping)
+ {
+ inputModifier += " -stream_loop -1";
}
var analyzeDurationSeconds = 5;
var analyzeDuration = " -analyzeduration " +
(analyzeDurationSeconds * 1000000).ToString(CultureInfo.InvariantCulture);
- inputModifiers += analyzeDuration;
+ inputModifier += analyzeDuration;
var subtitleArgs = CopySubtitles ? " -codec:s copy" : " -sn";
@@ -228,7 +244,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
durationParam,
outputParam);
- return inputModifiers + " " + commandLineArgs;
+ return inputModifier + " " + commandLineArgs;
}
private string GetAudioArgs(MediaSourceInfo mediaSource)
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs
index 3b5e60c4a7..e639a312c0 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/IRecorder.cs
@@ -1,6 +1,7 @@
using System;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
namespace Emby.Server.Implementations.LiveTv.EmbyTV
@@ -10,13 +11,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
/// <summary>
/// Records the specified media source.
/// </summary>
- /// <param name="mediaSource">The media source.</param>
- /// <param name="targetFile">The target file.</param>
- /// <param name="duration">The duration.</param>
- /// <param name="onStarted">The on started.</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <returns>Task.</returns>
- Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken);
+ Task Record(IDirectStreamProvider directStreamProvider, MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken);
string GetOutputPath(MediaSourceInfo mediaSource, string targetFile);
}
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
index 953cb8e415..4ba2269a61 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
@@ -4,7 +4,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs
index 17de93a3c4..94be4a02ef 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/RecordingHelper.cs
@@ -105,7 +105,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
}
else
{
- name += " " + info.StartDate.ToString("yyyy-MM-dd") + " " + info.Id;
+ name += " " + info.StartDate.ToString("yyyy-MM-dd");
}
return name;
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
index 7bf6bf1ca2..843ba7e42c 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/SeriesTimerManager.cs
@@ -2,8 +2,6 @@
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using System;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace Emby.Server.Implementations.LiveTv.EmbyTV
diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
index 2eec3df8a5..380b248001 100644
--- a/Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
+++ b/Emby.Server.Implementations/LiveTv/EmbyTV/TimerManager.cs
@@ -8,7 +8,7 @@ using System.Collections.Concurrent;
using System.Globalization;
using System.Linq;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.LiveTv;
diff --git a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
index a36cb124db..da6759b34d 100644
--- a/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
+++ b/Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
@@ -167,10 +167,12 @@ namespace Emby.Server.Implementations.LiveTv.Listings
{
var programEntry = programDict[schedule.programID];
- var data = images[imageIndex].data ?? new List<ScheduleDirect.ImageData>();
- data = data.OrderByDescending(GetSizeOrder).ToList();
+ var allImages = (images[imageIndex].data ?? new List<ScheduleDirect.ImageData>()).OrderByDescending(GetSizeOrder).ToList();
+ var imagesWithText = allImages.Where(i => string.Equals(i.text, "yes", StringComparison.OrdinalIgnoreCase)).ToList();
+
+ programEntry.primaryImage = GetProgramImage(ApiUrl, imagesWithText, "Logo", true, 600) ??
+ GetProgramImage(ApiUrl, allImages, "Logo", true, 600);
- programEntry.primaryImage = GetProgramImage(ApiUrl, data, "Logo", true, 600);
//programEntry.thumbImage = GetProgramImage(ApiUrl, data, "Iconic", false);
//programEntry.bannerImage = GetProgramImage(ApiUrl, data, "Banner", false) ??
// GetProgramImage(ApiUrl, data, "Banner-L1", false) ??
diff --git a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs
index 43b055098a..5c50721922 100644
--- a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs
+++ b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs
@@ -149,7 +149,11 @@ namespace Emby.Server.Implementations.LiveTv
IncludeItemTypes = new string[] { typeof(Series).Name },
Name = seriesName,
Limit = 1,
- ImageTypes = new ImageType[] { ImageType.Thumb }
+ ImageTypes = new ImageType[] { ImageType.Thumb },
+ DtoOptions = new DtoOptions
+ {
+ Fields = new List<MediaBrowser.Model.Querying.ItemFields>()
+ }
}).FirstOrDefault();
@@ -191,7 +195,11 @@ namespace Emby.Server.Implementations.LiveTv
IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name },
ExternalSeriesId = programSeriesId,
Limit = 1,
- ImageTypes = new ImageType[] { ImageType.Primary }
+ ImageTypes = new ImageType[] { ImageType.Primary },
+ DtoOptions = new DtoOptions
+ {
+ Fields = new List<MediaBrowser.Model.Querying.ItemFields>()
+ }
}).FirstOrDefault();
@@ -239,7 +247,11 @@ namespace Emby.Server.Implementations.LiveTv
IncludeItemTypes = new string[] { typeof(Series).Name },
Name = seriesName,
Limit = 1,
- ImageTypes = new ImageType[] { ImageType.Thumb }
+ ImageTypes = new ImageType[] { ImageType.Thumb },
+ DtoOptions = new DtoOptions
+ {
+ Fields = new List<MediaBrowser.Model.Querying.ItemFields>()
+ }
}).FirstOrDefault();
@@ -281,14 +293,22 @@ namespace Emby.Server.Implementations.LiveTv
IncludeItemTypes = new string[] { typeof(Series).Name },
Name = seriesName,
Limit = 1,
- ImageTypes = new ImageType[] { ImageType.Primary }
+ ImageTypes = new ImageType[] { ImageType.Primary },
+ DtoOptions = new DtoOptions
+ {
+ Fields = new List<MediaBrowser.Model.Querying.ItemFields>()
+ }
}).FirstOrDefault() ?? _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name },
ExternalSeriesId = programSeriesId,
Limit = 1,
- ImageTypes = new ImageType[] { ImageType.Primary }
+ ImageTypes = new ImageType[] { ImageType.Primary },
+ DtoOptions = new DtoOptions
+ {
+ Fields = new List<MediaBrowser.Model.Querying.ItemFields>()
+ }
}).FirstOrDefault();
diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
index fa86ac36d0..c2f0575604 100644
--- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -26,7 +26,7 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Events;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Common.Security;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
@@ -173,7 +173,7 @@ namespace Emby.Server.Implementations.LiveTv
}
}
- public async Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, CancellationToken cancellationToken)
+ public async Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken)
{
var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId);
@@ -192,7 +192,8 @@ namespace Emby.Server.Implementations.LiveTv
IsFavorite = query.IsFavorite,
IsLiked = query.IsLiked,
StartIndex = query.StartIndex,
- Limit = query.Limit
+ Limit = query.Limit,
+ DtoOptions = dtoOptions
};
internalQuery.OrderBy.AddRange(query.SortBy.Select(i => new Tuple<string, SortOrder>(i, query.SortOrder ?? SortOrder.Ascending)));
@@ -249,7 +250,7 @@ namespace Emby.Server.Implementations.LiveTv
{
Id = id
- }, cancellationToken).ConfigureAwait(false);
+ }, new DtoOptions(), cancellationToken).ConfigureAwait(false);
return result.Items.FirstOrDefault();
}
@@ -477,7 +478,8 @@ namespace Emby.Server.Implementations.LiveTv
if (!(service is EmbyTV.EmbyTV))
{
- // We can't trust that we'll be able to direct stream it through emby server, no matter what the provider says
+ // We can't trust that we'll be able to direct stream it through emby server, no matter what the provider says
+ //mediaSource.SupportsDirectPlay = false;
mediaSource.SupportsDirectStream = false;
mediaSource.SupportsTranscoding = true;
foreach (var stream in mediaSource.MediaStreams)
@@ -864,13 +866,6 @@ namespace Emby.Server.Implementations.LiveTv
return item.Id;
}
-
-
- private string GetExternalSeriesIdLegacy(BaseItem item)
- {
- return item.GetProviderId("ProviderExternalSeriesId");
- }
-
public async Task<BaseItemDto> GetProgram(string id, CancellationToken cancellationToken, User user = null)
{
var program = GetInternalProgram(id);
@@ -881,11 +876,6 @@ namespace Emby.Server.Implementations.LiveTv
var externalSeriesId = program.ExternalSeriesId;
- if (string.IsNullOrWhiteSpace(externalSeriesId))
- {
- externalSeriesId = GetExternalSeriesIdLegacy(program);
- }
-
list.Add(new Tuple<BaseItemDto, string, string, string>(dto, program.ServiceName, GetItemExternalId(program), externalSeriesId));
await AddRecordingInfo(list, cancellationToken).ConfigureAwait(false);
@@ -905,6 +895,8 @@ namespace Emby.Server.Implementations.LiveTv
query.SortBy = new[] { ItemSortBy.StartDate };
}
+ RemoveFields(options);
+
var internalQuery = new InternalItemsQuery(user)
{
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
@@ -964,8 +956,6 @@ namespace Emby.Server.Implementations.LiveTv
var queryResult = _libraryManager.QueryItems(internalQuery);
- RemoveFields(options);
-
var returnArray = (await _dtoService.GetBaseItemDtos(queryResult.Items, options, user).ConfigureAwait(false)).ToArray();
var result = new QueryResult<BaseItemDto>
@@ -1044,12 +1034,12 @@ namespace Emby.Server.Implementations.LiveTv
public async Task<QueryResult<BaseItemDto>> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
{
+ RemoveFields(options);
+
var internalResult = await GetRecommendedProgramsInternal(query, options, cancellationToken).ConfigureAwait(false);
var user = _userManager.GetUserById(query.UserId);
- RemoveFields(options);
-
var returnArray = (await _dtoService.GetBaseItemDtos(internalResult.Items, options, user).ConfigureAwait(false)).ToArray();
var result = new QueryResult<BaseItemDto>
@@ -1332,7 +1322,8 @@ namespace Emby.Server.Implementations.LiveTv
{
IncludeItemTypes = new string[] { typeof(LiveTvProgram).Name },
- ChannelIds = new string[] { currentChannel.Id.ToString("N") }
+ ChannelIds = new string[] { currentChannel.Id.ToString("N") },
+ DtoOptions = new DtoOptions(true)
}).Cast<LiveTvProgram>().ToDictionary(i => i.Id);
@@ -1435,7 +1426,8 @@ namespace Emby.Server.Implementations.LiveTv
{
var list = _itemRepo.GetItemIdsList(new InternalItemsQuery
{
- IncludeItemTypes = validTypes
+ IncludeItemTypes = validTypes,
+ DtoOptions = new DtoOptions(false)
}).ToList();
@@ -1662,6 +1654,8 @@ namespace Emby.Server.Implementations.LiveTv
includeItemTypes.Add(typeof(Series).Name);
+ RemoveFields(options);
+
var internalResult = _libraryManager.GetItemsResult(new InternalItemsQuery(user)
{
Recursive = true,
@@ -1671,11 +1665,10 @@ namespace Emby.Server.Implementations.LiveTv
SortOrder = SortOrder.Descending,
EnableTotalRecordCount = query.EnableTotalRecordCount,
IncludeItemTypes = includeItemTypes.ToArray(),
- ExcludeItemTypes = excludeItemTypes.ToArray()
+ ExcludeItemTypes = excludeItemTypes.ToArray(),
+ DtoOptions = options
});
- RemoveFields(options);
-
var returnArray = (await _dtoService.GetBaseItemDtos(internalResult.Items, options, user).ConfigureAwait(false)).ToArray();
return new QueryResult<BaseItemDto>
@@ -1685,7 +1678,7 @@ namespace Emby.Server.Implementations.LiveTv
};
}
- public async Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, CancellationToken cancellationToken)
+ public async Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, DtoOptions options, CancellationToken cancellationToken)
{
var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId);
if (user != null && !IsLiveTvEnabled(user))
@@ -1695,14 +1688,15 @@ namespace Emby.Server.Implementations.LiveTv
if (_services.Count == 1 && !(query.IsInProgress ?? false) && (!query.IsLibraryItem.HasValue || query.IsLibraryItem.Value))
{
- return GetEmbyRecordings(query, new DtoOptions(), user);
+ return GetEmbyRecordings(query, options, user);
}
await RefreshRecordings(cancellationToken).ConfigureAwait(false);
var internalQuery = new InternalItemsQuery(user)
{
- IncludeItemTypes = new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name }
+ IncludeItemTypes = new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name },
+ DtoOptions = options
};
if (!string.IsNullOrEmpty(query.ChannelId))
@@ -1871,11 +1865,6 @@ namespace Emby.Server.Implementations.LiveTv
var externalSeriesId = program.ExternalSeriesId;
- if (string.IsNullOrWhiteSpace(externalSeriesId))
- {
- externalSeriesId = GetExternalSeriesIdLegacy(program);
- }
-
programTuples.Add(new Tuple<BaseItemDto, string, string, string>(dto, serviceName, GetItemExternalId(program), externalSeriesId));
}
@@ -1952,10 +1941,10 @@ namespace Emby.Server.Implementations.LiveTv
{
var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId);
- var internalResult = await GetInternalRecordings(query, cancellationToken).ConfigureAwait(false);
-
RemoveFields(options);
+ var internalResult = await GetInternalRecordings(query, options, cancellationToken).ConfigureAwait(false);
+
var returnArray = (await _dtoService.GetBaseItemDtos(internalResult.Items, options, user).ConfigureAwait(false)).ToArray();
return new QueryResult<BaseItemDto>
@@ -2298,7 +2287,8 @@ namespace Emby.Server.Implementations.LiveTv
MinEndDate = now,
Limit = channelIds.Length,
SortBy = new[] { "StartDate" },
- TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Result.Id.ToString("N") }
+ TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Result.Id.ToString("N") },
+ DtoOptions = options
}).ToList() : new List<BaseItem>();
@@ -2600,7 +2590,7 @@ namespace Emby.Server.Implementations.LiveTv
{
UserId = query.UserId
- }, cancellationToken).ConfigureAwait(false);
+ }, new DtoOptions(), cancellationToken).ConfigureAwait(false);
var recordings = recordingResult.Items.OfType<ILiveTvRecording>().ToList();
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
index d724a9fbc4..504f9a6ee6 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
@@ -421,7 +421,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
SupportsDirectStream = true,
SupportsTranscoding = true,
IsInfiniteStream = true,
- IgnoreDts = true
+ IgnoreDts = true,
+ //IgnoreIndex = true,
+ ReadAtNativeFramerate = true
};
mediaSource.InferTotalBitrate();
@@ -505,12 +507,12 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
if (hdhomerunChannel != null && hdhomerunChannel.IsLegacyTuner)
{
- return new HdHomerunUdpStream(mediaSource, streamId, new LegacyHdHomerunChannelCommands(hdhomerunChannel.Url), modelInfo.TunerCount, _fileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost, _socketFactory, _networkManager);
+ return new HdHomerunUdpStream(mediaSource, streamId, new LegacyHdHomerunChannelCommands(hdhomerunChannel.Url), modelInfo.TunerCount, _fileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost, _socketFactory, _networkManager, _environment);
}
// The UDP method is not working reliably on OSX, and on BSD it hasn't been tested yet
- var enableHttpStream = _environment.OperatingSystem == OperatingSystem.OSX ||
- _environment.OperatingSystem == OperatingSystem.BSD;
+ var enableHttpStream = _environment.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.OSX
+ || _environment.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.BSD;
enableHttpStream = true;
if (enableHttpStream)
{
@@ -519,17 +521,16 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
var httpUrl = GetApiUrl(info, true) + "/auto/v" + hdhrId;
// If raw was used, the tuner doesn't support params
- if (!string.IsNullOrWhiteSpace(profile)
- && !string.Equals(profile, "native", StringComparison.OrdinalIgnoreCase))
+ if (!string.IsNullOrWhiteSpace(profile) && !string.Equals(profile, "native", StringComparison.OrdinalIgnoreCase))
{
httpUrl += "?transcode=" + profile;
}
mediaSource.Path = httpUrl;
- return new HdHomerunHttpStream(mediaSource, streamId, _fileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost);
+ return new HdHomerunHttpStream(mediaSource, streamId, _fileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost, _environment);
}
- return new HdHomerunUdpStream(mediaSource, streamId, new HdHomerunChannelCommands(hdhomerunChannel.Number), modelInfo.TunerCount, _fileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost, _socketFactory, _networkManager);
+ return new HdHomerunUdpStream(mediaSource, streamId, new HdHomerunChannelCommands(hdhomerunChannel.Number, profile), modelInfo.TunerCount, _fileSystem, _httpClient, Logger, Config.ApplicationPaths, _appHost, _socketFactory, _networkManager, _environment);
}
public async Task Validate(TunerHostInfo info)
@@ -596,10 +597,12 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
// Need a way to set the Receive timeout on the socket otherwise this might never timeout?
try
{
- await udpClient.SendAsync(discBytes, discBytes.Length, new IpEndPointInfo(new IpAddressInfo("255.255.255.255", IpAddressFamily.InterNetwork), 65001), cancellationToken);
+ await udpClient.SendToAsync(discBytes, 0, discBytes.Length, new IpEndPointInfo(new IpAddressInfo("255.255.255.255", IpAddressFamily.InterNetwork), 65001), cancellationToken);
+ var receiveBuffer = new byte[8192];
+
while (!cancellationToken.IsCancellationRequested)
{
- var response = await udpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
+ var response = await udpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false);
var deviceIp = response.RemoteEndPoint.IpAddress.Address;
// check to make sure we have enough bytes received to be a valid message and make sure the 2nd byte is the discover reply byte
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs
index 2798805fa0..5db842dec7 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHttpStream.cs
@@ -2,6 +2,7 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
+using Emby.Server.Implementations.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
@@ -10,6 +11,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
+using MediaBrowser.Model.System;
namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{
@@ -17,24 +19,22 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{
private readonly ILogger _logger;
private readonly IHttpClient _httpClient;
- private readonly IFileSystem _fileSystem;
- private readonly IServerApplicationPaths _appPaths;
private readonly IServerApplicationHost _appHost;
private readonly CancellationTokenSource _liveStreamCancellationTokenSource = new CancellationTokenSource();
private readonly TaskCompletionSource<bool> _liveStreamTaskCompletionSource = new TaskCompletionSource<bool>();
- private readonly MulticastStream _multicastStream;
- public HdHomerunHttpStream(MediaSourceInfo mediaSource, string originalStreamId, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost)
- : base(mediaSource)
+ private readonly string _tempFilePath;
+
+ public HdHomerunHttpStream(MediaSourceInfo mediaSource, string originalStreamId, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost, IEnvironmentInfo environment)
+ : base(mediaSource, environment, fileSystem)
{
- _fileSystem = fileSystem;
_httpClient = httpClient;
_logger = logger;
- _appPaths = appPaths;
_appHost = appHost;
OriginalStreamId = originalStreamId;
- _multicastStream = new MulticastStream(_logger);
+
+ _tempFilePath = Path.Combine(appPaths.TranscodingTempPath, UniqueId + ".ts");
}
protected override async Task OpenInternal(CancellationToken openCancellationToken)
@@ -57,9 +57,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
OpenedMediaSource.Path = _appHost.GetLocalApiUrl("127.0.0.1") + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
OpenedMediaSource.Protocol = MediaProtocol.Http;
- OpenedMediaSource.SupportsDirectPlay = false;
- OpenedMediaSource.SupportsDirectStream = true;
- OpenedMediaSource.SupportsTranscoding = true;
+ //OpenedMediaSource.SupportsDirectPlay = false;
+ //OpenedMediaSource.SupportsDirectStream = true;
+ //OpenedMediaSource.SupportsTranscoding = true;
await taskCompletionSource.Task.ConfigureAwait(false);
@@ -74,9 +74,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
return _liveStreamTaskCompletionSource.Task;
}
- private async Task StartStreaming(string url, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken)
+ private Task StartStreaming(string url, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken)
{
- await Task.Run(async () =>
+ return Task.Run(async () =>
{
var isFirstAttempt = true;
@@ -101,13 +101,14 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{
_logger.Info("Beginning multicastStream.CopyUntilCancelled");
- Action onStarted = null;
- if (isFirstAttempt)
+ FileSystem.CreateDirectory(FileSystem.GetDirectoryName(_tempFilePath));
+ using (var fileStream = FileSystem.GetFileStream(_tempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.Asynchronous))
{
- onStarted = () => openTaskCompletionSource.TrySetResult(true);
- }
+ ResolveAfterDelay(3000, openTaskCompletionSource);
- await _multicastStream.CopyUntilCancelled(response.Content, onStarted, cancellationToken).ConfigureAwait(false);
+ //await response.Content.CopyToAsync(fileStream, 81920, cancellationToken).ConfigureAwait(false);
+ await AsyncStreamCopier.CopyStream(response.Content, fileStream, 81920, 4, cancellationToken).ConfigureAwait(false);
+ }
}
}
}
@@ -131,13 +132,60 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
}
_liveStreamTaskCompletionSource.TrySetResult(true);
+ await DeleteTempFile(_tempFilePath).ConfigureAwait(false);
+ });
+ }
- }).ConfigureAwait(false);
+ private void ResolveAfterDelay(int delayMs, TaskCompletionSource<bool> openTaskCompletionSource)
+ {
+ Task.Run(async () =>
+ {
+ await Task.Delay(delayMs).ConfigureAwait(false);
+ openTaskCompletionSource.TrySetResult(true);
+ });
}
public Task CopyToAsync(Stream stream, CancellationToken cancellationToken)
{
- return _multicastStream.CopyToAsync(stream);
+ return CopyFileTo(_tempFilePath, false, stream, cancellationToken);
+ }
+
+ protected async Task CopyFileTo(string path, bool allowEndOfFile, Stream outputStream, CancellationToken cancellationToken)
+ {
+ var eofCount = 0;
+
+ long startPosition = -25000;
+ if (startPosition < 0)
+ {
+ var length = FileSystem.GetFileInfo(path).Length;
+ startPosition = Math.Max(length - startPosition, 0);
+ }
+
+ using (var inputStream = GetInputStream(path, startPosition, true))
+ {
+ if (startPosition > 0)
+ {
+ inputStream.Position = startPosition;
+ }
+
+ while (eofCount < 20 || !allowEndOfFile)
+ {
+ var bytesRead = await AsyncStreamCopier.CopyStream(inputStream, outputStream, 81920, 4, cancellationToken).ConfigureAwait(false);
+
+ //var position = fs.Position;
+ //_logger.Debug("Streamed {0} bytes to position {1} from file {2}", bytesRead, position, path);
+
+ if (bytesRead == 0)
+ {
+ eofCount++;
+ await Task.Delay(100, cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ eofCount = 0;
+ }
+ }
+ }
}
}
}
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
index 2c678d9f8d..41b058baf7 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunManager.cs
@@ -46,10 +46,12 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
public class HdHomerunChannelCommands : IHdHomerunChannelCommands
{
private string _channel;
+ private string _profile;
- public HdHomerunChannelCommands(string channel)
+ public HdHomerunChannelCommands(string channel, string profile)
{
_channel = channel;
+ _profile = profile;
}
public IEnumerable<Tuple<string, string>> GetCommands()
@@ -57,7 +59,16 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
var commands = new List<Tuple<string, string>>();
if (!String.IsNullOrEmpty(_channel))
- commands.Add(Tuple.Create("vchannel", _channel));
+ {
+ if (!string.IsNullOrWhiteSpace(_profile) && !string.Equals(_profile, "native", StringComparison.OrdinalIgnoreCase))
+ {
+ commands.Add(Tuple.Create("vchannel", String.Format("{0} transcode={1}", _channel, _profile)));
+ }
+ else
+ {
+ commands.Add(Tuple.Create("vchannel", _channel));
+ }
+ }
return commands;
}
@@ -103,8 +114,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
var ipEndPoint = new IpEndPointInfo(remoteIp, HdHomeRunPort);
var lockkeyMsg = CreateGetMessage(tuner, "lockkey");
- await socket.SendAsync(lockkeyMsg, lockkeyMsg.Length, ipEndPoint, cancellationToken);
- var response = await socket.ReceiveAsync(cancellationToken).ConfigureAwait(false);
+ await socket.SendToAsync(lockkeyMsg, 0, lockkeyMsg.Length, ipEndPoint, cancellationToken);
+
+ var receiveBuffer = new byte[8192];
+ var response = await socket.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false);
+
string returnVal;
ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal);
@@ -117,6 +131,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
using (var tcpClient = _socketFactory.CreateTcpSocket(_remoteIp, HdHomeRunPort))
{
+ var receiveBuffer = new byte[8192];
+
if (!_lockkey.HasValue)
{
var rand = new Random();
@@ -133,8 +149,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
_activeTuner = i;
var lockKeyString = String.Format("{0:d}", _lockkey.Value);
var lockkeyMsg = CreateSetMessage(i, "lockkey", lockKeyString, null);
- await tcpClient.SendAsync(lockkeyMsg, lockkeyMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false);
- var response = await tcpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
+ await tcpClient.SendToAsync(lockkeyMsg, 0, lockkeyMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false);
+ var response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false);
string returnVal;
// parse response to make sure it worked
if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal))
@@ -144,8 +160,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
foreach(Tuple<string,string> command in commandList)
{
var channelMsg = CreateSetMessage(i, command.Item1, command.Item2, _lockkey.Value);
- await tcpClient.SendAsync(channelMsg, channelMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false);
- response = await tcpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
+ await tcpClient.SendToAsync(channelMsg, 0, channelMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false);
+ response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false);
// parse response to make sure it worked
if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal))
{
@@ -158,8 +174,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
var targetValue = String.Format("rtp://{0}:{1}", localIp, localPort);
var targetMsg = CreateSetMessage(i, "target", targetValue, _lockkey.Value);
- await tcpClient.SendAsync(targetMsg, targetMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false);
- response = await tcpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
+ await tcpClient.SendToAsync(targetMsg, 0, targetMsg.Length, ipEndPoint, cancellationToken).ConfigureAwait(false);
+ response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false);
// parse response to make sure it worked
if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal))
{
@@ -180,11 +196,13 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
using (var tcpClient = _socketFactory.CreateTcpSocket(_remoteIp, HdHomeRunPort))
{
var commandList = commands.GetCommands();
+ var receiveBuffer = new byte[8192];
+
foreach (Tuple<string, string> command in commandList)
{
var channelMsg = CreateSetMessage(_activeTuner, command.Item1, command.Item2, _lockkey.Value);
- await tcpClient.SendAsync(channelMsg, channelMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), cancellationToken).ConfigureAwait(false);
- var response = await tcpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
+ await tcpClient.SendToAsync(channelMsg, 0, channelMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), cancellationToken).ConfigureAwait(false);
+ var response = await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, cancellationToken).ConfigureAwait(false);
// parse response to make sure it worked
string returnVal;
if (!ParseReturnMessage(response.Buffer, response.ReceivedBytes, out returnVal))
@@ -209,12 +227,15 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
private async Task ReleaseLockkey(ISocket tcpClient)
{
var releaseTarget = CreateSetMessage(_activeTuner, "target", "none", _lockkey);
- await tcpClient.SendAsync(releaseTarget, releaseTarget.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false);
- await tcpClient.ReceiveAsync(CancellationToken.None).ConfigureAwait(false);
+ await tcpClient.SendToAsync(releaseTarget, 0, releaseTarget.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false);
+
+ var receiveBuffer = new byte[8192];
+
+ await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, CancellationToken.None).ConfigureAwait(false);
var releaseKeyMsg = CreateSetMessage(_activeTuner, "lockkey", "none", _lockkey);
_lockkey = null;
- await tcpClient.SendAsync(releaseKeyMsg, releaseKeyMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false);
- await tcpClient.ReceiveAsync(CancellationToken.None).ConfigureAwait(false);
+ await tcpClient.SendToAsync(releaseKeyMsg, 0, releaseKeyMsg.Length, new IpEndPointInfo(_remoteIp, HdHomeRunPort), CancellationToken.None).ConfigureAwait(false);
+ await tcpClient.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, CancellationToken.None).ConfigureAwait(false);
}
private static byte[] CreateGetMessage(int tuner, string name)
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs
index e1572ea3ff..2989177c0f 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunUdpStream.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
+using Emby.Server.Implementations.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
@@ -14,39 +15,35 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Net;
+using MediaBrowser.Model.System;
namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
{
public class HdHomerunUdpStream : LiveStream, IDirectStreamProvider
{
private readonly ILogger _logger;
- private readonly IHttpClient _httpClient;
- private readonly IFileSystem _fileSystem;
- private readonly IServerApplicationPaths _appPaths;
private readonly IServerApplicationHost _appHost;
private readonly ISocketFactory _socketFactory;
private readonly CancellationTokenSource _liveStreamCancellationTokenSource = new CancellationTokenSource();
private readonly TaskCompletionSource<bool> _liveStreamTaskCompletionSource = new TaskCompletionSource<bool>();
- private readonly MulticastStream _multicastStream;
private readonly IHdHomerunChannelCommands _channelCommands;
private readonly int _numTuners;
private readonly INetworkManager _networkManager;
- public HdHomerunUdpStream(MediaSourceInfo mediaSource, string originalStreamId, IHdHomerunChannelCommands channelCommands, int numTuners, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost, ISocketFactory socketFactory, INetworkManager networkManager)
- : base(mediaSource)
+ private readonly string _tempFilePath;
+
+ public HdHomerunUdpStream(MediaSourceInfo mediaSource, string originalStreamId, IHdHomerunChannelCommands channelCommands, int numTuners, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost, ISocketFactory socketFactory, INetworkManager networkManager, IEnvironmentInfo environment)
+ : base(mediaSource, environment, fileSystem)
{
- _fileSystem = fileSystem;
- _httpClient = httpClient;
_logger = logger;
- _appPaths = appPaths;
_appHost = appHost;
_socketFactory = socketFactory;
_networkManager = networkManager;
OriginalStreamId = originalStreamId;
- _multicastStream = new MulticastStream(_logger);
_channelCommands = channelCommands;
_numTuners = numTuners;
+ _tempFilePath = Path.Combine(appPaths.TranscodingTempPath, UniqueId + ".ts");
}
protected override async Task OpenInternal(CancellationToken openCancellationToken)
@@ -70,9 +67,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
OpenedMediaSource.Path = _appHost.GetLocalApiUrl("127.0.0.1") + "/LiveTv/LiveStreamFiles/" + UniqueId + "/stream.ts";
OpenedMediaSource.Protocol = MediaProtocol.Http;
- OpenedMediaSource.SupportsDirectPlay = false;
- OpenedMediaSource.SupportsDirectStream = true;
- OpenedMediaSource.SupportsTranscoding = true;
+ //OpenedMediaSource.SupportsDirectPlay = false;
+ //OpenedMediaSource.SupportsDirectStream = true;
+ //OpenedMediaSource.SupportsTranscoding = true;
await taskCompletionSource.Task.ConfigureAwait(false);
@@ -87,9 +84,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
return _liveStreamTaskCompletionSource.Task;
}
- private async Task StartStreaming(string remoteIp, int localPort, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken)
+ private Task StartStreaming(string remoteIp, int localPort, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken)
{
- await Task.Run(async () =>
+ return Task.Run(async () =>
{
var isFirstAttempt = true;
using (var udpClient = _socketFactory.CreateUdpSocket(localPort))
@@ -124,13 +121,11 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
if (!cancellationToken.IsCancellationRequested)
{
- Action onStarted = null;
- if (isFirstAttempt)
+ FileSystem.CreateDirectory(FileSystem.GetDirectoryName(_tempFilePath));
+ using (var fileStream = FileSystem.GetFileStream(_tempFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, FileOpenOptions.Asynchronous))
{
- onStarted = () => openTaskCompletionSource.TrySetResult(true);
+ await CopyTo(udpClient, fileStream, openTaskCompletionSource, cancellationToken).ConfigureAwait(false);
}
-
- await _multicastStream.CopyUntilCancelled(new UdpClientStream(udpClient), onStarted, cancellationToken).ConfigureAwait(false);
}
}
catch (OperationCanceledException ex)
@@ -159,135 +154,109 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
}
}
- }).ConfigureAwait(false);
+ await DeleteTempFile(_tempFilePath).ConfigureAwait(false);
+ });
}
- public Task CopyToAsync(Stream stream, CancellationToken cancellationToken)
+ private void Resolve(TaskCompletionSource<bool> openTaskCompletionSource)
{
- return _multicastStream.CopyToAsync(stream);
+ Task.Run(() =>
+ {
+ openTaskCompletionSource.TrySetResult(true);
+ });
}
- }
-
- // This handles the ReadAsync function only of a Stream object
- // This is used to wrap a UDP socket into a stream for MulticastStream which only uses ReadAsync
- public class UdpClientStream : Stream
- {
- private static int RtpHeaderBytes = 12;
- private static int PacketSize = 1316;
- private readonly ISocket _udpClient;
- bool disposed;
- public UdpClientStream(ISocket udpClient) : base()
+ public Task CopyToAsync(Stream stream, CancellationToken cancellationToken)
{
- _udpClient = udpClient;
+ return CopyFileTo(_tempFilePath, false, stream, cancellationToken);
}
- public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ protected async Task CopyFileTo(string path, bool allowEndOfFile, Stream outputStream, CancellationToken cancellationToken)
{
- if (buffer == null)
- throw new ArgumentNullException("buffer");
+ var eofCount = 0;
- if (offset + count < 0)
- throw new ArgumentOutOfRangeException("offset + count must not be negative", "offset+count");
+ long startPosition = -25000;
+ if (startPosition < 0)
+ {
+ var length = FileSystem.GetFileInfo(path).Length;
+ startPosition = Math.Max(length - startPosition, 0);
+ }
- if (offset + count > buffer.Length)
- throw new ArgumentException("offset + count must not be greater than the length of buffer", "offset+count");
+ using (var inputStream = GetInputStream(path, startPosition, true))
+ {
+ if (startPosition > 0)
+ {
+ inputStream.Position = startPosition;
+ }
- if (disposed)
- throw new ObjectDisposedException(typeof(UdpClientStream).ToString());
+ while (eofCount < 20 || !allowEndOfFile)
+ {
+ var bytesRead = await AsyncStreamCopier.CopyStream(inputStream, outputStream, 81920, 4, cancellationToken).ConfigureAwait(false);
- // This will always receive a 1328 packet size (PacketSize + RtpHeaderSize)
- // The RTP header will be stripped so see how many reads we need to make to fill the buffer.
- int numReads = count / PacketSize;
- int totalBytesRead = 0;
+ //var position = fs.Position;
+ //_logger.Debug("Streamed {0} bytes to position {1} from file {2}", bytesRead, position, path);
- for (int i = 0; i < numReads; ++i)
- {
- var data = await _udpClient.ReceiveAsync(cancellationToken).ConfigureAwait(false);
-
- var bytesRead = data.ReceivedBytes - RtpHeaderBytes;
-
- // remove rtp header
- Buffer.BlockCopy(data.Buffer, RtpHeaderBytes, buffer, offset, bytesRead);
- offset += bytesRead;
- totalBytesRead += bytesRead;
+ if (bytesRead == 0)
+ {
+ eofCount++;
+ await Task.Delay(100, cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ eofCount = 0;
+ }
+ }
}
- return totalBytesRead;
}
- protected override void Dispose(bool disposing)
+ private static int RtpHeaderBytes = 12;
+ private Task CopyTo(ISocket udpClient, Stream outputStream, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken)
{
- disposed = true;
+ return CopyStream(_socketFactory.CreateNetworkStream(udpClient, false), outputStream, 81920, 4, openTaskCompletionSource, cancellationToken);
}
- public override bool CanRead
+ private Task CopyStream(Stream source, Stream target, int bufferSize, int bufferCount, TaskCompletionSource<bool> openTaskCompletionSource, CancellationToken cancellationToken)
{
- get
- {
- throw new NotImplementedException();
- }
- }
+ var copier = new AsyncStreamCopier(source, target, 0, cancellationToken, false, bufferSize, bufferCount);
+ copier.IndividualReadOffset = RtpHeaderBytes;
- public override bool CanSeek
- {
- get
- {
- throw new NotImplementedException();
- }
- }
+ var taskCompletion = new TaskCompletionSource<long>();
- public override bool CanWrite
- {
- get
- {
- throw new NotImplementedException();
- }
- }
+ copier.TaskCompletionSource = taskCompletion;
- public override long Length
- {
- get
- {
- throw new NotImplementedException();
- }
- }
+ var result = copier.BeginCopy(StreamCopyCallback, copier);
- public override long Position
- {
- get
+ if (openTaskCompletionSource != null)
{
- throw new NotImplementedException();
+ Resolve(openTaskCompletionSource);
+ openTaskCompletionSource = null;
}
- set
+ if (result.CompletedSynchronously)
{
- throw new NotImplementedException();
+ StreamCopyCallback(result);
}
- }
- public override void Flush()
- {
- throw new NotImplementedException();
- }
+ cancellationToken.Register(() => taskCompletion.TrySetCanceled());
- public override int Read(byte[] buffer, int offset, int count)
- {
- throw new NotImplementedException();
+ return taskCompletion.Task;
}
- public override long Seek(long offset, SeekOrigin origin)
+ private void StreamCopyCallback(IAsyncResult result)
{
- throw new NotImplementedException();
- }
+ var copier = (AsyncStreamCopier)result.AsyncState;
+ var taskCompletion = copier.TaskCompletionSource;
- public override void SetLength(long value)
- {
- throw new NotImplementedException();
+ try
+ {
+ copier.EndCopy(result);
+ taskCompletion.TrySetResult(0);
+ }
+ catch (Exception ex)
+ {
+ taskCompletion.TrySetException(ex);
+ }
}
- public override void Write(byte[] buffer, int offset, int count)
- {
- throw new NotImplementedException();
- }
}
} \ No newline at end of file
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
index 8cf1106f0f..12b7901f93 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3UTunerHost.cs
@@ -11,7 +11,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
@@ -19,6 +19,7 @@ using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Serialization;
+using MediaBrowser.Model.System;
namespace Emby.Server.Implementations.LiveTv.TunerHosts
{
@@ -27,13 +28,15 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
private readonly IFileSystem _fileSystem;
private readonly IHttpClient _httpClient;
private readonly IServerApplicationHost _appHost;
+ private readonly IEnvironmentInfo _environment;
- public M3UTunerHost(IServerConfigurationManager config, ILogger logger, IJsonSerializer jsonSerializer, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IHttpClient httpClient, IServerApplicationHost appHost)
+ public M3UTunerHost(IServerConfigurationManager config, ILogger logger, IJsonSerializer jsonSerializer, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IHttpClient httpClient, IServerApplicationHost appHost, IEnvironmentInfo environment)
: base(config, logger, jsonSerializer, mediaEncoder)
{
_fileSystem = fileSystem;
_httpClient = httpClient;
_appHost = appHost;
+ _environment = environment;
}
public override string Type
@@ -73,7 +76,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
{
var sources = await GetChannelStreamMediaSources(info, channelId, cancellationToken).ConfigureAwait(false);
- var liveStream = new LiveStream(sources.First());
+ var liveStream = new LiveStream(sources.First(), _environment, _fileSystem);
return liveStream;
}
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
index 8c4b9bf606..4c1190e0ee 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
@@ -8,7 +8,6 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.IO;
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs
index 02ebbcf16d..e650086d34 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs
@@ -15,7 +15,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
{
private readonly ConcurrentDictionary<Guid,QueueStream> _outputStreams = new ConcurrentDictionary<Guid, QueueStream>();
private const int BufferSize = 81920;
- private CancellationToken _cancellationToken;
private readonly ILogger _logger;
public MulticastStream(ILogger logger)
@@ -25,8 +24,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
public async Task CopyUntilCancelled(Stream source, Action onStarted, CancellationToken cancellationToken)
{
- _cancellationToken = cancellationToken;
-
byte[] buffer = new byte[BufferSize];
if (source == null)
@@ -72,59 +69,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
}
}
- private static int RtpHeaderBytes = 12;
- public async Task CopyUntilCancelled(ISocket udpClient, Action onStarted, CancellationToken cancellationToken)
- {
- _cancellationToken = cancellationToken;
-
- while (!cancellationToken.IsCancellationRequested)
- {
- var receiveToken = cancellationToken;
-
- // On the first connection attempt, put a timeout to avoid being stuck indefinitely in the event of failure
- if (onStarted != null)
- {
- receiveToken = CancellationTokenSource.CreateLinkedTokenSource(new CancellationTokenSource(5000).Token, cancellationToken).Token;
- }
-
- var data = await udpClient.ReceiveAsync(receiveToken).ConfigureAwait(false);
- var bytesRead = data.ReceivedBytes - RtpHeaderBytes;
-
- if (bytesRead > 0)
- {
- var allStreams = _outputStreams.ToList();
-
- if (allStreams.Count == 1)
- {
- await allStreams[0].Value.WriteAsync(data.Buffer, 0, bytesRead).ConfigureAwait(false);
- }
- else
- {
- byte[] copy = new byte[bytesRead];
- Buffer.BlockCopy(data.Buffer, RtpHeaderBytes, copy, 0, bytesRead);
-
- foreach (var stream in allStreams)
- {
- stream.Value.Queue(copy, 0, copy.Length);
- }
- }
-
- if (onStarted != null)
- {
- var onStartedCopy = onStarted;
- onStarted = null;
- Task.Run(onStartedCopy);
- }
- }
-
- else
- {
- await Task.Delay(100).ConfigureAwait(false);
- }
- }
- }
-
- public Task CopyToAsync(Stream stream)
+ public Task CopyToAsync(Stream stream, CancellationToken cancellationToken)
{
var result = new QueueStream(stream, _logger)
{
@@ -133,7 +78,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
_outputStreams.TryAdd(result.Id, result);
- result.Start(_cancellationToken);
+ result.Start(cancellationToken);
return result.TaskCompletion.Task;
}
diff --git a/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs b/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs
index 884a001f0e..1d74e87886 100644
--- a/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs
+++ b/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs
@@ -13,7 +13,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Library;
diff --git a/Emby.Server.Implementations/Migrations/GuideMigration.cs b/Emby.Server.Implementations/Migrations/GuideMigration.cs
index 99b2942dcb..78fb6c222d 100644
--- a/Emby.Server.Implementations/Migrations/GuideMigration.cs
+++ b/Emby.Server.Implementations/Migrations/GuideMigration.cs
@@ -25,7 +25,7 @@ namespace Emby.Server.Implementations.Migrations
_taskManager = taskManager;
}
- public async Task Run()
+ public Task Run()
{
var name = "GuideRefresh3";
@@ -42,6 +42,8 @@ namespace Emby.Server.Implementations.Migrations
_config.Configuration.Migrations = list.ToArray();
_config.SaveConfiguration();
}
+
+ return Task.FromResult(true);
}
}
}
diff --git a/Emby.Server.Implementations/Migrations/LibraryScanMigration.cs b/Emby.Server.Implementations/Migrations/LibraryScanMigration.cs
index bd185bc9cf..9d7f67a4f7 100644
--- a/Emby.Server.Implementations/Migrations/LibraryScanMigration.cs
+++ b/Emby.Server.Implementations/Migrations/LibraryScanMigration.cs
@@ -25,7 +25,7 @@ namespace Emby.Server.Implementations.Migrations
_taskManager = taskManager;
}
- public async Task Run()
+ public Task Run()
{
var name = "LibraryScan6";
@@ -42,6 +42,8 @@ namespace Emby.Server.Implementations.Migrations
_config.Configuration.Migrations = list.ToArray();
_config.SaveConfiguration();
}
+
+ return Task.FromResult(true);
}
}
}
diff --git a/Emby.Server.Implementations/Migrations/UpdateLevelMigration.cs b/Emby.Server.Implementations/Migrations/UpdateLevelMigration.cs
deleted file mode 100644
index c532ea08d1..0000000000
--- a/Emby.Server.Implementations/Migrations/UpdateLevelMigration.cs
+++ /dev/null
@@ -1,130 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Common.Updates;
-using MediaBrowser.Controller;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.Updates;
-
-namespace Emby.Server.Implementations.Migrations
-{
- public class UpdateLevelMigration : IVersionMigration
- {
- private readonly IServerConfigurationManager _config;
- private readonly IServerApplicationHost _appHost;
- private readonly IHttpClient _httpClient;
- private readonly IJsonSerializer _jsonSerializer;
- private readonly string _releaseAssetFilename;
- private readonly ILogger _logger;
-
- public UpdateLevelMigration(IServerConfigurationManager config, IServerApplicationHost appHost, IHttpClient httpClient, IJsonSerializer jsonSerializer, string releaseAssetFilename, ILogger logger)
- {
- _config = config;
- _appHost = appHost;
- _httpClient = httpClient;
- _jsonSerializer = jsonSerializer;
- _releaseAssetFilename = releaseAssetFilename;
- _logger = logger;
- }
-
- public async Task Run()
- {
- var lastVersion = _config.Configuration.LastVersion;
- var currentVersion = _appHost.ApplicationVersion;
-
- if (string.Equals(lastVersion, currentVersion.ToString(), StringComparison.OrdinalIgnoreCase))
- {
- return;
- }
-
- try
- {
- var updateLevel = _config.Configuration.SystemUpdateLevel;
-
- await CheckVersion(currentVersion, updateLevel, CancellationToken.None).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error in update migration", ex);
- }
- }
-
- private async Task CheckVersion(Version currentVersion, PackageVersionClass currentUpdateLevel, CancellationToken cancellationToken)
- {
- var releases = await new GithubUpdater(_httpClient, _jsonSerializer)
- .GetLatestReleases("MediaBrowser", "Emby", _releaseAssetFilename, cancellationToken).ConfigureAwait(false);
-
- var newUpdateLevel = GetNewUpdateLevel(currentVersion, currentUpdateLevel, releases);
-
- if (newUpdateLevel != currentUpdateLevel)
- {
- _config.Configuration.SystemUpdateLevel = newUpdateLevel;
- _config.SaveConfiguration();
- }
- }
-
- private PackageVersionClass GetNewUpdateLevel(Version currentVersion, PackageVersionClass currentUpdateLevel, List<GithubUpdater.RootObject> releases)
- {
- var newUpdateLevel = currentUpdateLevel;
-
- // If the current version is later than current stable, set the update level to beta
- if (releases.Count >= 1)
- {
- var release = releases[0];
- var version = ParseVersion(release.tag_name);
- if (version != null)
- {
- if (currentVersion > version)
- {
- newUpdateLevel = PackageVersionClass.Beta;
- }
- else
- {
- return PackageVersionClass.Release;
- }
- }
- }
-
- // If the current version is later than current beta, set the update level to dev
- if (releases.Count >= 2)
- {
- var release = releases[1];
- var version = ParseVersion(release.tag_name);
- if (version != null)
- {
- if (currentVersion > version)
- {
- newUpdateLevel = PackageVersionClass.Dev;
- }
- else
- {
- return PackageVersionClass.Beta;
- }
- }
- }
-
- return newUpdateLevel;
- }
-
- private Version ParseVersion(string versionString)
- {
- if (!string.IsNullOrWhiteSpace(versionString))
- {
- var parts = versionString.Split('.');
- if (parts.Length == 3)
- {
- versionString += ".0";
- }
- }
-
- Version version;
- Version.TryParse(versionString, out version);
-
- return version;
- }
- }
-}
diff --git a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
index cc1756f960..0744fc0d9d 100644
--- a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
+++ b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs
@@ -18,15 +18,15 @@ namespace Emby.Server.Implementations.Photos
{
}
- protected override Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var photoAlbum = (PhotoAlbum)item;
var items = GetFinalItems(photoAlbum.Children.ToList());
- return Task.FromResult(items);
+ return items;
}
- protected override Task<string> CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
+ protected string CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
{
return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary);
}
diff --git a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs
index 9514c12caa..127ce24ae4 100644
--- a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs
+++ b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs
@@ -10,7 +10,8 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Emby.Server.Implementations.Images;
-using MediaBrowser.Common.IO;
+
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -26,7 +27,7 @@ namespace Emby.Server.Implementations.Playlists
{
}
- protected override Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var playlist = (Playlist)item;
@@ -67,7 +68,7 @@ namespace Emby.Server.Implementations.Playlists
.DistinctBy(i => i.Id)
.ToList();
- return Task.FromResult(GetFinalItems(items));
+ return GetFinalItems(items);
}
}
@@ -80,7 +81,7 @@ namespace Emby.Server.Implementations.Playlists
_libraryManager = libraryManager;
}
- protected override Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var items = _libraryManager.GetItemList(new InternalItemsQuery
{
@@ -89,11 +90,12 @@ namespace Emby.Server.Implementations.Playlists
SortBy = new[] { ItemSortBy.Random },
Limit = 4,
Recursive = true,
- ImageTypes = new[] { ImageType.Primary }
+ ImageTypes = new[] { ImageType.Primary },
+ DtoOptions = new DtoOptions(false)
}).ToList();
- return Task.FromResult(GetFinalItems(items));
+ return GetFinalItems(items);
}
//protected override Task<string> CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
@@ -111,7 +113,7 @@ namespace Emby.Server.Implementations.Playlists
_libraryManager = libraryManager;
}
- protected override Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var items = _libraryManager.GetItemList(new InternalItemsQuery
{
@@ -120,11 +122,12 @@ namespace Emby.Server.Implementations.Playlists
SortBy = new[] { ItemSortBy.Random },
Limit = 4,
Recursive = true,
- ImageTypes = new[] { ImageType.Primary }
+ ImageTypes = new[] { ImageType.Primary },
+ DtoOptions = new DtoOptions(false)
}).ToList();
- return Task.FromResult(GetFinalItems(items));
+ return GetFinalItems(items);
}
//protected override Task<string> CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
diff --git a/Emby.Server.Implementations/Playlists/PlaylistManager.cs b/Emby.Server.Implementations/Playlists/PlaylistManager.cs
index 18042b5870..e0e133e38d 100644
--- a/Emby.Server.Implementations/Playlists/PlaylistManager.cs
+++ b/Emby.Server.Implementations/Playlists/PlaylistManager.cs
@@ -12,7 +12,8 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -135,7 +136,10 @@ namespace Emby.Server.Implementations.Playlists
if (options.ItemIdList.Count > 0)
{
- await AddToPlaylistInternal(playlist.Id.ToString("N"), options.ItemIdList, user);
+ await AddToPlaylistInternal(playlist.Id.ToString("N"), options.ItemIdList, user, new DtoOptions(false)
+ {
+ EnableImages = true
+ });
}
return new PlaylistCreationResult
@@ -160,21 +164,24 @@ namespace Emby.Server.Implementations.Playlists
return path;
}
- private Task<IEnumerable<BaseItem>> GetPlaylistItems(IEnumerable<string> itemIds, string playlistMediaType, User user)
+ private IEnumerable<BaseItem> GetPlaylistItems(IEnumerable<string> itemIds, string playlistMediaType, User user, DtoOptions options)
{
var items = itemIds.Select(i => _libraryManager.GetItemById(i)).Where(i => i != null);
- return Playlist.GetPlaylistItems(playlistMediaType, items, user);
+ return Playlist.GetPlaylistItems(playlistMediaType, items, user, options);
}
public Task AddToPlaylist(string playlistId, IEnumerable<string> itemIds, string userId)
{
var user = string.IsNullOrWhiteSpace(userId) ? null : _userManager.GetUserById(userId);
- return AddToPlaylistInternal(playlistId, itemIds, user);
+ return AddToPlaylistInternal(playlistId, itemIds, user, new DtoOptions(false)
+ {
+ EnableImages = true
+ });
}
- private async Task AddToPlaylistInternal(string playlistId, IEnumerable<string> itemIds, User user)
+ private async Task AddToPlaylistInternal(string playlistId, IEnumerable<string> itemIds, User user, DtoOptions options)
{
var playlist = _libraryManager.GetItemById(playlistId) as Playlist;
@@ -185,12 +192,17 @@ namespace Emby.Server.Implementations.Playlists
var list = new List<LinkedChild>();
- var items = (await GetPlaylistItems(itemIds, playlist.MediaType, user).ConfigureAwait(false))
+ var items = (GetPlaylistItems(itemIds, playlist.MediaType, user, options))
.Where(i => i.SupportsAddingToPlaylist)
.ToList();
foreach (var item in items)
{
+ if (string.IsNullOrWhiteSpace(item.Path))
+ {
+ continue;
+ }
+
list.Add(LinkedChild.Create(item));
}
@@ -271,7 +283,7 @@ namespace Emby.Server.Implementations.Playlists
{
var typeName = "PlaylistsFolder";
- return _libraryManager.RootFolder.Children.OfType<Folder>().FirstOrDefault(i => string.Equals(i.GetType().Name, typeName, StringComparison.Ordinal)) ??
+ return _libraryManager.RootFolder.Children.OfType<Folder>().FirstOrDefault(i => string.Equals(i.GetType().Name, typeName, StringComparison.Ordinal)) ??
_libraryManager.GetUserRootFolder().Children.OfType<Folder>().FirstOrDefault(i => string.Equals(i.GetType().Name, typeName, StringComparison.Ordinal));
}
}
diff --git a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
index d1c70ba1dd..967e7ddd86 100644
--- a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
+++ b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs
@@ -10,7 +10,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Entities;
@@ -85,7 +85,9 @@ namespace Emby.Server.Implementations.ScheduledTasks
{
MediaTypes = new[] { MediaType.Video },
IsFolder = false,
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(false)
+
})
.OfType<Video>()
.ToList();
diff --git a/Emby.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs b/Emby.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs
index 749233fa19..9bf6f2824d 100644
--- a/Emby.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs
+++ b/Emby.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs
@@ -4,7 +4,7 @@ using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/Emby.Server.Implementations/ServerManager/ServerManager.cs b/Emby.Server.Implementations/ServerManager/ServerManager.cs
index 4c9228e54b..7cd94c5260 100644
--- a/Emby.Server.Implementations/ServerManager/ServerManager.cs
+++ b/Emby.Server.Implementations/ServerManager/ServerManager.cs
@@ -12,7 +12,7 @@ using System.Collections.Specialized;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
using MediaBrowser.Model.Text;
diff --git a/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs b/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs
index ac20fe7b3c..e4392d7e64 100644
--- a/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs
+++ b/Emby.Server.Implementations/ServerManager/WebSocketConnection.cs
@@ -9,7 +9,6 @@ using System.Collections.Specialized;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
using MediaBrowser.Model.Text;
diff --git a/Emby.Server.Implementations/Services/ResponseHelper.cs b/Emby.Server.Implementations/Services/ResponseHelper.cs
index 3c2af60db0..84dc343c39 100644
--- a/Emby.Server.Implementations/Services/ResponseHelper.cs
+++ b/Emby.Server.Implementations/Services/ResponseHelper.cs
@@ -12,43 +12,28 @@ namespace Emby.Server.Implementations.Services
{
public static class ResponseHelper
{
- public static Task WriteToResponse(IResponse httpRes, IRequest httpReq, object result)
+ public static async Task WriteToResponse(IResponse response, IRequest request, object result, CancellationToken cancellationToken)
{
if (result == null)
{
- if (httpRes.StatusCode == (int)HttpStatusCode.OK)
+ if (response.StatusCode == (int)HttpStatusCode.OK)
{
- httpRes.StatusCode = (int)HttpStatusCode.NoContent;
+ response.StatusCode = (int)HttpStatusCode.NoContent;
}
- httpRes.SetContentLength(0);
- return Task.FromResult(true);
+ response.SetContentLength(0);
+ return;
}
var httpResult = result as IHttpResult;
if (httpResult != null)
{
- httpResult.RequestContext = httpReq;
- httpReq.ResponseContentType = httpResult.ContentType ?? httpReq.ResponseContentType;
- return WriteToResponseInternal(httpRes, httpResult, httpReq);
+ httpResult.RequestContext = request;
+ request.ResponseContentType = httpResult.ContentType ?? request.ResponseContentType;
}
- return WriteToResponseInternal(httpRes, result, httpReq);
- }
-
- /// <summary>
- /// Writes to response.
- /// Response headers are customizable by implementing IHasHeaders an returning Dictionary of Http headers.
- /// </summary>
- /// <param name="response">The response.</param>
- /// <param name="result">Whether or not it was implicity handled by ServiceStack's built-in handlers.</param>
- /// <param name="request">The serialization context.</param>
- /// <returns></returns>
- private static async Task WriteToResponseInternal(IResponse response, object result, IRequest request)
- {
var defaultContentType = request.ResponseContentType;
- var httpResult = result as IHttpResult;
if (httpResult != null)
{
if (httpResult.RequestContext == null)
@@ -105,7 +90,7 @@ namespace Emby.Server.Implementations.Services
var asyncStreamWriter = result as IAsyncStreamWriter;
if (asyncStreamWriter != null)
{
- await asyncStreamWriter.WriteToAsync(response.OutputStream, CancellationToken.None).ConfigureAwait(false);
+ await asyncStreamWriter.WriteToAsync(response.OutputStream, cancellationToken).ConfigureAwait(false);
return;
}
@@ -119,7 +104,7 @@ namespace Emby.Server.Implementations.Services
var fileWriter = result as FileWriter;
if (fileWriter != null)
{
- await fileWriter.WriteToAsync(response, CancellationToken.None).ConfigureAwait(false);
+ await fileWriter.WriteToAsync(response, cancellationToken).ConfigureAwait(false);
return;
}
@@ -139,7 +124,7 @@ namespace Emby.Server.Implementations.Services
response.ContentType = "application/octet-stream";
response.SetContentLength(bytes.Length);
- await response.OutputStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
+ await response.OutputStream.WriteAsync(bytes, 0, bytes.Length, cancellationToken).ConfigureAwait(false);
return;
}
@@ -148,7 +133,7 @@ namespace Emby.Server.Implementations.Services
{
bytes = Encoding.UTF8.GetBytes(responseText);
response.SetContentLength(bytes.Length);
- await response.OutputStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
+ await response.OutputStream.WriteAsync(bytes, 0, bytes.Length, cancellationToken).ConfigureAwait(false);
return;
}
diff --git a/Emby.Server.Implementations/Services/ServiceController.cs b/Emby.Server.Implementations/Services/ServiceController.cs
index d283bf81f6..1c530144c9 100644
--- a/Emby.Server.Implementations/Services/ServiceController.cs
+++ b/Emby.Server.Implementations/Services/ServiceController.cs
@@ -187,7 +187,7 @@ namespace Emby.Server.Implementations.Services
return null;
}
- public async Task<object> Execute(HttpListenerHost appHost, object requestDto, IRequest req)
+ public Task<object> Execute(HttpListenerHost appHost, object requestDto, IRequest req)
{
req.Dto = requestDto;
var requestType = requestDto.GetType();
@@ -209,9 +209,7 @@ namespace Emby.Server.Implementations.Services
req.Dto = requestDto;
//Executes the service and returns the result
- var response = await ServiceExecGeneral.Execute(serviceType, req, service, requestDto, requestType.GetMethodName()).ConfigureAwait(false);
-
- return response;
+ return ServiceExecGeneral.Execute(serviceType, req, service, requestDto, requestType.GetMethodName());
}
}
diff --git a/Emby.Server.Implementations/Services/ServiceHandler.cs b/Emby.Server.Implementations/Services/ServiceHandler.cs
index 8b59b48430..526e62d398 100644
--- a/Emby.Server.Implementations/Services/ServiceHandler.cs
+++ b/Emby.Server.Implementations/Services/ServiceHandler.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Reflection;
+using System.Threading;
using System.Threading.Tasks;
using Emby.Server.Implementations.HttpServer;
using MediaBrowser.Model.Logging;
@@ -123,7 +124,7 @@ namespace Emby.Server.Implementations.Services
// Set from SSHHF.GetHandlerForPathInfo()
public string ResponseContentType { get; set; }
- public async Task ProcessRequestAsync(HttpListenerHost appHost, IRequest httpReq, IResponse httpRes, ILogger logger, string operationName)
+ public async Task ProcessRequestAsync(HttpListenerHost appHost, IRequest httpReq, IResponse httpRes, ILogger logger, string operationName, CancellationToken cancellationToken)
{
var restPath = GetRestPath(httpReq.Verb, httpReq.PathInfo);
if (restPath == null)
@@ -142,7 +143,8 @@ namespace Emby.Server.Implementations.Services
var rawResponse = await appHost.ServiceController.Execute(appHost, request, httpReq).ConfigureAwait(false);
- var response = await HandleResponseAsync(rawResponse).ConfigureAwait(false);
+ //var response = await HandleResponseAsync(rawResponse).ConfigureAwait(false);
+ var response = rawResponse;
// Apply response filters
foreach (var responseFilter in appHost.ResponseFilters)
@@ -150,7 +152,7 @@ namespace Emby.Server.Implementations.Services
responseFilter(httpReq, httpRes, response);
}
- await ResponseHelper.WriteToResponse(httpRes, httpReq, response).ConfigureAwait(false);
+ await ResponseHelper.WriteToResponse(httpRes, httpReq, response, cancellationToken).ConfigureAwait(false);
}
public static object CreateRequest(HttpListenerHost host, IRequest httpReq, RestPath restPath, ILogger logger)
diff --git a/Emby.Server.Implementations/Session/HttpSessionController.cs b/Emby.Server.Implementations/Session/HttpSessionController.cs
index 2acc3902fd..92fa6c4242 100644
--- a/Emby.Server.Implementations/Session/HttpSessionController.cs
+++ b/Emby.Server.Implementations/Session/HttpSessionController.cs
@@ -66,19 +66,19 @@ namespace Emby.Server.Implementations.Session
return SendMessage(name, new Dictionary<string, string>(), cancellationToken);
}
- private async Task SendMessage(string name,
+ private Task SendMessage(string name,
Dictionary<string, string> args,
CancellationToken cancellationToken)
{
var url = PostUrl + "/" + name + ToQueryString(args);
- await _httpClient.Post(new HttpRequestOptions
+ return _httpClient.Post(new HttpRequestOptions
{
Url = url,
CancellationToken = cancellationToken,
BufferContent = false
- }).ConfigureAwait(false);
+ });
}
public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken)
@@ -159,8 +159,24 @@ namespace Emby.Server.Implementations.Session
public Task SendMessage<T>(string name, T data, CancellationToken cancellationToken)
{
- // Not supported or needed right now
- return Task.FromResult(true);
+ var url = PostUrl + "/" + name;
+
+ var options = new HttpRequestOptions
+ {
+ Url = url,
+ CancellationToken = cancellationToken,
+ BufferContent = false
+ };
+
+ options.RequestContent = _json.SerializeToString(data);
+ options.RequestContentType = "application/json";
+
+ return _httpClient.Post(new HttpRequestOptions
+ {
+ Url = url,
+ CancellationToken = cancellationToken,
+ BufferContent = false
+ });
}
private string ToQueryString(Dictionary<string, string> nvc)
diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs
index de00cf2391..42cd5d1b1e 100644
--- a/Emby.Server.Implementations/Session/SessionManager.cs
+++ b/Emby.Server.Implementations/Session/SessionManager.cs
@@ -30,6 +30,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Threading;
namespace Emby.Server.Implementations.Session
@@ -984,7 +985,7 @@ namespace Emby.Server.Implementations.Session
var list = new List<BaseItem>();
foreach (var itemId in command.ItemIds)
{
- var subItems = await TranslateItemForPlayback(itemId, user).ConfigureAwait(false);
+ var subItems = TranslateItemForPlayback(itemId, user);
list.AddRange(subItems);
}
@@ -1022,7 +1023,10 @@ namespace Emby.Server.Implementations.Session
var series = episode.Series;
if (series != null)
{
- var episodes = series.GetEpisodes(user)
+ var episodes = series.GetEpisodes(user, new DtoOptions(false)
+ {
+ EnableImages = false
+ })
.Where(i => !i.IsVirtualItem)
.SkipWhile(i => i.Id != episode.Id)
.ToList();
@@ -1048,7 +1052,7 @@ namespace Emby.Server.Implementations.Session
await session.SessionController.SendPlayCommand(command, cancellationToken).ConfigureAwait(false);
}
- private async Task<List<BaseItem>> TranslateItemForPlayback(string id, User user)
+ private List<BaseItem> TranslateItemForPlayback(string id, User user)
{
var item = _libraryManager.GetItemById(id);
@@ -1065,7 +1069,15 @@ namespace Emby.Server.Implementations.Session
var items = byName.GetTaggedItems(new InternalItemsQuery(user)
{
IsFolder = false,
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false,
+ Fields = new List<ItemFields>
+ {
+ ItemFields.SortName
+ }
+ }
});
return FilterToSingleMediaType(items)
@@ -1077,12 +1089,20 @@ namespace Emby.Server.Implementations.Session
{
var folder = (Folder)item;
- var itemsResult = await folder.GetItems(new InternalItemsQuery(user)
+ var itemsResult = folder.GetItems(new InternalItemsQuery(user)
{
Recursive = true,
- IsFolder = false
+ IsFolder = false,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false,
+ Fields = new List<ItemFields>
+ {
+ ItemFields.SortName
+ }
+ }
- }).ConfigureAwait(false);
+ });
return FilterToSingleMediaType(itemsResult.Items)
.OrderBy(i => i.SortName)
@@ -1111,7 +1131,7 @@ namespace Emby.Server.Implementations.Session
return new List<BaseItem>();
}
- return _musicManager.GetInstantMixFromItem(item, user);
+ return _musicManager.GetInstantMixFromItem(item, user, new DtoOptions(false) { EnableImages = false });
}
public Task SendBrowseCommand(string controllingSessionId, string sessionId, BrowseRequest command, CancellationToken cancellationToken)
diff --git a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs
index 478f9da716..2735bb2378 100644
--- a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs
+++ b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs
@@ -57,7 +57,6 @@ namespace Emby.Server.Implementations.Session
_json = json;
_httpServer = httpServer;
_serverManager = serverManager;
- httpServer.WebSocketConnecting += _httpServer_WebSocketConnecting;
serverManager.WebSocketConnected += _serverManager_WebSocketConnected;
}
@@ -84,27 +83,6 @@ namespace Emby.Server.Implementations.Session
}
}
- async void _httpServer_WebSocketConnecting(object sender, WebSocketConnectingEventArgs e)
- {
- //var token = e.QueryString["api_key"];
- //if (!string.IsNullOrWhiteSpace(token))
- //{
- // try
- // {
- // var session = await GetSession(e.QueryString, e.Endpoint).ConfigureAwait(false);
-
- // if (session == null)
- // {
- // e.AllowConnection = false;
- // }
- // }
- // catch (Exception ex)
- // {
- // _logger.ErrorException("Error getting session info", ex);
- // }
- //}
- }
-
private Task<SessionInfo> GetSession(QueryParamCollection queryString, string remoteEndpoint)
{
if (queryString == null)
@@ -123,7 +101,6 @@ namespace Emby.Server.Implementations.Session
public void Dispose()
{
- _httpServer.WebSocketConnecting -= _httpServer_WebSocketConnecting;
_serverManager.WebSocketConnected -= _serverManager_WebSocketConnected;
}
diff --git a/Emby.Server.Implementations/TV/SeriesPostScanTask.cs b/Emby.Server.Implementations/TV/SeriesPostScanTask.cs
index 3d93561f17..23b6a3cb57 100644
--- a/Emby.Server.Implementations/TV/SeriesPostScanTask.cs
+++ b/Emby.Server.Implementations/TV/SeriesPostScanTask.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
@@ -58,7 +59,8 @@ namespace Emby.Server.Implementations.TV
{
IncludeItemTypes = new[] { typeof(Series).Name },
Recursive = true,
- GroupByPresentationUniqueKey = false
+ GroupByPresentationUniqueKey = false,
+ DtoOptions = new DtoOptions(true)
}).Cast<Series>().ToList();
@@ -188,7 +190,8 @@ namespace Emby.Server.Implementations.TV
{
IncludeItemTypes = new[] { typeof(Series).Name },
Recursive = true,
- GroupByPresentationUniqueKey = false
+ GroupByPresentationUniqueKey = false,
+ DtoOptions = new DtoOptions(true)
}).Cast<Series>().ToList();
diff --git a/Emby.Server.Implementations/TV/TVSeriesManager.cs b/Emby.Server.Implementations/TV/TVSeriesManager.cs
index b5e64bc231..876c5d58b0 100644
--- a/Emby.Server.Implementations/TV/TVSeriesManager.cs
+++ b/Emby.Server.Implementations/TV/TVSeriesManager.cs
@@ -8,6 +8,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dto;
namespace Emby.Server.Implementations.TV
{
@@ -26,7 +27,7 @@ namespace Emby.Server.Implementations.TV
_config = config;
}
- public QueryResult<BaseItem> GetNextUp(NextUpQuery request)
+ public QueryResult<BaseItem> GetNextUp(NextUpQuery request, DtoOptions dtoOptions)
{
var user = _userManager.GetUserById(request.UserId);
@@ -68,19 +69,19 @@ namespace Emby.Server.Implementations.TV
{
Fields = new List<ItemFields>
{
-
+ ItemFields.PresentationUniqueKey
}
}
}).Cast<Series>().Select(GetUniqueSeriesKey);
// Avoid implicitly captured closure
- var episodes = GetNextUpEpisodes(request, user, items);
+ var episodes = GetNextUpEpisodes(request, user, items, dtoOptions);
return GetResult(episodes, request);
}
- public QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders)
+ public QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders, DtoOptions dtoOptions)
{
var user = _userManager.GetUserById(request.UserId);
@@ -118,7 +119,7 @@ namespace Emby.Server.Implementations.TV
{
Fields = new List<ItemFields>
{
-
+ ItemFields.PresentationUniqueKey
},
EnableImages = false
}
@@ -126,18 +127,18 @@ namespace Emby.Server.Implementations.TV
}, parentsFolders.Cast<BaseItem>().ToList()).Cast<Series>().Select(GetUniqueSeriesKey);
// Avoid implicitly captured closure
- var episodes = GetNextUpEpisodes(request, user, items);
+ var episodes = GetNextUpEpisodes(request, user, items, dtoOptions);
return GetResult(episodes, request);
}
- public IEnumerable<Episode> GetNextUpEpisodes(NextUpQuery request, User user, IEnumerable<string> seriesKeys)
+ public IEnumerable<Episode> GetNextUpEpisodes(NextUpQuery request, User user, IEnumerable<string> seriesKeys, DtoOptions dtoOptions)
{
// Avoid implicitly captured closure
var currentUser = user;
var allNextUp = seriesKeys
- .Select(i => GetNextUp(i, currentUser));
+ .Select(i => GetNextUp(i, currentUser, dtoOptions));
//allNextUp = allNextUp.OrderByDescending(i => i.Item1);
@@ -175,14 +176,12 @@ namespace Emby.Server.Implementations.TV
/// Gets the next up.
/// </summary>
/// <returns>Task{Episode}.</returns>
- private Tuple<DateTime, Func<Episode>> GetNextUp(string seriesKey, User user)
+ private Tuple<DateTime, Func<Episode>> GetNextUp(string seriesKey, User user, DtoOptions dtoOptions)
{
- var enableSeriesPresentationKey = _config.Configuration.EnableSeriesPresentationUniqueKey;
-
var lastWatchedEpisode = _libraryManager.GetItemList(new InternalItemsQuery(user)
{
- AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
- SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
+ AncestorWithPresentationUniqueKey = null,
+ SeriesPresentationUniqueKey = seriesKey,
IncludeItemTypes = new[] { typeof(Episode).Name },
SortBy = new[] { ItemSortBy.SortName },
SortOrder = SortOrder.Descending,
@@ -193,7 +192,7 @@ namespace Emby.Server.Implementations.TV
{
Fields = new List<ItemFields>
{
-
+ ItemFields.SortName
},
EnableImages = false
}
@@ -204,8 +203,8 @@ namespace Emby.Server.Implementations.TV
{
return _libraryManager.GetItemList(new InternalItemsQuery(user)
{
- AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
- SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
+ AncestorWithPresentationUniqueKey = null,
+ SeriesPresentationUniqueKey = seriesKey,
IncludeItemTypes = new[] { typeof(Episode).Name },
SortBy = new[] { ItemSortBy.SortName },
SortOrder = SortOrder.Ascending,
@@ -213,7 +212,8 @@ namespace Emby.Server.Implementations.TV
IsPlayed = false,
IsVirtualItem = false,
ParentIndexNumberNotEquals = 0,
- MinSortName = lastWatchedEpisode == null ? null : lastWatchedEpisode.SortName
+ MinSortName = lastWatchedEpisode == null ? null : lastWatchedEpisode.SortName,
+ DtoOptions = dtoOptions
}).Cast<Episode>().FirstOrDefault();
};
diff --git a/Emby.Server.Implementations/Udp/UdpServer.cs b/Emby.Server.Implementations/Udp/UdpServer.cs
index 21ef3cab64..8dc1fae4be 100644
--- a/Emby.Server.Implementations/Udp/UdpServer.cs
+++ b/Emby.Server.Implementations/Udp/UdpServer.cs
@@ -139,30 +139,58 @@ namespace Emby.Server.Implementations.Udp
{
_udpClient = _socketFactory.CreateUdpSocket(port);
- Task.Run(() => StartListening());
+ Task.Run(() => BeginReceive());
}
- private async void StartListening()
+ private readonly byte[] _receiveBuffer = new byte[8192];
+
+ private void BeginReceive()
{
- while (!_isDisposed)
+ if (_isDisposed)
{
- try
- {
- var result = await _udpClient.ReceiveAsync(CancellationToken.None).ConfigureAwait(false);
+ return;
+ }
- OnMessageReceived(result);
- }
- catch (ObjectDisposedException)
- {
- }
- catch (OperationCanceledException)
- {
- }
- catch (Exception ex)
+ try
+ {
+ var result = _udpClient.BeginReceive(_receiveBuffer, 0, _receiveBuffer.Length, OnReceiveResult);
+
+ if (result.CompletedSynchronously)
{
- _logger.ErrorException("Error receiving udp message", ex);
+ OnReceiveResult(result);
}
}
+ catch (ObjectDisposedException)
+ {
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error receiving udp message", ex);
+ }
+ }
+
+ private void OnReceiveResult(IAsyncResult result)
+ {
+ if (_isDisposed)
+ {
+ return;
+ }
+
+ try
+ {
+ var socketResult = _udpClient.EndReceive(result);
+
+ OnMessageReceived(socketResult);
+ }
+ catch (ObjectDisposedException)
+ {
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error receiving udp message", ex);
+ }
+
+ BeginReceive();
}
/// <summary>
@@ -239,13 +267,13 @@ namespace Emby.Server.Implementations.Udp
try
{
- await _udpClient.SendWithLockAsync(bytes, bytes.Length, remoteEndPoint, CancellationToken.None).ConfigureAwait(false);
+ await _udpClient.SendToAsync(bytes, 0, bytes.Length, remoteEndPoint, CancellationToken.None).ConfigureAwait(false);
_logger.Info("Udp message sent to {0}", remoteEndPoint);
}
catch (OperationCanceledException)
{
-
+
}
catch (Exception ex)
{
diff --git a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
index ab63072386..f546133847 100644
--- a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
+++ b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs
@@ -11,9 +11,9 @@ using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Emby.Server.Implementations.Images;
-using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Collections;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
@@ -36,19 +36,20 @@ namespace Emby.Server.Implementations.UserViews
};
}
- protected override async Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var view = (CollectionFolder)item;
var recursive = !new[] { CollectionType.Playlists, CollectionType.Channels }.Contains(view.CollectionType ?? string.Empty, StringComparer.OrdinalIgnoreCase);
- var result = await view.GetItems(new InternalItemsQuery
+ var result = view.GetItems(new InternalItemsQuery
{
CollapseBoxSetItems = false,
Recursive = recursive,
- ExcludeItemTypes = new[] { "UserView", "CollectionFolder", "Playlist" }
+ ExcludeItemTypes = new[] { "UserView", "CollectionFolder", "Playlist" },
+ DtoOptions = new DtoOptions(false)
- }).ConfigureAwait(false);
+ });
var items = result.Items.Select(i =>
{
@@ -98,7 +99,7 @@ namespace Emby.Server.Implementations.UserViews
return item is CollectionFolder;
}
- protected override async Task<string> CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
+ protected override string CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
{
var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png");
@@ -109,10 +110,10 @@ namespace Emby.Server.Implementations.UserViews
return null;
}
- return await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540).ConfigureAwait(false);
+ return CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540);
}
- return await base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex).ConfigureAwait(false);
+ return base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex);
}
}
@@ -133,7 +134,7 @@ namespace Emby.Server.Implementations.UserViews
};
}
- protected override async Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var view = (ManualCollectionsFolder)item;
@@ -144,7 +145,8 @@ namespace Emby.Server.Implementations.UserViews
Recursive = recursive,
IncludeItemTypes = new[] { typeof(BoxSet).Name },
Limit = 20,
- SortBy = new[] { ItemSortBy.Random }
+ SortBy = new[] { ItemSortBy.Random },
+ DtoOptions = new DtoOptions(false)
});
return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8);
@@ -155,7 +157,7 @@ namespace Emby.Server.Implementations.UserViews
return item is ManualCollectionsFolder;
}
- protected override async Task<string> CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
+ protected override string CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
{
var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png");
@@ -166,10 +168,10 @@ namespace Emby.Server.Implementations.UserViews
return null;
}
- return await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540).ConfigureAwait(false);
+ return CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540);
}
- return await base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex).ConfigureAwait(false);
+ return base.CreateImage(item, itemsWithImages, outputPath, imageType, imageIndex);
}
}
diff --git a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs
index b8d03db3d3..cd2c4728f1 100644
--- a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs
+++ b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs
@@ -12,6 +12,7 @@ using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Emby.Server.Implementations.Images;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Extensions;
@@ -47,7 +48,7 @@ namespace Emby.Server.Implementations.UserViews
};
}
- protected override async Task<List<BaseItem>> GetItemsWithImages(IHasImages item)
+ protected override List<BaseItem> GetItemsWithImages(IHasImages item)
{
var view = (UserView)item;
@@ -58,7 +59,9 @@ namespace Emby.Server.Implementations.UserViews
IncludeItemTypes = new[] { typeof(LiveTvProgram).Name },
ImageTypes = new[] { ImageType.Primary },
Limit = 30,
- IsMovie = true
+ IsMovie = true,
+ DtoOptions = new DtoOptions(false)
+
}).ToList();
return GetFinalItems(programs).ToList();
@@ -67,9 +70,10 @@ namespace Emby.Server.Implementations.UserViews
if (string.Equals(view.ViewType, SpecialFolder.MovieGenre, StringComparison.OrdinalIgnoreCase) ||
string.Equals(view.ViewType, SpecialFolder.TvGenre, StringComparison.OrdinalIgnoreCase))
{
- var userItemsResult = await view.GetItems(new InternalItemsQuery
+ var userItemsResult = view.GetItems(new InternalItemsQuery
{
- CollapseBoxSetItems = false
+ CollapseBoxSetItems = false,
+ DtoOptions = new DtoOptions(false)
});
return userItemsResult.Items.ToList();
@@ -78,14 +82,14 @@ namespace Emby.Server.Implementations.UserViews
var isUsingCollectionStrip = IsUsingCollectionStrip(view);
var recursive = isUsingCollectionStrip && !new[] { CollectionType.Channels, CollectionType.BoxSets, CollectionType.Playlists }.Contains(view.ViewType ?? string.Empty, StringComparer.OrdinalIgnoreCase);
- var result = await view.GetItems(new InternalItemsQuery
+ var result = view.GetItems(new InternalItemsQuery
{
User = view.UserId.HasValue ? _userManager.GetUserById(view.UserId.Value) : null,
CollapseBoxSetItems = false,
Recursive = recursive,
ExcludeItemTypes = new[] { "UserView", "CollectionFolder", "Person" },
-
- }).ConfigureAwait(false);
+ DtoOptions = new DtoOptions(false)
+ });
var items = result.Items.Select(i =>
{
@@ -159,7 +163,7 @@ namespace Emby.Server.Implementations.UserViews
return collectionStripViewTypes.Contains(view.ViewType ?? string.Empty);
}
- protected override async Task<string> CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
+ protected override string CreateImage(IHasImages item, List<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
{
if (itemsWithImages.Count == 0)
{
@@ -168,7 +172,7 @@ namespace Emby.Server.Implementations.UserViews
var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png");
- return await CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540).ConfigureAwait(false);
+ return CreateThumbCollage(item, itemsWithImages, outputPath, 960, 540);
}
}
}
diff --git a/Emby.Server.sln b/Emby.Server.sln
deleted file mode 100644
index 002a7ae0e9..0000000000
--- a/Emby.Server.sln
+++ /dev/null
@@ -1,289 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D93082B7-8BA0-4F64-8772-F318C78773D7}"
- ProjectSection(SolutionItems) = preProject
- global.json = global.json
- EndProjectSection
-EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Emby.Server", "src\Emby.Server\Emby.Server.xproj", "{DDAFF431-0B3D-4857-8762-990A32DC8472}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Model", "MediaBrowser.Model\MediaBrowser.Model.csproj", "{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common", "MediaBrowser.Common\MediaBrowser.Common.csproj", "{9142EEFA-7570-41E1-BFCC-468BB571AF2F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.XbmcMetadata", "MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj", "{23499896-B135-4527-8574-C26E926EA99E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.LocalMetadata", "MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj", "{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.WebDashboard", "MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj", "{5624B7B5-B5A7-41D8-9F10-CC5611109619}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DvdLib", "DvdLib\DvdLib.csproj", "{713F42B5-878E-499D-A878-E4C652B1D5E8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BDInfo", "BDInfo\BDInfo.csproj", "{88AE38DF-19D7-406F-A6A9-09527719A21E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Providers", "MediaBrowser.Providers\MediaBrowser.Providers.csproj", "{442B5058-DCAF-4263-BB6A-F21E31120A1B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSubtitlesHandler", "OpenSubtitlesHandler\OpenSubtitlesHandler.csproj", "{4A4402D4-E910-443B-B8FC-2C18286A2CA0}"
-EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Emby.Common.Implementations", "Emby.Common.Implementations\Emby.Common.Implementations.xproj", "{5A27010A-09C6-4E86-93EA-437484C10917}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Photos", "Emby.Photos\Emby.Photos.csproj", "{89AB4548-770D-41FD-A891-8DAFF44F452C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Api", "MediaBrowser.Api\MediaBrowser.Api.csproj", "{4FD51AC5-2C16-4308-A993-C3A84F3B4582}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.MediaEncoding", "MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj", "{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RSSDP", "RSSDP\RSSDP.csproj", "{21002819-C39A-4D3E-BE83-2A276A77FB1F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Dlna", "Emby.Dlna\Emby.Dlna.csproj", "{805844AB-E92F-45E6-9D99-4F6D48D129A5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Implementations", "MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj", "{2E781478-814D-4A48-9D80-BFF206441A65}"
-EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Mono.Nat", "Mono.Nat\Mono.Nat.xproj", "{4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Implementations", "Emby.Server.Implementations\Emby.Server.Implementations.csproj", "{E383961B-9356-4D5D-8233-9A1079D03055}"
-EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Emby.Server.Core", "Emby.Server.Core\Emby.Server.Core.xproj", "{65AA7D67-8059-40CD-91F1-16D02687226C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing", "Emby.Drawing\Emby.Drawing.csproj", "{08FFF49B-F175-4807-A2B5-73B0EBD9F716}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHttpListener.Portable", "SocketHttpListener.Portable\SocketHttpListener.Portable.csproj", "{4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release Mono|Any CPU = Release Mono|Any CPU
- Release|Any CPU = Release|Any CPU
- Signed|Any CPU = Signed|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Release|Any CPU.Build.0 = Release|Any CPU
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {DDAFF431-0B3D-4857-8762-990A32DC8472}.Signed|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|Any CPU.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Any CPU.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.Build.0 = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.Build.0 = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|Any CPU.Build.0 = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.Build.0 = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Any CPU.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|Any CPU.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Any CPU.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|Any CPU.Build.0 = Release|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Release|Any CPU.Build.0 = Release|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Signed|Any CPU.ActiveCfg = Signed|Any CPU
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA}.Signed|Any CPU.Build.0 = Signed|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {DDAFF431-0B3D-4857-8762-990A32DC8472} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {23499896-B135-4527-8574-C26E926EA99E} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {5624B7B5-B5A7-41D8-9F10-CC5611109619} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {713F42B5-878E-499D-A878-E4C652B1D5E8} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {88AE38DF-19D7-406F-A6A9-09527719A21E} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {442B5058-DCAF-4263-BB6A-F21E31120A1B} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {5A27010A-09C6-4E86-93EA-437484C10917} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {89AB4548-770D-41FD-A891-8DAFF44F452C} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {21002819-C39A-4D3E-BE83-2A276A77FB1F} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {805844AB-E92F-45E6-9D99-4F6D48D129A5} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {2E781478-814D-4A48-9D80-BFF206441A65} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {E383961B-9356-4D5D-8233-9A1079D03055} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {65AA7D67-8059-40CD-91F1-16D02687226C} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {680A1709-25EB-4D52-A87F-EE03FFD94BAA} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E} = {8ADD772F-F0A4-4A53-9B2F-AF4A4C585839}
- EndGlobalSection
-EndGlobal
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs
index 53e4749820..e4abe96f3a 100644
--- a/MediaBrowser.Api/ApiEntryPoint.cs
+++ b/MediaBrowser.Api/ApiEntryPoint.cs
@@ -15,7 +15,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Diagnostics;
@@ -399,7 +399,7 @@ namespace MediaBrowser.Api
}
}
- private async void PingTimer(TranscodingJob job, bool isProgressCheckIn)
+ private void PingTimer(TranscodingJob job, bool isProgressCheckIn)
{
if (job.HasExited)
{
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs
index a802e56af0..0f1d240d0c 100644
--- a/MediaBrowser.Api/BaseApiService.cs
+++ b/MediaBrowser.Api/BaseApiService.cs
@@ -151,16 +151,6 @@ namespace MediaBrowser.Api
options.Fields.Add(Model.Querying.ItemFields.ChildCount);
}
- if (client.IndexOf("web", StringComparison.OrdinalIgnoreCase) == -1 &&
-
- // covers both emby mobile and emby for android mobile
- client.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) == -1 &&
- client.IndexOf("ios", StringComparison.OrdinalIgnoreCase) == -1 &&
- client.IndexOf("theater", StringComparison.OrdinalIgnoreCase) == -1)
- {
- options.Fields.Add(Model.Querying.ItemFields.ChildCount);
- }
-
var hasDtoOptions = request as IHasDtoOptions;
if (hasDtoOptions != null)
{
@@ -184,14 +174,15 @@ namespace MediaBrowser.Api
return options;
}
- protected MusicArtist GetArtist(string name, ILibraryManager libraryManager)
+ protected MusicArtist GetArtist(string name, ILibraryManager libraryManager, DtoOptions dtoOptions)
{
if (name.IndexOf(BaseItem.SlugChar) != -1)
{
var result = libraryManager.GetItemList(new InternalItemsQuery
{
SlugName = name,
- IncludeItemTypes = new[] { typeof(MusicArtist).Name }
+ IncludeItemTypes = new[] { typeof(MusicArtist).Name },
+ DtoOptions = dtoOptions
}).OfType<MusicArtist>().FirstOrDefault();
@@ -201,17 +192,18 @@ namespace MediaBrowser.Api
}
}
- return libraryManager.GetArtist(name);
+ return libraryManager.GetArtist(name, dtoOptions);
}
- protected Studio GetStudio(string name, ILibraryManager libraryManager)
+ protected Studio GetStudio(string name, ILibraryManager libraryManager, DtoOptions dtoOptions)
{
if (name.IndexOf(BaseItem.SlugChar) != -1)
{
var result = libraryManager.GetItemList(new InternalItemsQuery
{
SlugName = name,
- IncludeItemTypes = new[] { typeof(Studio).Name }
+ IncludeItemTypes = new[] { typeof(Studio).Name },
+ DtoOptions = dtoOptions
}).OfType<Studio>().FirstOrDefault();
@@ -224,14 +216,15 @@ namespace MediaBrowser.Api
return libraryManager.GetStudio(name);
}
- protected Genre GetGenre(string name, ILibraryManager libraryManager)
+ protected Genre GetGenre(string name, ILibraryManager libraryManager, DtoOptions dtoOptions)
{
if (name.IndexOf(BaseItem.SlugChar) != -1)
{
var result = libraryManager.GetItemList(new InternalItemsQuery
{
SlugName = name,
- IncludeItemTypes = new[] { typeof(Genre).Name }
+ IncludeItemTypes = new[] { typeof(Genre).Name },
+ DtoOptions = dtoOptions
}).OfType<Genre>().FirstOrDefault();
@@ -244,14 +237,15 @@ namespace MediaBrowser.Api
return libraryManager.GetGenre(name);
}
- protected MusicGenre GetMusicGenre(string name, ILibraryManager libraryManager)
+ protected MusicGenre GetMusicGenre(string name, ILibraryManager libraryManager, DtoOptions dtoOptions)
{
if (name.IndexOf(BaseItem.SlugChar) != -1)
{
var result = libraryManager.GetItemList(new InternalItemsQuery
{
SlugName = name,
- IncludeItemTypes = new[] { typeof(MusicGenre).Name }
+ IncludeItemTypes = new[] { typeof(MusicGenre).Name },
+ DtoOptions = dtoOptions
}).OfType<MusicGenre>().FirstOrDefault();
@@ -264,14 +258,15 @@ namespace MediaBrowser.Api
return libraryManager.GetMusicGenre(name);
}
- protected GameGenre GetGameGenre(string name, ILibraryManager libraryManager)
+ protected GameGenre GetGameGenre(string name, ILibraryManager libraryManager, DtoOptions dtoOptions)
{
if (name.IndexOf(BaseItem.SlugChar) != -1)
{
var result = libraryManager.GetItemList(new InternalItemsQuery
{
SlugName = name,
- IncludeItemTypes = new[] { typeof(GameGenre).Name }
+ IncludeItemTypes = new[] { typeof(GameGenre).Name },
+ DtoOptions = dtoOptions
}).OfType<GameGenre>().FirstOrDefault();
@@ -284,14 +279,15 @@ namespace MediaBrowser.Api
return libraryManager.GetGameGenre(name);
}
- protected Person GetPerson(string name, ILibraryManager libraryManager)
+ protected Person GetPerson(string name, ILibraryManager libraryManager, DtoOptions dtoOptions)
{
if (name.IndexOf(BaseItem.SlugChar) != -1)
{
var result = libraryManager.GetItemList(new InternalItemsQuery
{
SlugName = name,
- IncludeItemTypes = new[] { typeof(Person).Name }
+ IncludeItemTypes = new[] { typeof(Person).Name },
+ DtoOptions = dtoOptions
}).OfType<Person>().FirstOrDefault();
@@ -339,37 +335,33 @@ namespace MediaBrowser.Api
/// <summary>
/// Gets the name of the item by.
/// </summary>
- /// <param name="name">The name.</param>
- /// <param name="type">The type.</param>
- /// <param name="libraryManager">The library manager.</param>
- /// <returns>Task{BaseItem}.</returns>
- protected BaseItem GetItemByName(string name, string type, ILibraryManager libraryManager)
+ protected BaseItem GetItemByName(string name, string type, ILibraryManager libraryManager, DtoOptions dtoOptions)
{
BaseItem item;
if (type.IndexOf("Person", StringComparison.OrdinalIgnoreCase) == 0)
{
- item = GetPerson(name, libraryManager);
+ item = GetPerson(name, libraryManager, dtoOptions);
}
else if (type.IndexOf("Artist", StringComparison.OrdinalIgnoreCase) == 0)
{
- item = GetArtist(name, libraryManager);
+ item = GetArtist(name, libraryManager, dtoOptions);
}
else if (type.IndexOf("Genre", StringComparison.OrdinalIgnoreCase) == 0)
{
- item = GetGenre(name, libraryManager);
+ item = GetGenre(name, libraryManager, dtoOptions);
}
else if (type.IndexOf("MusicGenre", StringComparison.OrdinalIgnoreCase) == 0)
{
- item = GetMusicGenre(name, libraryManager);
+ item = GetMusicGenre(name, libraryManager, dtoOptions);
}
else if (type.IndexOf("GameGenre", StringComparison.OrdinalIgnoreCase) == 0)
{
- item = GetGameGenre(name, libraryManager);
+ item = GetGameGenre(name, libraryManager, dtoOptions);
}
else if (type.IndexOf("Studio", StringComparison.OrdinalIgnoreCase) == 0)
{
- item = GetStudio(name, libraryManager);
+ item = GetStudio(name, libraryManager, dtoOptions);
}
else if (type.IndexOf("Year", StringComparison.OrdinalIgnoreCase) == 0)
{
diff --git a/MediaBrowser.Api/ConfigurationService.cs b/MediaBrowser.Api/ConfigurationService.cs
index 5dbb4b42aa..8d5f46962c 100644
--- a/MediaBrowser.Api/ConfigurationService.cs
+++ b/MediaBrowser.Api/ConfigurationService.cs
@@ -8,7 +8,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.MediaEncoding;
@@ -113,8 +113,7 @@ namespace MediaBrowser.Api
public void Post(UpdateMediaEncoderPath request)
{
- var task = _mediaEncoder.UpdateEncoderPath(request.Path, request.PathType);
- Task.WaitAll(task);
+ _mediaEncoder.UpdateEncoderPath(request.Path, request.PathType);
}
/// <summary>
diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs
index 8125951b5d..6e59cceecd 100644
--- a/MediaBrowser.Api/Dlna/DlnaServerService.cs
+++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs
@@ -5,7 +5,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
diff --git a/MediaBrowser.Api/FilterService.cs b/MediaBrowser.Api/FilterService.cs
index dc2f8e1364..a1f891506a 100644
--- a/MediaBrowser.Api/FilterService.cs
+++ b/MediaBrowser.Api/FilterService.cs
@@ -52,7 +52,7 @@ namespace MediaBrowser.Api
_userManager = userManager;
}
- public async Task<object> Get(GetQueryFilters request)
+ public object Get(GetQueryFilters request)
{
var parentItem = string.IsNullOrEmpty(request.ParentId) ? null : _libraryManager.GetItemById(request.ParentId);
var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
@@ -61,7 +61,7 @@ namespace MediaBrowser.Api
user == null ? _libraryManager.RootFolder : user.RootFolder :
parentItem;
- var result = await ((Folder)item).GetItems(GetItemsQuery(request, user));
+ var result = ((Folder)item).GetItems(GetItemsQuery(request, user));
return ToOptimizedResult(GetFilters(result.Items));
}
diff --git a/MediaBrowser.Api/GamesService.cs b/MediaBrowser.Api/GamesService.cs
index a9394b52e4..2d161ccfd5 100644
--- a/MediaBrowser.Api/GamesService.cs
+++ b/MediaBrowser.Api/GamesService.cs
@@ -110,7 +110,11 @@ namespace MediaBrowser.Api
var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId);
var query = new InternalItemsQuery(user)
{
- IncludeItemTypes = new[] { typeof(GameSystem).Name }
+ IncludeItemTypes = new[] { typeof(GameSystem).Name },
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
};
var gameSystems = _libraryManager.GetItemList(query)
.Cast<GameSystem>()
@@ -130,7 +134,11 @@ namespace MediaBrowser.Api
var user = request.UserId == null ? null : _userManager.GetUserById(request.UserId);
var query = new InternalItemsQuery(user)
{
- IncludeItemTypes = new[] { typeof(Game).Name }
+ IncludeItemTypes = new[] { typeof(Game).Name },
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
};
var games = _libraryManager.GetItemList(query)
.Cast<Game>()
@@ -167,7 +175,11 @@ namespace MediaBrowser.Api
system.GetRecursiveChildren(i => i is Game) :
system.GetRecursiveChildren(user, new InternalItemsQuery(user)
{
- IncludeItemTypes = new[] { typeof(Game).Name }
+ IncludeItemTypes = new[] { typeof(Game).Name },
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
});
var games = items.Cast<Game>().ToList();
diff --git a/MediaBrowser.Api/Images/ImageByNameService.cs b/MediaBrowser.Api/Images/ImageByNameService.cs
index 2c8fc2d614..2100e9e91e 100644
--- a/MediaBrowser.Api/Images/ImageByNameService.cs
+++ b/MediaBrowser.Api/Images/ImageByNameService.cs
@@ -8,8 +8,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index 9f144c8e45..882967a53c 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -14,7 +14,8 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
@@ -406,7 +407,7 @@ namespace MediaBrowser.Api.Images
{
var type = GetPathValue(0);
- var item = GetItemByName(request.Name, type, _libraryManager);
+ var item = GetItemByName(request.Name, type, _libraryManager, new DtoOptions(false));
return GetImage(request, item, false);
}
@@ -415,7 +416,7 @@ namespace MediaBrowser.Api.Images
{
var type = GetPathValue(0);
- var item = GetItemByName(request.Name, type, _libraryManager);
+ var item = GetItemByName(request.Name, type, _libraryManager, new DtoOptions(false));
return GetImage(request, item, true);
}
@@ -617,6 +618,8 @@ namespace MediaBrowser.Api.Images
ImageIndex = request.Index ?? 0,
Image = image,
Item = item,
+ ItemId = item.Id.ToString("N"),
+ ItemType = item.GetType().Name,
MaxHeight = request.MaxHeight,
MaxWidth = request.MaxWidth,
Quality = request.Quality ?? 100,
diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs
index ebd8b89517..e4f3fd3d76 100644
--- a/MediaBrowser.Api/Images/RemoteImageService.cs
+++ b/MediaBrowser.Api/Images/RemoteImageService.cs
@@ -14,7 +14,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
@@ -141,11 +141,6 @@ namespace MediaBrowser.Api.Images
{
var item = _libraryManager.GetItemById(request.Id);
- return await GetRemoteImageResult(item, request).ConfigureAwait(false);
- }
-
- private async Task<RemoteImageResult> GetRemoteImageResult(BaseItem item, BaseRemoteImageRequest request)
- {
var images = await _providerManager.GetAvailableRemoteImages(item, new RemoteImageQuery
{
ProviderName = request.ProviderName,
diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs
index bca292241b..534089848e 100644
--- a/MediaBrowser.Api/ItemRefreshService.cs
+++ b/MediaBrowser.Api/ItemRefreshService.cs
@@ -3,7 +3,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Providers;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index e654cc8f6a..4e0bdc8a96 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -21,7 +21,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
@@ -427,7 +427,11 @@ namespace MediaBrowser.Api.Library
{
var series = _libraryManager.GetItemList(new InternalItemsQuery
{
- IncludeItemTypes = new[] { typeof(Series).Name }
+ IncludeItemTypes = new[] { typeof(Series).Name },
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
}).Where(i => string.Equals(request.TvdbId, i.GetProviderId(MetadataProviders.Tvdb), StringComparison.OrdinalIgnoreCase)).ToArray();
@@ -448,7 +452,11 @@ namespace MediaBrowser.Api.Library
{
var movies = _libraryManager.GetItemList(new InternalItemsQuery
{
- IncludeItemTypes = new[] { typeof(Movie).Name }
+ IncludeItemTypes = new[] { typeof(Movie).Name },
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
}).ToArray();
@@ -668,7 +676,11 @@ namespace MediaBrowser.Api.Library
Recursive = true,
IsVirtualItem = false,
SourceTypes = new[] { SourceType.Library },
- IsFavorite = request.IsFavorite
+ IsFavorite = request.IsFavorite,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
};
return _libraryManager.GetItemsResult(query).TotalRecordCount;
@@ -898,7 +910,11 @@ namespace MediaBrowser.Api.Library
var query = new InternalItemsQuery(user)
{
IncludeItemTypes = includeTypes,
- Recursive = true
+ Recursive = true,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
};
var items = _libraryManager.GetItemList(query);
diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs
index c3bb80dcb5..8e396ff57a 100644
--- a/MediaBrowser.Api/Library/LibraryStructureService.cs
+++ b/MediaBrowser.Api/Library/LibraryStructureService.cs
@@ -8,7 +8,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs
index 9fcdb4be56..837a0f6a6b 100644
--- a/MediaBrowser.Api/LiveTv/LiveTvService.cs
+++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs
@@ -17,11 +17,12 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Api.Playback.Progressive;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Services;
+using MediaBrowser.Model.System;
namespace MediaBrowser.Api.LiveTv
{
@@ -698,8 +699,9 @@ namespace MediaBrowser.Api.LiveTv
private readonly IFileSystem _fileSystem;
private readonly IAuthorizationContext _authContext;
private readonly ISessionContext _sessionContext;
+ private readonly IEnvironmentInfo _environment;
- public LiveTvService(ILiveTvManager liveTvManager, IUserManager userManager, IServerConfigurationManager config, IHttpClient httpClient, ILibraryManager libraryManager, IDtoService dtoService, IFileSystem fileSystem, IAuthorizationContext authContext, ISessionContext sessionContext)
+ public LiveTvService(ILiveTvManager liveTvManager, IUserManager userManager, IServerConfigurationManager config, IHttpClient httpClient, ILibraryManager libraryManager, IDtoService dtoService, IFileSystem fileSystem, IAuthorizationContext authContext, ISessionContext sessionContext, IEnvironmentInfo environment)
{
_liveTvManager = liveTvManager;
_userManager = userManager;
@@ -710,6 +712,7 @@ namespace MediaBrowser.Api.LiveTv
_fileSystem = fileSystem;
_authContext = authContext;
_sessionContext = sessionContext;
+ _environment = environment;
}
public object Get(GetTunerHostTypes request)
@@ -731,7 +734,7 @@ namespace MediaBrowser.Api.LiveTv
outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType(path);
- return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, null, Logger, CancellationToken.None)
+ return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, null, Logger, _environment, CancellationToken.None)
{
AllowEndOfFile = false
};
@@ -750,7 +753,7 @@ namespace MediaBrowser.Api.LiveTv
outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType("file." + request.Container);
- return new ProgressiveFileCopier(directStreamProvider, outputHeaders, null, Logger, CancellationToken.None)
+ return new ProgressiveFileCopier(directStreamProvider, outputHeaders, null, Logger, _environment, CancellationToken.None)
{
AllowEndOfFile = false
};
@@ -889,6 +892,8 @@ namespace MediaBrowser.Api.LiveTv
public async Task<object> Get(GetChannels request)
{
+ var options = GetDtoOptions(_authContext, request);
+
var channelResult = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery
{
ChannelType = request.Type,
@@ -908,11 +913,10 @@ namespace MediaBrowser.Api.LiveTv
SortOrder = request.SortOrder ?? SortOrder.Ascending,
AddCurrentProgram = request.AddCurrentProgram
- }, CancellationToken.None).ConfigureAwait(false);
+ }, options, CancellationToken.None).ConfigureAwait(false);
var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId);
- var options = GetDtoOptions(_authContext, request);
RemoveFields(options);
options.AddCurrentProgram = request.AddCurrentProgram;
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index ff77497954..a798ab5ff5 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -33,14 +33,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <DebugType>none</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index b5c6f52fc0..e20fa2cca1 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -36,7 +36,7 @@ namespace MediaBrowser.Api.Movies
}
[Route("/Movies/Recommendations", "GET", Summary = "Gets movie recommendations")]
- public class GetMovieRecommendations : IReturn<RecommendationDto[]>, IHasItemFields
+ public class GetMovieRecommendations : IReturn<RecommendationDto[]>, IHasDtoOptions
{
[ApiMember(Name = "CategoryLimit", Description = "The max number of categories to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public int CategoryLimit { get; set; }
@@ -58,6 +58,18 @@ namespace MediaBrowser.Api.Movies
[ApiMember(Name = "ParentId", Description = "Specify this to localize the search to a specific item or folder. Omit to use the root", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string ParentId { get; set; }
+ [ApiMember(Name = "EnableImages", Description = "Optional, include image information in output", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")]
+ public bool? EnableImages { get; set; }
+
+ [ApiMember(Name = "EnableUserData", Description = "Optional, include user data", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")]
+ public bool? EnableUserData { get; set; }
+
+ [ApiMember(Name = "ImageTypeLimit", Description = "Optional, the max number of images to return, per image type", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+ public int? ImageTypeLimit { get; set; }
+
+ [ApiMember(Name = "EnableImageTypes", Description = "Optional. The image types to include in the output.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
+ public string EnableImageTypes { get; set; }
+
public GetMovieRecommendations()
{
CategoryLimit = 5;
@@ -115,14 +127,12 @@ namespace MediaBrowser.Api.Movies
return ToOptimizedSerializedResultUsingCache(result);
}
- public async Task<object> Get(GetMovieRecommendations request)
+ public object Get(GetMovieRecommendations request)
{
var user = _userManager.GetUserById(request.UserId);
var dtoOptions = GetDtoOptions(_authContext, request);
- dtoOptions.Fields = request.GetItemFields().ToList();
-
var result = GetRecommendationCategories(user, request.ParentId, request.CategoryLimit, request.ItemLimit, dtoOptions);
return ToOptimizedResult(result);
diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs
index d735dd7cd0..3cb29de072 100644
--- a/MediaBrowser.Api/Music/InstantMixService.cs
+++ b/MediaBrowser.Api/Music/InstantMixService.cs
@@ -85,9 +85,11 @@ namespace MediaBrowser.Api.Music
var user = _userManager.GetUserById(request.UserId);
- var items = _musicManager.GetInstantMixFromItem(item, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
+ var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions);
- return GetResult(items, user, request);
+ return GetResult(items, user, request, dtoOptions);
}
public Task<object> Get(GetInstantMixFromArtistId request)
@@ -96,9 +98,11 @@ namespace MediaBrowser.Api.Music
var user = _userManager.GetUserById(request.UserId);
- var items = _musicManager.GetInstantMixFromItem(item, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
- return GetResult(items, user, request);
+ var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions);
+
+ return GetResult(items, user, request, dtoOptions);
}
public Task<object> Get(GetInstantMixFromMusicGenreId request)
@@ -107,9 +111,11 @@ namespace MediaBrowser.Api.Music
var user = _userManager.GetUserById(request.UserId);
- var items = _musicManager.GetInstantMixFromItem(item, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
- return GetResult(items, user, request);
+ var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions);
+
+ return GetResult(items, user, request, dtoOptions);
}
public Task<object> Get(GetInstantMixFromSong request)
@@ -118,9 +124,11 @@ namespace MediaBrowser.Api.Music
var user = _userManager.GetUserById(request.UserId);
- var items = _musicManager.GetInstantMixFromItem(item, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
+ var items = _musicManager.GetInstantMixFromItem(item, user, dtoOptions);
- return GetResult(items, user, request);
+ return GetResult(items, user, request, dtoOptions);
}
public Task<object> Get(GetInstantMixFromAlbum request)
@@ -129,9 +137,11 @@ namespace MediaBrowser.Api.Music
var user = _userManager.GetUserById(request.UserId);
- var items = _musicManager.GetInstantMixFromItem(album, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
+ var items = _musicManager.GetInstantMixFromItem(album, user, dtoOptions);
- return GetResult(items, user, request);
+ return GetResult(items, user, request, dtoOptions);
}
public Task<object> Get(GetInstantMixFromPlaylist request)
@@ -140,31 +150,37 @@ namespace MediaBrowser.Api.Music
var user = _userManager.GetUserById(request.UserId);
- var items = _musicManager.GetInstantMixFromItem(playlist, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
+ var items = _musicManager.GetInstantMixFromItem(playlist, user, dtoOptions);
- return GetResult(items, user, request);
+ return GetResult(items, user, request, dtoOptions);
}
public Task<object> Get(GetInstantMixFromMusicGenre request)
{
var user = _userManager.GetUserById(request.UserId);
- var items = _musicManager.GetInstantMixFromGenres(new[] { request.Name }, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
+ var items = _musicManager.GetInstantMixFromGenres(new[] { request.Name }, user, dtoOptions);
- return GetResult(items, user, request);
+ return GetResult(items, user, request, dtoOptions);
}
public Task<object> Get(GetInstantMixFromArtist request)
{
var user = _userManager.GetUserById(request.UserId);
- var artist = _libraryManager.GetArtist(request.Name);
+ var artist = _libraryManager.GetArtist(request.Name, new DtoOptions(false));
- var items = _musicManager.GetInstantMixFromArtist(artist, user);
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
+ var items = _musicManager.GetInstantMixFromArtist(artist, user, dtoOptions);
- return GetResult(items, user, request);
+ return GetResult(items, user, request, dtoOptions);
}
- private async Task<object> GetResult(IEnumerable<Audio> items, User user, BaseGetSimilarItems request)
+ private async Task<object> GetResult(IEnumerable<Audio> items, User user, BaseGetSimilarItems request, DtoOptions dtoOptions)
{
var list = items.ToList();
@@ -173,8 +189,6 @@ namespace MediaBrowser.Api.Music
TotalRecordCount = list.Count
};
- var dtoOptions = GetDtoOptions(_authContext, request);
-
result.Items = (await _dtoService.GetBaseItemDtos(list.Take(request.Limit ?? list.Count), dtoOptions, user).ConfigureAwait(false)).ToArray();
return ToOptimizedResult(result);
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 6edeb960a8..3ffa26450f 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -880,6 +880,7 @@ namespace MediaBrowser.Api.Playback
state.TargetPacketLength,
state.TargetTimestamp,
state.IsTargetAnamorphic,
+ state.IsTargetInterlaced,
state.TargetRefFrames,
state.TargetVideoStreamCount,
state.TargetAudioStreamCount,
@@ -989,6 +990,7 @@ namespace MediaBrowser.Api.Playback
state.TargetPacketLength,
state.TranscodeSeekInfo,
state.IsTargetAnamorphic,
+ state.IsTargetInterlaced,
state.TargetRefFrames,
state.TargetVideoStreamCount,
state.TargetAudioStreamCount,
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index d64c009a07..4003fb4634 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -542,6 +542,12 @@ namespace MediaBrowser.Api.Playback.Hls
var queryStringIndex = Request.RawUrl.IndexOf('?');
var queryString = queryStringIndex == -1 ? string.Empty : Request.RawUrl.Substring(queryStringIndex);
+ // from universal audio service
+ if (queryString.IndexOf("SegmentContainer", StringComparison.OrdinalIgnoreCase) == -1 && !string.IsNullOrWhiteSpace(state.Request.SegmentContainer))
+ {
+ queryString += "&SegmentContainer=" + state.Request.SegmentContainer;
+ }
+
// Main stream
var playlistUrl = isLiveStream ? "live.m3u8" : "main.m3u8";
@@ -918,60 +924,43 @@ namespace MediaBrowser.Api.Playback.Hls
var startNumberParam = isEncoding ? startNumber.ToString(UsCulture) : "0";
var mapArgs = state.IsOutputVideo ? EncodingHelper.GetMapArgs(state) : string.Empty;
- var useGenericSegmenter = true;
- if (useGenericSegmenter)
+ var outputTsArg = Path.Combine(FileSystem.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state.Request);
+
+ var timeDeltaParam = String.Empty;
+
+ if (isEncoding && startNumber > 0)
{
- var outputTsArg = Path.Combine(FileSystem.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath)) + "%d" + GetSegmentFileExtension(state.Request);
+ var startTime = state.SegmentLength * startNumber;
+ timeDeltaParam = string.Format("-segment_time_delta -{0}", startTime);
+ }
- var timeDeltaParam = String.Empty;
+ var segmentFormat = GetSegmentFileExtension(state.Request).TrimStart('.');
+ if (string.Equals(segmentFormat, "ts", StringComparison.OrdinalIgnoreCase))
+ {
+ segmentFormat = "mpegts";
+ }
- if (isEncoding && startNumber > 0)
- {
- var startTime = state.SegmentLength * startNumber;
- timeDeltaParam = string.Format("-segment_time_delta -{0}", startTime);
- }
+ var videoCodec = EncodingHelper.GetVideoEncoder(state, ApiEntryPoint.Instance.GetEncodingOptions());
+ var breakOnNonKeyFrames = state.EnableBreakOnNonKeyFrames(videoCodec);
- var segmentFormat = GetSegmentFileExtension(state.Request).TrimStart('.');
- if (string.Equals(segmentFormat, "ts", StringComparison.OrdinalIgnoreCase))
- {
- segmentFormat = "mpegts";
- }
+ var breakOnNonKeyFramesArg = breakOnNonKeyFrames ? " -break_non_keyframes 1" : "";
- var videoCodec = EncodingHelper.GetVideoEncoder(state, ApiEntryPoint.Instance.GetEncodingOptions());
- var breakOnNonKeyFrames = state.EnableBreakOnNonKeyFrames(videoCodec);
-
- var breakOnNonKeyFramesArg = breakOnNonKeyFrames ? " -break_non_keyframes 1" : "";
-
- return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0{12} -segment_format {11} -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"",
- inputModifier,
- EncodingHelper.GetInputArgument(state, encodingOptions),
- threads,
- mapArgs,
- GetVideoArguments(state),
- GetAudioArguments(state),
- state.SegmentLength.ToString(UsCulture),
- startNumberParam,
- outputPath,
- outputTsArg,
- timeDeltaParam,
- segmentFormat,
- breakOnNonKeyFramesArg
- ).Trim();
- }
-
- return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -hls_time {6} -individual_header_trailer 0 -start_number {7} -hls_list_size {8} -y \"{9}\"",
- inputModifier,
- EncodingHelper.GetInputArgument(state, encodingOptions),
- threads,
- mapArgs,
- GetVideoArguments(state),
- GetAudioArguments(state),
- state.SegmentLength.ToString(UsCulture),
- startNumberParam,
- state.HlsListSize.ToString(UsCulture),
- outputPath
- ).Trim();
+ return string.Format("{0} {1} -map_metadata -1 -map_chapters -1 -threads {2} {3} {4} {5} -f segment -max_delay 5000000 -avoid_negative_ts disabled -start_at_zero -segment_time {6} {10} -individual_header_trailer 0{12} -segment_format {11} -segment_list_type m3u8 -segment_start_number {7} -segment_list \"{8}\" -y \"{9}\"",
+ inputModifier,
+ EncodingHelper.GetInputArgument(state, encodingOptions),
+ threads,
+ mapArgs,
+ GetVideoArguments(state),
+ GetAudioArguments(state),
+ state.SegmentLength.ToString(UsCulture),
+ startNumberParam,
+ outputPath,
+ outputTsArg,
+ timeDeltaParam,
+ segmentFormat,
+ breakOnNonKeyFramesArg
+ ).Trim();
}
}
} \ No newline at end of file
diff --git a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
index 0ff52e63f5..52cc025283 100644
--- a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
+++ b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
@@ -5,7 +5,7 @@ using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
diff --git a/MediaBrowser.Api/Playback/MediaInfoService.cs b/MediaBrowser.Api/Playback/MediaInfoService.cs
index fcd18bfe47..55fe738e89 100644
--- a/MediaBrowser.Api/Playback/MediaInfoService.cs
+++ b/MediaBrowser.Api/Playback/MediaInfoService.cs
@@ -127,7 +127,7 @@ namespace MediaBrowser.Api.Playback
SetDeviceSpecificData(item, result.MediaSource, profile, authInfo, request.MaxStreamingBitrate,
request.StartTimeTicks ?? 0, result.MediaSource.Id, request.AudioStreamIndex,
- request.SubtitleStreamIndex, request.MaxAudioChannels, request.PlaySessionId, request.UserId, true, true, true, true, true, true);
+ request.SubtitleStreamIndex, request.MaxAudioChannels, request.PlaySessionId, request.UserId, request.EnableDirectPlay, request.ForceDirectPlayRemoteMediaSource, request.EnableDirectStream, true, true, true);
}
else
{
diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
index f0386d5ba1..af8670eb15 100644
--- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
@@ -9,11 +9,10 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
using System.Collections.Generic;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
+using MediaBrowser.Model.System;
namespace MediaBrowser.Api.Playback.Progressive
{
@@ -35,6 +34,10 @@ namespace MediaBrowser.Api.Playback.Progressive
//[Authenticated]
public class AudioService : BaseProgressiveStreamingService
{
+ public AudioService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor, IEnvironmentInfo environmentInfo) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer, authorizationContext, imageProcessor, environmentInfo)
+ {
+ }
+
/// <summary>
/// Gets the specified request.
/// </summary>
@@ -61,9 +64,5 @@ namespace MediaBrowser.Api.Playback.Progressive
return EncodingHelper.GetProgressiveAudioFullCommandLine(state, encodingOptions, outputPath);
}
-
- public AudioService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer, authorizationContext, imageProcessor)
- {
- }
}
}
diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
index 646a91c275..db5c78a2f2 100644
--- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
@@ -16,6 +16,7 @@ using System.IO;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.Services;
+using MediaBrowser.Model.System;
namespace MediaBrowser.Api.Playback.Progressive
{
@@ -25,10 +26,12 @@ namespace MediaBrowser.Api.Playback.Progressive
public abstract class BaseProgressiveStreamingService : BaseStreamingService
{
protected readonly IImageProcessor ImageProcessor;
+ protected readonly IEnvironmentInfo EnvironmentInfo;
- public BaseProgressiveStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer, authorizationContext)
+ public BaseProgressiveStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor, IEnvironmentInfo environmentInfo) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer, authorizationContext)
{
ImageProcessor = imageProcessor;
+ EnvironmentInfo = environmentInfo;
}
/// <summary>
@@ -130,7 +133,7 @@ namespace MediaBrowser.Api.Playback.Progressive
// TODO: Don't hardcode this
outputHeaders["Content-Type"] = MediaBrowser.Model.Net.MimeTypes.GetMimeType("file.ts");
- return new ProgressiveFileCopier(state.DirectStreamProvider, outputHeaders, null, Logger, CancellationToken.None)
+ return new ProgressiveFileCopier(state.DirectStreamProvider, outputHeaders, null, Logger, EnvironmentInfo, CancellationToken.None)
{
AllowEndOfFile = false
};
@@ -174,7 +177,7 @@ namespace MediaBrowser.Api.Playback.Progressive
outputHeaders["Content-Type"] = contentType;
- return new ProgressiveFileCopier(FileSystem, state.MediaPath, outputHeaders, null, Logger, CancellationToken.None)
+ return new ProgressiveFileCopier(FileSystem, state.MediaPath, outputHeaders, null, Logger, EnvironmentInfo, CancellationToken.None)
{
AllowEndOfFile = false
};
@@ -398,7 +401,7 @@ namespace MediaBrowser.Api.Playback.Progressive
outputHeaders[item.Key] = item.Value;
}
- return new ProgressiveFileCopier(FileSystem, outputPath, outputHeaders, job, Logger, CancellationToken.None);
+ return new ProgressiveFileCopier(FileSystem, outputPath, outputHeaders, job, Logger, EnvironmentInfo, CancellationToken.None);
}
finally
{
diff --git a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
index a33fbcbcfd..9061261f5a 100644
--- a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
+++ b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
@@ -6,10 +6,11 @@ using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Net;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Services;
+using MediaBrowser.Model.System;
namespace MediaBrowser.Api.Playback.Progressive
{
@@ -22,16 +23,16 @@ namespace MediaBrowser.Api.Playback.Progressive
private readonly CancellationToken _cancellationToken;
private readonly Dictionary<string, string> _outputHeaders;
- // 256k
- private const int BufferSize = 81920;
+ const int StreamCopyToBufferSize = 81920;
private long _bytesWritten = 0;
public long StartPosition { get; set; }
public bool AllowEndOfFile = true;
private readonly IDirectStreamProvider _directStreamProvider;
+ private readonly IEnvironmentInfo _environment;
- public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary<string, string> outputHeaders, TranscodingJob job, ILogger logger, CancellationToken cancellationToken)
+ public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary<string, string> outputHeaders, TranscodingJob job, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken)
{
_fileSystem = fileSystem;
_path = path;
@@ -39,15 +40,17 @@ namespace MediaBrowser.Api.Playback.Progressive
_job = job;
_logger = logger;
_cancellationToken = cancellationToken;
+ _environment = environment;
}
- public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary<string, string> outputHeaders, TranscodingJob job, ILogger logger, CancellationToken cancellationToken)
+ public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary<string, string> outputHeaders, TranscodingJob job, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken)
{
_directStreamProvider = directStreamProvider;
_outputHeaders = outputHeaders;
_job = job;
_logger = logger;
_cancellationToken = cancellationToken;
+ _environment = environment;
}
public IDictionary<string, string> Headers
@@ -58,33 +61,55 @@ namespace MediaBrowser.Api.Playback.Progressive
}
}
- private Stream GetInputStream()
+ private Stream GetInputStream(bool allowAsyncFileRead)
{
- return _fileSystem.GetFileStream(_path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, true);
+ var fileOpenOptions = StartPosition > 0
+ ? FileOpenOptions.RandomAccess
+ : FileOpenOptions.SequentialScan;
+
+ if (allowAsyncFileRead)
+ {
+ fileOpenOptions |= FileOpenOptions.Asynchronous;
+ }
+
+ return _fileSystem.GetFileStream(_path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, fileOpenOptions);
}
public async Task WriteToAsync(Stream outputStream, CancellationToken cancellationToken)
{
+ cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _cancellationToken).Token;
+
try
{
if (_directStreamProvider != null)
{
- await _directStreamProvider.CopyToAsync(outputStream, _cancellationToken).ConfigureAwait(false);
+ await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false);
return;
}
var eofCount = 0;
- using (var inputStream = GetInputStream())
+ // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039
+ var allowAsyncFileRead = _environment.OperatingSystem != OperatingSystem.Windows;
+
+ using (var inputStream = GetInputStream(allowAsyncFileRead))
{
if (StartPosition > 0)
{
inputStream.Position = StartPosition;
}
- while (eofCount < 15 || !AllowEndOfFile)
+ while (eofCount < 20 || !AllowEndOfFile)
{
- var bytesRead = await CopyToAsyncInternal(inputStream, outputStream, BufferSize, _cancellationToken).ConfigureAwait(false);
+ int bytesRead;
+ if (allowAsyncFileRead)
+ {
+ bytesRead = await CopyToInternalAsync(inputStream, outputStream, cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ bytesRead = await CopyToInternalAsyncWithSyncRead(inputStream, outputStream, cancellationToken).ConfigureAwait(false);
+ }
//var position = fs.Position;
//_logger.Debug("Streamed {0} bytes to position {1} from file {2}", bytesRead, position, path);
@@ -95,7 +120,7 @@ namespace MediaBrowser.Api.Playback.Progressive
{
eofCount++;
}
- await Task.Delay(100, _cancellationToken).ConfigureAwait(false);
+ await Task.Delay(100, cancellationToken).ConfigureAwait(false);
}
else
{
@@ -113,22 +138,54 @@ namespace MediaBrowser.Api.Playback.Progressive
}
}
- private async Task<int> CopyToAsyncInternal(Stream source, Stream destination, Int32 bufferSize, CancellationToken cancellationToken)
+ private async Task<int> CopyToInternalAsyncWithSyncRead(Stream source, Stream destination, CancellationToken cancellationToken)
{
- byte[] buffer = new byte[bufferSize];
+ var array = new byte[StreamCopyToBufferSize];
int bytesRead;
int totalBytesRead = 0;
- while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0)
+ while ((bytesRead = source.Read(array, 0, array.Length)) != 0)
{
- await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false);
+ var bytesToWrite = bytesRead;
+
+ if (bytesToWrite > 0)
+ {
+ await destination.WriteAsync(array, 0, Convert.ToInt32(bytesToWrite), cancellationToken).ConfigureAwait(false);
- _bytesWritten += bytesRead;
- totalBytesRead += bytesRead;
+ _bytesWritten += bytesRead;
+ totalBytesRead += bytesRead;
- if (_job != null)
+ if (_job != null)
+ {
+ _job.BytesDownloaded = Math.Max(_job.BytesDownloaded ?? _bytesWritten, _bytesWritten);
+ }
+ }
+ }
+
+ return totalBytesRead;
+ }
+
+ private async Task<int> CopyToInternalAsync(Stream source, Stream destination, CancellationToken cancellationToken)
+ {
+ var array = new byte[StreamCopyToBufferSize];
+ int bytesRead;
+ int totalBytesRead = 0;
+
+ while ((bytesRead = await source.ReadAsync(array, 0, array.Length, cancellationToken).ConfigureAwait(false)) != 0)
+ {
+ var bytesToWrite = bytesRead;
+
+ if (bytesToWrite > 0)
{
- _job.BytesDownloaded = Math.Max(_job.BytesDownloaded ?? _bytesWritten, _bytesWritten);
+ await destination.WriteAsync(array, 0, Convert.ToInt32(bytesToWrite), cancellationToken).ConfigureAwait(false);
+
+ _bytesWritten += bytesRead;
+ totalBytesRead += bytesRead;
+
+ if (_job != null)
+ {
+ _job.BytesDownloaded = Math.Max(_job.BytesDownloaded ?? _bytesWritten, _bytesWritten);
+ }
}
}
diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index c36a27690a..5e21f6a841 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -9,6 +9,7 @@ using MediaBrowser.Model.Serialization;
using System.Threading.Tasks;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Services;
+using MediaBrowser.Model.System;
namespace MediaBrowser.Api.Playback.Progressive
{
@@ -66,7 +67,7 @@ namespace MediaBrowser.Api.Playback.Progressive
//[Authenticated]
public class VideoService : BaseProgressiveStreamingService
{
- public VideoService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer, authorizationContext, imageProcessor)
+ public VideoService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor, IEnvironmentInfo environmentInfo) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer, authorizationContext, imageProcessor, environmentInfo)
{
}
diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs
index 4b1687d689..1daca9e33c 100644
--- a/MediaBrowser.Api/Playback/StreamState.cs
+++ b/MediaBrowser.Api/Playback/StreamState.cs
@@ -68,15 +68,18 @@ namespace MediaBrowser.Api.Playback
if (string.Equals(OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase))
{
var userAgent = UserAgent ?? string.Empty;
- if (userAgent.IndexOf("AppleTV", StringComparison.OrdinalIgnoreCase) != -1)
- {
- return 10;
- }
- if (userAgent.IndexOf("cfnetwork", StringComparison.OrdinalIgnoreCase) != -1 ||
+
+ if (userAgent.IndexOf("AppleTV", StringComparison.OrdinalIgnoreCase) != -1 ||
+ userAgent.IndexOf("cfnetwork", StringComparison.OrdinalIgnoreCase) != -1 ||
userAgent.IndexOf("ipad", StringComparison.OrdinalIgnoreCase) != -1 ||
userAgent.IndexOf("iphone", StringComparison.OrdinalIgnoreCase) != -1 ||
userAgent.IndexOf("ipod", StringComparison.OrdinalIgnoreCase) != -1)
{
+ if (IsSegmentedLiveStream)
+ {
+ return 6;
+ }
+
return 10;
}
@@ -364,6 +367,37 @@ namespace MediaBrowser.Api.Playback
}
}
+ public bool? IsTargetAnamorphic
+ {
+ get
+ {
+ if (Request.Static)
+ {
+ return VideoStream == null ? null : VideoStream.IsAnamorphic;
+ }
+
+ return false;
+ }
+ }
+
+ public bool? IsTargetInterlaced
+ {
+ get
+ {
+ if (Request.Static)
+ {
+ return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
+ }
+
+ if (DeInterlace)
+ {
+ return false;
+ }
+
+ return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
+ }
+ }
+
private int? GetMediaStreamCount(MediaStreamType type, int limit)
{
var count = MediaSource.GetStreamCount(type);
@@ -445,19 +479,6 @@ namespace MediaBrowser.Api.Playback
}
}
- public bool? IsTargetAnamorphic
- {
- get
- {
- if (Request.Static)
- {
- return VideoStream == null ? null : VideoStream.IsAnamorphic;
- }
-
- return false;
- }
- }
-
public bool? IsTargetAVC
{
get
diff --git a/MediaBrowser.Api/Playback/UniversalAudioService.cs b/MediaBrowser.Api/Playback/UniversalAudioService.cs
index e50d0f2c54..fffec69489 100644
--- a/MediaBrowser.Api/Playback/UniversalAudioService.cs
+++ b/MediaBrowser.Api/Playback/UniversalAudioService.cs
@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
-using System.IO;
+using System.Globalization;
using System.Threading.Tasks;
using MediaBrowser.Api.Playback.Hls;
using MediaBrowser.Api.Playback.Progressive;
@@ -17,6 +17,7 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Services;
+using MediaBrowser.Model.System;
namespace MediaBrowser.Api.Playback
{
@@ -35,18 +36,30 @@ namespace MediaBrowser.Api.Playback
[ApiMember(Name = "DeviceId", Description = "The device id of the client requesting. Used to stop encoding processes when needed.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string DeviceId { get; set; }
- public string Token { get; set; }
-
public string UserId { get; set; }
public string AudioCodec { get; set; }
public string Container { get; set; }
public int? MaxAudioChannels { get; set; }
+ public int? TranscodingAudioChannels { get; set; }
public long? MaxStreamingBitrate { get; set; }
[ApiMember(Name = "StartTimeTicks", Description = "Optional. Specify a starting offset, in ticks. 1 tick = 10000 ms", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
public long? StartTimeTicks { get; set; }
+
+ public string TranscodingContainer { get; set; }
+ public string TranscodingProtocol { get; set; }
+ public int? MaxAudioSampleRate { get; set; }
+
+ public bool EnableRedirection { get; set; }
+ public bool EnableRemoteMedia { get; set; }
+ public bool BreakOnNonKeyFrames { get; set; }
+
+ public BaseUniversalRequest()
+ {
+ EnableRedirection = true;
+ }
}
[Route("/Audio/{Id}/universal.{Container}", "GET", Summary = "Gets an audio stream")]
@@ -57,10 +70,10 @@ namespace MediaBrowser.Api.Playback
{
}
- //[Authenticated]
+ [Authenticated]
public class UniversalAudioService : BaseApiService
{
- public UniversalAudioService(IServerConfigurationManager serverConfigurationManager, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, IDeviceManager deviceManager, ISubtitleEncoder subtitleEncoder, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor, INetworkManager networkManager)
+ public UniversalAudioService(IServerConfigurationManager serverConfigurationManager, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, IDeviceManager deviceManager, ISubtitleEncoder subtitleEncoder, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, IAuthorizationContext authorizationContext, IImageProcessor imageProcessor, INetworkManager networkManager, IEnvironmentInfo environmentInfo)
{
ServerConfigurationManager = serverConfigurationManager;
UserManager = userManager;
@@ -77,6 +90,7 @@ namespace MediaBrowser.Api.Playback
AuthorizationContext = authorizationContext;
ImageProcessor = imageProcessor;
NetworkManager = networkManager;
+ EnvironmentInfo = environmentInfo;
}
protected IServerConfigurationManager ServerConfigurationManager { get; private set; }
@@ -94,6 +108,7 @@ namespace MediaBrowser.Api.Playback
protected IAuthorizationContext AuthorizationContext { get; private set; }
protected IImageProcessor ImageProcessor { get; private set; }
protected INetworkManager NetworkManager { get; private set; }
+ protected IEnvironmentInfo EnvironmentInfo { get; private set; }
public Task<object> Get(GetUniversalAudioStream request)
{
@@ -125,12 +140,54 @@ namespace MediaBrowser.Api.Playback
{
Type = DlnaProfileType.Audio,
Context = EncodingContext.Streaming,
- Container = "ts",
- AudioCodec = "aac",
- Protocol = "hls"
+ Container = request.TranscodingContainer,
+ AudioCodec = request.AudioCodec,
+ Protocol = request.TranscodingProtocol,
+ BreakOnNonKeyFrames = request.BreakOnNonKeyFrames,
+ MaxAudioChannels = request.TranscodingAudioChannels.HasValue ? request.TranscodingAudioChannels.Value.ToString(CultureInfo.InvariantCulture) : null
}
};
+ var codecProfiles = new List<CodecProfile>();
+ var conditions = new List<ProfileCondition>();
+
+ if (request.MaxAudioSampleRate.HasValue)
+ {
+ // codec profile
+ conditions.Add(new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ IsRequired = false,
+ Property = ProfileConditionValue.AudioSampleRate,
+ Value = request.MaxAudioSampleRate.Value.ToString(CultureInfo.InvariantCulture)
+ });
+ }
+
+ if (request.MaxAudioChannels.HasValue)
+ {
+ // codec profile
+ conditions.Add(new ProfileCondition
+ {
+ Condition = ProfileConditionType.LessThanEqual,
+ IsRequired = false,
+ Property = ProfileConditionValue.AudioChannels,
+ Value = request.MaxAudioChannels.Value.ToString(CultureInfo.InvariantCulture)
+ });
+ }
+
+ if (conditions.Count > 0)
+ {
+ // codec profile
+ codecProfiles.Add(new CodecProfile
+ {
+ Type = CodecType.Audio,
+ Container = request.Container,
+ Conditions = conditions.ToArray()
+ });
+ }
+
+ deviceProfile.CodecProfiles = codecProfiles.ToArray();
+
return deviceProfile;
}
@@ -159,6 +216,17 @@ namespace MediaBrowser.Api.Playback
var mediaSource = playbackInfoResult.MediaSources[0];
+ if (mediaSource.SupportsDirectPlay && mediaSource.Protocol == MediaProtocol.Http)
+ {
+ if (request.EnableRedirection)
+ {
+ if (mediaSource.IsRemote && request.EnableRemoteMedia)
+ {
+ return ResultFactory.GetRedirectResult(mediaSource.Path);
+ }
+ }
+ }
+
var isStatic = mediaSource.SupportsDirectStream;
if (!isStatic && string.Equals(mediaSource.TranscodingSubProtocol, "hls", StringComparison.OrdinalIgnoreCase))
@@ -194,7 +262,10 @@ namespace MediaBrowser.Api.Playback
MediaSourceId = mediaSource.Id,
PlaySessionId = playbackInfoResult.PlaySessionId,
StartTimeTicks = request.StartTimeTicks,
- Static = isStatic
+ Static = isStatic,
+ SegmentContainer = request.TranscodingContainer,
+ AudioSampleRate = request.MaxAudioSampleRate,
+ BreakOnNonKeyFrames = transcodingProfile.BreakOnNonKeyFrames
};
if (isHeadRequest)
@@ -218,7 +289,8 @@ namespace MediaBrowser.Api.Playback
ZipClient,
JsonSerializer,
AuthorizationContext,
- ImageProcessor)
+ ImageProcessor,
+ EnvironmentInfo)
{
Request = Request
};
@@ -226,7 +298,7 @@ namespace MediaBrowser.Api.Playback
var newRequest = new GetAudioStream
{
AudioBitRate = isStatic ? (int?)null : Convert.ToInt32(Math.Min(request.MaxStreamingBitrate ?? 192000, int.MaxValue)),
- //AudioCodec = request.AudioCodec,
+ AudioCodec = request.AudioCodec,
Container = isStatic ? null : ("." + mediaSource.TranscodingContainer),
DeviceId = request.DeviceId,
Id = request.Id,
@@ -234,7 +306,8 @@ namespace MediaBrowser.Api.Playback
MediaSourceId = mediaSource.Id,
PlaySessionId = playbackInfoResult.PlaySessionId,
StartTimeTicks = request.StartTimeTicks,
- Static = isStatic
+ Static = isStatic,
+ AudioSampleRate = request.MaxAudioSampleRate
};
if (isHeadRequest)
diff --git a/MediaBrowser.Api/Reports/ReportsService.cs b/MediaBrowser.Api/Reports/ReportsService.cs
index 9490c301d6..d4201e73c4 100644
--- a/MediaBrowser.Api/Reports/ReportsService.cs
+++ b/MediaBrowser.Api/Reports/ReportsService.cs
@@ -67,7 +67,7 @@ namespace MediaBrowser.Api.Reports
/// <summary> Gets the given request. </summary>
/// <param name="request"> The request. </param>
/// <returns> A Task&lt;object&gt; </returns>
- public async Task<object> Get(GetReportHeaders request)
+ public object Get(GetReportHeaders request)
{
if (string.IsNullOrEmpty(request.IncludeItemTypes))
return null;
@@ -95,14 +95,14 @@ namespace MediaBrowser.Api.Reports
/// <summary> Gets the given request. </summary>
/// <param name="request"> The request. </param>
/// <returns> A Task&lt;object&gt; </returns>
- public async Task<object> Get(GetItemReport request)
+ public object Get(GetItemReport request)
{
if (string.IsNullOrEmpty(request.IncludeItemTypes))
return null;
request.DisplayType = "Screen";
var user = !string.IsNullOrWhiteSpace(request.UserId) ? _userManager.GetUserById(request.UserId) : null;
- var reportResult = await GetReportResult(request, user);
+ var reportResult = GetReportResult(request, user);
return ToOptimizedResult(reportResult);
}
@@ -110,7 +110,7 @@ namespace MediaBrowser.Api.Reports
/// <summary> Gets the given request. </summary>
/// <param name="request"> The request. </param>
/// <returns> A Task&lt;object&gt; </returns>
- public async Task<object> Get(GetReportDownload request)
+ public object Get(GetReportDownload request)
{
if (string.IsNullOrEmpty(request.IncludeItemTypes))
return null;
@@ -142,7 +142,7 @@ namespace MediaBrowser.Api.Reports
case ReportViewType.ReportData:
ReportIncludeItemTypes reportRowType = ReportHelper.GetRowType(request.IncludeItemTypes);
ReportBuilder dataBuilder = new ReportBuilder(_libraryManager);
- QueryResult<BaseItem> queryResult = await GetQueryResult(request, user).ConfigureAwait(false);
+ QueryResult<BaseItem> queryResult = GetQueryResult(request, user);
result = dataBuilder.GetResult(queryResult.Items, request);
result.TotalRecordCount = queryResult.TotalRecordCount;
break;
@@ -225,7 +225,6 @@ namespace MediaBrowser.Api.Reports
ParentId = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId),
ParentIndexNumber = request.ParentIndexNumber,
AiredDuringSeason = request.AiredDuringSeason,
- AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater,
EnableTotalRecordCount = request.EnableTotalRecordCount
};
@@ -315,7 +314,7 @@ namespace MediaBrowser.Api.Reports
return query;
}
- private async Task<QueryResult<BaseItem>> GetQueryResult(BaseReportRequest request, User user)
+ private QueryResult<BaseItem> GetQueryResult(BaseReportRequest request, User user)
{
// all report queries currently need this because it's not being specified
request.Recursive = true;
@@ -345,7 +344,7 @@ namespace MediaBrowser.Api.Reports
{
request.Recursive = true;
var query = GetItemsQuery(request, user);
- var result = await folder.GetItems(query).ConfigureAwait(false);
+ var result = folder.GetItems(query);
if (string.IsNullOrWhiteSpace(request.SortBy))
{
@@ -360,19 +359,19 @@ namespace MediaBrowser.Api.Reports
if (request.Recursive)
{
- return await folder.GetItems(GetItemsQuery(request, user)).ConfigureAwait(false);
+ return folder.GetItems(GetItemsQuery(request, user));
}
if (user == null)
{
- return await folder.GetItems(GetItemsQuery(request, null)).ConfigureAwait(false);
+ return folder.GetItems(GetItemsQuery(request, null));
}
var userRoot = item as UserRootFolder;
if (userRoot == null)
{
- return await folder.GetItems(GetItemsQuery(request, user)).ConfigureAwait(false);
+ return folder.GetItems(GetItemsQuery(request, user));
}
IEnumerable<BaseItem> items = folder.GetChildren(user, true);
@@ -413,10 +412,10 @@ namespace MediaBrowser.Api.Reports
/// <summary> Gets report result. </summary>
/// <param name="request"> The request. </param>
/// <returns> The report result. </returns>
- private async Task<ReportResult> GetReportResult(GetItemReport request, User user)
+ private ReportResult GetReportResult(GetItemReport request, User user)
{
ReportBuilder reportBuilder = new ReportBuilder(_libraryManager);
- QueryResult<BaseItem> queryResult = await GetQueryResult(request, user).ConfigureAwait(false);
+ QueryResult<BaseItem> queryResult = GetQueryResult(request, user);
ReportResult reportResult = reportBuilder.GetResult(queryResult.Items, request);
reportResult.TotalRecordCount = queryResult.TotalRecordCount;
diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs
index 7e13512aa1..2df6d225b9 100644
--- a/MediaBrowser.Api/StartupWizardService.cs
+++ b/MediaBrowser.Api/StartupWizardService.cs
@@ -96,11 +96,11 @@ namespace MediaBrowser.Api
config.EnableCaseSensitiveItemIds = true;
config.SkipDeserializationForBasicTypes = true;
config.SkipDeserializationForAudio = true;
- config.EnableSeriesPresentationUniqueKey = true;
config.EnableLocalizedGuids = true;
config.EnableSimpleArtistDetection = true;
config.EnableNormalizedItemByNameIds = true;
config.DisableLiveTvChannelUserDataName = true;
+ config.EnableSimpleSortNameHandling = true;
}
public void Post(UpdateStartupConfiguration request)
diff --git a/MediaBrowser.Api/Subtitles/SubtitleService.cs b/MediaBrowser.Api/Subtitles/SubtitleService.cs
index 798004a5ef..7dde974ae6 100644
--- a/MediaBrowser.Api/Subtitles/SubtitleService.cs
+++ b/MediaBrowser.Api/Subtitles/SubtitleService.cs
@@ -14,7 +14,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
diff --git a/MediaBrowser.Api/System/SystemService.cs b/MediaBrowser.Api/System/SystemService.cs
index 913b230627..a9cec09145 100644
--- a/MediaBrowser.Api/System/SystemService.cs
+++ b/MediaBrowser.Api/System/SystemService.cs
@@ -9,7 +9,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Net;
diff --git a/MediaBrowser.Api/TvShowsService.cs b/MediaBrowser.Api/TvShowsService.cs
index 4b279031ee..5a6004760f 100644
--- a/MediaBrowser.Api/TvShowsService.cs
+++ b/MediaBrowser.Api/TvShowsService.cs
@@ -374,6 +374,8 @@ namespace MediaBrowser.Api
/// <returns>System.Object.</returns>
public async Task<object> Get(GetNextUpEpisodes request)
{
+ var options = GetDtoOptions(_authContext, request);
+
var result = _tvSeriesManager.GetNextUp(new NextUpQuery
{
Limit = request.Limit,
@@ -382,12 +384,10 @@ namespace MediaBrowser.Api
StartIndex = request.StartIndex,
UserId = request.UserId,
EnableTotalRecordCount = request.EnableTotalRecordCount
- });
+ }, options);
var user = _userManager.GetUserById(request.UserId);
- var options = GetDtoOptions(_authContext, request);
-
var returnItems = (await _dtoService.GetBaseItemDtos(result.Items, options, user).ConfigureAwait(false)).ToArray();
return ToOptimizedSerializedResultUsingCache(new ItemsResult
@@ -432,14 +432,14 @@ namespace MediaBrowser.Api
throw new ResourceNotFoundException("Series not found");
}
- var seasons = (await series.GetItems(new InternalItemsQuery(user)
+ var seasons = (series.GetItems(new InternalItemsQuery(user)
{
IsMissing = request.IsMissing,
IsVirtualUnaired = request.IsVirtualUnaired,
IsSpecialSeason = request.IsSpecialSeason,
AdjacentTo = request.AdjacentTo
- }).ConfigureAwait(false)).Items.OfType<Season>();
+ })).Items.OfType<Season>();
var dtoOptions = GetDtoOptions(_authContext, request);
@@ -469,6 +469,8 @@ namespace MediaBrowser.Api
IEnumerable<Episode> episodes;
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
if (!string.IsNullOrWhiteSpace(request.SeasonId))
{
var season = _libraryManager.GetItemById(new Guid(request.SeasonId)) as Season;
@@ -478,7 +480,7 @@ namespace MediaBrowser.Api
throw new ResourceNotFoundException("No season exists with Id " + request.SeasonId);
}
- episodes = season.GetEpisodes(user);
+ episodes = season.GetEpisodes(user, dtoOptions);
}
else if (request.Season.HasValue)
{
@@ -489,7 +491,7 @@ namespace MediaBrowser.Api
throw new ResourceNotFoundException("Series not found");
}
- var season = series.GetSeasons(user).FirstOrDefault(i => i.IndexNumber == request.Season.Value);
+ var season = series.GetSeasons(user, dtoOptions).FirstOrDefault(i => i.IndexNumber == request.Season.Value);
if (season == null)
{
@@ -497,7 +499,7 @@ namespace MediaBrowser.Api
}
else
{
- episodes = season.GetEpisodes(user);
+ episodes = season.GetEpisodes(user, dtoOptions);
}
}
else
@@ -509,7 +511,7 @@ namespace MediaBrowser.Api
throw new ResourceNotFoundException("Series not found");
}
- episodes = series.GetEpisodes(user);
+ episodes = series.GetEpisodes(user, dtoOptions);
}
// Filter after the fact in case the ui doesn't want them
@@ -543,8 +545,6 @@ namespace MediaBrowser.Api
var pagedItems = ApplyPaging(returnList, request.StartIndex, request.Limit);
- var dtoOptions = GetDtoOptions(_authContext, request);
-
var dtos = (await _dtoService.GetBaseItemDtos(pagedItems, dtoOptions, user).ConfigureAwait(false))
.ToArray();
diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs
index 5bbd96c7c3..7c1519e9fd 100644
--- a/MediaBrowser.Api/UserLibrary/ArtistsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs
@@ -68,10 +68,10 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private BaseItemDto GetItem(GetArtist request)
{
- var item = GetArtist(request.Name, LibraryManager);
-
var dtoOptions = GetDtoOptions(AuthorizationContext, request);
+ var item = GetArtist(request.Name, LibraryManager, dtoOptions);
+
if (!string.IsNullOrWhiteSpace(request.UserId))
{
var user = UserManager.GetUserById(request.UserId);
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
index c1cc1555de..24d0a7d524 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
+++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
@@ -119,7 +119,6 @@ namespace MediaBrowser.Api.UserLibrary
NameLessThan = request.NameLessThan,
NameStartsWith = request.NameStartsWith,
NameStartsWithOrGreater = request.NameStartsWithOrGreater,
- AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater,
Tags = request.GetTags(),
OfficialRatings = request.GetOfficialRatings(),
Genres = request.GetGenres(),
@@ -129,7 +128,8 @@ namespace MediaBrowser.Api.UserLibrary
PersonIds = request.GetPersonIds(),
PersonTypes = request.GetPersonTypes(),
Years = request.GetYears(),
- MinCommunityRating = request.MinCommunityRating
+ MinCommunityRating = request.MinCommunityRating,
+ DtoOptions = dtoOptions
};
if (!string.IsNullOrWhiteSpace(request.ParentId))
@@ -266,7 +266,8 @@ namespace MediaBrowser.Api.UserLibrary
{
ExcludeItemTypes = excludeItemTypes,
IncludeItemTypes = includeItemTypes,
- MediaTypes = mediaTypes
+ MediaTypes = mediaTypes,
+ DtoOptions = dtoOptions
};
Func<BaseItem, bool> filter = i => FilterItem(request, i, excludeItemTypes, includeItemTypes, mediaTypes);
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
index 55c23841cf..2de86f4da9 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
+++ b/MediaBrowser.Api/UserLibrary/BaseItemsRequest.cs
@@ -85,6 +85,12 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "MinPremiereDate", Description = "Optional. The minimum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public string MinPremiereDate { get; set; }
+ [ApiMember(Name = "MinDateLastSaved", Description = "Optional. The minimum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+ public string MinDateLastSaved { get; set; }
+
+ [ApiMember(Name = "MinDateLastSavedForUser", Description = "Optional. The minimum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
+ public string MinDateLastSavedForUser { get; set; }
+
[ApiMember(Name = "MaxPremiereDate", Description = "Optional. The maximum premiere date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public string MaxPremiereDate { get; set; }
@@ -348,9 +354,6 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "NameLessThan", Description = "Optional filter by items whose name is equally or lesser than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
public string NameLessThan { get; set; }
- [ApiMember(Name = "AlbumArtistStartsWithOrGreater", Description = "Optional filter by items whose album artist is sorted equally or greater than a given input string.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
- public string AlbumArtistStartsWithOrGreater { get; set; }
-
public string[] GetGenres()
{
return (Genres ?? string.Empty).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
diff --git a/MediaBrowser.Api/UserLibrary/GameGenresService.cs b/MediaBrowser.Api/UserLibrary/GameGenresService.cs
index 2eef1ab2fd..56730c1b20 100644
--- a/MediaBrowser.Api/UserLibrary/GameGenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/GameGenresService.cs
@@ -56,10 +56,10 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private BaseItemDto GetItem(GetGameGenre request)
{
- var item = GetGameGenre(request.Name, LibraryManager);
-
var dtoOptions = GetDtoOptions(AuthorizationContext, request);
-
+
+ var item = GetGameGenre(request.Name, LibraryManager, dtoOptions);
+
if (!string.IsNullOrWhiteSpace(request.UserId))
{
var user = UserManager.GetUserById(request.UserId);
diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs
index 664efac14c..fc387e5e39 100644
--- a/MediaBrowser.Api/UserLibrary/GenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/GenresService.cs
@@ -66,10 +66,10 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private BaseItemDto GetItem(GetGenre request)
{
- var item = GetGenre(request.Name, LibraryManager);
-
- var dtoOptions = GetDtoOptions(AuthorizationContext ,request);
+ var dtoOptions = GetDtoOptions(AuthorizationContext, request);
+ var item = GetGenre(request.Name, LibraryManager, dtoOptions);
+
if (!string.IsNullOrWhiteSpace(request.UserId))
{
var user = UserManager.GetUserById(request.UserId);
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index f8580d3288..01e1ce769a 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -105,7 +105,7 @@ namespace MediaBrowser.Api.UserLibrary
var dtoOptions = GetDtoOptions(_authContext, request);
- var result = await GetQueryResult(request, dtoOptions, user).ConfigureAwait(false);
+ var result = GetQueryResult(request, dtoOptions, user);
if (result == null)
{
@@ -134,7 +134,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary>
/// Gets the items to serialize.
/// </summary>
- private async Task<QueryResult<BaseItem>> GetQueryResult(GetItems request, DtoOptions dtoOptions, User user)
+ private QueryResult<BaseItem> GetQueryResult(GetItems request, DtoOptions dtoOptions, User user)
{
var item = string.IsNullOrEmpty(request.ParentId) ?
null :
@@ -169,14 +169,14 @@ namespace MediaBrowser.Api.UserLibrary
if (request.Recursive || !string.IsNullOrEmpty(request.Ids) || user == null)
{
- return await folder.GetItems(GetItemsQuery(request, dtoOptions, user)).ConfigureAwait(false);
+ return folder.GetItems(GetItemsQuery(request, dtoOptions, user));
}
var userRoot = item as UserRootFolder;
if (userRoot == null)
{
- return await folder.GetItems(GetItemsQuery(request, dtoOptions, user)).ConfigureAwait(false);
+ return folder.GetItems(GetItemsQuery(request, dtoOptions, user));
}
IEnumerable<BaseItem> items = folder.GetChildren(user, true);
@@ -249,7 +249,6 @@ namespace MediaBrowser.Api.UserLibrary
ParentId = string.IsNullOrWhiteSpace(request.ParentId) ? (Guid?)null : new Guid(request.ParentId),
ParentIndexNumber = request.ParentIndexNumber,
AiredDuringSeason = request.AiredDuringSeason,
- AlbumArtistStartsWithOrGreater = request.AlbumArtistStartsWithOrGreater,
EnableTotalRecordCount = request.EnableTotalRecordCount,
ExcludeItemIds = request.GetExcludeItemIds(),
DtoOptions = dtoOptions
@@ -294,6 +293,16 @@ namespace MediaBrowser.Api.UserLibrary
}
}
+ if (!string.IsNullOrEmpty(request.MinDateLastSaved))
+ {
+ query.MinDateLastSaved = DateTime.Parse(request.MinDateLastSaved, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
+ }
+
+ if (!string.IsNullOrEmpty(request.MinDateLastSavedForUser))
+ {
+ query.MinDateLastSavedForUser = DateTime.Parse(request.MinDateLastSavedForUser, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
+ }
+
if (!string.IsNullOrEmpty(request.MinPremiereDate))
{
query.MinPremiereDate = DateTime.Parse(request.MinPremiereDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
@@ -330,7 +339,7 @@ namespace MediaBrowser.Api.UserLibrary
{
var requestedLocationTypes =
request.LocationTypes.Split(',')
- .Select(d => (LocationType) Enum.Parse(typeof (LocationType), d, true))
+ .Select(d => (LocationType)Enum.Parse(typeof(LocationType), d, true))
.ToList();
if (requestedLocationTypes.Count > 0 && requestedLocationTypes.Count < 4)
@@ -358,7 +367,7 @@ namespace MediaBrowser.Api.UserLibrary
{
try
{
- return _libraryManager.GetArtist(i);
+ return _libraryManager.GetArtist(i, new DtoOptions(false));
}
catch
{
@@ -381,15 +390,15 @@ namespace MediaBrowser.Api.UserLibrary
// Albums
if (!string.IsNullOrEmpty(request.Albums))
{
- query.AlbumIds = request.Albums.Split('|').Select(i =>
+ query.AlbumIds = request.Albums.Split('|').SelectMany(i =>
{
- return _libraryManager.GetItemList(new InternalItemsQuery
+ return _libraryManager.GetItemIds(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
Name = i,
Limit = 1
- }).Select(album => album.Id.ToString("N")).FirstOrDefault();
+ }).Select(albumId => albumId.ToString("N"));
}).ToArray();
}
diff --git a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs
index 305c136dfb..d1d4aa634b 100644
--- a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs
@@ -57,10 +57,10 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private BaseItemDto GetItem(GetMusicGenre request)
{
- var item = GetMusicGenre(request.Name, LibraryManager);
-
var dtoOptions = GetDtoOptions(AuthorizationContext, request);
+ var item = GetMusicGenre(request.Name, LibraryManager, dtoOptions);
+
if (!string.IsNullOrWhiteSpace(request.UserId))
{
var user = UserManager.GetUserById(request.UserId);
diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs
index dbce22578b..21f416025e 100644
--- a/MediaBrowser.Api/UserLibrary/PersonsService.cs
+++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs
@@ -64,10 +64,10 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private BaseItemDto GetItem(GetPerson request)
{
- var item = GetPerson(request.Name, LibraryManager);
-
var dtoOptions = GetDtoOptions(AuthorizationContext, request);
+ var item = GetPerson(request.Name, LibraryManager, dtoOptions);
+
if (!string.IsNullOrWhiteSpace(request.UserId))
{
var user = UserManager.GetUserById(request.UserId);
diff --git a/MediaBrowser.Api/UserLibrary/PlaystateService.cs b/MediaBrowser.Api/UserLibrary/PlaystateService.cs
index c4cc90955e..98b4a5d5d8 100644
--- a/MediaBrowser.Api/UserLibrary/PlaystateService.cs
+++ b/MediaBrowser.Api/UserLibrary/PlaystateService.cs
@@ -279,6 +279,20 @@ namespace MediaBrowser.Api.UserLibrary
return dto;
}
+ private PlayMethod ValidatePlayMethod(PlayMethod method, string playSessionId)
+ {
+ if (method == PlayMethod.Transcode)
+ {
+ var job = string.IsNullOrWhiteSpace(playSessionId) ? null : ApiEntryPoint.Instance.GetTranscodingJob(playSessionId);
+ if (job == null)
+ {
+ return PlayMethod.DirectPlay;
+ }
+ }
+
+ return method;
+ }
+
/// <summary>
/// Posts the specified request.
/// </summary>
@@ -300,6 +314,8 @@ namespace MediaBrowser.Api.UserLibrary
public void Post(ReportPlaybackStart request)
{
+ request.PlayMethod = ValidatePlayMethod(request.PlayMethod, request.PlaySessionId);
+
request.SessionId = GetSession(_sessionContext).Result.Id;
var task = _sessionManager.OnPlaybackStart(request);
@@ -332,6 +348,8 @@ namespace MediaBrowser.Api.UserLibrary
public void Post(ReportPlaybackProgress request)
{
+ request.PlayMethod = ValidatePlayMethod(request.PlayMethod, request.PlaySessionId);
+
request.SessionId = GetSession(_sessionContext).Result.Id;
var task = _sessionManager.OnPlaybackProgress(request);
@@ -427,7 +445,7 @@ namespace MediaBrowser.Api.UserLibrary
await item.MarkUnplayed(user).ConfigureAwait(false);
}
- return await _userDataRepository.GetUserDataDto(item, user).ConfigureAwait(false);
+ return _userDataRepository.GetUserDataDto(item, user);
}
}
} \ No newline at end of file
diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs
index f4debcf48a..7ac1264e8f 100644
--- a/MediaBrowser.Api/UserLibrary/StudiosService.cs
+++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs
@@ -66,10 +66,10 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private BaseItemDto GetItem(GetStudio request)
{
- var item = GetStudio(request.Name, LibraryManager);
-
var dtoOptions = GetDtoOptions(AuthorizationContext, request);
-
+
+ var item = GetStudio(request.Name, LibraryManager, dtoOptions);
+
if (!string.IsNullOrWhiteSpace(request.UserId))
{
var user = UserManager.GetUserById(request.UserId);
diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
index b1f196f15e..3b638208b5 100644
--- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
+++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
@@ -11,7 +11,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -308,6 +307,8 @@ namespace MediaBrowser.Api.UserLibrary
}
}
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
var list = _userViewManager.GetLatestItems(new LatestItemsQuery
{
GroupItems = request.GroupItems,
@@ -315,10 +316,8 @@ namespace MediaBrowser.Api.UserLibrary
IsPlayed = request.IsPlayed,
Limit = request.Limit,
ParentId = request.ParentId,
- UserId = request.UserId
- });
-
- var dtoOptions = GetDtoOptions(_authContext, request);
+ UserId = request.UserId,
+ }, dtoOptions);
var dtos = list.Select(i =>
{
@@ -360,22 +359,8 @@ namespace MediaBrowser.Api.UserLibrary
var currentUser = user;
var dtos = series
- .GetEpisodes(user)
+ .GetEpisodes(user, dtoOptions)
.Where(i => i.ParentIndexNumber.HasValue && i.ParentIndexNumber.Value == 0)
- .OrderBy(i =>
- {
- if (i.PremiereDate.HasValue)
- {
- return i.PremiereDate.Value;
- }
-
- if (i.ProductionYear.HasValue)
- {
- return new DateTime(i.ProductionYear.Value, 1, 1, 0, 0, 0, DateTimeKind.Utc);
- }
- return DateTime.MinValue;
- })
- .ThenBy(i => i.SortName)
.Select(i => _dtoService.GetBaseItemDto(i, dtoOptions, currentUser));
return dtos.ToList();
@@ -556,7 +541,7 @@ namespace MediaBrowser.Api.UserLibrary
await _userDataRepository.SaveUserData(user.Id, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None).ConfigureAwait(false);
- return await _userDataRepository.GetUserDataDto(item, user).ConfigureAwait(false);
+ return _userDataRepository.GetUserDataDto(item, user);
}
/// <summary>
@@ -601,7 +586,7 @@ namespace MediaBrowser.Api.UserLibrary
await _userDataRepository.SaveUserData(user.Id, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None).ConfigureAwait(false);
- return await _userDataRepository.GetUserDataDto(item, user).ConfigureAwait(false);
+ return _userDataRepository.GetUserDataDto(item, user);
}
}
}
diff --git a/MediaBrowser.Api/UserLibrary/UserViewsService.cs b/MediaBrowser.Api/UserLibrary/UserViewsService.cs
index 89953c2bd8..3ed5166a4b 100644
--- a/MediaBrowser.Api/UserLibrary/UserViewsService.cs
+++ b/MediaBrowser.Api/UserLibrary/UserViewsService.cs
@@ -103,7 +103,7 @@ namespace MediaBrowser.Api.UserLibrary
return ToOptimizedResult(result);
}
- public async Task<object> Get(GetGroupingOptions request)
+ public object Get(GetGroupingOptions request)
{
var user = _userManager.GetUserById(request.UserId);
diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs
index f7b83f23bf..729b50c1f4 100644
--- a/MediaBrowser.Api/VideosService.cs
+++ b/MediaBrowser.Api/VideosService.cs
@@ -9,7 +9,7 @@ using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index eb082f707a..b24975dbab 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -36,14 +36,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <DebugType>none</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release Mono\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
@@ -55,7 +47,6 @@
<Compile Include="Extensions\BaseExtensions.cs" />
<Compile Include="Extensions\ResourceNotFoundException.cs" />
<Compile Include="IDependencyContainer.cs" />
- <Compile Include="IO\ProgressStream.cs" />
<Compile Include="Configuration\IApplicationPaths.cs" />
<Compile Include="Net\HttpRequestOptions.cs" />
<Compile Include="Net\HttpResponseInfo.cs" />
@@ -84,6 +75,7 @@
<ItemGroup>
<None Include="project.json" />
</ItemGroup>
+ <ItemGroup />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent />
diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs
index a2590dec72..35c2ea1aac 100644
--- a/MediaBrowser.Controller/Channels/Channel.cs
+++ b/MediaBrowser.Controller/Channels/Channel.cs
@@ -38,12 +38,12 @@ namespace MediaBrowser.Controller.Channels
set { }
}
- protected override async Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query)
+ protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
try
{
// Don't blow up here because it could cause parent screens with other content to fail
- return await ChannelManager.GetChannelItemsInternal(new ChannelItemQuery
+ return ChannelManager.GetChannelItemsInternal(new ChannelItemQuery
{
ChannelId = Id.ToString("N"),
Limit = query.Limit,
@@ -52,7 +52,7 @@ namespace MediaBrowser.Controller.Channels
SortBy = query.SortBy,
SortOrder = query.SortOrder
- }, new Progress<double>(), CancellationToken.None);
+ }, new Progress<double>(), CancellationToken.None).Result;
}
catch
{
diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs
index 7927446289..824bdf8ffb 100644
--- a/MediaBrowser.Controller/Channels/IChannelManager.cs
+++ b/MediaBrowser.Controller/Channels/IChannelManager.cs
@@ -110,7 +110,7 @@ namespace MediaBrowser.Controller.Channels
/// <param name="item">The item.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{IEnumerable{MediaSourceInfo}}.</returns>
- Task<IEnumerable<MediaSourceInfo>> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken);
+ IEnumerable<MediaSourceInfo> GetStaticMediaSources(BaseItem item, CancellationToken cancellationToken);
/// <summary>
/// Gets the channel folder.
diff --git a/MediaBrowser.Controller/Drawing/IImageEncoder.cs b/MediaBrowser.Controller/Drawing/IImageEncoder.cs
index 64d997dba0..9b895587f3 100644
--- a/MediaBrowser.Controller/Drawing/IImageEncoder.cs
+++ b/MediaBrowser.Controller/Drawing/IImageEncoder.cs
@@ -19,7 +19,7 @@ namespace MediaBrowser.Controller.Drawing
/// <summary>
/// Encodes the image.
/// </summary>
- void EncodeImage(string inputPath, ImageSize? originalImageSize, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
+ string EncodeImage(string inputPath, DateTime dateModified, string outputPath, bool autoOrient, int quality, ImageProcessingOptions options, ImageFormat outputFormat);
/// <summary>
/// Creates the image collage.
diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
index a107c12328..d98638d556 100644
--- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs
+++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
@@ -105,7 +105,7 @@ namespace MediaBrowser.Controller.Drawing
/// Creates the image collage.
/// </summary>
/// <param name="options">The options.</param>
- Task CreateImageCollage(ImageCollageOptions options);
+ void CreateImageCollage(ImageCollageOptions options);
/// <summary>
/// Gets a value indicating whether [supports image collage creation].
@@ -114,5 +114,7 @@ namespace MediaBrowser.Controller.Drawing
bool SupportsImageCollageCreation { get; }
IImageEncoder ImageEncoder { get; set; }
+
+ void SaveImageSize(string path, DateTime imageDateModified, ImageSize size);
}
}
diff --git a/MediaBrowser.Controller/Drawing/ImageHelper.cs b/MediaBrowser.Controller/Drawing/ImageHelper.cs
index 30c4e90fb0..54f2ff987a 100644
--- a/MediaBrowser.Controller/Drawing/ImageHelper.cs
+++ b/MediaBrowser.Controller/Drawing/ImageHelper.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using System;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
@@ -18,6 +19,13 @@ namespace MediaBrowser.Controller.Drawing
return GetSizeEstimate(options);
}
+ public static IImageProcessor ImageProcessor { get; set; }
+
+ public static void SaveImageSize(string path, DateTime dateModified, ImageSize size)
+ {
+ ImageProcessor.SaveImageSize(path, dateModified, size);
+ }
+
private static ImageSize GetSizeEstimate(ImageProcessingOptions options)
{
if (options.Width.HasValue && options.Height.HasValue)
diff --git a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
index 70ac083430..cfb3a97eea 100644
--- a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
+++ b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs
@@ -10,6 +10,8 @@ namespace MediaBrowser.Controller.Drawing
{
public class ImageProcessingOptions
{
+ public string ItemId { get; set; }
+ public string ItemType { get; set; }
public IHasImages Item { get; set; }
public ItemImageInfo Image { get; set; }
diff --git a/MediaBrowser.Controller/Dto/DtoOptions.cs b/MediaBrowser.Controller/Dto/DtoOptions.cs
index e69b649488..b9d9d7ddad 100644
--- a/MediaBrowser.Controller/Dto/DtoOptions.cs
+++ b/MediaBrowser.Controller/Dto/DtoOptions.cs
@@ -23,17 +23,28 @@ namespace MediaBrowser.Controller.Dto
public bool AddCurrentProgram { get; set; }
public DtoOptions()
+ : this(true)
+ {
+ }
+
+ public DtoOptions(bool allFields)
{
- Fields = new List<ItemFields>();
ImageTypeLimit = int.MaxValue;
EnableImages = true;
EnableUserData = true;
AddCurrentProgram = true;
- Fields = Enum.GetNames(typeof (ItemFields))
- .Select(i => (ItemFields) Enum.Parse(typeof (ItemFields), i, true))
- .Except(DefaultExcludedFields)
- .ToList();
+ if (allFields)
+ {
+ Fields = Enum.GetNames(typeof(ItemFields))
+ .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
+ .Except(DefaultExcludedFields)
+ .ToList();
+ }
+ else
+ {
+ Fields = new List<ItemFields>();
+ }
ImageTypes = Enum.GetNames(typeof(ImageType))
.Select(i => (ImageType)Enum.Parse(typeof(ImageType), i, true))
diff --git a/MediaBrowser.Controller/Entities/AggregateFolder.cs b/MediaBrowser.Controller/Entities/AggregateFolder.cs
index a1de23c930..fe8ac0919c 100644
--- a/MediaBrowser.Controller/Entities/AggregateFolder.cs
+++ b/MediaBrowser.Controller/Entities/AggregateFolder.cs
@@ -6,7 +6,6 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs
index 92d8d95bcf..4d35531cb7 100644
--- a/MediaBrowser.Controller/Entities/Audio/Audio.cs
+++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs
@@ -131,7 +131,7 @@ namespace MediaBrowser.Controller.Entities.Audio
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
- protected override string CreateSortName()
+ protected override string CreateSortNameInternal()
{
return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("0000 - ") : "")
+ (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
@@ -209,7 +209,7 @@ namespace MediaBrowser.Controller.Entities.Audio
if (SourceType == SourceType.Channel)
{
var sources = ChannelManager.GetStaticMediaSources(this, CancellationToken.None)
- .Result.ToList();
+ .ToList();
if (sources.Count > 0)
{
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
index f40ab3cdee..e9eca19cf7 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
@@ -8,6 +8,7 @@ using System.Linq;
using MediaBrowser.Model.Serialization;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
@@ -42,20 +43,22 @@ namespace MediaBrowser.Controller.Entities.Audio
[IgnoreDataMember]
public MusicArtist MusicArtist
{
- get
- {
- var artist = GetParents().OfType<MusicArtist>().FirstOrDefault();
+ get { return GetMusicArtist(new DtoOptions(true)); }
+ }
- if (artist == null)
+ public MusicArtist GetMusicArtist(DtoOptions options)
+ {
+ var artist = GetParents().OfType<MusicArtist>().FirstOrDefault();
+
+ if (artist == null)
+ {
+ var name = AlbumArtist;
+ if (!string.IsNullOrWhiteSpace(name))
{
- var name = AlbumArtist;
- if (!string.IsNullOrWhiteSpace(name))
- {
- artist = LibraryManager.GetArtist(name);
- }
+ artist = LibraryManager.GetArtist(name, options);
}
- return artist;
}
+ return artist;
}
[IgnoreDataMember]
@@ -171,7 +174,7 @@ namespace MediaBrowser.Controller.Entities.Audio
id.AlbumArtists = AlbumArtists;
- var artist = MusicArtist;
+ var artist = GetMusicArtist(new DtoOptions(false));
if (artist != null)
{
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index 8d83f8a35e..b0b9493a53 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -266,20 +266,6 @@ namespace MediaBrowser.Controller.Entities.Audio
return info;
}
- public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
- {
- return inputItems.Where(GetItemFilter());
- }
-
- public Func<BaseItem, bool> GetItemFilter()
- {
- return i =>
- {
- var hasArtist = i as IHasArtist;
- return hasArtist != null && hasArtist.HasAnyArtist(Name);
- };
- }
-
[IgnoreDataMember]
public override bool SupportsPeople
{
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
index 2f99e530e3..d4a85b4d07 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs
@@ -91,16 +91,6 @@ namespace MediaBrowser.Controller.Entities.Audio
}
}
- public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
- {
- return inputItems.Where(GetItemFilter());
- }
-
- public Func<BaseItem, bool> GetItemFilter()
- {
- return i => i is IHasMusicGenres && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase);
- }
-
[IgnoreDataMember]
public override bool SupportsPeople
{
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 999f6db3fc..346442f59a 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -21,7 +21,8 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Sorting;
@@ -186,10 +187,15 @@ namespace MediaBrowser.Controller.Entities
}
set
{
+ var isSortNameDefault = IsSortNameDefault(SortName);
+
_name = value;
- // lazy load this again
- _sortName = null;
+ if (isSortNameDefault)
+ {
+ // lazy load this again
+ SortName = null;
+ }
}
}
@@ -580,7 +586,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- private string _forcedSortName;
/// <summary>
/// Gets or sets the name of the forced sort.
/// </summary>
@@ -588,8 +593,42 @@ namespace MediaBrowser.Controller.Entities
[IgnoreDataMember]
public string ForcedSortName
{
- get { return _forcedSortName; }
- set { _forcedSortName = value; _sortName = null; }
+ get
+ {
+ var sortName = SortName;
+
+ if (string.IsNullOrWhiteSpace(sortName))
+ {
+ return null;
+ }
+
+ if (string.Equals(sortName, CreateSortName(), StringComparison.OrdinalIgnoreCase))
+ {
+ return null;
+ }
+
+ return sortName;
+ }
+ set
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ SortName = null;
+ }
+ else
+ {
+ var newValue = CreateSortNameFromCustomValue(value);
+
+ if (string.Equals(newValue, CreateSortName(), StringComparison.OrdinalIgnoreCase))
+ {
+ SortName = null;
+ }
+ else
+ {
+ SortName = newValue;
+ }
+ }
+ }
}
private string _sortName;
@@ -604,15 +643,7 @@ namespace MediaBrowser.Controller.Entities
{
if (_sortName == null)
{
- if (!string.IsNullOrWhiteSpace(ForcedSortName))
- {
- // Need the ToLower because that's what CreateSortName does
- _sortName = ModifySortChunks(ForcedSortName).ToLower();
- }
- else
- {
- _sortName = CreateSortName();
- }
+ _sortName = CreateSortName();
}
return _sortName;
}
@@ -622,6 +653,31 @@ namespace MediaBrowser.Controller.Entities
}
}
+ private string CreateSortNameFromCustomValue(string value)
+ {
+ return string.IsNullOrWhiteSpace(value) ? null : NormalizeCustomSortName(value);
+ }
+
+ protected virtual string NormalizeCustomSortName(string value)
+ {
+ if (ConfigurationManager.Configuration.EnableSimpleSortNameHandling)
+ {
+ return value.RemoveDiacritics().ToLower();
+ }
+
+ return ModifySortChunks(value).ToLower();
+ }
+
+ public bool IsSortNameDefault(string value)
+ {
+ if (string.IsNullOrWhiteSpace(value))
+ {
+ return true;
+ }
+
+ return string.Equals(CreateSortNameFromCustomValue(value), CreateSortName(), StringComparison.OrdinalIgnoreCase);
+ }
+
public string GetInternalMetadataPath()
{
var basePath = ConfigurationManager.ApplicationPaths.InternalMetadataPath;
@@ -643,14 +699,22 @@ namespace MediaBrowser.Controller.Entities
return System.IO.Path.Combine(basePath, idString.Substring(0, 2), idString);
}
+ protected string CreateSortName()
+ {
+ if (string.IsNullOrWhiteSpace(Name))
+ {
+ return null;
+ }
+
+ return CreateSortNameInternal();
+ }
+
/// <summary>
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
- protected virtual string CreateSortName()
+ protected virtual string CreateSortNameInternal()
{
- if (Name == null) return null; //some items may not have name filled in properly
-
if (!EnableAlphaNumericSorting)
{
return Name.TrimStart();
@@ -1303,7 +1367,6 @@ namespace MediaBrowser.Controller.Entities
public void AfterMetadataRefresh()
{
- _sortName = null;
}
/// <summary>
@@ -1680,7 +1743,7 @@ namespace MediaBrowser.Controller.Entities
private BaseItem FindLinkedChild(LinkedChild info)
{
- if (!string.IsNullOrEmpty(info.Path))
+ if (!string.IsNullOrWhiteSpace(info.Path))
{
var itemByPath = LibraryManager.FindByPath(info.Path, null);
@@ -1809,10 +1872,13 @@ namespace MediaBrowser.Controller.Entities
/// Do whatever refreshing is necessary when the filesystem pertaining to this item has changed.
/// </summary>
/// <returns>Task.</returns>
- public virtual Task ChangedExternally()
+ public virtual void ChangedExternally()
{
- ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(FileSystem), RefreshPriority.High);
- return Task.FromResult(true);
+ ProviderManager.QueueRefresh(Id, new MetadataRefreshOptions(FileSystem)
+ {
+ ValidateChildren = true,
+
+ }, RefreshPriority.High);
}
/// <summary>
@@ -2187,8 +2253,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public virtual bool BeforeMetadataRefresh()
{
- _sortName = null;
-
var hasChanges = false;
if (string.IsNullOrEmpty(Name) && !string.IsNullOrEmpty(Path))
@@ -2210,7 +2274,7 @@ namespace MediaBrowser.Controller.Entities
return path;
}
- public virtual Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields)
+ public virtual void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields)
{
if (RunTimeTicks.HasValue)
{
@@ -2226,8 +2290,6 @@ namespace MediaBrowser.Controller.Entities
}
}
}
-
- return Task.FromResult(true);
}
protected Task RefreshMetadataForOwnedItem(BaseItem ownedItem, bool copyTitleMetadata, MetadataRefreshOptions options, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index 24474ba559..0a5faa727c 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -7,7 +7,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Extensions;
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index edac27f99b..7566911a10 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -10,8 +10,9 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Channels;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
@@ -671,8 +672,9 @@ namespace MediaBrowser.Controller.Entities
{
return ItemRepository.GetItemList(new InternalItemsQuery
{
- ParentId = Id,
- GroupByPresentationUniqueKey = false
+ Parent = this,
+ GroupByPresentationUniqueKey = false,
+ DtoOptions = new DtoOptions(true)
});
}
@@ -690,9 +692,13 @@ namespace MediaBrowser.Controller.Entities
{
Recursive = false,
Limit = 0,
- ParentId = Id
+ Parent = this,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
- }).Result;
+ });
return result.TotalRecordCount;
}
@@ -705,9 +711,13 @@ namespace MediaBrowser.Controller.Entities
IsFolder = false,
IsVirtualItem = false,
EnableTotalRecordCount = true,
- Limit = 0
+ Limit = 0,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
- }).Result.TotalRecordCount;
+ }).TotalRecordCount;
}
public QueryResult<BaseItem> QueryRecursive(InternalItemsQuery query)
@@ -733,7 +743,10 @@ namespace MediaBrowser.Controller.Entities
if (!(this is UserRootFolder) && !(this is AggregateFolder))
{
- query.ParentId = query.ParentId ?? Id;
+ if (!query.ParentId.HasValue)
+ {
+ query.Parent = this;
+ }
}
if (RequiresPostFiltering2(query))
@@ -813,30 +826,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- if (query.SortBy != null && query.SortBy.Length > 0)
- {
- if (query.SortBy.Contains(ItemSortBy.AiredEpisodeOrder, StringComparer.OrdinalIgnoreCase))
- {
- Logger.Debug("Query requires post-filtering due to ItemSortBy.AiredEpisodeOrder");
- return true;
- }
- if (query.SortBy.Contains(ItemSortBy.GameSystem, StringComparer.OrdinalIgnoreCase))
- {
- Logger.Debug("Query requires post-filtering due to ItemSortBy.GameSystem");
- return true;
- }
- if (query.SortBy.Contains(ItemSortBy.Players, StringComparer.OrdinalIgnoreCase))
- {
- Logger.Debug("Query requires post-filtering due to ItemSortBy.Players");
- return true;
- }
- if (query.SortBy.Contains(ItemSortBy.VideoBitRate, StringComparer.OrdinalIgnoreCase))
- {
- Logger.Debug("Query requires post-filtering due to ItemSortBy.VideoBitRate");
- return true;
- }
- }
-
if (query.IsInBoxSet.HasValue)
{
Logger.Debug("Query requires post-filtering due to IsInBoxSet");
@@ -894,18 +883,6 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- if (query.MinPlayers.HasValue)
- {
- Logger.Debug("Query requires post-filtering due to MinPlayers");
- return true;
- }
-
- if (query.MaxPlayers.HasValue)
- {
- Logger.Debug("Query requires post-filtering due to MaxPlayers");
- return true;
- }
-
if (UserViewBuilder.CollapseBoxSetItems(query, this, query.User, ConfigurationManager))
{
Logger.Debug("Query requires post-filtering due to CollapseBoxSetItems");
@@ -936,12 +913,6 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- if (!string.IsNullOrWhiteSpace(query.AlbumArtistStartsWithOrGreater))
- {
- Logger.Debug("Query requires post-filtering due to AlbumArtistStartsWithOrGreater");
- return true;
- }
-
if (query.IsPlayed.HasValue)
{
if (query.IncludeItemTypes.Length == 1 && query.IncludeItemTypes.Contains(typeof(Series).Name))
@@ -954,7 +925,7 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- public Task<QueryResult<BaseItem>> GetItems(InternalItemsQuery query)
+ public QueryResult<BaseItem> GetItems(InternalItemsQuery query)
{
if (query.ItemIds.Length > 0)
{
@@ -967,20 +938,20 @@ namespace MediaBrowser.Controller.Entities
// Try to preserve order
result.Items = result.Items.OrderBy(i => ids.IndexOf(i.Id.ToString("N"))).ToArray();
}
- return Task.FromResult(result);
+ return result;
}
return GetItemsInternal(query);
}
- protected virtual async Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query)
+ protected virtual QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
if (SourceType == SourceType.Channel)
{
try
{
// Don't blow up here because it could cause parent screens with other content to fail
- return await ChannelManager.GetChannelItemsInternal(new ChannelItemQuery
+ return ChannelManager.GetChannelItemsInternal(new ChannelItemQuery
{
ChannelId = ChannelId,
FolderId = Id.ToString("N"),
@@ -990,7 +961,7 @@ namespace MediaBrowser.Controller.Entities
SortBy = query.SortBy,
SortOrder = query.SortOrder
- }, new Progress<double>(), CancellationToken.None);
+ }, new Progress<double>(), CancellationToken.None).Result;
}
catch
{
@@ -1355,19 +1326,6 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
- /// Folders need to validate and refresh
- /// </summary>
- /// <returns>Task.</returns>
- public override async Task ChangedExternally()
- {
- var progress = new Progress<double>();
-
- await ValidateChildren(progress, CancellationToken.None).ConfigureAwait(false);
-
- await base.ChangedExternally().ConfigureAwait(false);
- }
-
- /// <summary>
/// Marks the played.
/// </summary>
/// <param name="user">The user.</param>
@@ -1391,7 +1349,7 @@ namespace MediaBrowser.Controller.Entities
query.IsVirtualItem = false;
}
- var itemsResult = await GetItems(query).ConfigureAwait(false);
+ var itemsResult = GetItems(query);
// Sweep through recursively and update status
var tasks = itemsResult.Items.Select(c => c.MarkPlayed(user, datePlayed, resetPosition));
@@ -1406,14 +1364,14 @@ namespace MediaBrowser.Controller.Entities
/// <returns>Task.</returns>
public override async Task MarkUnplayed(User user)
{
- var itemsResult = await GetItems(new InternalItemsQuery
+ var itemsResult = GetItems(new InternalItemsQuery
{
User = user,
Recursive = true,
IsFolder = false,
EnableTotalRecordCount = false
- }).ConfigureAwait(false);
+ });
// Sweep through recursively and update status
var tasks = itemsResult.Items.Select(c => c.MarkUnplayed(user));
@@ -1430,7 +1388,7 @@ namespace MediaBrowser.Controller.Entities
IsVirtualItem = false,
EnableTotalRecordCount = false
- }).Result;
+ });
return itemsResult.Items
.All(i => i.IsPlayed(user));
@@ -1481,7 +1439,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- public override async Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> itemFields)
+ public override void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields)
{
if (!SupportsUserDataFromChildren)
{
@@ -1490,7 +1448,7 @@ namespace MediaBrowser.Controller.Entities
if (itemDto != null)
{
- if (itemFields.Contains(ItemFields.RecursiveItemCount))
+ if (fields.Contains(ItemFields.RecursiveItemCount))
{
itemDto.RecursiveItemCount = GetRecursiveChildCount(user);
}
@@ -1498,16 +1456,20 @@ namespace MediaBrowser.Controller.Entities
if (SupportsPlayedStatus)
{
- var unplayedQueryResult = await GetItems(new InternalItemsQuery(user)
+ var unplayedQueryResult = GetItems(new InternalItemsQuery(user)
{
Recursive = true,
IsFolder = false,
IsVirtualItem = false,
EnableTotalRecordCount = true,
Limit = 0,
- IsPlayed = false
+ IsPlayed = false,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
- }).ConfigureAwait(false);
+ });
double unplayedCount = unplayedQueryResult.TotalRecordCount;
diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs
index 093b191b6b..836020d886 100644
--- a/MediaBrowser.Controller/Entities/GameGenre.cs
+++ b/MediaBrowser.Controller/Entities/GameGenre.cs
@@ -69,16 +69,6 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
- {
- return inputItems.Where(GetItemFilter());
- }
-
- public Func<BaseItem, bool> GetItemFilter()
- {
- return i => i is Game && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase);
- }
-
public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
{
query.GenreIds = new[] { Id.ToString("N") };
diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs
index 6569a1e6c0..4b70eae586 100644
--- a/MediaBrowser.Controller/Entities/Genre.cs
+++ b/MediaBrowser.Controller/Entities/Genre.cs
@@ -81,16 +81,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
- {
- return inputItems.Where(GetItemFilter());
- }
-
- public Func<BaseItem, bool> GetItemFilter()
- {
- return i => !(i is Game) && !(i is IHasMusicGenres) && i.Genres.Contains(Name, StringComparer.OrdinalIgnoreCase);
- }
-
public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
{
query.GenreIds = new[] { Id.ToString("N") };
diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs
index 2104bee09f..e2b3c07771 100644
--- a/MediaBrowser.Controller/Entities/IHasImages.cs
+++ b/MediaBrowser.Controller/Entities/IHasImages.cs
@@ -3,7 +3,7 @@ using MediaBrowser.Model.Entities;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Controller/Entities/IHasUserData.cs b/MediaBrowser.Controller/Entities/IHasUserData.cs
index 0b3b7dc8d9..0029947ee1 100644
--- a/MediaBrowser.Controller/Entities/IHasUserData.cs
+++ b/MediaBrowser.Controller/Entities/IHasUserData.cs
@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities
/// <summary>
/// Fills the user data dto values.
/// </summary>
- Task FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields);
+ void FillUserDataDtoValues(UserItemDataDto dto, UserItemData userData, BaseItemDto itemDto, User user, List<ItemFields> fields);
bool EnableRememberingTrackSelections { get; }
diff --git a/MediaBrowser.Controller/Entities/IItemByName.cs b/MediaBrowser.Controller/Entities/IItemByName.cs
index b69c8bdfcc..a02ca1c0c4 100644
--- a/MediaBrowser.Controller/Entities/IItemByName.cs
+++ b/MediaBrowser.Controller/Entities/IItemByName.cs
@@ -7,13 +7,6 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
public interface IItemByName : IHasMetadata
{
- /// <summary>
- /// Gets the tagged items.
- /// </summary>
- /// <param name="inputItems">The input items.</param>
- /// <returns>IEnumerable{BaseItem}.</returns>
- IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems);
-
IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query);
}
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index 3c948487d8..743e7642e1 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -126,9 +126,27 @@ namespace MediaBrowser.Controller.Entities
public bool? IsVirtualItem { get; set; }
public Guid? ParentId { get; set; }
+ public string ParentType { get; set; }
public string[] AncestorIds { get; set; }
public string[] TopParentIds { get; set; }
+ public BaseItem Parent
+ {
+ set
+ {
+ if (value == null)
+ {
+ ParentId = null;
+ ParentType = null;
+ }
+ else
+ {
+ ParentId = value.Id;
+ ParentType = value.GetType().Name;
+ }
+ }
+ }
+
public string[] PresetViews { get; set; }
public SourceType[] SourceTypes { get; set; }
public SourceType[] ExcludeSourceTypes { get; set; }
@@ -136,7 +154,6 @@ namespace MediaBrowser.Controller.Entities
public DayOfWeek[] AirDays { get; set; }
public SeriesStatus[] SeriesStatuses { get; set; }
- public string AlbumArtistStartsWithOrGreater { get; set; }
public string ExternalSeriesId { get; set; }
public string ExternalId { get; set; }
@@ -156,41 +173,11 @@ namespace MediaBrowser.Controller.Entities
public DateTime? MinDateCreated { get; set; }
public DateTime? MinDateLastSaved { get; set; }
+ public DateTime? MinDateLastSavedForUser { get; set; }
public DtoOptions DtoOptions { get; set; }
public int MinSimilarityScore { get; set; }
- public bool HasField(ItemFields name)
- {
- var fields = DtoOptions.Fields;
-
- switch (name)
- {
- case ItemFields.ThemeSongIds:
- case ItemFields.ThemeVideoIds:
- case ItemFields.ProductionLocations:
- case ItemFields.Keywords:
- case ItemFields.Taglines:
- case ItemFields.CustomRating:
- case ItemFields.DateCreated:
- case ItemFields.SortName:
- case ItemFields.Overview:
- case ItemFields.HomePageUrl:
- case ItemFields.VoteCount:
- case ItemFields.DisplayMediaType:
- //case ItemFields.ServiceName:
- case ItemFields.Genres:
- case ItemFields.Studios:
- case ItemFields.Settings:
- case ItemFields.OriginalTitle:
- case ItemFields.Tags:
- case ItemFields.DateLastMediaAdded:
- return fields.Count == 0 || fields.Contains(name);
- default:
- return true;
- }
- }
-
public InternalItemsQuery()
{
MinSimilarityScore = 20;
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index 3f733ce035..efa85f3ae4 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -152,7 +152,7 @@ namespace MediaBrowser.Controller.Entities.Movies
var currentOfficialRating = OfficialRating;
// Gather all possible ratings
- var ratings = GetRecursiveChildren(i => i is Movie || i is Series || i is MusicAlbum || i is Game)
+ var ratings = GetLinkedChildren()
.Select(i => i.OfficialRating)
.Where(i => !string.IsNullOrEmpty(i))
.Distinct(StringComparer.OrdinalIgnoreCase)
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index c2a01f4fff..8a5b726e28 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -6,7 +6,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Providers;
diff --git a/MediaBrowser.Controller/Entities/Person.cs b/MediaBrowser.Controller/Entities/Person.cs
index 005fb20142..20d9c7999d 100644
--- a/MediaBrowser.Controller/Entities/Person.cs
+++ b/MediaBrowser.Controller/Entities/Person.cs
@@ -93,22 +93,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
- {
- var itemsWithPerson = LibraryManager.GetItemIds(new InternalItemsQuery
- {
- PersonIds = new[] { Id.ToString("N") }
- });
-
- return inputItems.Where(i => itemsWithPerson.Contains(i.Id));
- }
-
-
- public Func<BaseItem, bool> GetItemFilter()
- {
- return i => LibraryManager.GetPeople(i).Any(p => string.Equals(p.Name, Name, StringComparison.OrdinalIgnoreCase));
- }
-
[IgnoreDataMember]
public override bool SupportsPeople
{
diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs
index 2e5e6ce437..8cb65c60a0 100644
--- a/MediaBrowser.Controller/Entities/Studio.cs
+++ b/MediaBrowser.Controller/Entities/Studio.cs
@@ -88,16 +88,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
- {
- return inputItems.Where(GetItemFilter());
- }
-
- public Func<BaseItem, bool> GetItemFilter()
- {
- return i => i.Studios.Contains(Name, StringComparer.OrdinalIgnoreCase);
- }
-
public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
{
query.StudioIds = new[] { Id.ToString("N") };
diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs
index c2f7a6168b..e963ab184e 100644
--- a/MediaBrowser.Controller/Entities/TV/Episode.cs
+++ b/MediaBrowser.Controller/Entities/TV/Episode.cs
@@ -237,7 +237,7 @@ namespace MediaBrowser.Controller.Entities.TV
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
- protected override string CreateSortName()
+ protected override string CreateSortNameInternal()
{
return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000 - ") : "")
+ (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index ed04b5ddcb..4ccf6d6232 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -5,6 +5,7 @@ using MediaBrowser.Model.Users;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Serialization;
@@ -144,12 +145,12 @@ namespace MediaBrowser.Controller.Entities.TV
/// Creates the name of the sort.
/// </summary>
/// <returns>System.String.</returns>
- protected override string CreateSortName()
+ protected override string CreateSortNameInternal()
{
return IndexNumber != null ? IndexNumber.Value.ToString("0000") : Name;
}
- protected override Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query)
+ protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
if (query.User == null)
{
@@ -160,41 +161,39 @@ namespace MediaBrowser.Controller.Entities.TV
Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager);
- var items = GetEpisodes(user).Where(filter);
+ var items = GetEpisodes(user, query.DtoOptions).Where(filter);
var result = PostFilterAndSort(items, query, false, false);
- return Task.FromResult(result);
+ return result;
}
/// <summary>
/// Gets the episodes.
/// </summary>
- /// <param name="user">The user.</param>
- /// <returns>IEnumerable{Episode}.</returns>
- public IEnumerable<Episode> GetEpisodes(User user)
+ public IEnumerable<Episode> GetEpisodes(User user, DtoOptions options)
{
- return GetEpisodes(Series, user);
+ return GetEpisodes(Series, user, options);
}
- public IEnumerable<Episode> GetEpisodes(Series series, User user)
+ public IEnumerable<Episode> GetEpisodes(Series series, User user, DtoOptions options)
{
- return GetEpisodes(series, user, null);
+ return GetEpisodes(series, user, null, options);
}
- public IEnumerable<Episode> GetEpisodes(Series series, User user, IEnumerable<Episode> allSeriesEpisodes)
+ public IEnumerable<Episode> GetEpisodes(Series series, User user, IEnumerable<Episode> allSeriesEpisodes, DtoOptions options)
{
- return series.GetSeasonEpisodes(this, user, allSeriesEpisodes);
+ return series.GetSeasonEpisodes(this, user, allSeriesEpisodes, options);
}
public IEnumerable<Episode> GetEpisodes()
{
- return Series.GetSeasonEpisodes(this, null, null);
+ return Series.GetSeasonEpisodes(this, null, null, new DtoOptions(true));
}
public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
{
- return GetEpisodes(user);
+ return GetEpisodes(user, new DtoOptions(true));
}
protected override bool GetBlockUnratedValue(UserPolicy config)
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 7641c95234..c54f93f11f 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -8,6 +8,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Serialization;
@@ -141,13 +142,12 @@ namespace MediaBrowser.Controller.Entities.TV
public override int GetChildCount(User user)
{
- var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
var seriesKey = GetUniqueSeriesKey(this);
var result = LibraryManager.GetCount(new InternalItemsQuery(user)
{
- AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
- SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
+ AncestorWithPresentationUniqueKey = null,
+ SeriesPresentationUniqueKey = seriesKey,
IncludeItemTypes = new[] { typeof(Season).Name },
IsVirtualItem = false,
Limit = 0,
@@ -166,13 +166,12 @@ namespace MediaBrowser.Controller.Entities.TV
public override int GetRecursiveChildCount(User user)
{
- var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
var seriesKey = GetUniqueSeriesKey(this);
var query = new InternalItemsQuery(user)
{
- AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
- SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
+ AncestorWithPresentationUniqueKey = null,
+ SeriesPresentationUniqueKey = seriesKey,
DtoOptions = new Dto.DtoOptions
{
Fields = new List<ItemFields>
@@ -250,12 +249,15 @@ namespace MediaBrowser.Controller.Entities.TV
public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
{
- return GetSeasons(user);
+ return GetSeasons(user, new DtoOptions(true));
}
- public IEnumerable<Season> GetSeasons(User user)
+ public IEnumerable<Season> GetSeasons(User user, DtoOptions options)
{
- var query = new InternalItemsQuery(user);
+ var query = new InternalItemsQuery(user)
+ {
+ DtoOptions = options
+ };
SetSeasonQueryOptions(query, user);
@@ -266,11 +268,10 @@ namespace MediaBrowser.Controller.Entities.TV
{
var config = user.Configuration;
- var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
var seriesKey = GetUniqueSeriesKey(this);
- query.AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey;
- query.SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null;
+ query.AncestorWithPresentationUniqueKey = null;
+ query.SeriesPresentationUniqueKey = seriesKey;
query.IncludeItemTypes = new[] { typeof(Season).Name };
query.SortBy = new[] {ItemSortBy.SortName};
@@ -288,7 +289,7 @@ namespace MediaBrowser.Controller.Entities.TV
}
}
- protected override Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query)
+ protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
if (query.User == null)
{
@@ -299,11 +300,10 @@ namespace MediaBrowser.Controller.Entities.TV
if (query.Recursive)
{
- var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
var seriesKey = GetUniqueSeriesKey(this);
- query.AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey;
- query.SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null;
+ query.AncestorWithPresentationUniqueKey = null;
+ query.SeriesPresentationUniqueKey = seriesKey;
if (query.SortBy.Length == 0)
{
query.SortBy = new[] { ItemSortBy.SortName };
@@ -313,25 +313,25 @@ namespace MediaBrowser.Controller.Entities.TV
query.IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name };
}
query.IsVirtualItem = false;
- return Task.FromResult(LibraryManager.GetItemsResult(query));
+ return LibraryManager.GetItemsResult(query);
}
SetSeasonQueryOptions(query, user);
- return Task.FromResult(LibraryManager.GetItemsResult(query));
+ return LibraryManager.GetItemsResult(query);
}
- public IEnumerable<Episode> GetEpisodes(User user)
+ public IEnumerable<Episode> GetEpisodes(User user, DtoOptions options)
{
- var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
var seriesKey = GetUniqueSeriesKey(this);
var query = new InternalItemsQuery(user)
{
- AncestorWithPresentationUniqueKey = enableSeriesPresentationKey ? null : seriesKey,
- SeriesPresentationUniqueKey = enableSeriesPresentationKey ? seriesKey : null,
+ AncestorWithPresentationUniqueKey = null,
+ SeriesPresentationUniqueKey = seriesKey,
IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name },
- SortBy = new[] { ItemSortBy.SortName }
+ SortBy = new[] { ItemSortBy.SortName },
+ DtoOptions = options
};
var config = user.Configuration;
if (!config.DisplayMissingEpisodes && !config.DisplayUnairedEpisodes)
@@ -352,7 +352,7 @@ namespace MediaBrowser.Controller.Entities.TV
var allSeriesEpisodes = allItems.OfType<Episode>().ToList();
var allEpisodes = allItems.OfType<Season>()
- .SelectMany(i => i.GetEpisodes(this, user, allSeriesEpisodes))
+ .SelectMany(i => i.GetEpisodes(this, user, allSeriesEpisodes, options))
.Reverse()
.ToList();
@@ -429,10 +429,8 @@ namespace MediaBrowser.Controller.Entities.TV
progress.Report(100);
}
- public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user)
+ public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, DtoOptions options)
{
- var enableSeriesPresentationKey = ConfigurationManager.Configuration.EnableSeriesPresentationUniqueKey;
-
var queryFromSeries = ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons;
// add optimization when this setting is not enabled
@@ -442,10 +440,11 @@ namespace MediaBrowser.Controller.Entities.TV
var query = new InternalItemsQuery(user)
{
- AncestorWithPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? null : seriesKey,
- SeriesPresentationUniqueKey = queryFromSeries && enableSeriesPresentationKey ? seriesKey : null,
+ AncestorWithPresentationUniqueKey = queryFromSeries ? null : seriesKey,
+ SeriesPresentationUniqueKey = queryFromSeries ? seriesKey : null,
IncludeItemTypes = new[] { typeof(Episode).Name },
- SortBy = new[] { ItemSortBy.SortName }
+ SortBy = new[] { ItemSortBy.SortName },
+ DtoOptions = options
};
if (user != null)
{
@@ -466,14 +465,14 @@ namespace MediaBrowser.Controller.Entities.TV
var allItems = LibraryManager.GetItemList(query).OfType<Episode>();
- return GetSeasonEpisodes(parentSeason, user, allItems);
+ return GetSeasonEpisodes(parentSeason, user, allItems, options);
}
- public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<Episode> allSeriesEpisodes)
+ public IEnumerable<Episode> GetSeasonEpisodes(Season parentSeason, User user, IEnumerable<Episode> allSeriesEpisodes, DtoOptions options)
{
if (allSeriesEpisodes == null)
{
- return GetSeasonEpisodes(parentSeason, user);
+ return GetSeasonEpisodes(parentSeason, user, options);
}
var episodes = FilterEpisodesBySeason(allSeriesEpisodes, parentSeason, ConfigurationManager.Configuration.DisplaySpecialsWithinSeasons);
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index b602990ac8..c93c814015 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -50,23 +50,23 @@ namespace MediaBrowser.Controller.Entities
}
}
- protected override async Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query)
+ protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
if (query.Recursive)
{
return QueryRecursive(query);
}
- var result = await UserViewManager.GetUserViews(new UserViewQuery
+ var result = UserViewManager.GetUserViews(new UserViewQuery
{
UserId = query.User.Id.ToString("N"),
PresetViews = query.PresetViews
- }, CancellationToken.None).ConfigureAwait(false);
+ }, CancellationToken.None).Result;
var user = query.User;
Func<BaseItem, bool> filter = i => UserViewBuilder.Filter(i, user, query, UserDataManager, LibraryManager);
-
+
return PostFilterAndSort(result.Where(filter), query, true, true);
}
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index 99601b2904..27be696ebd 100644
--- a/MediaBrowser.Controller/Entities/UserView.cs
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -7,6 +7,7 @@ using System.Collections.Generic;
using MediaBrowser.Model.Serialization;
using System.Threading.Tasks;
using System.Linq;
+using MediaBrowser.Controller.Dto;
namespace MediaBrowser.Controller.Entities
{
@@ -53,7 +54,7 @@ namespace MediaBrowser.Controller.Entities
return GetChildren(user, true).Count();
}
- protected override Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query)
+ protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
var parent = this as Folder;
@@ -67,7 +68,7 @@ namespace MediaBrowser.Controller.Entities
}
return new UserViewBuilder(UserViewManager, LiveTvManager, ChannelManager, LibraryManager, Logger, UserDataManager, TVSeriesManager, ConfigurationManager, PlaylistManager)
- .GetUserItems(parent, this, ViewType, query);
+ .GetUserItems(parent, this, ViewType, query).Result;
}
public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
@@ -75,9 +76,10 @@ namespace MediaBrowser.Controller.Entities
var result = GetItems(new InternalItemsQuery
{
User = user,
- EnableTotalRecordCount = false
+ EnableTotalRecordCount = false,
+ DtoOptions = new DtoOptions(true)
- }).Result;
+ });
return result.Items;
}
@@ -100,9 +102,11 @@ namespace MediaBrowser.Controller.Entities
Recursive = true,
EnableTotalRecordCount = false,
- ForceDirect = true
+ ForceDirect = true,
+
+ DtoOptions = query.DtoOptions
- }).Result;
+ });
return result.Items.Where(i => UserViewBuilder.FilterItem(i, query));
}
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 8da069f62b..91e24caeba 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -17,6 +17,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.Extensions;
namespace MediaBrowser.Controller.Entities
@@ -83,7 +84,7 @@ namespace MediaBrowser.Controller.Entities
Limit = query.Limit,
StartIndex = query.StartIndex
- }, CancellationToken.None).ConfigureAwait(false);
+ }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false);
return GetResult(result);
}
@@ -110,7 +111,7 @@ namespace MediaBrowser.Controller.Entities
Limit = query.Limit,
StartIndex = query.StartIndex
- }, CancellationToken.None).ConfigureAwait(false);
+ }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false);
return GetResult(result);
}
@@ -129,7 +130,7 @@ namespace MediaBrowser.Controller.Entities
if (query.Recursive)
{
query.Recursive = true;
- query.ParentId = queryParent.Id;
+ query.Parent = queryParent;
query.SetUser(user);
return _libraryManager.GetItemsResult(query);
@@ -141,7 +142,7 @@ namespace MediaBrowser.Controller.Entities
return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query);
case CollectionType.Playlists:
- return await GetPlaylistsView(queryParent, user, query).ConfigureAwait(false);
+ return GetPlaylistsView(queryParent, user, query);
case CollectionType.BoxSets:
return GetBoxsetView(queryParent, user, query);
@@ -180,7 +181,7 @@ namespace MediaBrowser.Controller.Entities
return await GetMovieGenres(queryParent, user, query).ConfigureAwait(false);
case SpecialFolder.MovieGenre:
- return await GetMovieGenreItems(queryParent, displayParent, user, query).ConfigureAwait(false);
+ return GetMovieGenreItems(queryParent, displayParent, user, query);
case SpecialFolder.MovieResume:
return GetMovieResume(queryParent, user, query);
@@ -354,7 +355,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicPlaylists(Folder parent, User user, InternalItemsQuery query)
{
- query.ParentId = null;
+ query.Parent = null;
query.IncludeItemTypes = new[] { typeof(Playlist).Name };
query.SetUser(user);
query.Recursive = true;
@@ -365,7 +366,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicAlbums(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IncludeItemTypes = new[] { typeof(MusicAlbum).Name };
@@ -376,7 +377,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicSongs(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IncludeItemTypes = new[] { typeof(Audio.Audio).Name };
@@ -394,7 +395,7 @@ namespace MediaBrowser.Controller.Entities
ParentId = parent == null ? null : parent.Id.ToString("N"),
GroupItems = true
- }).Select(i => i.Item1 ?? i.Item2.FirstOrDefault()).Where(i => i != null);
+ }, query.DtoOptions).Select(i => i.Item1 ?? i.Item2.FirstOrDefault()).Where(i => i != null);
query.SortBy = new string[] { };
@@ -404,7 +405,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetFavoriteSongs(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IsFavorite = true;
query.IncludeItemTypes = new[] { typeof(Audio.Audio).Name };
@@ -415,7 +416,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetFavoriteAlbums(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IsFavorite = true;
query.IncludeItemTypes = new[] { typeof(MusicAlbum).Name };
@@ -423,13 +424,6 @@ namespace MediaBrowser.Controller.Entities
return _libraryManager.GetItemsResult(query);
}
- private async Task<QueryResult<BaseItem>> FindPlaylists(Folder parent, User user, InternalItemsQuery query)
- {
- var list = _playlistManager.GetPlaylists(user.Id.ToString("N"));
-
- return GetResult(list, parent, query);
- }
-
private int GetSpecialItemsLimit()
{
return 50;
@@ -465,7 +459,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetFavoriteMovies(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IsFavorite = true;
query.IncludeItemTypes = new[] { typeof(Movie).Name };
@@ -476,7 +470,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetFavoriteSeries(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IsFavorite = true;
query.IncludeItemTypes = new[] { typeof(Series).Name };
@@ -487,7 +481,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetFavoriteEpisodes(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IsFavorite = true;
query.IncludeItemTypes = new[] { typeof(Episode).Name };
@@ -498,7 +492,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMovieMovies(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IncludeItemTypes = new[] { typeof(Movie).Name };
@@ -517,7 +511,7 @@ namespace MediaBrowser.Controller.Entities
query.SortOrder = SortOrder.Descending;
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.Limit = GetSpecialItemsLimit();
query.IncludeItemTypes = new[] { typeof(Movie).Name };
@@ -531,7 +525,7 @@ namespace MediaBrowser.Controller.Entities
query.SortOrder = SortOrder.Descending;
query.IsResumable = true;
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.Limit = GetSpecialItemsLimit();
query.IncludeItemTypes = new[] { typeof(Movie).Name };
@@ -582,10 +576,10 @@ namespace MediaBrowser.Controller.Entities
return GetResult(genres, parent, query);
}
- private async Task<QueryResult<BaseItem>> GetMovieGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
+ private QueryResult<BaseItem> GetMovieGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = queryParent.Id;
+ query.Parent = queryParent;
query.GenreIds = new[] { displayParent.Id.ToString("N") };
query.SetUser(user);
@@ -594,14 +588,14 @@ namespace MediaBrowser.Controller.Entities
return _libraryManager.GetItemsResult(query);
}
- private async Task<QueryResult<BaseItem>> GetPlaylistsView(Folder parent, User user, InternalItemsQuery query)
+ private QueryResult<BaseItem> GetPlaylistsView(Folder parent, User user, InternalItemsQuery query)
{
return GetResult(_playlistManager.GetPlaylists(user.Id.ToString("N")), parent, query);
}
private QueryResult<BaseItem> GetBoxsetView(Folder parent, User user, InternalItemsQuery query)
{
- query.ParentId = null;
+ query.Parent = null;
query.IncludeItemTypes = new[] { typeof(BoxSet).Name };
query.SetUser(user);
query.Recursive = true;
@@ -643,7 +637,7 @@ namespace MediaBrowser.Controller.Entities
query.SortOrder = SortOrder.Descending;
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.Limit = GetSpecialItemsLimit();
query.IncludeItemTypes = new[] { typeof(Episode).Name };
@@ -662,7 +656,7 @@ namespace MediaBrowser.Controller.Entities
StartIndex = query.StartIndex,
UserId = query.User.Id.ToString("N")
- }, parentFolders);
+ }, parentFolders, query.DtoOptions);
return result;
}
@@ -673,7 +667,7 @@ namespace MediaBrowser.Controller.Entities
query.SortOrder = SortOrder.Descending;
query.IsResumable = true;
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.Limit = GetSpecialItemsLimit();
query.IncludeItemTypes = new[] { typeof(Episode).Name };
@@ -684,7 +678,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetTvSeries(Folder parent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = parent.Id;
+ query.Parent = parent;
query.SetUser(user);
query.IncludeItemTypes = new[] { typeof(Series).Name };
@@ -728,7 +722,7 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetTvGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
{
query.Recursive = true;
- query.ParentId = queryParent.Id;
+ query.Parent = queryParent;
query.GenreIds = new[] { displayParent.Id.ToString("N") };
query.SetUser(user);
@@ -1713,17 +1707,6 @@ namespace MediaBrowser.Controller.Entities
}
}
- if (!string.IsNullOrEmpty(query.AlbumArtistStartsWithOrGreater))
- {
- var ok = new[] { item }.OfType<IHasAlbumArtist>()
- .Any(p => string.Compare(query.AlbumArtistStartsWithOrGreater, p.AlbumArtists.FirstOrDefault(), StringComparison.CurrentCultureIgnoreCase) < 1);
-
- if (!ok)
- {
- return false;
- }
- }
-
return true;
}
@@ -1783,7 +1766,7 @@ namespace MediaBrowser.Controller.Entities
Status = RecordingStatus.Completed,
UserId = user.Id.ToString("N")
- }, CancellationToken.None).ConfigureAwait(false);
+ }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false);
}
var list = new List<BaseItem>();
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index 90aa3690a9..fb31d9a474 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -11,7 +11,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -282,12 +282,10 @@ namespace MediaBrowser.Controller.Entities
public IEnumerable<Video> GetLinkedAlternateVersions()
{
- var linkedVersions = LinkedAlternateVersions
+ return LinkedAlternateVersions
.Select(GetLinkedChild)
.Where(i => i != null)
- .OfType<Video>();
-
- return linkedVersions
+ .OfType<Video>()
.OrderBy(i => i.SortName);
}
@@ -554,7 +552,7 @@ namespace MediaBrowser.Controller.Entities
if (SourceType == SourceType.Channel)
{
var sources = ChannelManager.GetStaticMediaSources(this, CancellationToken.None)
- .Result.ToList();
+ .ToList();
if (sources.Count > 0)
{
@@ -630,21 +628,24 @@ namespace MediaBrowser.Controller.Entities
{
info.Path = media.ShortcutPath;
- if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase))
- {
- info.Protocol = MediaProtocol.Http;
- }
- else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase))
- {
- info.Protocol = MediaProtocol.Rtmp;
- }
- else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
- {
- info.Protocol = MediaProtocol.Rtsp;
- }
- else
+ if (!string.IsNullOrWhiteSpace(info.Path))
{
- info.Protocol = MediaProtocol.File;
+ if (info.Path.StartsWith("Http", StringComparison.OrdinalIgnoreCase))
+ {
+ info.Protocol = MediaProtocol.Http;
+ }
+ else if (info.Path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase))
+ {
+ info.Protocol = MediaProtocol.Rtmp;
+ }
+ else if (info.Path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
+ {
+ info.Protocol = MediaProtocol.Rtsp;
+ }
+ else
+ {
+ info.Protocol = MediaProtocol.File;
+ }
}
}
diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs
index b352950a09..61b1a3b1ae 100644
--- a/MediaBrowser.Controller/Entities/Year.cs
+++ b/MediaBrowser.Controller/Entities/Year.cs
@@ -65,20 +65,6 @@ namespace MediaBrowser.Controller.Entities
return true;
}
- public IEnumerable<BaseItem> GetTaggedItems(IEnumerable<BaseItem> inputItems)
- {
- int year;
-
- var usCulture = new CultureInfo("en-US");
-
- if (!int.TryParse(Name, NumberStyles.Integer, usCulture, out year))
- {
- return inputItems;
- }
-
- return inputItems.Where(i => i.ProductionYear.HasValue && i.ProductionYear.Value == year);
- }
-
public IEnumerable<BaseItem> GetTaggedItems(InternalItemsQuery query)
{
int year;
@@ -107,12 +93,6 @@ namespace MediaBrowser.Controller.Entities
return null;
}
- public Func<BaseItem, bool> GetItemFilter()
- {
- var val = GetYearValue();
- return i => i.ProductionYear.HasValue && val.HasValue && i.ProductionYear.Value == val.Value;
- }
-
[IgnoreDataMember]
public override bool SupportsPeople
{
diff --git a/MediaBrowser.Controller/IO/FileData.cs b/MediaBrowser.Controller/IO/FileData.cs
index d40829d44b..97b778d0cb 100644
--- a/MediaBrowser.Controller/IO/FileData.cs
+++ b/MediaBrowser.Controller/IO/FileData.cs
@@ -3,7 +3,7 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
namespace MediaBrowser.Controller.IO
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index dd23799407..3f6b5a8060 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -10,8 +10,9 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dto;
@@ -68,18 +69,7 @@ namespace MediaBrowser.Controller.Library
/// <param name="name">The name.</param>
/// <returns>Task{Artist}.</returns>
MusicArtist GetArtist(string name);
- /// <summary>
- /// Gets the album artists.
- /// </summary>
- /// <param name="items">The items.</param>
- /// <returns>IEnumerable&lt;MusicArtist&gt;.</returns>
- IEnumerable<MusicArtist> GetAlbumArtists(IEnumerable<IHasAlbumArtist> items);
- /// <summary>
- /// Gets the artists.
- /// </summary>
- /// <param name="items">The items.</param>
- /// <returns>IEnumerable&lt;MusicArtist&gt;.</returns>
- IEnumerable<MusicArtist> GetArtists(IEnumerable<IHasArtist> items);
+ MusicArtist GetArtist(string name, DtoOptions options);
/// <summary>
/// Gets a Studio
/// </summary>
@@ -557,6 +547,14 @@ namespace MediaBrowser.Controller.Library
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
bool IgnoreFile(FileSystemMetadata file, BaseItem parent);
+ Guid GetStudioId(string name);
+
+ Guid GetGenreId(string name);
+
+ Guid GetMusicGenreId(string name);
+
+ Guid GetGameGenreId(string name);
+
void AddVirtualFolder(string name, string collectionType, LibraryOptions options, bool refreshLibrary);
void RemoveVirtualFolder(string name, bool refreshLibrary);
void AddMediaPath(string virtualFolderName, MediaPathInfo path);
diff --git a/MediaBrowser.Controller/Library/IMusicManager.cs b/MediaBrowser.Controller/Library/IMusicManager.cs
index 9baf8b6f12..95ba671b47 100644
--- a/MediaBrowser.Controller/Library/IMusicManager.cs
+++ b/MediaBrowser.Controller/Library/IMusicManager.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using System.Collections.Generic;
+using MediaBrowser.Controller.Dto;
namespace MediaBrowser.Controller.Library
{
@@ -9,23 +10,16 @@ namespace MediaBrowser.Controller.Library
/// <summary>
/// Gets the instant mix from song.
/// </summary>
- /// <param name="item">The item.</param>
- /// <param name="user">The user.</param>
- /// <returns>IEnumerable{Audio}.</returns>
- IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user);
+ IEnumerable<Audio> GetInstantMixFromItem(BaseItem item, User user, DtoOptions dtoOptions);
+
/// <summary>
/// Gets the instant mix from artist.
/// </summary>
- /// <param name="artist">The artist.</param>
- /// <param name="user">The user.</param>
- /// <returns>IEnumerable{Audio}.</returns>
- IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist artist, User user);
+ IEnumerable<Audio> GetInstantMixFromArtist(MusicArtist artist, User user, DtoOptions dtoOptions);
+
/// <summary>
/// Gets the instant mix from genre.
/// </summary>
- /// <param name="genres">The genres.</param>
- /// <param name="user">The user.</param>
- /// <returns>IEnumerable{Audio}.</returns>
- IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user);
+ IEnumerable<Audio> GetInstantMixFromGenres(IEnumerable<string> genres, User user, DtoOptions dtoOptions);
}
}
diff --git a/MediaBrowser.Controller/Library/IUserDataManager.cs b/MediaBrowser.Controller/Library/IUserDataManager.cs
index 5940c7e292..e9954545ed 100644
--- a/MediaBrowser.Controller/Library/IUserDataManager.cs
+++ b/MediaBrowser.Controller/Library/IUserDataManager.cs
@@ -38,9 +38,9 @@ namespace MediaBrowser.Controller.Library
/// <summary>
/// Gets the user data dto.
/// </summary>
- Task<UserItemDataDto> GetUserDataDto(IHasUserData item, User user);
+ UserItemDataDto GetUserDataDto(IHasUserData item, User user);
- Task<UserItemDataDto> GetUserDataDto(IHasUserData item, BaseItemDto itemDto, User user, List<ItemFields> fields);
+ UserItemDataDto GetUserDataDto(IHasUserData item, BaseItemDto itemDto, User user, List<ItemFields> fields);
/// <summary>
/// Get all user data for the given user
diff --git a/MediaBrowser.Controller/Library/IUserViewManager.cs b/MediaBrowser.Controller/Library/IUserViewManager.cs
index 5391d113ea..b46ece49d4 100644
--- a/MediaBrowser.Controller/Library/IUserViewManager.cs
+++ b/MediaBrowser.Controller/Library/IUserViewManager.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
namespace MediaBrowser.Controller.Library
{
@@ -16,6 +17,6 @@ namespace MediaBrowser.Controller.Library
Task<UserView> GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken);
- List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request);
+ List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options);
}
}
diff --git a/MediaBrowser.Controller/Library/ItemResolveArgs.cs b/MediaBrowser.Controller/Library/ItemResolveArgs.cs
index 3aa4d4ee2c..3ddda81cd0 100644
--- a/MediaBrowser.Controller/Library/ItemResolveArgs.cs
+++ b/MediaBrowser.Controller/Library/ItemResolveArgs.cs
@@ -4,7 +4,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
index 7e1dab4624..288b302788 100644
--- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
+++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
@@ -284,19 +284,12 @@ namespace MediaBrowser.Controller.LiveTv
/// <summary>
/// Gets the internal channels.
/// </summary>
- /// <param name="query">The query.</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <returns>Task&lt;QueryResult&lt;LiveTvChannel&gt;&gt;.</returns>
- Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query,
- CancellationToken cancellationToken);
+ Task<QueryResult<LiveTvChannel>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken);
/// <summary>
/// Gets the internal recordings.
/// </summary>
- /// <param name="query">The query.</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <returns>Task&lt;QueryResult&lt;BaseItem&gt;&gt;.</returns>
- Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, CancellationToken cancellationToken);
+ Task<QueryResult<BaseItem>> GetInternalRecordings(RecordingQuery query, DtoOptions options, CancellationToken cancellationToken);
/// <summary>
/// Gets the recording media sources.
diff --git a/MediaBrowser.Controller/LiveTv/LiveStream.cs b/MediaBrowser.Controller/LiveTv/LiveStream.cs
index 0908c3eccb..912fed23c2 100644
--- a/MediaBrowser.Controller/LiveTv/LiveStream.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveStream.cs
@@ -1,8 +1,11 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.System;
namespace MediaBrowser.Controller.LiveTv
{
@@ -10,7 +13,8 @@ namespace MediaBrowser.Controller.LiveTv
{
public MediaSourceInfo OriginalMediaSource { get; set; }
public MediaSourceInfo OpenedMediaSource { get; set; }
- public int ConsumerCount {
+ public int ConsumerCount
+ {
get { return SharedStreamIds.Count; }
}
public ITunerHost TunerHost { get; set; }
@@ -18,11 +22,16 @@ namespace MediaBrowser.Controller.LiveTv
public bool EnableStreamSharing { get; set; }
public string UniqueId = Guid.NewGuid().ToString("N");
- public List<string> SharedStreamIds = new List<string>();
+ public List<string> SharedStreamIds = new List<string>();
+ protected readonly IEnvironmentInfo Environment;
+ protected readonly IFileSystem FileSystem;
+ const int StreamCopyToBufferSize = 81920;
- public LiveStream(MediaSourceInfo mediaSource)
+ public LiveStream(MediaSourceInfo mediaSource, IEnvironmentInfo environment, IFileSystem fileSystem)
{
OriginalMediaSource = mediaSource;
+ Environment = environment;
+ FileSystem = fileSystem;
OpenedMediaSource = mediaSource;
EnableStreamSharing = true;
}
@@ -41,5 +50,40 @@ namespace MediaBrowser.Controller.LiveTv
{
return Task.FromResult(true);
}
+
+ protected Stream GetInputStream(string path, long startPosition, bool allowAsyncFileRead)
+ {
+ var fileOpenOptions = startPosition > 0
+ ? FileOpenOptions.RandomAccess
+ : FileOpenOptions.SequentialScan;
+
+ if (allowAsyncFileRead)
+ {
+ fileOpenOptions |= FileOpenOptions.Asynchronous;
+ }
+
+ return FileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, fileOpenOptions);
+ }
+
+ protected async Task DeleteTempFile(string path, int retryCount = 0)
+ {
+ try
+ {
+ FileSystem.DeleteFile(path);
+ return;
+ }
+ catch
+ {
+
+ }
+
+ if (retryCount > 20)
+ {
+ return;
+ }
+
+ await Task.Delay(500).ConfigureAwait(false);
+ await DeleteTempFile(path, retryCount + 1).ConfigureAwait(false);
+ }
}
}
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
index 6e2fe2495a..34a9103f84 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
@@ -89,7 +89,7 @@ namespace MediaBrowser.Controller.LiveTv
}
}
- protected override string CreateSortName()
+ protected override string CreateSortNameInternal()
{
if (!string.IsNullOrEmpty(Number))
{
@@ -101,7 +101,7 @@ namespace MediaBrowser.Controller.LiveTv
}
}
- return Number + "-" + (Name ?? string.Empty);
+ return (Number ?? string.Empty) + "-" + (Name ?? string.Empty);
}
[IgnoreDataMember]
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index b3a29bafad..d8b81027c5 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -36,14 +36,6 @@
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <DebugType>none</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release Mono\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<ItemGroup>
<None Include="project.json" />
<!-- A reference to the entire .NET Framework is automatically included -->
diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
index 29d37f99b8..54a361ff7e 100644
--- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
+++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
@@ -968,7 +968,7 @@ namespace MediaBrowser.Controller.MediaEncoding
{
if (bitrate.HasValue && videoStream.BitRate.HasValue)
{
- bitrate = Math.Min(bitrate.Value, videoStream.BitRate.Value);
+ bitrate = GetMinBitrate(bitrate.Value, videoStream.BitRate.Value);
}
}
}
@@ -981,13 +981,29 @@ namespace MediaBrowser.Controller.MediaEncoding
// If a max bitrate was requested, don't let the scaled bitrate exceed it
if (request.VideoBitRate.HasValue)
{
- bitrate = Math.Min(bitrate.Value, request.VideoBitRate.Value);
+ bitrate = GetMinBitrate(bitrate.Value, request.VideoBitRate.Value);
}
}
return bitrate;
}
+ private int GetMinBitrate(int sourceBitrate, int requestedBitrate)
+ {
+ if (sourceBitrate <= 2000000)
+ {
+ sourceBitrate *= 2;
+ }
+ else if (sourceBitrate <= 3000000)
+ {
+ sourceBitrate = Convert.ToInt32(sourceBitrate * 1.5);
+ }
+
+ var bitrate = Math.Min(sourceBitrate, requestedBitrate);
+
+ return bitrate;
+ }
+
public int? GetAudioBitrateParam(BaseEncodingJobOptions request, MediaStream audioStream)
{
if (request.AudioBitRate.HasValue)
diff --git a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
index bac9807a90..10d7b9a7e3 100644
--- a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
+++ b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
@@ -124,7 +124,7 @@ namespace MediaBrowser.Controller.MediaEncoding
Task Init();
- Task UpdateEncoderPath(string path, string pathType);
+ void UpdateEncoderPath(string path, string pathType);
bool SupportsEncoder(string encoder);
void SetLogFilename(string name);
diff --git a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs
index 0b1ca08e51..d5c85197fa 100644
--- a/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs
+++ b/MediaBrowser.Controller/MediaEncoding/MediaEncoderHelpers.cs
@@ -4,7 +4,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
namespace MediaBrowser.Controller.MediaEncoding
diff --git a/MediaBrowser.Controller/Net/IHttpResultFactory.cs b/MediaBrowser.Controller/Net/IHttpResultFactory.cs
index 9f295c71d8..b885246919 100644
--- a/MediaBrowser.Controller/Net/IHttpResultFactory.cs
+++ b/MediaBrowser.Controller/Net/IHttpResultFactory.cs
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Services;
@@ -22,6 +22,8 @@ namespace MediaBrowser.Controller.Net
/// <returns>System.Object.</returns>
object GetResult(object content, string contentType, IDictionary<string,string> responseHeaders = null);
+ object GetRedirectResult(string url);
+
/// <summary>
/// Gets the optimized result.
/// </summary>
diff --git a/MediaBrowser.Controller/Net/StaticResultOptions.cs b/MediaBrowser.Controller/Net/StaticResultOptions.cs
index 62c13fbb53..3064cbf101 100644
--- a/MediaBrowser.Controller/Net/StaticResultOptions.cs
+++ b/MediaBrowser.Controller/Net/StaticResultOptions.cs
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
namespace MediaBrowser.Controller.Net
diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs
index fb1410f4af..790e8e824d 100644
--- a/MediaBrowser.Controller/Playlists/Playlist.cs
+++ b/MediaBrowser.Controller/Playlists/Playlist.cs
@@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Model.Serialization;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Providers;
namespace MediaBrowser.Controller.Playlists
@@ -81,7 +82,7 @@ namespace MediaBrowser.Controller.Playlists
public override IEnumerable<BaseItem> GetChildren(User user, bool includeLinkedChildren)
{
- return GetPlayableItems(user).Result;
+ return GetPlayableItems(user, new DtoOptions(true));
}
protected override IEnumerable<BaseItem> GetNonCachedChildren(IDirectoryService directoryService)
@@ -91,7 +92,7 @@ namespace MediaBrowser.Controller.Playlists
public override IEnumerable<BaseItem> GetRecursiveChildren(User user, InternalItemsQuery query)
{
- var items = GetPlayableItems(user).Result;
+ var items = GetPlayableItems(user, query.DtoOptions);
if (query != null)
{
@@ -106,12 +107,12 @@ namespace MediaBrowser.Controller.Playlists
return GetLinkedChildrenInfos();
}
- private Task<IEnumerable<BaseItem>> GetPlayableItems(User user)
+ private IEnumerable<BaseItem> GetPlayableItems(User user, DtoOptions options)
{
- return GetPlaylistItems(MediaType, base.GetChildren(user, true), user);
+ return GetPlaylistItems(MediaType, base.GetChildren(user, true), user, options);
}
- public static async Task<IEnumerable<BaseItem>> GetPlaylistItems(string playlistMediaType, IEnumerable<BaseItem> inputItems, User user)
+ public static IEnumerable<BaseItem> GetPlaylistItems(string playlistMediaType, IEnumerable<BaseItem> inputItems, User user, DtoOptions options)
{
if (user != null)
{
@@ -122,14 +123,14 @@ namespace MediaBrowser.Controller.Playlists
foreach (var item in inputItems)
{
- var playlistItems = await GetPlaylistItems(item, user, playlistMediaType).ConfigureAwait(false);
+ var playlistItems = GetPlaylistItems(item, user, playlistMediaType, options);
list.AddRange(playlistItems);
}
return list;
}
- private static async Task<IEnumerable<BaseItem>> GetPlaylistItems(BaseItem item, User user, string mediaType)
+ private static IEnumerable<BaseItem> GetPlaylistItems(BaseItem item, User user, string mediaType, DtoOptions options)
{
var musicGenre = item as MusicGenre;
if (musicGenre != null)
@@ -140,7 +141,8 @@ namespace MediaBrowser.Controller.Playlists
IncludeItemTypes = new[] { typeof(Audio).Name },
GenreIds = new[] { musicGenre.Id.ToString("N") },
SortBy = new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName },
- SortOrder = SortOrder.Ascending
+ SortOrder = SortOrder.Ascending,
+ DtoOptions = options
});
}
@@ -153,7 +155,8 @@ namespace MediaBrowser.Controller.Playlists
IncludeItemTypes = new[] { typeof(Audio).Name },
ArtistIds = new[] { musicArtist.Id.ToString("N") },
SortBy = new[] { ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName },
- SortOrder = SortOrder.Ascending
+ SortOrder = SortOrder.Ascending,
+ DtoOptions = options
});
}
@@ -166,10 +169,11 @@ namespace MediaBrowser.Controller.Playlists
IsFolder = false,
SortBy = new[] { ItemSortBy.SortName },
MediaTypes = new[] { mediaType },
- EnableTotalRecordCount = false
+ EnableTotalRecordCount = false,
+ DtoOptions = options
};
- var itemsResult = await folder.GetItems(query).ConfigureAwait(false);
+ var itemsResult = folder.GetItems(query);
var items = itemsResult.Items;
return items;
diff --git a/MediaBrowser.Controller/Providers/DirectoryService.cs b/MediaBrowser.Controller/Providers/DirectoryService.cs
index 62db007b90..3d1af2afa2 100644
--- a/MediaBrowser.Controller/Providers/DirectoryService.cs
+++ b/MediaBrowser.Controller/Providers/DirectoryService.cs
@@ -4,7 +4,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Controller/Providers/IDirectoryService.cs b/MediaBrowser.Controller/Providers/IDirectoryService.cs
index f78d9cd6a6..1b203f32c6 100644
--- a/MediaBrowser.Controller/Providers/IDirectoryService.cs
+++ b/MediaBrowser.Controller/Providers/IDirectoryService.cs
@@ -1,5 +1,5 @@
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Controller/Providers/LocalImageInfo.cs b/MediaBrowser.Controller/Providers/LocalImageInfo.cs
index 63651fce85..5e6efe9f6f 100644
--- a/MediaBrowser.Controller/Providers/LocalImageInfo.cs
+++ b/MediaBrowser.Controller/Providers/LocalImageInfo.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
index 7d9dab92b2..86cef628e0 100644
--- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
+++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
@@ -1,5 +1,5 @@
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
@@ -15,6 +15,7 @@ namespace MediaBrowser.Controller.Providers
public bool ReplaceAllMetadata { get; set; }
public bool IsPostRecursiveRefresh { get; set; }
+ public bool ValidateChildren { get; set; }
public MetadataRefreshMode MetadataRefreshMode { get; set; }
public RemoteSearchResult SearchResult { get; set; }
diff --git a/MediaBrowser.Controller/Resolvers/IItemResolver.cs b/MediaBrowser.Controller/Resolvers/IItemResolver.cs
index fcb162b9e6..3af5d5f7f6 100644
--- a/MediaBrowser.Controller/Resolvers/IItemResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/IItemResolver.cs
@@ -2,7 +2,7 @@
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs
index 06372395ec..25537193a9 100644
--- a/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs
+++ b/MediaBrowser.Controller/Resolvers/IResolverIgnoreRule.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Controller/TV/ITVSeriesManager.cs b/MediaBrowser.Controller/TV/ITVSeriesManager.cs
index 771fa602a0..0bcb9ae5b7 100644
--- a/MediaBrowser.Controller/TV/ITVSeriesManager.cs
+++ b/MediaBrowser.Controller/TV/ITVSeriesManager.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Querying;
using System.Collections.Generic;
+using MediaBrowser.Controller.Dto;
namespace MediaBrowser.Controller.TV
{
@@ -9,16 +10,11 @@ namespace MediaBrowser.Controller.TV
/// <summary>
/// Gets the next up.
/// </summary>
- /// <param name="query">The query.</param>
- /// <returns>QueryResult&lt;BaseItem&gt;.</returns>
- QueryResult<BaseItem> GetNextUp(NextUpQuery query);
+ QueryResult<BaseItem> GetNextUp(NextUpQuery query, DtoOptions options);
/// <summary>
/// Gets the next up.
/// </summary>
- /// <param name="request">The request.</param>
- /// <param name="parentsFolders">The parents folders.</param>
- /// <returns>QueryResult&lt;BaseItem&gt;.</returns>
- QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders);
+ QueryResult<BaseItem> GetNextUp(NextUpQuery request, List<Folder> parentsFolders, DtoOptions options);
}
}
diff --git a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
index 50e9de727f..9400cccf30 100644
--- a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
@@ -3,7 +3,7 @@ using MediaBrowser.Controller.Providers;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs
index d393b98d99..954e0c3223 100644
--- a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs
@@ -1,7 +1,7 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
index bd33dece80..fbb6b20f11 100644
--- a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
@@ -6,7 +6,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs
index 7e3a056838..83554f0447 100644
--- a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
using System.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
diff --git a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs
index 8003803eab..47579f870e 100644
--- a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs
@@ -4,7 +4,7 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Providers;
using System.Collections.Generic;
using System.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
index f147f1d61d..b449ad6e0a 100644
--- a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
@@ -7,7 +7,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs
index 69d799b187..6aba137eb0 100644
--- a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs
@@ -8,7 +8,7 @@ using System.Globalization;
using System.IO;
using System.Threading;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs
index 88c51caaa5..30576b5311 100644
--- a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs
@@ -4,7 +4,7 @@ using MediaBrowser.LocalMetadata.Parsers;
using MediaBrowser.Model.Logging;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs
index fda8ea6d0c..fc936f780c 100644
--- a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Logging;
using System.Collections.Generic;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs
index 45cd8eb938..0b596a5be2 100644
--- a/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs
@@ -1,6 +1,6 @@
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
diff --git a/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs
index 8054b1204b..006376b41b 100644
--- a/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs
@@ -1,6 +1,6 @@
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
diff --git a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs
index 8ed18df643..3e7acc28de 100644
--- a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs
@@ -4,7 +4,7 @@ using MediaBrowser.LocalMetadata.Parsers;
using MediaBrowser.Model.Logging;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs
index 2d4059a1a8..572fa7f4c8 100644
--- a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs
@@ -4,7 +4,7 @@ using MediaBrowser.LocalMetadata.Parsers;
using MediaBrowser.Model.Logging;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs
index e0bbb119f2..f91e236f7e 100644
--- a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs
@@ -1,5 +1,5 @@
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
diff --git a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs
index cd839f9cc2..4d0495acbf 100644
--- a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs
@@ -4,7 +4,7 @@ using MediaBrowser.LocalMetadata.Parsers;
using MediaBrowser.Model.Logging;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs
index ce006ef382..9220051870 100644
--- a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs
@@ -1,6 +1,6 @@
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.IO;
diff --git a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs
index 4a7149657d..4212bf2c87 100644
--- a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs
@@ -3,7 +3,7 @@ using MediaBrowser.Controller.Providers;
using MediaBrowser.LocalMetadata.Parsers;
using MediaBrowser.Model.Logging;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
index dd93380fa8..dab637a344 100644
--- a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
@@ -339,9 +339,10 @@ namespace MediaBrowser.LocalMetadata.Savers
writer.WriteElementString("LocalTitle", item.Name);
}
- if (!string.IsNullOrEmpty(item.ForcedSortName))
+ var forcedSortName = item.ForcedSortName;
+ if (!string.IsNullOrEmpty(forcedSortName))
{
- writer.WriteElementString("SortTitle", item.ForcedSortName);
+ writer.WriteElementString("SortTitle", forcedSortName);
}
if (item.PremiereDate.HasValue)
diff --git a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs
index 8167f60022..214b44ae7e 100644
--- a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs
@@ -7,7 +7,7 @@ using System.IO;
using System.Text;
using System.Threading;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs
index b51bd5b911..d5d878ef70 100644
--- a/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/FolderXmlSaver.cs
@@ -10,8 +10,6 @@ using System.IO;
using System.Text;
using System.Threading;
using System.Xml;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs b/MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs
index 5beab746d0..16c67655ad 100644
--- a/MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs
+++ b/MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs
@@ -2,7 +2,7 @@
using MediaBrowser.Model.Configuration;
using System.Collections.Generic;
using System.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs
index 9d518c431a..97623c44b7 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs
@@ -325,6 +325,24 @@ namespace MediaBrowser.MediaEncoding.Encoder
}
}
+ public bool? IsTargetInterlaced
+ {
+ get
+ {
+ if (Options.Static)
+ {
+ return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
+ }
+
+ if (DeInterlace)
+ {
+ return false;
+ }
+
+ return VideoStream == null ? (bool?)null : VideoStream.IsInterlaced;
+ }
+ }
+
public bool? IsTargetAVC
{
get
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
index df067f3c86..c74a8ce37a 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs
@@ -277,6 +277,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
state.TargetPacketLength,
state.TargetTimestamp,
state.IsTargetAnamorphic,
+ state.IsTargetInterlaced,
state.TargetRefFrames,
state.TargetVideoStreamCount,
state.TargetAudioStreamCount,
diff --git a/MediaBrowser.MediaEncoding/Encoder/FontConfigLoader.cs b/MediaBrowser.MediaEncoding/Encoder/FontConfigLoader.cs
index 42048ab9e2..1b5b4b4e41 100644
--- a/MediaBrowser.MediaEncoding/Encoder/FontConfigLoader.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/FontConfigLoader.cs
@@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index c58a18b0fa..280b01ee22 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -252,7 +252,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
}
}
- public async Task UpdateEncoderPath(string path, string pathType)
+ public void UpdateEncoderPath(string path, string pathType)
{
if (_hasExternalEncoder)
{
@@ -786,7 +786,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
timeoutMs = DefaultImageExtractionTimeoutMs;
}
- ranToCompletion = process.WaitForExit(timeoutMs);
+ ranToCompletion = await process.WaitForExitAsync(timeoutMs).ConfigureAwait(false);
if (!ranToCompletion)
{
@@ -892,7 +892,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
while (isResponsive)
{
- if (process.WaitForExit(30000))
+ if (await process.WaitForExitAsync(30000).ConfigureAwait(false))
{
ranToCompletion = true;
break;
diff --git a/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj b/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj
index d021321517..142e1c627b 100644
--- a/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj
+++ b/MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj
@@ -31,11 +31,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <Optimize>false</Optimize>
- <OutputPath>bin\Release Mono</OutputPath>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
index 6270b87c65..1e91a8198b 100644
--- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
+++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs
@@ -9,7 +9,7 @@ using System.Linq;
using System.Text;
using System.Xml;
using MediaBrowser.Model.IO;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
index 1e983ca15c..f8f95684d6 100644
--- a/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs
@@ -61,7 +61,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
}
}
- private async Task<Stream> ConvertSubtitles(Stream stream,
+ private Stream ConvertSubtitles(Stream stream,
string inputFormat,
string outputFormat,
long startTimeTicks,
@@ -166,7 +166,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
using (var stream = subtitle.Item1)
{
- return await ConvertSubtitles(stream, inputFormat, outputFormat, startTimeTicks, endTimeTicks, preserveOriginalTimestamps, cancellationToken).ConfigureAwait(false);
+ return ConvertSubtitles(stream, inputFormat, outputFormat, startTimeTicks, endTimeTicks, preserveOriginalTimestamps, cancellationToken);
}
}
@@ -445,7 +445,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
throw;
}
- var ranToCompletion = process.WaitForExit(60000);
+ var ranToCompletion = await process.WaitForExitAsync(300000).ConfigureAwait(false);
if (!ranToCompletion)
{
@@ -575,7 +575,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
throw;
}
- var ranToCompletion = process.WaitForExit(300000);
+ var ranToCompletion = await process.WaitForExitAsync(300000).ConfigureAwait(false);
if (!ranToCompletion)
{
diff --git a/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs b/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs
index c4f9f206d6..b5b0101cb9 100644
--- a/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/BaseApplicationConfiguration.cs
@@ -22,11 +22,6 @@ namespace MediaBrowser.Model.Configuration
public bool EnableAutoUpdate { get; set; }
/// <summary>
- /// Gets of sets a value indicating the level of system updates (Release, Beta, Dev)
- /// </summary>
- public PackageVersionClass SystemUpdateLevel { get; set; }
-
- /// <summary>
/// The number of days we should retain log files
/// </summary>
/// <value>The log file retention days.</value>
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index 60bbf62404..e30364de96 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -17,6 +17,8 @@ namespace MediaBrowser.Model.Configuration
/// <value><c>true</c> if [enable u pn p]; otherwise, <c>false</c>.</value>
public bool EnableUPnP { get; set; }
+ public bool EnableSimpleSortNameHandling { get; set; }
+
/// <summary>
/// Gets or sets the public mapped port.
/// </summary>
@@ -46,7 +48,6 @@ namespace MediaBrowser.Model.Configuration
/// </summary>
/// <value><c>true</c> if [use HTTPS]; otherwise, <c>false</c>.</value>
public bool EnableHttps { get; set; }
- public bool EnableSeriesPresentationUniqueKey { get; set; }
public bool EnableLocalizedGuids { get; set; }
public bool EnableNormalizedItemByNameIds { get; set; }
@@ -78,8 +79,6 @@ namespace MediaBrowser.Model.Configuration
public string MetadataPath { get; set; }
public string MetadataNetworkPath { get; set; }
- public string LastVersion { get; set; }
-
/// <summary>
/// Gets or sets the display name of the season zero.
/// </summary>
diff --git a/MediaBrowser.Model/Diagnostics/IProcess.cs b/MediaBrowser.Model/Diagnostics/IProcess.cs
index ab0b0cfcff..7cd26af007 100644
--- a/MediaBrowser.Model/Diagnostics/IProcess.cs
+++ b/MediaBrowser.Model/Diagnostics/IProcess.cs
@@ -1,5 +1,6 @@
using System;
using System.IO;
+using System.Threading.Tasks;
namespace MediaBrowser.Model.Diagnostics
{
@@ -9,6 +10,7 @@ namespace MediaBrowser.Model.Diagnostics
void Kill();
bool WaitForExit(int timeMs);
+ Task<bool> WaitForExitAsync(int timeMs);
int ExitCode { get; }
void Start();
StreamWriter StandardInput { get; }
diff --git a/MediaBrowser.Model/Dlna/ConditionProcessor.cs b/MediaBrowser.Model/Dlna/ConditionProcessor.cs
index 63e962c4e3..a388bf98b2 100644
--- a/MediaBrowser.Model/Dlna/ConditionProcessor.cs
+++ b/MediaBrowser.Model/Dlna/ConditionProcessor.cs
@@ -20,6 +20,7 @@ namespace MediaBrowser.Model.Dlna
int? packetLength,
TransportStreamTimestamp? timestamp,
bool? isAnamorphic,
+ bool? isInterlaced,
int? refFrames,
int? numVideoStreams,
int? numAudioStreams,
@@ -28,6 +29,8 @@ namespace MediaBrowser.Model.Dlna
{
switch (condition.Property)
{
+ case ProfileConditionValue.IsInterlaced:
+ return IsConditionSatisfied(condition, isInterlaced);
case ProfileConditionValue.IsAnamorphic:
return IsConditionSatisfied(condition, isAnamorphic);
case ProfileConditionValue.IsAvc:
diff --git a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs
index cd1a29d6b6..6f6994a7e1 100644
--- a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs
+++ b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs
@@ -116,6 +116,7 @@ namespace MediaBrowser.Model.Dlna
int? packetLength,
TranscodeSeekInfo transcodeSeekInfo,
bool? isAnamorphic,
+ bool? isInterlaced,
int? refFrames,
int? numVideoStreams,
int? numAudioStreams,
@@ -158,6 +159,7 @@ namespace MediaBrowser.Model.Dlna
packetLength,
timestamp,
isAnamorphic,
+ isInterlaced,
refFrames,
numVideoStreams,
numAudioStreams,
diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs
index cd3c9e92b5..33d73e3bb5 100644
--- a/MediaBrowser.Model/Dlna/DeviceProfile.cs
+++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs
@@ -293,6 +293,7 @@ namespace MediaBrowser.Model.Dlna
int? packetLength,
TransportStreamTimestamp timestamp,
bool? isAnamorphic,
+ bool? isInterlaced,
int? refFrames,
int? numVideoStreams,
int? numAudioStreams,
@@ -331,7 +332,7 @@ namespace MediaBrowser.Model.Dlna
var anyOff = false;
foreach (ProfileCondition c in i.Conditions)
{
- if (!conditionProcessor.IsVideoConditionSatisfied(GetModelProfileCondition(c), width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
+ if (!conditionProcessor.IsVideoConditionSatisfied(GetModelProfileCondition(c), width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
{
anyOff = true;
break;
diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs
index 6ff3ce94c5..1e64c04d2d 100644
--- a/MediaBrowser.Model/Dlna/StreamBuilder.cs
+++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs
@@ -558,6 +558,7 @@ namespace MediaBrowser.Model.Dlna
string videoProfile = videoStream == null ? null : videoStream.Profile;
float? videoFramerate = videoStream == null ? null : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate;
bool? isAnamorphic = videoStream == null ? null : videoStream.IsAnamorphic;
+ bool? isInterlaced = videoStream == null ? (bool?)null : videoStream.IsInterlaced;
string videoCodecTag = videoStream == null ? null : videoStream.CodecTag;
bool? isAvc = videoStream == null ? null : videoStream.IsAVC;
@@ -568,7 +569,7 @@ namespace MediaBrowser.Model.Dlna
int? numAudioStreams = item.GetStreamCount(MediaStreamType.Audio);
int? numVideoStreams = item.GetStreamCount(MediaStreamType.Video);
- if (!conditionProcessor.IsVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
+ if (!conditionProcessor.IsVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
{
LogConditionFailure(options.Profile, "VideoCodecProfile", applyCondition, item);
applyConditions = false;
@@ -748,6 +749,7 @@ namespace MediaBrowser.Model.Dlna
string videoProfile = videoStream == null ? null : videoStream.Profile;
float? videoFramerate = videoStream == null ? null : videoStream.AverageFrameRate ?? videoStream.AverageFrameRate;
bool? isAnamorphic = videoStream == null ? null : videoStream.IsAnamorphic;
+ bool? isInterlaced = videoStream == null ? (bool?)null : videoStream.IsInterlaced;
string videoCodecTag = videoStream == null ? null : videoStream.CodecTag;
bool? isAvc = videoStream == null ? null : videoStream.IsAVC;
@@ -766,7 +768,7 @@ namespace MediaBrowser.Model.Dlna
// Check container conditions
foreach (ProfileCondition i in conditions)
{
- if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
+ if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
{
LogConditionFailure(profile, "VideoContainerProfile", i, mediaSource);
@@ -793,7 +795,7 @@ namespace MediaBrowser.Model.Dlna
bool applyConditions = true;
foreach (ProfileCondition applyCondition in i.ApplyConditions)
{
- if (!conditionProcessor.IsVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
+ if (!conditionProcessor.IsVideoConditionSatisfied(applyCondition, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
{
LogConditionFailure(profile, "VideoCodecProfile", applyCondition, mediaSource);
applyConditions = false;
@@ -813,7 +815,7 @@ namespace MediaBrowser.Model.Dlna
foreach (ProfileCondition i in conditions)
{
- if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
+ if (!conditionProcessor.IsVideoConditionSatisfied(i, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp, isAnamorphic, isInterlaced, refFrames, numVideoStreams, numAudioStreams, videoCodecTag, isAvc))
{
LogConditionFailure(profile, "VideoCodecProfile", i, mediaSource);
diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs
index 2c009b37ff..ba5251e8c9 100644
--- a/MediaBrowser.Model/Dlna/StreamInfo.cs
+++ b/MediaBrowser.Model/Dlna/StreamInfo.cs
@@ -746,6 +746,24 @@ namespace MediaBrowser.Model.Dlna
}
}
+ public bool? IsTargetInterlaced
+ {
+ get
+ {
+ if (IsDirectStream)
+ {
+ return TargetVideoStream == null ? (bool?)null : TargetVideoStream.IsInterlaced;
+ }
+
+ if (DeInterlace)
+ {
+ return false;
+ }
+
+ return TargetVideoStream == null ? (bool?)null : TargetVideoStream.IsInterlaced;
+ }
+ }
+
public bool? IsTargetAVC
{
get
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index 9384446eb2..d446597056 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -346,7 +346,9 @@ namespace MediaBrowser.Model.Dto
/// Gets or sets the studios.
/// </summary>
/// <value>The studios.</value>
- public StudioDto[] Studios { get; set; }
+ public NameIdPair[] Studios { get; set; }
+
+ public NameIdPair[] GenreItems { get; set; }
/// <summary>
/// If the item does not have a logo, this will hold the Id of the Parent that has one.
diff --git a/MediaBrowser.Model/Dto/StudioDto.cs b/MediaBrowser.Model/Dto/StudioDto.cs
index 13623fb1a9..10dc606997 100644
--- a/MediaBrowser.Model/Dto/StudioDto.cs
+++ b/MediaBrowser.Model/Dto/StudioDto.cs
@@ -1,6 +1,4 @@
-using System.ComponentModel;
-using System.Diagnostics;
-using MediaBrowser.Model.Serialization;
+using System.Diagnostics;
namespace MediaBrowser.Model.Dto
{
@@ -27,23 +25,5 @@ namespace MediaBrowser.Model.Dto
/// </summary>
/// <value>The primary image tag.</value>
public string PrimaryImageTag { get; set; }
-
- /// <summary>
- /// Gets a value indicating whether this instance has primary image.
- /// </summary>
- /// <value><c>true</c> if this instance has primary image; otherwise, <c>false</c>.</value>
- [IgnoreDataMember]
- public bool HasPrimaryImage
- {
- get
- {
- return PrimaryImageTag != null;
- }
- }
-
- /// <summary>
- /// Occurs when [property changed].
- /// </summary>
- public event PropertyChangedEventHandler PropertyChanged;
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs b/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs
index 913967352f..025f1bc7a6 100644
--- a/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs
+++ b/MediaBrowser.Model/MediaInfo/LiveStreamRequest.cs
@@ -15,9 +15,15 @@ namespace MediaBrowser.Model.MediaInfo
public string ItemId { get; set; }
public DeviceProfile DeviceProfile { get; set; }
+ public bool EnableDirectPlay { get; set; }
+ public bool EnableDirectStream { get; set; }
+ public bool ForceDirectPlayRemoteMediaSource { get; set; }
+
public LiveStreamRequest()
{
-
+ ForceDirectPlayRemoteMediaSource = true;
+ EnableDirectPlay = true;
+ EnableDirectStream = true;
}
public LiveStreamRequest(AudioOptions options)
diff --git a/MediaBrowser.Model/Net/IAcceptSocket.cs b/MediaBrowser.Model/Net/IAcceptSocket.cs
index 4262e23901..2b5d33dce6 100644
--- a/MediaBrowser.Model/Net/IAcceptSocket.cs
+++ b/MediaBrowser.Model/Net/IAcceptSocket.cs
@@ -1,6 +1,4 @@
using System;
-using System.Threading;
-using System.Threading.Tasks;
namespace MediaBrowser.Model.Net
{
@@ -15,7 +13,8 @@ namespace MediaBrowser.Model.Net
void Bind(IpEndPointInfo endpoint);
void Connect(IpEndPointInfo endPoint);
void StartAccept(Action<IAcceptSocket> onAccept, Func<bool> isClosed);
- Task SendFile(string path, byte[] preBuffer, byte[] postBuffer, CancellationToken cancellationToken);
+ IAsyncResult BeginSendFile(string path, byte[] preBuffer, byte[] postBuffer, AsyncCallback callback, object state);
+ void EndSendFile(IAsyncResult result);
}
public class SocketCreateException : Exception
diff --git a/MediaBrowser.Model/Net/ISocket.cs b/MediaBrowser.Model/Net/ISocket.cs
index 61fc0e28bf..7ad08f106e 100644
--- a/MediaBrowser.Model/Net/ISocket.cs
+++ b/MediaBrowser.Model/Net/ISocket.cs
@@ -14,16 +14,17 @@ namespace MediaBrowser.Model.Net
{
IpAddressInfo LocalIPAddress { get; }
- /// <summary>
- /// Waits for and returns the next UDP message sent to this socket (uni or multicast).
- /// </summary>
- /// <returns></returns>
- Task<SocketReceiveResult> ReceiveAsync(CancellationToken cancellationToken);
+ Task<SocketReceiveResult> ReceiveAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken);
+
+ IAsyncResult BeginReceive(byte[] buffer, int offset, int count, AsyncCallback callback);
+ SocketReceiveResult EndReceive(IAsyncResult result);
/// <summary>
/// Sends a UDP message to a particular end point (uni or multicast).
/// </summary>
- Task SendAsync(byte[] buffer, int bytes, IpEndPointInfo endPoint, CancellationToken cancellationToken);
- Task SendWithLockAsync(byte[] buffer, int bytes, IpEndPointInfo endPoint, CancellationToken cancellationToken);
+ Task SendToAsync(byte[] buffer, int offset, int bytes, IpEndPointInfo endPoint, CancellationToken cancellationToken);
+
+ IAsyncResult BeginSendTo(byte[] buffer, int offset, int size, IpEndPointInfo endPoint, AsyncCallback callback, object state);
+ int EndSendTo(IAsyncResult result);
}
} \ No newline at end of file
diff --git a/MediaBrowser.Model/Net/ISocketFactory.cs b/MediaBrowser.Model/Net/ISocketFactory.cs
index e7dbf6cb1e..bf2424660b 100644
--- a/MediaBrowser.Model/Net/ISocketFactory.cs
+++ b/MediaBrowser.Model/Net/ISocketFactory.cs
@@ -1,4 +1,6 @@

+using System.IO;
+
namespace MediaBrowser.Model.Net
{
/// <summary>
@@ -33,6 +35,8 @@ namespace MediaBrowser.Model.Net
ISocket CreateUdpMulticastSocket(string ipAddress, int multicastTimeToLive, int localPort);
IAcceptSocket CreateSocket(IpAddressFamily family, SocketType socketType, ProtocolType protocolType, bool dualMode);
+
+ Stream CreateNetworkStream(ISocket socket, bool ownsSocket);
}
public enum SocketType
diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs
index ab560875ec..9a70520895 100644
--- a/MediaBrowser.Model/Querying/ItemFields.cs
+++ b/MediaBrowser.Model/Querying/ItemFields.cs
@@ -154,11 +154,6 @@
RecursiveItemCount,
/// <summary>
- /// The season name
- /// </summary>
- SeasonName,
-
- /// <summary>
/// The settings
/// </summary>
Settings,
@@ -236,6 +231,13 @@
/// </summary>
ServiceName,
ThemeSongIds,
- ThemeVideoIds
+ ThemeVideoIds,
+ ExternalEtag,
+ PresentationUniqueKey,
+ InheritedParentalRatingValue,
+ ExternalSeriesId,
+ SeriesPresentationUniqueKey,
+ DateLastRefreshed,
+ DateLastSaved
}
}
diff --git a/MediaBrowser.Model/Services/IAsyncStreamWriter.cs b/MediaBrowser.Model/Services/IAsyncStreamWriter.cs
index f61a94f6ea..b10e12813a 100644
--- a/MediaBrowser.Model/Services/IAsyncStreamWriter.cs
+++ b/MediaBrowser.Model/Services/IAsyncStreamWriter.cs
@@ -8,9 +8,4 @@ namespace MediaBrowser.Model.Services
{
Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken);
}
-
- public interface IFileWriter
- {
- Task WriteToAsync(Stream responseStream, CancellationToken cancellationToken);
- }
}
diff --git a/MediaBrowser.Mono.sln b/MediaBrowser.Mono.sln
deleted file mode 100644
index 66ae294a7f..0000000000
--- a/MediaBrowser.Mono.sln
+++ /dev/null
@@ -1,410 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Model", "MediaBrowser.Model\MediaBrowser.Model.csproj", "{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common", "MediaBrowser.Common\MediaBrowser.Common.csproj", "{9142EEFA-7570-41E1-BFCC-468BB571AF2F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Providers", "MediaBrowser.Providers\MediaBrowser.Providers.csproj", "{442B5058-DCAF-4263-BB6A-F21E31120A1B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Implementations", "MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj", "{2E781478-814D-4A48-9D80-BFF206441A65}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.WebDashboard", "MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj", "{5624B7B5-B5A7-41D8-9F10-CC5611109619}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Api", "MediaBrowser.Api\MediaBrowser.Api.csproj", "{4FD51AC5-2C16-4308-A993-C3A84F3B4582}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Mono", "MediaBrowser.Server.Mono\MediaBrowser.Server.Mono.csproj", "{175A9388-F352-4586-A6B4-070DED62B644}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.MediaEncoding", "MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj", "{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSubtitlesHandler", "OpenSubtitlesHandler\OpenSubtitlesHandler.csproj", "{4A4402D4-E910-443B-B8FC-2C18286A2CA0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.LocalMetadata", "MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj", "{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.XbmcMetadata", "MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj", "{23499896-B135-4527-8574-C26E926EA99E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Startup.Common", "MediaBrowser.Server.Startup.Common\MediaBrowser.Server.Startup.Common.csproj", "{B90AB8F2-1BFF-4568-A3FD-2A338A435A75}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing", "Emby.Drawing\Emby.Drawing.csproj", "{08FFF49B-F175-4807-A2B5-73B0EBD9F716}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BDInfo", "BDInfo\BDInfo.csproj", "{88AE38DF-19D7-406F-A6A9-09527719A21E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DvdLib", "DvdLib\DvdLib.csproj", "{713F42B5-878E-499D-A878-E4C652B1D5E8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Photos", "Emby.Photos\Emby.Photos.csproj", "{89AB4548-770D-41FD-A891-8DAFF44F452C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Implementations", "Emby.Server.Implementations\Emby.Server.Implementations.csproj", "{E383961B-9356-4D5D-8233-9A1079D03055}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RSSDP", "RSSDP\RSSDP.csproj", "{21002819-C39A-4D3E-BE83-2A276A77FB1F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Dlna", "Emby.Dlna\Emby.Dlna.csproj", "{805844AB-E92F-45E6-9D99-4F6D48D129A5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.ImageMagick", "Emby.Drawing.ImageMagick\Emby.Drawing.ImageMagick.csproj", "{6CFEE013-6E7C-432B-AC37-CABF0880C69A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.Net", "Emby.Drawing.Net\Emby.Drawing.Net.csproj", "{C97A239E-A96C-4D64-A844-CCF8CC30AECB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHttpListener.Portable", "SocketHttpListener.Portable\SocketHttpListener.Portable.csproj", "{4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x86 = Debug|x86
- Release Mono|Any CPU = Release Mono|Any CPU
- Release Mono|x86 = Release Mono|x86
- Release|Any CPU = Release|Any CPU
- Release|x86 = Release|x86
- Signed|Any CPU = Signed|Any CPU
- Signed|x86 = Signed|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|x86.Build.0 = Debug|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|x86.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|x86.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|Any CPU.Build.0 = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|x86.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Signed|x86.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.Build.0 = Debug|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|x86.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|x86.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.ActiveCfg = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.ActiveCfg = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.Build.0 = Debug|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.ActiveCfg = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x86.Build.0 = Debug|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x86.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x86.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.Build.0 = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.Build.0 = Debug|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.Build.0 = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release|x86.ActiveCfg = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release|x86.Build.0 = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.Build.0 = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.ActiveCfg = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.Build.0 = Debug|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.ActiveCfg = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.Build.0 = Debug|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|x86.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|x86.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.ActiveCfg = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.Build.0 = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.ActiveCfg = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.ActiveCfg = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.Build.0 = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|Any CPU.Build.0 = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.ActiveCfg = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.Build.0 = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|x86.ActiveCfg = Release Mono|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|x86.Build.0 = Release Mono|x86
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.ActiveCfg = Debug|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.Build.0 = Debug|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.Build.0 = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|x86.ActiveCfg = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|x86.Build.0 = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.Build.0 = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x86.ActiveCfg = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x86.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.Build.0 = Debug|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x86.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x86.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Debug|x86.Build.0 = Debug|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|x86.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Release|x86.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|Any CPU.Build.0 = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|x86.ActiveCfg = Release|Any CPU
- {7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|x86.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Debug|x86.Build.0 = Debug|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|x86.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Release|x86.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|x86.ActiveCfg = Release|Any CPU
- {23499896-B135-4527-8574-C26E926EA99E}.Signed|x86.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|x86.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x86.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x86.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|x86.ActiveCfg = Debug|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Release|x86.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|Any CPU.Build.0 = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|x86.ActiveCfg = Release|Any CPU
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Signed|x86.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|x86.Build.0 = Debug|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release Mono|x86.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|x86.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Release|x86.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|x86.ActiveCfg = Release|Any CPU
- {88AE38DF-19D7-406F-A6A9-09527719A21E}.Signed|x86.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|x86.ActiveCfg = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Debug|x86.Build.0 = Debug|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release Mono|x86.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|x86.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Release|x86.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|Any CPU.Build.0 = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|x86.ActiveCfg = Release|Any CPU
- {713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|x86.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Debug|x86.Build.0 = Debug|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release Mono|x86.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|x86.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Release|x86.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|Any CPU.Build.0 = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|x86.ActiveCfg = Release|Any CPU
- {89AB4548-770D-41FD-A891-8DAFF44F452C}.Signed|x86.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Debug|x86.Build.0 = Debug|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release Mono|x86.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|x86.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Release|x86.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|Any CPU.Build.0 = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|x86.ActiveCfg = Release|Any CPU
- {E383961B-9356-4D5D-8233-9A1079D03055}.Signed|x86.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|x86.ActiveCfg = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|x86.Build.0 = Debug|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release Mono|x86.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|x86.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Release|x86.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|Any CPU.Build.0 = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|x86.ActiveCfg = Release|Any CPU
- {21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|x86.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|x86.ActiveCfg = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Debug|x86.Build.0 = Debug|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release Mono|x86.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|x86.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Release|x86.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|Any CPU.Build.0 = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|x86.ActiveCfg = Release|Any CPU
- {805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|x86.Build.0 = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Debug|x86.Build.0 = Debug|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release Mono|x86.Build.0 = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release|Any CPU.Build.0 = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release|x86.ActiveCfg = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Release|x86.Build.0 = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Signed|Any CPU.Build.0 = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Signed|x86.ActiveCfg = Release|Any CPU
- {6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Signed|x86.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|x86.Build.0 = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|x86.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Any CPU.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|x86.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|x86.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Any CPU.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|x86.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x86.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x86.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = MediaBrowser.Server.Mono\MediaBrowser.Server.Mono.csproj
- EndGlobalSection
-EndGlobal
diff --git a/MediaBrowser.Mono.userprefs b/MediaBrowser.Mono.userprefs
deleted file mode 100644
index bac7f95102..0000000000
--- a/MediaBrowser.Mono.userprefs
+++ /dev/null
@@ -1,17 +0,0 @@
-<Properties>
- <MonoDevelop.Ide.Workspace ActiveConfiguration="Release Mono" />
- <MonoDevelop.Ide.Workbench ActiveDocument="MediaBrowser.Server.Mono\Program.cs">
- <Files>
- <File FileName="MediaBrowser.Server.Mono\app.config" Line="1" Column="1" />
- <File FileName="MediaBrowser.ServerApplication\ApplicationHost.cs" Line="1" Column="1" />
- <File FileName="MediaBrowser.Server.Mono\Native\NativeApp.cs" Line="1" Column="1" />
- <File FileName="MediaBrowser.Server.Mono\Program.cs" Line="19" Column="19" />
- </Files>
- </MonoDevelop.Ide.Workbench>
- <MonoDevelop.Ide.DebuggingService.Breakpoints>
- <BreakpointStore>
- <Breakpoint file="D:\Development\MediaBrowser\MediaBrowser.Common.Implementations\HttpClientManager\HttpClientManager.cs" line="477" column="17" />
- </BreakpointStore>
- </MonoDevelop.Ide.DebuggingService.Breakpoints>
- <MonoDevelop.Ide.DebuggingService.PinnedWatches />
-</Properties> \ No newline at end of file
diff --git a/MediaBrowser.Providers/Books/AudioBookMetadataService.cs b/MediaBrowser.Providers/Books/AudioBookMetadataService.cs
index 696619a8c1..7cce851053 100644
--- a/MediaBrowser.Providers/Books/AudioBookMetadataService.cs
+++ b/MediaBrowser.Providers/Books/AudioBookMetadataService.cs
@@ -7,7 +7,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Books/AudioPodcastMetadataService.cs b/MediaBrowser.Providers/Books/AudioPodcastMetadataService.cs
index 86b2cf1b13..219f957997 100644
--- a/MediaBrowser.Providers/Books/AudioPodcastMetadataService.cs
+++ b/MediaBrowser.Providers/Books/AudioPodcastMetadataService.cs
@@ -7,7 +7,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Books/BookMetadataService.cs b/MediaBrowser.Providers/Books/BookMetadataService.cs
index ccc69eb626..ae7e734ccb 100644
--- a/MediaBrowser.Providers/Books/BookMetadataService.cs
+++ b/MediaBrowser.Providers/Books/BookMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
index a625b93b80..b391ce4d3c 100644
--- a/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
+++ b/MediaBrowser.Providers/BoxSets/BoxSetMetadataService.cs
@@ -9,7 +9,7 @@ using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -17,9 +17,9 @@ namespace MediaBrowser.Providers.BoxSets
{
public class BoxSetMetadataService : MetadataService<BoxSet, BoxSetInfo>
{
- protected override async Task<ItemUpdateType> BeforeSave(BoxSet item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType BeforeSave(BoxSet item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
- var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false);
+ var updateType = base.BeforeSave(item, isFullRefresh, currentUpdateType);
if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
{
diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
index 6175c36225..e271772cca 100644
--- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
+++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetProvider.cs
@@ -16,7 +16,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/Channels/ChannelMetadataService.cs b/MediaBrowser.Providers/Channels/ChannelMetadataService.cs
index c2a6c07f99..8a3da5bf4a 100644
--- a/MediaBrowser.Providers/Channels/ChannelMetadataService.cs
+++ b/MediaBrowser.Providers/Channels/ChannelMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs b/MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs
index c6013a94df..dc0fda72ef 100644
--- a/MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs
+++ b/MediaBrowser.Providers/Folders/CollectionFolderMetadataService.cs
@@ -1,5 +1,5 @@
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Configuration;
diff --git a/MediaBrowser.Providers/Folders/FolderMetadataService.cs b/MediaBrowser.Providers/Folders/FolderMetadataService.cs
index 94125b29db..ff8d87e2bc 100644
--- a/MediaBrowser.Providers/Folders/FolderMetadataService.cs
+++ b/MediaBrowser.Providers/Folders/FolderMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Folders/UserViewMetadataService.cs b/MediaBrowser.Providers/Folders/UserViewMetadataService.cs
index b1410bfd9a..06b62a98be 100644
--- a/MediaBrowser.Providers/Folders/UserViewMetadataService.cs
+++ b/MediaBrowser.Providers/Folders/UserViewMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs
index 180d36378e..13d40b4d90 100644
--- a/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs
+++ b/MediaBrowser.Providers/GameGenres/GameGenreMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Games/GameMetadataService.cs b/MediaBrowser.Providers/Games/GameMetadataService.cs
index d6f61fa94f..10f74629fb 100644
--- a/MediaBrowser.Providers/Games/GameMetadataService.cs
+++ b/MediaBrowser.Providers/Games/GameMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs
index 5794e8c9b6..ca33563fad 100644
--- a/MediaBrowser.Providers/Games/GameSystemMetadataService.cs
+++ b/MediaBrowser.Providers/Games/GameSystemMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Genres/GenreMetadataService.cs b/MediaBrowser.Providers/Genres/GenreMetadataService.cs
index 39f9354dba..a695fb3725 100644
--- a/MediaBrowser.Providers/Genres/GenreMetadataService.cs
+++ b/MediaBrowser.Providers/Genres/GenreMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs
index df4a03cdb2..f4749c37d5 100644
--- a/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs
+++ b/MediaBrowser.Providers/LiveTv/AudioRecordingService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs
index 7b5065986d..8012021abc 100644
--- a/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs
+++ b/MediaBrowser.Providers/LiveTv/ChannelMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs
index eaacc41fa2..f203aa8c6a 100644
--- a/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs
+++ b/MediaBrowser.Providers/LiveTv/ProgramMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs
index a8df3c88be..528e9a5ec9 100644
--- a/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs
+++ b/MediaBrowser.Providers/LiveTv/VideoRecordingService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs
index 4bd5044094..dc6c7e43fc 100644
--- a/MediaBrowser.Providers/Manager/ImageSaver.cs
+++ b/MediaBrowser.Providers/Manager/ImageSaver.cs
@@ -1,5 +1,5 @@
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -226,7 +226,6 @@ namespace MediaBrowser.Providers.Manager
return retryPath;
}
- private SemaphoreSlim _imageSaveSemaphore = new SemaphoreSlim(1, 1);
/// <summary>
/// Saves the image to location.
/// </summary>
@@ -240,8 +239,6 @@ namespace MediaBrowser.Providers.Manager
var parentFolder = _fileSystem.GetDirectoryName(path);
- await _imageSaveSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
-
try
{
_libraryMonitor.ReportFileSystemChangeBeginning(path);
@@ -263,8 +260,6 @@ namespace MediaBrowser.Providers.Manager
}
finally
{
- _imageSaveSemaphore.Release();
-
_libraryMonitor.ReportFileSystemChangeComplete(path, false);
_libraryMonitor.ReportFileSystemChangeComplete(parentFolder, false);
}
diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
index 31cdc164c6..39715a4497 100644
--- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs
+++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
@@ -15,7 +15,7 @@ using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 59a2278a1f..edca5e7d68 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -53,8 +53,8 @@ namespace MediaBrowser.Providers.Manager
requiresRefresh = item.RequiresRefresh();
}
- if (!requiresRefresh &&
- libraryOptions.AutomaticRefreshIntervalDays > 0 &&
+ if (!requiresRefresh &&
+ libraryOptions.AutomaticRefreshIntervalDays > 0 &&
(DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= libraryOptions.AutomaticRefreshIntervalDays)
{
requiresRefresh = true;
@@ -142,7 +142,7 @@ namespace MediaBrowser.Providers.Manager
}
}
- var beforeSaveResult = await BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh, updateType).ConfigureAwait(false);
+ var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh, updateType);
updateType = updateType | beforeSaveResult;
if (item.LocationType == LocationType.FileSystem)
@@ -281,7 +281,7 @@ namespace MediaBrowser.Providers.Manager
/// <param name="isFullRefresh">if set to <c>true</c> [is full refresh].</param>
/// <param name="currentUpdateType">Type of the current update.</param>
/// <returns>ItemUpdateType.</returns>
- protected virtual async Task<ItemUpdateType> BeforeSave(TItemType item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected virtual ItemUpdateType BeforeSave(TItemType item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
var updateType = ItemUpdateType.None;
@@ -368,7 +368,7 @@ namespace MediaBrowser.Providers.Manager
// Run all if either of these flags are true
var runAllProviders = options.ReplaceAllMetadata ||
- metadataRefreshMode == MetadataRefreshMode.FullRefresh ||
+ metadataRefreshMode == MetadataRefreshMode.FullRefresh ||
(isFirstRefresh && metadataRefreshMode >= MetadataRefreshMode.Default) ||
(requiresRefresh && metadataRefreshMode >= MetadataRefreshMode.Default);
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index 7ff018c7b1..16dfd89455 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -20,7 +20,8 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
-using MediaBrowser.Common.IO;
+
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
@@ -555,6 +556,7 @@ namespace MediaBrowser.Providers.Manager
new MetadataOptions();
}
+ private Task _completedTask = Task.FromResult(true);
/// <summary>
/// Saves the metadata.
/// </summary>
@@ -563,7 +565,8 @@ namespace MediaBrowser.Providers.Manager
/// <returns>Task.</returns>
public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType)
{
- return SaveMetadata(item, updateType, _savers);
+ SaveMetadata(item, updateType, _savers);
+ return _completedTask;
}
/// <summary>
@@ -575,7 +578,8 @@ namespace MediaBrowser.Providers.Manager
/// <returns>Task.</returns>
public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers)
{
- return SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase)));
+ SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase)));
+ return _completedTask;
}
/// <summary>
@@ -585,7 +589,7 @@ namespace MediaBrowser.Providers.Manager
/// <param name="updateType">Type of the update.</param>
/// <param name="savers">The savers.</param>
/// <returns>Task.</returns>
- private async Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<IMetadataSaver> savers)
+ private void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<IMetadataSaver> savers)
{
foreach (var saver in savers.Where(i => IsSaverEnabledForItem(i, item, updateType, false)))
{
@@ -868,7 +872,7 @@ namespace MediaBrowser.Providers.Manager
if (!_isProcessingRefreshQueue)
{
_isProcessingRefreshQueue = true;
- Task.Run(() => StartProcessingRefreshQueue());
+ Task.Run(StartProcessingRefreshQueue);
}
}
}
@@ -893,6 +897,15 @@ namespace MediaBrowser.Providers.Manager
// Try to throttle this a little bit.
await Task.Delay(100).ConfigureAwait(false);
+ if (refreshItem.Item2.ValidateChildren)
+ {
+ var folder = item as Folder;
+ if (folder != null)
+ {
+ await folder.ValidateChildren(new Progress<double>(), CancellationToken.None).ConfigureAwait(false);
+ }
+ }
+
var artist = item as MusicArtist;
var task = artist == null
? RefreshItem(item, refreshItem.Item2, CancellationToken.None)
@@ -958,7 +971,11 @@ namespace MediaBrowser.Providers.Manager
.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
- ArtistIds = new[] { item.Id.ToString("N") }
+ ArtistIds = new[] { item.Id.ToString("N") },
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
})
.OfType<MusicAlbum>()
.ToList();
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
index 9d20ec4239..d16ae91617 100644
--- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj
+++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
@@ -34,14 +34,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <DebugType>none</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release Mono\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
index c686e1d2e1..eaf3505d1a 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
@@ -25,7 +25,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
index 0e842cdb4f..200615a5d0 100644
--- a/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
+++ b/MediaBrowser.Providers/MediaInfo/SubtitleScheduledTask.cs
@@ -14,6 +14,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Tasks;
@@ -82,7 +83,8 @@ namespace MediaBrowser.Providers.MediaInfo
{
MediaTypes = new string[] { MediaType.Video },
IsVirtualItem = false,
- IncludeItemTypes = types.ToArray()
+ IncludeItemTypes = types.ToArray(),
+ DtoOptions = new DtoOptions(true)
}).OfType<Video>()
.Where(i => i.LocationType != LocationType.Remote)
diff --git a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
index 84d8d20ad4..ba24bd6000 100644
--- a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
+++ b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs
@@ -19,7 +19,7 @@ using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.LiveTv;
diff --git a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
index 6702154791..6a1af9272b 100644
--- a/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
+++ b/MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs
@@ -13,7 +13,7 @@ using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Extensions;
diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs
index d6aef5d1cf..fe190afb41 100644
--- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs
+++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs
@@ -18,7 +18,7 @@ using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.IO;
using MediaBrowser.Common;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Net;
diff --git a/MediaBrowser.Providers/Movies/MovieMetadataService.cs b/MediaBrowser.Providers/Movies/MovieMetadataService.cs
index 2187d6df13..333d289ec7 100644
--- a/MediaBrowser.Providers/Movies/MovieMetadataService.cs
+++ b/MediaBrowser.Providers/Movies/MovieMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
diff --git a/MediaBrowser.Providers/Music/AlbumMetadataService.cs b/MediaBrowser.Providers/Music/AlbumMetadataService.cs
index e5dbba9022..bba40608c6 100644
--- a/MediaBrowser.Providers/Music/AlbumMetadataService.cs
+++ b/MediaBrowser.Providers/Music/AlbumMetadataService.cs
@@ -9,7 +9,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -17,9 +16,9 @@ namespace MediaBrowser.Providers.Music
{
public class AlbumMetadataService : MetadataService<MusicAlbum, AlbumInfo>
{
- protected override async Task<ItemUpdateType> BeforeSave(MusicAlbum item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType BeforeSave(MusicAlbum item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
- var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false);
+ var updateType = base.BeforeSave(item, isFullRefresh, currentUpdateType);
if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
{
diff --git a/MediaBrowser.Providers/Music/ArtistMetadataService.cs b/MediaBrowser.Providers/Music/ArtistMetadataService.cs
index 1bd427ac9c..d4e5808717 100644
--- a/MediaBrowser.Providers/Music/ArtistMetadataService.cs
+++ b/MediaBrowser.Providers/Music/ArtistMetadataService.cs
@@ -9,17 +9,15 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Providers.Music
{
public class ArtistMetadataService : MetadataService<MusicArtist, ArtistInfo>
{
- protected override async Task<ItemUpdateType> BeforeSave(MusicArtist item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType BeforeSave(MusicArtist item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
- var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false);
+ var updateType = base.BeforeSave(item, isFullRefresh, currentUpdateType);
if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
{
diff --git a/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs b/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs
index 6d9b206891..cd6b0b8271 100644
--- a/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs
+++ b/MediaBrowser.Providers/Music/AudioDbAlbumProvider.cs
@@ -13,7 +13,7 @@ using System.Globalization;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -40,9 +40,9 @@ namespace MediaBrowser.Providers.Music
Current = this;
}
- public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
+ public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(AlbumInfo searchInfo, CancellationToken cancellationToken)
{
- return new List<RemoteSearchResult>();
+ return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
}
public async Task<MetadataResult<MusicAlbum>> GetMetadata(AlbumInfo info, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs b/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs
index c960e59a32..d8a7dbc041 100644
--- a/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs
+++ b/MediaBrowser.Providers/Music/AudioDbArtistProvider.cs
@@ -12,7 +12,7 @@ using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -39,9 +39,9 @@ namespace MediaBrowser.Providers.Music
Current = this;
}
- public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
+ public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ArtistInfo searchInfo, CancellationToken cancellationToken)
{
- return new List<RemoteSearchResult>();
+ return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
}
public async Task<MetadataResult<MusicArtist>> GetMetadata(ArtistInfo info, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Providers/Music/AudioMetadataService.cs b/MediaBrowser.Providers/Music/AudioMetadataService.cs
index faa8bb3ad7..4d791be01a 100644
--- a/MediaBrowser.Providers/Music/AudioMetadataService.cs
+++ b/MediaBrowser.Providers/Music/AudioMetadataService.cs
@@ -7,8 +7,6 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
using System.Linq;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Providers.Music
diff --git a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
index d22929664c..5700b23866 100644
--- a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
+++ b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs
@@ -14,7 +14,7 @@ using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
index 977f814143..eefebed292 100644
--- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
+++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs
@@ -17,7 +17,7 @@ using System.Net;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Net;
diff --git a/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs b/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs
index 88689dd5a3..50fb1de1f2 100644
--- a/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs
+++ b/MediaBrowser.Providers/Music/MovieDbMusicVideoProvider.cs
@@ -17,9 +17,9 @@ namespace MediaBrowser.Providers.Music
return MovieDbProvider.Current.GetItemMetadata<MusicVideo>(info, cancellationToken);
}
- public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MusicVideoInfo searchInfo, CancellationToken cancellationToken)
+ public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MusicVideoInfo searchInfo, CancellationToken cancellationToken)
{
- return new List<RemoteSearchResult>();
+ return Task.FromResult((IEnumerable<RemoteSearchResult>)new List<RemoteSearchResult>());
}
public string Name
diff --git a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs
index f46b6b128b..b8f6e2c633 100644
--- a/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs
+++ b/MediaBrowser.Providers/Music/MusicVideoMetadataService.cs
@@ -7,7 +7,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
using System.Linq;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs
index f1ffd09db7..ba059bd7b8 100644
--- a/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs
+++ b/MediaBrowser.Providers/MusicGenres/MusicGenreMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
index 812f0443ea..98a7460535 100644
--- a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs
@@ -12,7 +12,7 @@ using MediaBrowser.Model.Serialization;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
namespace MediaBrowser.Providers.Omdb
diff --git a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs
index f9d19b6be5..02cb3dbf34 100644
--- a/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbItemProvider.cs
@@ -125,7 +125,7 @@ namespace MediaBrowser.Providers.Omdb
}
}
- var url = await OmdbProvider.GetOmdbUrl(urlQuery, cancellationToken).ConfigureAwait(false);
+ var url = OmdbProvider.GetOmdbUrl(urlQuery, cancellationToken);
using (var stream = await OmdbProvider.GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false))
{
diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
index dd3ba23db1..41ff710705 100644
--- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
@@ -265,7 +265,7 @@ namespace MediaBrowser.Providers.Omdb
return false;
}
- public static async Task<string> GetOmdbUrl(string query, CancellationToken cancellationToken)
+ public static string GetOmdbUrl(string query, CancellationToken cancellationToken)
{
var url = "https://www.omdbapi.com?apikey=fe53f97e";
@@ -299,7 +299,7 @@ namespace MediaBrowser.Providers.Omdb
}
}
- var url = await GetOmdbUrl(string.Format("i={0}&plot=full&tomatoes=true&r=json", imdbParam), cancellationToken).ConfigureAwait(false);
+ var url = GetOmdbUrl(string.Format("i={0}&plot=full&tomatoes=true&r=json", imdbParam), cancellationToken);
using (var stream = await GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false))
{
@@ -333,7 +333,7 @@ namespace MediaBrowser.Providers.Omdb
}
}
- var url = await GetOmdbUrl(string.Format("i={0}&season={1}&detail=full", imdbParam, seasonId), cancellationToken).ConfigureAwait(false);
+ var url = GetOmdbUrl(string.Format("i={0}&season={1}&detail=full", imdbParam, seasonId), cancellationToken);
using (var stream = await GetOmdbResponse(_httpClient, url, cancellationToken).ConfigureAwait(false))
{
diff --git a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs
index 19b8f292c9..986c4b4a98 100644
--- a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs
+++ b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs
@@ -16,7 +16,7 @@ using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Providers/People/PersonMetadataService.cs b/MediaBrowser.Providers/People/PersonMetadataService.cs
index a306212ffd..5d70fc1d60 100644
--- a/MediaBrowser.Providers/People/PersonMetadataService.cs
+++ b/MediaBrowser.Providers/People/PersonMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs
index dd3bfb4f82..efbf46cd67 100644
--- a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs
+++ b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs
@@ -15,6 +15,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
@@ -65,7 +66,11 @@ namespace MediaBrowser.Providers.People
var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery
{
IncludeItemTypes = new[] { typeof(Series).Name },
- PersonIds = new[] { item.Id.ToString("N") }
+ PersonIds = new[] { item.Id.ToString("N") },
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
}).Cast<Series>()
.Where(i => TvdbSeriesProvider.IsValidSeries(i.ProviderIds))
diff --git a/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs b/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs
index b64b2f24e2..85b9dafd46 100644
--- a/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs
+++ b/MediaBrowser.Providers/Photos/PhotoAlbumMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Photos/PhotoMetadataService.cs b/MediaBrowser.Providers/Photos/PhotoMetadataService.cs
index 617a510b89..909d359b99 100644
--- a/MediaBrowser.Providers/Photos/PhotoMetadataService.cs
+++ b/MediaBrowser.Providers/Photos/PhotoMetadataService.cs
@@ -6,8 +6,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Providers.Photos
diff --git a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
index cfdba0fb2f..235fd8c8a7 100644
--- a/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
+++ b/MediaBrowser.Providers/Playlists/PlaylistMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Studios/StudioMetadataService.cs b/MediaBrowser.Providers/Studios/StudioMetadataService.cs
index c773b78968..ef5ced3e2b 100644
--- a/MediaBrowser.Providers/Studios/StudioMetadataService.cs
+++ b/MediaBrowser.Providers/Studios/StudioMetadataService.cs
@@ -6,8 +6,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Providers.Studios
diff --git a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs
index 1cf965e020..f7cd9dd13d 100644
--- a/MediaBrowser.Providers/Subtitles/SubtitleManager.cs
+++ b/MediaBrowser.Providers/Subtitles/SubtitleManager.cs
@@ -16,7 +16,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -163,7 +163,7 @@ namespace MediaBrowser.Providers.Subtitles
Provider = provider.Name
}, _logger);
-
+
throw;
}
}
@@ -256,7 +256,8 @@ namespace MediaBrowser.Providers.Subtitles
_monitor.ReportFileSystemChangeComplete(path, false);
}
- return _libraryManager.GetItemById(itemId).ChangedExternally();
+ _libraryManager.GetItemById(itemId).ChangedExternally();
+ return Task.FromResult(true);
}
public Task<SubtitleResponse> GetRemoteSubtitles(string id, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Providers/TV/DummySeasonProvider.cs b/MediaBrowser.Providers/TV/DummySeasonProvider.cs
index 279447a189..3b2d674a66 100644
--- a/MediaBrowser.Providers/TV/DummySeasonProvider.cs
+++ b/MediaBrowser.Providers/TV/DummySeasonProvider.cs
@@ -8,7 +8,7 @@ using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs
index bef4d88156..8adb6d4d24 100644
--- a/MediaBrowser.Providers/TV/EpisodeMetadataService.cs
+++ b/MediaBrowser.Providers/TV/EpisodeMetadataService.cs
@@ -8,7 +8,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -16,9 +16,9 @@ namespace MediaBrowser.Providers.TV
{
public class EpisodeMetadataService : MetadataService<Episode, EpisodeInfo>
{
- protected override async Task<ItemUpdateType> BeforeSave(Episode item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType BeforeSave(Episode item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
- var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false);
+ var updateType = base.BeforeSave(item, isFullRefresh, currentUpdateType);
var seriesName = item.FindSeriesName();
if (!string.Equals(item.SeriesName, seriesName, StringComparison.Ordinal))
diff --git a/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs b/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs
index f1fc2c9f3b..b9f010bb64 100644
--- a/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs
+++ b/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs
@@ -18,7 +18,7 @@ using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs b/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs
index 35178e1fe9..644e9cbb53 100644
--- a/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs
@@ -20,7 +20,7 @@ using System.Net;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
index 5b9e5d5ebf..da5a1f2d1e 100644
--- a/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/MissingEpisodeProvider.cs
@@ -13,7 +13,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs
index f73244cdfe..daf493ad9c 100644
--- a/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/Omdb/OmdbEpisodeProvider.cs
@@ -12,7 +12,7 @@ using MediaBrowser.Providers.Omdb;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
namespace MediaBrowser.Providers.TV
diff --git a/MediaBrowser.Providers/TV/SeasonMetadataService.cs b/MediaBrowser.Providers/TV/SeasonMetadataService.cs
index 74c8b4ec34..1b4e3f44fd 100644
--- a/MediaBrowser.Providers/TV/SeasonMetadataService.cs
+++ b/MediaBrowser.Providers/TV/SeasonMetadataService.cs
@@ -9,7 +9,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
@@ -17,9 +17,9 @@ namespace MediaBrowser.Providers.TV
{
public class SeasonMetadataService : MetadataService<Season, SeasonInfo>
{
- protected override async Task<ItemUpdateType> BeforeSave(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType)
+ protected override ItemUpdateType BeforeSave(Season item, bool isFullRefresh, ItemUpdateType currentUpdateType)
{
- var updateType = await base.BeforeSave(item, isFullRefresh, currentUpdateType).ConfigureAwait(false);
+ var updateType = base.BeforeSave(item, isFullRefresh, currentUpdateType);
if (item.IndexNumber.HasValue && item.IndexNumber.Value == 0)
{
diff --git a/MediaBrowser.Providers/TV/SeriesMetadataService.cs b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
index 0d89e307f9..7559a15de3 100644
--- a/MediaBrowser.Providers/TV/SeriesMetadataService.cs
+++ b/MediaBrowser.Providers/TV/SeriesMetadataService.cs
@@ -9,7 +9,7 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs
index 952c4f9349..854f9f06b8 100644
--- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs
+++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs
@@ -14,7 +14,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs
index d2191e1a64..1938f7ff04 100644
--- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeProvider.cs
@@ -16,7 +16,7 @@ using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs
index b2d70918cc..5ca2d5518e 100644
--- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs
+++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbProviderBase.cs
@@ -10,7 +10,7 @@ using System.Globalization;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs
index f41e254ca5..528ba3d0c4 100644
--- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs
+++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeasonProvider.cs
@@ -15,7 +15,7 @@ using System.IO;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs
index 7bf926799f..fe3d7d78c4 100644
--- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesProvider.cs
@@ -17,7 +17,7 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Globalization;
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs
index 030150e4d7..48e50c2e14 100644
--- a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs
+++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs
@@ -12,8 +12,6 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Providers.TV
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs
index 24c2b507a2..686bacfe13 100644
--- a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeProvider.cs
@@ -16,7 +16,7 @@ using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
@@ -48,14 +48,14 @@ namespace MediaBrowser.Providers.TV
Current = this;
}
- public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
+ public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
{
var list = new List<RemoteSearchResult>();
// The search query must either provide an episode number or date
if (!searchInfo.IndexNumber.HasValue && !searchInfo.PremiereDate.HasValue)
{
- return list;
+ return Task.FromResult((IEnumerable<RemoteSearchResult>)list);
}
if (TvdbSeriesProvider.IsValidSeries(searchInfo.SeriesProviderIds))
@@ -103,7 +103,7 @@ namespace MediaBrowser.Providers.TV
}
}
- return list;
+ return Task.FromResult((IEnumerable<RemoteSearchResult>)list);
}
public string Name
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs
index e8ed05225e..9a457ba948 100644
--- a/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs
+++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbPrescanTask.cs
@@ -14,7 +14,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
@@ -114,7 +114,11 @@ namespace MediaBrowser.Providers.TV
{
IncludeItemTypes = new[] { typeof(Series).Name },
Recursive = true,
- GroupByPresentationUniqueKey = false
+ GroupByPresentationUniqueKey = false,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
}).Cast<Series>()
.ToList();
@@ -325,7 +329,11 @@ namespace MediaBrowser.Providers.TV
{
IncludeItemTypes = new[] { typeof(Series).Name },
Recursive = true,
- GroupByPresentationUniqueKey = false
+ GroupByPresentationUniqueKey = false,
+ DtoOptions = new DtoOptions(false)
+ {
+ EnableImages = false
+ }
}).Cast<Series>();
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs
index daa6e78f5a..395d419cfc 100644
--- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs
+++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs
@@ -16,8 +16,6 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs
index 50bc6bc74e..d7eea42267 100644
--- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs
+++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs
@@ -16,7 +16,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.Providers/Users/UserMetadataService.cs b/MediaBrowser.Providers/Users/UserMetadataService.cs
index 274d04efd0..88df704d6b 100644
--- a/MediaBrowser.Providers/Users/UserMetadataService.cs
+++ b/MediaBrowser.Providers/Users/UserMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Providers/Videos/VideoMetadataService.cs b/MediaBrowser.Providers/Videos/VideoMetadataService.cs
index 49f7e11ba2..a07cc5949a 100644
--- a/MediaBrowser.Providers/Videos/VideoMetadataService.cs
+++ b/MediaBrowser.Providers/Videos/VideoMetadataService.cs
@@ -6,8 +6,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.Providers.Videos
diff --git a/MediaBrowser.Providers/Years/YearMetadataService.cs b/MediaBrowser.Providers/Years/YearMetadataService.cs
index 72f8eb471c..36c2fd1dd1 100644
--- a/MediaBrowser.Providers/Years/YearMetadataService.cs
+++ b/MediaBrowser.Providers/Years/YearMetadataService.cs
@@ -6,7 +6,7 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Providers.Manager;
using System.Collections.Generic;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs b/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs
index 979a929ca7..57254eed49 100644
--- a/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs
+++ b/MediaBrowser.Server.Implementations/Devices/CameraUploadsFolder.cs
@@ -5,9 +5,6 @@ using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
-using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Serialization;
@@ -46,7 +43,7 @@ namespace MediaBrowser.Server.Implementations.Devices
{
if (!_hasChildren.HasValue)
{
- _hasChildren = LibraryManager.GetItemIds(new InternalItemsQuery { ParentId = Id }).Count > 0;
+ _hasChildren = LibraryManager.GetItemIds(new InternalItemsQuery { Parent = this }).Count > 0;
}
return _hasChildren.Value;
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 3bfbff6e67..31c400915e 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -32,14 +32,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <DebugType>none</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release Mono\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
diff --git a/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs b/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
index 07773d846b..bd16dc2e9e 100644
--- a/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
+++ b/MediaBrowser.Server.Implementations/Playlists/ManualPlaylistsFolder.cs
@@ -43,7 +43,7 @@ namespace MediaBrowser.Server.Implementations.Playlists
get { return MediaBrowser.Model.Entities.CollectionType.Playlists; }
}
- protected override Task<QueryResult<BaseItem>> GetItemsInternal(InternalItemsQuery query)
+ protected override QueryResult<BaseItem> GetItemsInternal(InternalItemsQuery query)
{
query.Recursive = false;
return base.GetItemsInternal(query);
diff --git a/MediaBrowser.Server.Mac.sln b/MediaBrowser.Server.Mac.sln
index 75cec579a4..6fc1dd8925 100644
--- a/MediaBrowser.Server.Mac.sln
+++ b/MediaBrowser.Server.Mac.sln
@@ -21,8 +21,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Providers", "M
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Implementations", "MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj", "{2E781478-814D-4A48-9D80-BFF206441A65}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Startup.Common", "MediaBrowser.Server.Startup.Common\MediaBrowser.Server.Startup.Common.csproj", "{B90AB8F2-1BFF-4568-A3FD-2A338A435A75}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.WebDashboard", "MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj", "{5624B7B5-B5A7-41D8-9F10-CC5611109619}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.XbmcMetadata", "MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj", "{23499896-B135-4527-8574-C26E926EA99E}"
@@ -43,10 +41,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Implementations
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RSSDP", "RSSDP\RSSDP.csproj", "{21002819-C39A-4D3E-BE83-2A276A77FB1F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHttpListener.Portable", "SocketHttpListener.Portable\SocketHttpListener.Portable.csproj", "{4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.Skia", "Emby.Drawing.Skia\Emby.Drawing.Skia.csproj", "{2312DA6D-FF86-4597-9777-BCEEC32D96DD}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Common.Implementations", "Emby.Common.Implementations\Emby.Common.Implementations.csproj", "{1E37A338-9F57-4B70-BD6D-BB9C591E319B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHttpListener", "SocketHttpListener\SocketHttpListener.csproj", "{1D74413B-E7CF-455B-B021-F52BDF881542}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Core", "Emby.Server.Core\Emby.Server.Core.csproj", "{776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Nat", "Mono.Nat\Mono.Nat.csproj", "{CB7F2326-6497-4A3D-BA03-48513B17A7BE}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
AppStore|Any CPU = AppStore|Any CPU
@@ -59,6 +63,18 @@ Global
Release|x86 = Release|x86
Signed|Any CPU = Signed|Any CPU
Signed|x86 = Signed|x86
+ Debug|Mixed Platforms = Debug|Mixed Platforms
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release Mono|Mixed Platforms = Release Mono|Mixed Platforms
+ Release Mono|Win32 = Release Mono|Win32
+ Release Mono|x64 = Release Mono|x64
+ Release|Mixed Platforms = Release|Mixed Platforms
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ Signed|Mixed Platforms = Signed|Mixed Platforms
+ Signed|Win32 = Signed|Win32
+ Signed|x64 = Signed|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C97B98FA-00D4-4880-88B8-C76017A418AB}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU
@@ -238,26 +254,6 @@ Global
{2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.ActiveCfg = Release Mono|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.Build.0 = Release Mono|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.AppStore|x86.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.AppStore|x86.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|x86.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|x86.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|x86.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|x86.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|x86.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Any CPU.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x86.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x86.Build.0 = Debug|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.AppStore|Any CPU.Build.0 = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.AppStore|x86.ActiveCfg = Release Mono|Any CPU
@@ -458,26 +454,6 @@ Global
{21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|Any CPU.Build.0 = Release|Any CPU
{21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|x86.ActiveCfg = Release|Any CPU
{21002819-C39A-4D3E-BE83-2A276A77FB1F}.Signed|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.AppStore|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.AppStore|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.AppStore|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x86.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x86.Build.0 = Release|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -518,6 +494,182 @@ Global
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x64.Build.0 = Release|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x86.ActiveCfg = Release|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x86.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.AppStore|x86.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.AppStore|x86.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x86.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x86.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x86.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x86.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x86.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Any CPU.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x86.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x86.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Win32.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x64.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Win32.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Win32.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x64.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x64.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Win32.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Win32.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x64.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x64.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Win32.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Win32.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x64.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x64.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|x86.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.AppStore|x86.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x86.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x86.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x86.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x86.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x86.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Any CPU.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x86.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x86.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Win32.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x64.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Win32.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Win32.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x64.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x64.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Win32.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Win32.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x64.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x64.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Win32.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Win32.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x64.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x64.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.AppStore|x86.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.AppStore|x86.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x86.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x86.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x86.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x86.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x86.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Any CPU.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x86.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x86.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Win32.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x64.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Mixed Platforms.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Win32.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Win32.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x64.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x64.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Win32.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Win32.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x64.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x64.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Mixed Platforms.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Win32.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Win32.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x64.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x64.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|x86.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.AppStore|x86.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x86.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Any CPU.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x86.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x86.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x86.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x86.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Any CPU.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x86.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x86.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Win32.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x64.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Mixed Platforms.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Win32.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Win32.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x64.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x64.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Win32.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Win32.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x64.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x64.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Mixed Platforms.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Win32.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Win32.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x64.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x64.Build.0 = Debug|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj
index 3d84a435f3..4d3e22f0cf 100644
--- a/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj
+++ b/MediaBrowser.Server.Mac/Emby.Server.Mac.csproj
@@ -93,36 +93,27 @@
<HintPath>..\packages\Mono.Posix.4.0.0.0\lib\net40\Mono.Posix.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
- <HintPath>..\packages\NLog.4.4.0-betaV15\lib\net45\NLog.dll</HintPath>
+ <HintPath>..\packages\NLog.4.4.9\lib\net45\NLog.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="ServiceStack.Text, Version=4.5.4.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\ServiceStack.Text.4.5.4\lib\net45\ServiceStack.Text.dll</HintPath>
+ <Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SharpCompress, Version=0.14.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SimpleInjector, Version=3.2.4.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.3.2.4\lib\net45\SimpleInjector.dll</HintPath>
+ <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Data" />
- <Reference Include="Emby.Common.Implementations">
- <HintPath>..\ThirdParty\emby\Emby.Common.Implementations.dll</HintPath>
- </Reference>
- <Reference Include="Emby.Server.Core">
- <HintPath>..\ThirdParty\emby\Emby.Server.Core.dll</HintPath>
- </Reference>
- <Reference Include="Mono.Nat">
- <HintPath>..\ThirdParty\emby\Mono.Nat.dll</HintPath>
- </Reference>
<Reference Include="TagLib.Portable">
<HintPath>..\ThirdParty\taglib\TagLib.Portable.dll</HintPath>
</Reference>
<Reference Include="SkiaSharp">
- <HintPath>..\packages\SkiaSharp.1.57.1\lib\net45\SkiaSharp.dll</HintPath>
+ <HintPath>..\packages\SkiaSharp.1.58.0\lib\net45\SkiaSharp.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.core">
<HintPath>..\packages\SQLitePCLRaw.core.1.1.5\lib\net45\SQLitePCLRaw.core.dll</HintPath>
@@ -176,10 +167,6 @@
<Project>{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}</Project>
<Name>MediaBrowser.Controller</Name>
</ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Server.Startup.Common\MediaBrowser.Server.Startup.Common.csproj">
- <Project>{B90AB8F2-1BFF-4568-A3FD-2A338A435A75}</Project>
- <Name>MediaBrowser.Server.Startup.Common</Name>
- </ProjectReference>
<ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
<Project>{9142EEFA-7570-41E1-BFCC-468BB571AF2F}</Project>
<Name>MediaBrowser.Common</Name>
@@ -244,14 +231,26 @@
<Project>{88AE38DF-19D7-406F-A6A9-09527719A21E}</Project>
<Name>BDInfo</Name>
</ProjectReference>
- <ProjectReference Include="..\SocketHttpListener.Portable\SocketHttpListener.Portable.csproj">
- <Project>{4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}</Project>
- <Name>SocketHttpListener.Portable</Name>
- </ProjectReference>
<ProjectReference Include="..\RSSDP\RSSDP.csproj">
<Project>{21002819-C39A-4D3E-BE83-2A276A77FB1F}</Project>
<Name>RSSDP</Name>
</ProjectReference>
+ <ProjectReference Include="..\Emby.Common.Implementations\Emby.Common.Implementations.csproj">
+ <Project>{1E37A338-9F57-4B70-BD6D-BB9C591E319B}</Project>
+ <Name>Emby.Common.Implementations</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\SocketHttpListener\SocketHttpListener.csproj">
+ <Project>{1D74413B-E7CF-455B-B021-F52BDF881542}</Project>
+ <Name>SocketHttpListener</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Emby.Server.Core\Emby.Server.Core.csproj">
+ <Project>{776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}</Project>
+ <Name>Emby.Server.Core</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
+ <Project>{CB7F2326-6497-4A3D-BA03-48513B17A7BE}</Project>
+ <Name>Mono.Nat</Name>
+ </ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="statusicon.png" />
@@ -979,6 +978,9 @@
<BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlaudioplayer\plugin.js">
<Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlaudioplayer\plugin.js</Link>
</BundleResource>
+ <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\htmlmediahelper.js">
+ <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\htmlmediahelper.js</Link>
+ </BundleResource>
<BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\plugin.js">
<Link>Resources\dashboard-ui\bower_components\emby-webcomponents\htmlvideoplayer\plugin.js</Link>
</BundleResource>
@@ -1105,6 +1107,9 @@
<BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\pagejs\page.js">
<Link>Resources\dashboard-ui\bower_components\emby-webcomponents\pagejs\page.js</Link>
</BundleResource>
+ <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\photoplayer\plugin.js">
+ <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\photoplayer\plugin.js</Link>
+ </BundleResource>
<BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\autoplaydetect.js">
<Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\autoplaydetect.js</Link>
</BundleResource>
@@ -1135,6 +1140,9 @@
<BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playersettingsmenu.js">
<Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playersettingsmenu.js</Link>
</BundleResource>
+ <BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\playqueuemanager.js">
+ <Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\playqueuemanager.js</Link>
+ </BundleResource>
<BundleResource Include="..\MediaBrowser.WebDashboard\dashboard-ui\bower_components\emby-webcomponents\playback\remotecontrolautoplay.js">
<Link>Resources\dashboard-ui\bower_components\emby-webcomponents\playback\remotecontrolautoplay.js</Link>
</BundleResource>
@@ -2709,7 +2717,7 @@
</BundleResource>
</ItemGroup>
<ItemGroup>
- <NativeReference Include="..\packages\SkiaSharp.1.57.1\runtimes\osx\native\libSkiaSharp.dylib">
+ <NativeReference Include="..\packages\SkiaSharp.1.58.0\runtimes\osx\native\libSkiaSharp.dylib">
<Kind>Dynamic</Kind>
<SmartLink>False</SmartLink>
</NativeReference>
diff --git a/MediaBrowser.Server.Mac/Main.cs b/MediaBrowser.Server.Mac/Main.cs
index 8a3a6cdbab..d84d696ddd 100644
--- a/MediaBrowser.Server.Mac/Main.cs
+++ b/MediaBrowser.Server.Mac/Main.cs
@@ -1,6 +1,4 @@
using MediaBrowser.Model.Logging;
-using MediaBrowser.Server.Startup.Common;
-using MediaBrowser.Server.Startup.Common.IO;
using MediaBrowser.Server.Implementations;
using System;
using System.Diagnostics;
@@ -20,6 +18,8 @@ using MonoMac.AppKit;
using MonoMac.Foundation;
using MonoMac.ObjCRuntime;
using Emby.Server.Core;
+using Emby.Server.Core.Cryptography;
+using Emby.Server.Core.IO;
using Emby.Server.Implementations;
using Emby.Common.Implementations.Logging;
using Emby.Server.Implementations.Logging;
@@ -27,7 +27,7 @@ using Emby.Common.Implementations.EnvironmentInfo;
using Emby.Server.Mac.Native;
using Emby.Server.Implementations.IO;
using Emby.Common.Implementations.Networking;
-using Emby.Common.Implementations.Security;
+using Emby.Common.Implementations.Cryptography;
using Mono.Unix.Native;
using MediaBrowser.Model.System;
using MediaBrowser.Model.IO;
diff --git a/MediaBrowser.Server.Mac/packages.config b/MediaBrowser.Server.Mac/packages.config
index 98f56960b2..f6a11cd3a2 100644
--- a/MediaBrowser.Server.Mac/packages.config
+++ b/MediaBrowser.Server.Mac/packages.config
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
- <package id="SkiaSharp" version="1.57.1" targetFramework="net462" />
+ <package id="SkiaSharp" version="1.58.0" targetFramework="net462" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/ImageEncoderHelper.cs b/MediaBrowser.Server.Mono/ImageEncoderHelper.cs
index ddbde2f666..2f7f2a45ce 100644
--- a/MediaBrowser.Server.Mono/ImageEncoderHelper.cs
+++ b/MediaBrowser.Server.Mono/ImageEncoderHelper.cs
@@ -1,6 +1,5 @@
using System;
using Emby.Drawing;
-using Emby.Drawing.Net;
using Emby.Drawing.ImageMagick;
using Emby.Server.Core;
using Emby.Server.Implementations;
@@ -33,15 +32,6 @@ namespace MediaBrowser.Server.Startup.Common
}
}
- try
- {
- return new GDIImageEncoder(fileSystem, logManager.GetLogger("GDI"));
- }
- catch
- {
- logger.Error("Error loading GDI. Will revert to NullImageEncoder.");
- }
-
return new NullImageEncoder();
}
}
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index e4bde07c7d..8199cf2c4e 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -2,7 +2,7 @@
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{175A9388-F352-4586-A6B4-070DED62B644}</ProjectGuid>
@@ -14,62 +14,34 @@
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<TargetFrameworkProfile />
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
- <OutputPath>bin\Debug</OutputPath>
- <DefineConstants>DEBUG;</DefineConstants>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
- <PlatformTarget>x86</PlatformTarget>
- <Externalconsole>true</Externalconsole>
- <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
- <DebugType>full</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release</OutputPath>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- <PlatformTarget>AnyCPU</PlatformTarget>
- <Externalconsole>true</Externalconsole>
<Prefer32Bit>false</Prefer32Bit>
- <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <Optimize>false</Optimize>
- <OutputPath>bin\Release</OutputPath>
- <WarningLevel>4</WarningLevel>
<PlatformTarget>AnyCPU</PlatformTarget>
- <Prefer32Bit>false</Prefer32Bit>
- <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <Optimize>false</Optimize>
- <OutputPath>bin\Release Mono</OutputPath>
+ <DebugType>none</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
- <PlatformTarget>AnyCPU</PlatformTarget>
- <Prefer32Bit>false</Prefer32Bit>
- <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release Mono|x86'">
<Prefer32Bit>false</Prefer32Bit>
- <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
- <Reference Include="Emby.Common.Implementations">
- <HintPath>..\ThirdParty\emby\Emby.Common.Implementations.dll</HintPath>
- </Reference>
<Reference Include="Emby.Server.CinemaMode">
<HintPath>..\ThirdParty\emby\Emby.Server.CinemaMode.dll</HintPath>
</Reference>
<Reference Include="Emby.Server.Connect">
<HintPath>..\ThirdParty\emby\Emby.Server.Connect.dll</HintPath>
</Reference>
- <Reference Include="Emby.Server.Core">
- <HintPath>..\ThirdParty\emby\Emby.Server.Core.dll</HintPath>
- </Reference>
<Reference Include="Emby.Server.Sync">
<HintPath>..\ThirdParty\emby\Emby.Server.Sync.dll</HintPath>
</Reference>
@@ -78,19 +50,18 @@
<HintPath>..\packages\Mono.Posix.4.0.0.0\lib\net40\Mono.Posix.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
- <HintPath>..\packages\NLog.4.4.3\lib\net45\NLog.dll</HintPath>
- <Private>True</Private>
+ <HintPath>..\packages\NLog.4.4.9\lib\net45\NLog.dll</HintPath>
</Reference>
- <Reference Include="ServiceStack.Text, Version=4.5.4.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\ServiceStack.Text.4.5.4\lib\net45\ServiceStack.Text.dll</HintPath>
+ <Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SharpCompress, Version=0.14.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SimpleInjector, Version=3.3.2.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.3.3.2\lib\net45\SimpleInjector.dll</HintPath>
+ <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
@@ -109,8 +80,6 @@
<Reference Include="System.Data" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.Runtime.Serialization" />
- <Reference Include="System.ServiceModel" />
- <Reference Include="System.Transactions" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
@@ -134,6 +103,10 @@
<Project>{713f42b5-878e-499d-a878-e4c652b1d5e8}</Project>
<Name>DvdLib</Name>
</ProjectReference>
+ <ProjectReference Include="..\Emby.Common.Implementations\Emby.Common.Implementations.csproj">
+ <Project>{1e37a338-9f57-4b70-bd6d-bb9c591e319b}</Project>
+ <Name>Emby.Common.Implementations</Name>
+ </ProjectReference>
<ProjectReference Include="..\Emby.Dlna\Emby.Dlna.csproj">
<Project>{805844ab-e92f-45e6-9d99-4f6d48d129a5}</Project>
<Name>Emby.Dlna</Name>
@@ -142,10 +115,6 @@
<Project>{6cfee013-6e7c-432b-ac37-cabf0880c69a}</Project>
<Name>Emby.Drawing.ImageMagick</Name>
</ProjectReference>
- <ProjectReference Include="..\Emby.Drawing.Net\Emby.Drawing.Net.csproj">
- <Project>{c97a239e-a96c-4d64-a844-ccf8cc30aecb}</Project>
- <Name>Emby.Drawing.Net</Name>
- </ProjectReference>
<ProjectReference Include="..\Emby.Drawing\Emby.Drawing.csproj">
<Project>{08fff49b-f175-4807-a2b5-73b0ebd9f716}</Project>
<Name>Emby.Drawing</Name>
@@ -154,14 +123,14 @@
<Project>{89ab4548-770d-41fd-a891-8daff44f452c}</Project>
<Name>Emby.Photos</Name>
</ProjectReference>
+ <ProjectReference Include="..\Emby.Server.Core\Emby.Server.Core.csproj">
+ <Project>{776b9f0c-5195-45e3-9a36-1cc1f0d8e0b0}</Project>
+ <Name>Emby.Server.Core</Name>
+ </ProjectReference>
<ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj">
<Project>{e383961b-9356-4d5d-8233-9a1079d03055}</Project>
<Name>Emby.Server.Implementations</Name>
</ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Server.Startup.Common\MediaBrowser.Server.Startup.Common.csproj">
- <Project>{b90ab8f2-1bff-4568-a3fd-2a338a435a75}</Project>
- <Name>MediaBrowser.Server.Startup.Common</Name>
- </ProjectReference>
<ProjectReference Include="..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj">
<Project>{5624B7B5-B5A7-41D8-9F10-CC5611109619}</Project>
<Name>MediaBrowser.WebDashboard</Name>
@@ -202,6 +171,10 @@
<Project>{23499896-B135-4527-8574-C26E926EA99E}</Project>
<Name>MediaBrowser.XbmcMetadata</Name>
</ProjectReference>
+ <ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
+ <Project>{cb7f2326-6497-4a3d-ba03-48513b17a7be}</Project>
+ <Name>Mono.Nat</Name>
+ </ProjectReference>
<ProjectReference Include="..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj">
<Project>{4a4402d4-e910-443b-b8fc-2c18286a2ca0}</Project>
<Name>OpenSubtitlesHandler</Name>
@@ -210,10 +183,6 @@
<Project>{21002819-c39a-4d3e-be83-2a276a77fb1f}</Project>
<Name>RSSDP</Name>
</ProjectReference>
- <ProjectReference Include="..\SocketHttpListener.Portable\SocketHttpListener.Portable.csproj">
- <Project>{4f26d5d8-a7b0-42b3-ba42-7cb7d245934e}</Project>
- <Name>SocketHttpListener.Portable</Name>
- </ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="..\ThirdParty\SQLite3\osx\libsqlite3.0.dylib">
diff --git a/MediaBrowser.Server.Mono/MonoAppHost.cs b/MediaBrowser.Server.Mono/MonoAppHost.cs
index 09c409a2c5..6f438cb72e 100644
--- a/MediaBrowser.Server.Mono/MonoAppHost.cs
+++ b/MediaBrowser.Server.Mono/MonoAppHost.cs
@@ -42,11 +42,6 @@ namespace MediaBrowser.Server.Mono
return new SyncManager();
}
- public override PackageVersionClass SystemUpdateLevel
- {
- get { return UpdateLevelHelper.GetSystemUpdateLevel(ConfigurationManager); }
- }
-
protected override void RestartInternal()
{
MainClass.Restart(StartupOptions);
diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs
index b79c8c1f7d..af6e00e257 100644
--- a/MediaBrowser.Server.Mono/Program.cs
+++ b/MediaBrowser.Server.Mono/Program.cs
@@ -14,15 +14,15 @@ using System.Threading.Tasks;
using Emby.Common.Implementations.EnvironmentInfo;
using Emby.Common.Implementations.Logging;
using Emby.Common.Implementations.Networking;
-using Emby.Common.Implementations.Security;
+using Emby.Server.Core.Cryptography;
using Emby.Server.Core;
+using Emby.Server.Core.IO;
using Emby.Server.Core.Logging;
using Emby.Server.Implementations;
using Emby.Server.Implementations.IO;
using Emby.Server.Implementations.Logging;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.System;
-using MediaBrowser.Server.Startup.Common.IO;
using Mono.Unix.Native;
using NLog;
using ILogger = MediaBrowser.Model.Logging.ILogger;
@@ -42,7 +42,6 @@ namespace MediaBrowser.Server.Mono
var applicationPath = Assembly.GetEntryAssembly().Location;
var appFolderPath = Path.GetDirectoryName(applicationPath);
- TryCopySqliteConfigFile(appFolderPath);
SetSqliteProvider();
var options = new StartupOptions(Environment.GetCommandLineArgs());
@@ -74,20 +73,6 @@ namespace MediaBrowser.Server.Mono
}
}
- private static void TryCopySqliteConfigFile(string appFolderPath)
- {
- try
- {
- File.Copy(Path.Combine(appFolderPath, "System.Data.SQLite.dll.config"),
- Path.Combine(appFolderPath, "SQLitePCLRaw.provider.sqlite3.dll.config"),
- true);
- }
- catch
- {
-
- }
- }
-
private static void SetSqliteProvider()
{
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
@@ -260,7 +245,8 @@ namespace MediaBrowser.Server.Mono
{
var message = LogHelper.GetLogMessage(exception).ToString();
- if (message.IndexOf("InotifyWatcher", StringComparison.OrdinalIgnoreCase) == -1)
+ if (message.IndexOf("InotifyWatcher", StringComparison.OrdinalIgnoreCase) == -1 &&
+ message.IndexOf("_IOCompletionCallback", StringComparison.OrdinalIgnoreCase) == -1)
{
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(exception));
}
diff --git a/MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config b/MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config
index 83a6cd9f38..793d8a889b 100644
--- a/MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config
+++ b/MediaBrowser.Server.Mono/SQLitePCLRaw.provider.sqlite3.dll.config
@@ -1,3 +1,4 @@
<configuration>
<dllmap dll="sqlite3" target="libsqlite3.so" os="linux"/>
+ <dllmap dll="dl" target="libdl.so" os="linux"/>
</configuration> \ No newline at end of file
diff --git a/MediaBrowser.Server.Mono/app.config b/MediaBrowser.Server.Mono/app.config
index 8f21d4a67f..62d8a4cae2 100644
--- a/MediaBrowser.Server.Mono/app.config
+++ b/MediaBrowser.Server.Mono/app.config
@@ -1,31 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
- <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
+ <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true"></targets>
</nlog>
<appSettings>
- <add key="DebugProgramDataPath" value="ProgramData-Server" />
- <add key="ReleaseProgramDataPath" value="ProgramData-Server" />
+ <add key="DebugProgramDataPath" value="ProgramData-Server"/>
+ <add key="ReleaseProgramDataPath" value="ProgramData-Server"/>
</appSettings>
<runtime>
- <legacyUnhandledExceptionPolicy enabled="1" />
+ <legacyUnhandledExceptionPolicy enabled="1"/>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
- <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-1.0.94.0" newVersion="1.0.94.0" />
+ <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral"/>
+ <bindingRedirect oldVersion="0.0.0.0-1.0.94.0" newVersion="1.0.94.0"/>
</dependentAssembly>
<dependentAssembly>
- <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
+ <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
+ <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
- <assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-3.3.2.0" newVersion="3.3.2.0" />
+ <assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral"/>
+ <bindingRedirect oldVersion="0.0.0.0-4.0.7.0" newVersion="4.0.7.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" /></startup></configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>
diff --git a/MediaBrowser.Server.Mono/packages.config b/MediaBrowser.Server.Mono/packages.config
index de26c7666e..0e846ac8ff 100644
--- a/MediaBrowser.Server.Mono/packages.config
+++ b/MediaBrowser.Server.Mono/packages.config
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
- <package id="NLog" version="4.4.3" targetFramework="net46" />
- <package id="ServiceStack.Text" version="4.5.4" targetFramework="net46" />
+ <package id="NLog" version="4.4.9" targetFramework="net46" />
+ <package id="ServiceStack.Text" version="4.5.8" targetFramework="net46" />
<package id="SharpCompress" version="0.14.0" targetFramework="net46" />
- <package id="SimpleInjector" version="3.3.2" targetFramework="net46" />
+ <package id="SimpleInjector" version="4.0.7" targetFramework="net46" />
<package id="SQLitePCLRaw.core" version="1.1.5" targetFramework="net46" />
<package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.5" targetFramework="net46" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.Server.Startup.Common/UpdateLevelHelper.cs b/MediaBrowser.Server.Startup.Common/UpdateLevelHelper.cs
deleted file mode 100644
index 7f3e27d911..0000000000
--- a/MediaBrowser.Server.Startup.Common/UpdateLevelHelper.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using System;
-using System.Configuration;
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Model.Updates;
-
-namespace MediaBrowser.Server.Startup.Common
-{
- public static class UpdateLevelHelper
- {
- public static PackageVersionClass GetSystemUpdateLevel(IConfigurationManager config)
- {
- return config.CommonConfiguration.SystemUpdateLevel;
- //var configuredValue = ConfigurationManager.AppSettings["SystemUpdateLevel"];
-
- //if (string.Equals(configuredValue, "Beta", StringComparison.OrdinalIgnoreCase))
- //{
- // return PackageVersionClass.Beta;
- //}
- //if (string.Equals(configuredValue, "Dev", StringComparison.OrdinalIgnoreCase))
- //{
- // return PackageVersionClass.Dev;
- //}
-
- //return PackageVersionClass.Release;
- }
- }
-}
diff --git a/MediaBrowser.Server.Startup.Common/app.config b/MediaBrowser.Server.Startup.Common/app.config
deleted file mode 100644
index e5b8d3d027..0000000000
--- a/MediaBrowser.Server.Startup.Common/app.config
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
- <runtime>
- <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
- <dependentAssembly>
- <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
- </dependentAssembly>
- </assemblyBinding>
- </runtime>
-</configuration> \ No newline at end of file
diff --git a/MediaBrowser.Server.Startup.Common/packages.config b/MediaBrowser.Server.Startup.Common/packages.config
deleted file mode 100644
index 4b6266585a..0000000000
--- a/MediaBrowser.Server.Startup.Common/packages.config
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="Microsoft.IO.RecyclableMemoryStream" version="1.2.2" targetFramework="net46" />
-</packages> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/App.config b/MediaBrowser.ServerApplication/App.config
index fae013d6e1..d7f4380c4c 100644
--- a/MediaBrowser.ServerApplication/App.config
+++ b/MediaBrowser.ServerApplication/App.config
@@ -49,7 +49,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral" />
- <bindingRedirect oldVersion="0.0.0.0-3.3.2.0" newVersion="3.3.2.0" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.7.0" newVersion="4.0.7.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
diff --git a/MediaBrowser.ServerApplication/ImageEncoderHelper.cs b/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
index b8fa097d64..a6651ea40d 100644
--- a/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
+++ b/MediaBrowser.ServerApplication/ImageEncoderHelper.cs
@@ -1,6 +1,5 @@
using System;
using Emby.Drawing;
-using Emby.Drawing.Net;
using Emby.Drawing.ImageMagick;
using Emby.Drawing.Skia;
using Emby.Server.Core;
@@ -22,34 +21,22 @@ namespace MediaBrowser.Server.Startup.Common
Func<IHttpClient> httpClient,
IApplicationPaths appPaths)
{
- if (!startupOptions.ContainsOption("-enablegdi"))
+ try
{
- try
- {
- return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem);
- }
- catch
- {
- logger.Error("Error loading Skia. Will revert to ImageMagick.");
- }
-
- try
- {
- return new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem);
- }
- catch
- {
- logger.Error("Error loading ImageMagick. Will revert to GDI.");
- }
+ return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem);
+ }
+ catch
+ {
+ logger.Error("Error loading Skia. Will revert to ImageMagick.");
}
try
{
- return new GDIImageEncoder(fileSystem, logManager.GetLogger("GDI"));
+ return new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem);
}
catch
{
- logger.Error("Error loading GDI. Will revert to NullImageEncoder.");
+ logger.Error("Error loading ImageMagick. Will revert to GDI.");
}
return new NullImageEncoder();
diff --git a/MediaBrowser.ServerApplication/MainStartup.cs b/MediaBrowser.ServerApplication/MainStartup.cs
index 37c71545a4..a0494b3e5c 100644
--- a/MediaBrowser.ServerApplication/MainStartup.cs
+++ b/MediaBrowser.ServerApplication/MainStartup.cs
@@ -21,9 +21,10 @@ using Emby.Common.Implementations.EnvironmentInfo;
using Emby.Common.Implementations.IO;
using Emby.Common.Implementations.Logging;
using Emby.Common.Implementations.Networking;
-using Emby.Common.Implementations.Security;
+using Emby.Server.Core.Cryptography;
using Emby.Drawing;
using Emby.Server.Core;
+using Emby.Server.Core.IO;
using Emby.Server.Core.Logging;
using Emby.Server.Implementations;
using Emby.Server.Implementations.Browser;
@@ -32,7 +33,6 @@ using Emby.Server.Implementations.Logging;
using ImageMagickSharp;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.IO;
-using MediaBrowser.Server.Startup.Common.IO;
namespace MediaBrowser.ServerApplication
{
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index d632007d20..637474380b 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -64,18 +64,12 @@
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
- <Reference Include="Emby.Common.Implementations">
- <HintPath>..\ThirdParty\emby\Emby.Common.Implementations.dll</HintPath>
- </Reference>
<Reference Include="Emby.Server.CinemaMode">
<HintPath>..\ThirdParty\emby\Emby.Server.CinemaMode.dll</HintPath>
</Reference>
<Reference Include="Emby.Server.Connect">
<HintPath>..\ThirdParty\emby\Emby.Server.Connect.dll</HintPath>
</Reference>
- <Reference Include="Emby.Server.Core">
- <HintPath>..\ThirdParty\emby\Emby.Server.Core.dll</HintPath>
- </Reference>
<Reference Include="Emby.Server.Sync">
<HintPath>..\ThirdParty\emby\Emby.Server.Sync.dll</HintPath>
</Reference>
@@ -84,24 +78,22 @@
<HintPath>..\packages\ImageMagickSharp.1.0.0.18\lib\net45\ImageMagickSharp.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
- <HintPath>..\packages\NLog.4.4.3\lib\net45\NLog.dll</HintPath>
- <Private>True</Private>
+ <HintPath>..\packages\NLog.4.4.9\lib\net45\NLog.dll</HintPath>
</Reference>
- <Reference Include="ServiceStack.Text, Version=4.5.4.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\ServiceStack.Text.4.5.4\lib\net45\ServiceStack.Text.dll</HintPath>
+ <Reference Include="ServiceStack.Text, Version=4.5.8.0, Culture=neutral, processorArchitecture=MSIL">
+ <HintPath>..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SharpCompress, Version=0.14.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SimpleInjector, Version=3.3.2.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
- <HintPath>..\packages\SimpleInjector.3.3.2\lib\net45\SimpleInjector.dll</HintPath>
+ <Reference Include="SimpleInjector, Version=4.0.7.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <HintPath>..\packages\SimpleInjector.4.0.7\lib\net45\SimpleInjector.dll</HintPath>
<Private>True</Private>
</Reference>
- <Reference Include="SkiaSharp, Version=1.57.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
- <HintPath>..\packages\SkiaSharp.1.57.1\lib\net45\SkiaSharp.dll</HintPath>
- <Private>True</Private>
+ <Reference Include="SkiaSharp, Version=1.58.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
+ <HintPath>..\packages\SkiaSharp.1.58.0\lib\net45\SkiaSharp.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.core.1.1.5\lib\net45\SQLitePCLRaw.core.dll</HintPath>
@@ -119,9 +111,7 @@
<Reference Include="System.IO.Compression" />
<Reference Include="System.Management" />
<Reference Include="System.Runtime.Serialization" />
- <Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceProcess" />
- <Reference Include="System.Transactions" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@@ -189,14 +179,6 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
- <Content Include="..\packages\SkiaSharp.1.57.1\runtimes\win7-x64\native\libSkiaSharp.dll">
- <Link>x64\libSkiaSharp.dll</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- <Content Include="..\packages\SkiaSharp.1.57.1\runtimes\win7-x86\native\libSkiaSharp.dll">
- <Link>x86\libSkiaSharp.dll</Link>
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
<Content Include="..\Tools\Installation\MediaBrowser.InstallUtil.dll">
<Link>MediaBrowser.InstallUtil.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -644,6 +626,9 @@
<Content Include="x64\IM_MOD_RL_yuv_.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="x64\libSkiaSharp.dll">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="x64\sqlite3.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1087,6 +1072,9 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Resources\Images\mb3logo800.png" />
+ <Content Include="x86\libSkiaSharp.dll">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<Content Include="x86\sqlite3.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -1100,6 +1088,10 @@
<Project>{713f42b5-878e-499d-a878-e4c652b1d5e8}</Project>
<Name>DvdLib</Name>
</ProjectReference>
+ <ProjectReference Include="..\Emby.Common.Implementations\Emby.Common.Implementations.csproj">
+ <Project>{1e37a338-9f57-4b70-bd6d-bb9c591e319b}</Project>
+ <Name>Emby.Common.Implementations</Name>
+ </ProjectReference>
<ProjectReference Include="..\Emby.Dlna\Emby.Dlna.csproj">
<Project>{805844ab-e92f-45e6-9d99-4f6d48d129a5}</Project>
<Name>Emby.Dlna</Name>
@@ -1108,10 +1100,6 @@
<Project>{6cfee013-6e7c-432b-ac37-cabf0880c69a}</Project>
<Name>Emby.Drawing.ImageMagick</Name>
</ProjectReference>
- <ProjectReference Include="..\Emby.Drawing.Net\Emby.Drawing.Net.csproj">
- <Project>{c97a239e-a96c-4d64-a844-ccf8cc30aecb}</Project>
- <Name>Emby.Drawing.Net</Name>
- </ProjectReference>
<ProjectReference Include="..\Emby.Drawing.Skia\Emby.Drawing.Skia.csproj">
<Project>{2312da6d-ff86-4597-9777-bceec32d96dd}</Project>
<Name>Emby.Drawing.Skia</Name>
@@ -1124,6 +1112,10 @@
<Project>{89ab4548-770d-41fd-a891-8daff44f452c}</Project>
<Name>Emby.Photos</Name>
</ProjectReference>
+ <ProjectReference Include="..\Emby.Server.Core\Emby.Server.Core.csproj">
+ <Project>{776b9f0c-5195-45e3-9a36-1cc1f0d8e0b0}</Project>
+ <Name>Emby.Server.Core</Name>
+ </ProjectReference>
<ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj">
<Project>{e383961b-9356-4d5d-8233-9a1079d03055}</Project>
<Name>Emby.Server.Implementations</Name>
@@ -1160,10 +1152,6 @@
<Project>{2e781478-814d-4a48-9d80-bff206441a65}</Project>
<Name>MediaBrowser.Server.Implementations</Name>
</ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Server.Startup.Common\MediaBrowser.Server.Startup.Common.csproj">
- <Project>{b90ab8f2-1bff-4568-a3fd-2a338a435a75}</Project>
- <Name>MediaBrowser.Server.Startup.Common</Name>
- </ProjectReference>
<ProjectReference Include="..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj">
<Project>{5624b7b5-b5a7-41d8-9f10-cc5611109619}</Project>
<Name>MediaBrowser.WebDashboard</Name>
@@ -1172,6 +1160,10 @@
<Project>{23499896-b135-4527-8574-c26e926ea99e}</Project>
<Name>MediaBrowser.XbmcMetadata</Name>
</ProjectReference>
+ <ProjectReference Include="..\Mono.Nat\Mono.Nat.csproj">
+ <Project>{cb7f2326-6497-4a3d-ba03-48513b17a7be}</Project>
+ <Name>Mono.Nat</Name>
+ </ProjectReference>
<ProjectReference Include="..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj">
<Project>{4a4402d4-e910-443b-b8fc-2c18286a2ca0}</Project>
<Name>OpenSubtitlesHandler</Name>
@@ -1180,10 +1172,6 @@
<Project>{21002819-c39a-4d3e-be83-2a276a77fb1f}</Project>
<Name>RSSDP</Name>
</ProjectReference>
- <ProjectReference Include="..\SocketHttpListener.Portable\SocketHttpListener.Portable.csproj">
- <Project>{4f26d5d8-a7b0-42b3-ba42-7cb7d245934e}</Project>
- <Name>SocketHttpListener.Portable</Name>
- </ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
diff --git a/MediaBrowser.ServerApplication/WindowsAppHost.cs b/MediaBrowser.ServerApplication/WindowsAppHost.cs
index 537c8b323c..7a35c56147 100644
--- a/MediaBrowser.ServerApplication/WindowsAppHost.cs
+++ b/MediaBrowser.ServerApplication/WindowsAppHost.cs
@@ -55,20 +55,10 @@ namespace MediaBrowser.ServerApplication
LoopUtil.Run(appName);
}
- public override PackageVersionClass SystemUpdateLevel
- {
- get { return UpdateLevelHelper.GetSystemUpdateLevel(ConfigurationManager); }
- }
-
protected override List<Assembly> GetAssembliesWithPartsInternal()
{
var list = new List<Assembly>();
- if (!Environment.Is64BitProcess)
- {
- //list.Add(typeof(PismoIsoManager).Assembly);
- }
-
list.Add(typeof(DefaultIntroProvider).Assembly);
list.Add(typeof(ConnectManager).Assembly);
list.Add(typeof(SyncManager).Assembly);
diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config
index 2d4ba61707..4d4bde09f9 100644
--- a/MediaBrowser.ServerApplication/packages.config
+++ b/MediaBrowser.ServerApplication/packages.config
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ImageMagickSharp" version="1.0.0.18" targetFramework="net45" />
- <package id="NLog" version="4.4.3" targetFramework="net462" />
- <package id="ServiceStack.Text" version="4.5.4" targetFramework="net462" />
+ <package id="NLog" version="4.4.9" targetFramework="net462" />
+ <package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
<package id="SharpCompress" version="0.14.0" targetFramework="net462" />
- <package id="SimpleInjector" version="3.3.2" targetFramework="net462" />
- <package id="SkiaSharp" version="1.57.1" targetFramework="net462" />
+ <package id="SimpleInjector" version="4.0.7" targetFramework="net462" />
+ <package id="SkiaSharp" version="1.58.0" targetFramework="net462" />
<package id="SQLitePCLRaw.core" version="1.1.5" targetFramework="net462" />
<package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.5" targetFramework="net462" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.ServerApplication/x64/libSkiaSharp.dll.REMOVED.git-id b/MediaBrowser.ServerApplication/x64/libSkiaSharp.dll.REMOVED.git-id
new file mode 100644
index 0000000000..4027f61a08
--- /dev/null
+++ b/MediaBrowser.ServerApplication/x64/libSkiaSharp.dll.REMOVED.git-id
@@ -0,0 +1 @@
+20e469be83c5d41bb44d085c36550780e788a8ef \ No newline at end of file
diff --git a/MediaBrowser.Tests/MediaBrowser.Tests.csproj b/MediaBrowser.Tests/MediaBrowser.Tests.csproj
index 8ba828d85f..a031d47eab 100644
--- a/MediaBrowser.Tests/MediaBrowser.Tests.csproj
+++ b/MediaBrowser.Tests/MediaBrowser.Tests.csproj
@@ -8,7 +8,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MediaBrowser.Tests</RootNamespace>
<AssemblyName>MediaBrowser.Tests</AssemblyName>
- <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+ <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
@@ -37,9 +37,6 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
- <Reference Include="Emby.Common.Implementations">
- <HintPath>..\ThirdParty\emby\Emby.Common.Implementations.dll</HintPath>
- </Reference>
<Reference Include="System" />
<Reference Include="System.XML" />
</ItemGroup>
@@ -68,6 +65,14 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\Emby.Common.Implementations\Emby.Common.Implementations.csproj">
+ <Project>{1e37a338-9f57-4b70-bd6d-bb9c591e319b}</Project>
+ <Name>Emby.Common.Implementations</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\Emby.Server.Core\Emby.Server.Core.csproj">
+ <Project>{776b9f0c-5195-45e3-9a36-1cc1f0d8e0b0}</Project>
+ <Name>Emby.Server.Core</Name>
+ </ProjectReference>
<ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj">
<Project>{e383961b-9356-4d5d-8233-9a1079d03055}</Project>
<Name>Emby.Server.Implementations</Name>
diff --git a/MediaBrowser.Tests/app.config b/MediaBrowser.Tests/app.config
index 9d8c1ac93a..5c79b167f0 100644
--- a/MediaBrowser.Tests/app.config
+++ b/MediaBrowser.Tests/app.config
@@ -8,4 +8,4 @@
</dependentAssembly>
</assemblyBinding>
</runtime>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6"/></startup></configuration>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup></configuration>
diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs
index c6cdeb3542..cf3e221b33 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardService.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs
@@ -305,8 +305,6 @@ namespace MediaBrowser.WebDashboard.Api
}
}
- path = path.Replace("scripts/jquery.mobile-1.4.5.min.map", "thirdparty/jquerymobile-1.4.5/jquery.mobile-1.4.5.min.map", StringComparison.OrdinalIgnoreCase);
-
var localizationCulture = GetLocalizationCulture();
// Don't cache if not configured to do so
@@ -330,7 +328,13 @@ namespace MediaBrowser.WebDashboard.Api
var cacheKey = (_appHost.ApplicationVersion + (localizationCulture ?? string.Empty) + path).GetMD5();
- return await _resultFactory.GetStaticResult(Request, cacheKey, null, cacheDuration, contentType, () => GetResourceStream(basePath, path, localizationCulture)).ConfigureAwait(false);
+ // html gets modified on the fly
+ if (contentType.StartsWith("text/html", StringComparison.OrdinalIgnoreCase))
+ {
+ return await _resultFactory.GetStaticResult(Request, cacheKey, null, cacheDuration, contentType, () => GetResourceStream(basePath, path, localizationCulture)).ConfigureAwait(false);
+ }
+
+ return await _resultFactory.GetStaticFileResult(Request, GetPackageCreator(basePath).GetResourcePath(path));
}
private string GetLocalizationCulture()
diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
index 72389044bd..ee911f0e98 100644
--- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs
+++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs
@@ -68,7 +68,7 @@ namespace MediaBrowser.WebDashboard.Api
/// Gets the dashboard resource path.
/// </summary>
/// <returns>System.String.</returns>
- private string GetDashboardResourcePath(string virtualPath)
+ public string GetResourcePath(string virtualPath)
{
var fullPath = Path.Combine(_basePath, virtualPath.Replace('/', _fileSystem.DirectorySeparatorChar));
@@ -97,7 +97,7 @@ namespace MediaBrowser.WebDashboard.Api
return false;
}
- path = GetDashboardResourcePath(path);
+ path = GetResourcePath(path);
var parent = _fileSystem.GetDirectoryName(path);
return string.Equals(_basePath, parent, StringComparison.OrdinalIgnoreCase) ||
@@ -140,7 +140,7 @@ namespace MediaBrowser.WebDashboard.Api
html = html.Substring(0, index);
}
}
- var mainFile = _fileSystem.ReadAllText(GetDashboardResourcePath("index.html"));
+ var mainFile = _fileSystem.ReadAllText(GetResourcePath("index.html"));
html = ReplaceFirst(mainFile, "<div class=\"mainAnimatedPages skinBody\"></div>", "<div class=\"mainAnimatedPages skinBody hide\">" + html + "</div>");
}
@@ -299,7 +299,7 @@ namespace MediaBrowser.WebDashboard.Api
/// </summary>
private Stream GetRawResourceStream(string virtualPath)
{
- return _fileSystem.GetFileStream(GetDashboardResourcePath(virtualPath), FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, true);
+ return _fileSystem.GetFileStream(GetResourcePath(virtualPath), FileOpenMode.Open, FileAccessMode.Read, FileShareMode.ReadWrite, true);
}
}
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index c9361a46e2..02020531ce 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -34,14 +34,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <DebugType>none</DebugType>
- <Optimize>true</Optimize>
- <OutputPath>bin\Release Mono\</OutputPath>
- <DefineConstants>TRACE</DefineConstants>
- <ErrorReport>prompt</ErrorReport>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<PropertyGroup>
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
</PropertyGroup>
diff --git a/MediaBrowser.XbmcMetadata/EntryPoint.cs b/MediaBrowser.XbmcMetadata/EntryPoint.cs
index cd18e56706..188fc85044 100644
--- a/MediaBrowser.XbmcMetadata/EntryPoint.cs
+++ b/MediaBrowser.XbmcMetadata/EntryPoint.cs
@@ -9,6 +9,7 @@ using MediaBrowser.XbmcMetadata.Configuration;
using MediaBrowser.XbmcMetadata.Savers;
using System;
using System.Linq;
+using MediaBrowser.Controller.Dto;
namespace MediaBrowser.XbmcMetadata
{
@@ -52,7 +53,8 @@ namespace MediaBrowser.XbmcMetadata
var items = _libraryManager.GetItemList(new InternalItemsQuery
{
- PersonIds = new [] { person.Id.ToString("N") }
+ PersonIds = new [] { person.Id.ToString("N") },
+ DtoOptions = new DtoOptions(true)
}).ToList();
diff --git a/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs
index c80ebda45a..f56ceed898 100644
--- a/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs
@@ -5,7 +5,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.XbmcMetadata.Parsers;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs
index 119dcf2f33..4fcc222f8a 100644
--- a/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs
@@ -5,8 +5,6 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.XbmcMetadata.Parsers;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs
index e5931cf25a..4803004dd2 100644
--- a/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs
@@ -4,8 +4,6 @@ using MediaBrowser.XbmcMetadata.Savers;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
namespace MediaBrowser.XbmcMetadata.Providers
diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs
index ff798c0f29..eeb55d8bcf 100644
--- a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs
@@ -6,7 +6,7 @@ using MediaBrowser.XbmcMetadata.Parsers;
using MediaBrowser.XbmcMetadata.Savers;
using System.Linq;
using System.Threading;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs
index 9deaa9745d..3bc10f35b9 100644
--- a/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs
@@ -6,8 +6,6 @@ using MediaBrowser.XbmcMetadata.Parsers;
using System.Collections.Generic;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs
index 75d85b2956..031bdc8d20 100644
--- a/MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs
@@ -1,5 +1,5 @@
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.IO;
diff --git a/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs
index ccccca98ef..0d214f58df 100644
--- a/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs
@@ -5,8 +5,6 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.XbmcMetadata.Parsers;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs
index e144142aa8..368d37e0a4 100644
--- a/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs
+++ b/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs
@@ -5,8 +5,6 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.XbmcMetadata.Parsers;
using System.IO;
using System.Threading;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs
index 9122d3046f..ec53b3bc4c 100644
--- a/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/AlbumNfoSaver.cs
@@ -9,7 +9,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
index 38738470e9..413738ade1 100644
--- a/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/ArtistNfoSaver.cs
@@ -9,7 +9,7 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
index 8658f512bf..a5955e14dc 100644
--- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs
@@ -18,7 +18,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
@@ -538,9 +538,10 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteElementString("year", item.ProductionYear.Value.ToString(UsCulture));
}
- if (!string.IsNullOrEmpty(item.ForcedSortName))
+ var forcedSortName = item.ForcedSortName;
+ if (!string.IsNullOrEmpty(forcedSortName))
{
- writer.WriteElementString("sorttitle", item.ForcedSortName);
+ writer.WriteElementString("sorttitle", forcedSortName);
}
if (!string.IsNullOrEmpty(item.OfficialRating))
diff --git a/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs
index e734b06401..bbd3a8d346 100644
--- a/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/EpisodeNfoSaver.cs
@@ -8,7 +8,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs
index cdada7446e..f32f89bc2a 100644
--- a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs
@@ -10,7 +10,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs
index 5c6b023605..85ed307c19 100644
--- a/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/SeasonNfoSaver.cs
@@ -7,7 +7,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs
index e9a5d4d600..e9b2b786ac 100644
--- a/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs
+++ b/MediaBrowser.XbmcMetadata/Savers/SeriesNfoSaver.cs
@@ -8,7 +8,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
-using MediaBrowser.Common.IO;
+
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
diff --git a/MediaBrowser.sln b/MediaBrowser.sln
index 219beeab16..1a46382657 100644
--- a/MediaBrowser.sln
+++ b/MediaBrowser.sln
@@ -52,35 +52,31 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.LocalMetadata"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Mono", "MediaBrowser.Server.Mono\MediaBrowser.Server.Mono.csproj", "{175A9388-F352-4586-A6B4-070DED62B644}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Server.Startup.Common", "MediaBrowser.Server.Startup.Common\MediaBrowser.Server.Startup.Common.csproj", "{B90AB8F2-1BFF-4568-A3FD-2A338A435A75}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing", "Emby.Drawing\Emby.Drawing.csproj", "{08FFF49B-F175-4807-A2B5-73B0EBD9F716}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Photos", "Emby.Photos\Emby.Photos.csproj", "{89AB4548-770D-41FD-A891-8DAFF44F452C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DvdLib", "DvdLib\DvdLib.csproj", "{713F42B5-878E-499D-A878-E4C652B1D5E8}"
EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Emby.Common.Implementations", "Emby.Common.Implementations\Emby.Common.Implementations.xproj", "{5A27010A-09C6-4E86-93EA-437484C10917}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BDInfo", "BDInfo\BDInfo.csproj", "{88AE38DF-19D7-406F-A6A9-09527719A21E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Implementations", "Emby.Server.Implementations\Emby.Server.Implementations.csproj", "{E383961B-9356-4D5D-8233-9A1079D03055}"
EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Mono.Nat", "Mono.Nat\Mono.Nat.xproj", "{4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RSSDP", "RSSDP\RSSDP.csproj", "{21002819-C39A-4D3E-BE83-2A276A77FB1F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Dlna", "Emby.Dlna\Emby.Dlna.csproj", "{805844AB-E92F-45E6-9D99-4F6D48D129A5}"
EndProject
-Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Emby.Server.Core", "Emby.Server.Core\Emby.Server.Core.xproj", "{65AA7D67-8059-40CD-91F1-16D02687226C}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.ImageMagick", "Emby.Drawing.ImageMagick\Emby.Drawing.ImageMagick.csproj", "{6CFEE013-6E7C-432B-AC37-CABF0880C69A}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.Net", "Emby.Drawing.Net\Emby.Drawing.Net.csproj", "{C97A239E-A96C-4D64-A844-CCF8CC30AECB}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.Skia", "Emby.Drawing.Skia\Emby.Drawing.Skia.csproj", "{2312DA6D-FF86-4597-9777-BCEEC32D96DD}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHttpListener.Portable", "SocketHttpListener.Portable\SocketHttpListener.Portable.csproj", "{4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Server.Core", "Emby.Server.Core\Emby.Server.Core.csproj", "{776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Drawing.Skia", "Emby.Drawing.Skia\Emby.Drawing.Skia.csproj", "{2312DA6D-FF86-4597-9777-BCEEC32D96DD}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Nat", "Mono.Nat\Mono.Nat.csproj", "{CB7F2326-6497-4A3D-BA03-48513B17A7BE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Emby.Common.Implementations", "Emby.Common.Implementations\Emby.Common.Implementations.csproj", "{1E37A338-9F57-4B70-BD6D-BB9C591E319B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketHttpListener", "SocketHttpListener\SocketHttpListener.csproj", "{1D74413B-E7CF-455B-B021-F52BDF881542}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -116,11 +112,12 @@ Global
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|x86.Build.0 = Debug|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release Mono|x86.Build.0 = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -129,16 +126,16 @@ Global
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x64.ActiveCfg = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.ActiveCfg = Release|Any CPU
{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|x86.Build.0 = Release|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x64.Build.0 = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|Win32.Build.0 = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x64.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x64.Build.0 = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Signed|x86.Build.0 = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -149,11 +146,12 @@ Global
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.Build.0 = Debug|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|x86.Build.0 = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Any CPU.Build.0 = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -162,16 +160,16 @@ Global
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|x64.ActiveCfg = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|x86.ActiveCfg = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release|x86.Build.0 = Release|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x64.Build.0 = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|Win32.Build.0 = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x64.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x64.Build.0 = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.ActiveCfg = Release|Any CPU
+ {4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Signed|x86.Build.0 = Release|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -182,11 +180,12 @@ Global
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|x86.Build.0 = Debug|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release Mono|x86.Build.0 = Release|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.Build.0 = Release|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -195,16 +194,16 @@ Global
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|x64.ActiveCfg = Release|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|x86.ActiveCfg = Release|Any CPU
{9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|x86.Build.0 = Release|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x64.Build.0 = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|Win32.Build.0 = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x64.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x64.Build.0 = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Signed|x86.Build.0 = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -218,9 +217,7 @@ Global
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|Win32.Build.0 = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x64.Build.0 = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.ActiveCfg = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release Mono|x86.Build.0 = Release|Any CPU
{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -251,11 +248,12 @@ Global
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Debug|x86.Build.0 = Debug|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release Mono|x86.Build.0 = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Any CPU.Build.0 = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -264,16 +262,16 @@ Global
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x64.ActiveCfg = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.ActiveCfg = Release|Any CPU
{5624B7B5-B5A7-41D8-9F10-CC5611109619}.Release|x86.Build.0 = Release|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x64.Build.0 = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|Win32.Build.0 = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x64.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x64.Build.0 = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.ActiveCfg = Release|Any CPU
+ {5624B7B5-B5A7-41D8-9F10-CC5611109619}.Signed|x86.Build.0 = Release|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -283,11 +281,11 @@ Global
{2E781478-814D-4A48-9D80-BFF206441A65}.Debug|x86.ActiveCfg = Debug|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Release Mono|x86.ActiveCfg = Release|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|Any CPU.Build.0 = Release|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -295,16 +293,16 @@ Global
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|Win32.ActiveCfg = Release|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|x64.ActiveCfg = Release|Any CPU
{2E781478-814D-4A48-9D80-BFF206441A65}.Release|x86.ActiveCfg = Release|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x64.Build.0 = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|Win32.Build.0 = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x64.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x64.Build.0 = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.ActiveCfg = Release|Any CPU
+ {2E781478-814D-4A48-9D80-BFF206441A65}.Signed|x86.Build.0 = Release|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -313,7 +311,6 @@ Global
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|x64.ActiveCfg = Debug|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Debug|x86.ActiveCfg = Debug|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Any CPU.Build.0 = Release|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
{E22BFD35-0FCD-4A85-978A-C22DCD73A081}.Release Mono|Win32.ActiveCfg = Release|Any CPU
@@ -345,11 +342,11 @@ Global
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Debug|x86.ActiveCfg = Debug|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release Mono|x86.ActiveCfg = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -357,16 +354,16 @@ Global
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Win32.ActiveCfg = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x64.ActiveCfg = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x86.ActiveCfg = Release|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x64.Build.0 = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|Win32.Build.0 = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x64.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x64.Build.0 = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.ActiveCfg = Release|Any CPU
+ {442B5058-DCAF-4263-BB6A-F21E31120A1B}.Signed|x86.Build.0 = Release|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -375,13 +372,11 @@ Global
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|x64.ActiveCfg = Debug|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Debug|x86.ActiveCfg = Debug|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.ActiveCfg = Release|x86
- {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.Build.0 = Release|x86
- {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Win32.ActiveCfg = Release|x86
- {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Win32.Build.0 = Release|x86
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|Win32.ActiveCfg = Release|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x86.ActiveCfg = Release|x86
- {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x86.Build.0 = Release|x86
+ {94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release Mono|x86.ActiveCfg = Release|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Any CPU.Build.0 = Release|Any CPU
{94ADE4D3-B7EC-45CD-A200-CC469433072B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -408,11 +403,11 @@ Global
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.ActiveCfg = Debug|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|x86.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.Build.0 = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -420,16 +415,16 @@ Global
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Win32.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|x64.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|x86.ActiveCfg = Release|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x64.Build.0 = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|Win32.Build.0 = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x64.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x64.Build.0 = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x86.ActiveCfg = Release|Any CPU
+ {0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Signed|x86.Build.0 = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -439,11 +434,11 @@ Global
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Win32.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x86.ActiveCfg = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|x86.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.Build.0 = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
@@ -451,16 +446,16 @@ Global
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Win32.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x64.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x86.ActiveCfg = Release|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Mixed Platforms.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Mixed Platforms.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Win32.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Win32.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x64.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x64.Build.0 = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.ActiveCfg = Release Mono|Any CPU
- {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.Build.0 = Release Mono|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|Win32.Build.0 = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x64.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x64.Build.0 = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.ActiveCfg = Release|Any CPU
+ {4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Signed|x86.Build.0 = Release|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23499896-B135-4527-8574-C26E926EA99E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -523,73 +518,42 @@ Global
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|x64.Build.0 = Release|Any CPU
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|x86.ActiveCfg = Release|Any CPU
{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}.Signed|x86.Build.0 = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.ActiveCfg = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.Build.0 = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.Build.0 = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.ActiveCfg = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.Build.0 = Debug|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|Win32.Build.0 = Debug|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Debug|x64.ActiveCfg = Debug|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.ActiveCfg = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.Build.0 = Debug|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.ActiveCfg = Release Mono|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.Build.0 = Release Mono|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.ActiveCfg = Release Mono|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.Build.0 = Release Mono|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x64.ActiveCfg = Release Mono|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.ActiveCfg = Release Mono|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.Build.0 = Release Mono|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Debug|x86.Build.0 = Debug|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|Win32.Build.0 = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release Mono|x86.Build.0 = Release|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.ActiveCfg = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.Build.0 = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.ActiveCfg = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.Build.0 = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|Win32.Build.0 = Release|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Release|x64.ActiveCfg = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.ActiveCfg = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.Build.0 = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Release|x86.Build.0 = Release|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Signed|Any CPU.ActiveCfg = Release|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Signed|Any CPU.Build.0 = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Mixed Platforms.ActiveCfg = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Mixed Platforms.Build.0 = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Win32.ActiveCfg = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Win32.Build.0 = Release|x86
+ {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Signed|Win32.Build.0 = Release|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Signed|x64.ActiveCfg = Release|Any CPU
{175A9388-F352-4586-A6B4-070DED62B644}.Signed|x64.Build.0 = Release|Any CPU
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|x86.ActiveCfg = Release|x86
- {175A9388-F352-4586-A6B4-070DED62B644}.Signed|x86.Build.0 = Release|x86
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|Win32.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|x64.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Release|x86.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Any CPU.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Win32.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|Win32.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x64.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x64.Build.0 = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x86.ActiveCfg = Release|Any CPU
- {B90AB8F2-1BFF-4568-A3FD-2A338A435A75}.Signed|x86.Build.0 = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Signed|x86.ActiveCfg = Release|Any CPU
+ {175A9388-F352-4586-A6B4-070DED62B644}.Signed|x86.Build.0 = Release|Any CPU
{08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Any CPU.Build.0 = Debug|Any CPU
{08FFF49B-F175-4807-A2B5-73B0EBD9F716}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -701,46 +665,6 @@ Global
{713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|x64.Build.0 = Release|Any CPU
{713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|x86.ActiveCfg = Release|Any CPU
{713F42B5-878E-499D-A878-E4C652B1D5E8}.Signed|x86.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|Win32.Build.0 = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|x64.ActiveCfg = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|x64.Build.0 = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|x86.ActiveCfg = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Debug|x86.Build.0 = Debug|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|Win32.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|x64.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release Mono|x86.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Any CPU.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Win32.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|Win32.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|x64.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|x64.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|x86.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Release|x86.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Any CPU.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Win32.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|Win32.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|x64.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|x64.Build.0 = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|x86.ActiveCfg = Release|Any CPU
- {5A27010A-09C6-4E86-93EA-437484C10917}.Signed|x86.Build.0 = Release|Any CPU
{88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{88AE38DF-19D7-406F-A6A9-09527719A21E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -821,46 +745,6 @@ Global
{E383961B-9356-4D5D-8233-9A1079D03055}.Signed|x64.Build.0 = Release|Any CPU
{E383961B-9356-4D5D-8233-9A1079D03055}.Signed|x86.ActiveCfg = Release|Any CPU
{E383961B-9356-4D5D-8233-9A1079D03055}.Signed|x86.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|Win32.Build.0 = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|x64.Build.0 = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Debug|x86.Build.0 = Debug|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|Win32.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|x64.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release Mono|x86.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Any CPU.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Win32.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|Win32.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|x64.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|x64.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|x86.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Release|x86.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Win32.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|Win32.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|x64.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|x64.Build.0 = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|x86.ActiveCfg = Release|Any CPU
- {4ACAB6A2-AC9A-4B50-BAEC-1FE4A1F3B8BC}.Signed|x86.Build.0 = Release|Any CPU
{21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{21002819-C39A-4D3E-BE83-2A276A77FB1F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -941,46 +825,6 @@ Global
{805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|x64.Build.0 = Release|Any CPU
{805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|x86.ActiveCfg = Release|Any CPU
{805844AB-E92F-45E6-9D99-4F6D48D129A5}.Signed|x86.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|Win32.Build.0 = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|x64.Build.0 = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Debug|x86.Build.0 = Debug|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|Win32.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|x64.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release Mono|x86.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Any CPU.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Win32.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|Win32.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|x64.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|x64.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|x86.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Release|x86.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Any CPU.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Win32.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|Win32.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|x64.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|x64.Build.0 = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|x86.ActiveCfg = Release|Any CPU
- {65AA7D67-8059-40CD-91F1-16D02687226C}.Signed|x86.Build.0 = Release|Any CPU
{6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1021,86 +865,6 @@ Global
{6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Signed|x64.Build.0 = Release|Any CPU
{6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Signed|x86.ActiveCfg = Release|Any CPU
{6CFEE013-6E7C-432B-AC37-CABF0880C69A}.Signed|x86.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|Win32.Build.0 = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|x64.Build.0 = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Debug|x86.Build.0 = Debug|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|Win32.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|x64.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release Mono|x86.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Any CPU.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Win32.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|Win32.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|x64.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|x64.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|x86.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Release|x86.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Any CPU.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Win32.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|Win32.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|x64.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|x64.Build.0 = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|x86.ActiveCfg = Release|Any CPU
- {C97A239E-A96C-4D64-A844-CCF8CC30AECB}.Signed|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Win32.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|Win32.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x64.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Debug|x86.Build.0 = Debug|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Win32.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|Win32.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x64.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x64.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release Mono|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Win32.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|Win32.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x64.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x64.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Release|x86.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Any CPU.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Win32.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|Win32.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x64.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x64.Build.0 = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x86.ActiveCfg = Release|Any CPU
- {4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}.Signed|x86.Build.0 = Release|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -1141,6 +905,166 @@ Global
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x64.Build.0 = Release|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x86.ActiveCfg = Release|Any CPU
{2312DA6D-FF86-4597-9777-BCEEC32D96DD}.Signed|x86.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|Win32.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x64.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Debug|x86.Build.0 = Debug|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|Win32.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x64.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release Mono|x86.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Win32.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|Win32.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x64.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x64.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x86.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Release|x86.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|Win32.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x64.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x64.Build.0 = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x86.ActiveCfg = Release|Any CPU
+ {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0}.Signed|x86.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|Win32.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x64.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Debug|x86.Build.0 = Debug|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|Win32.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x64.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release Mono|x86.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Win32.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|Win32.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x64.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x64.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x86.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Release|x86.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|Win32.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x64.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x64.Build.0 = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x86.ActiveCfg = Release|Any CPU
+ {CB7F2326-6497-4A3D-BA03-48513B17A7BE}.Signed|x86.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|Win32.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x64.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Debug|x86.Build.0 = Debug|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|Win32.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x64.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release Mono|x86.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Win32.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|Win32.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x64.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x64.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x86.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Release|x86.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|Win32.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x64.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x64.Build.0 = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x86.ActiveCfg = Release|Any CPU
+ {1E37A338-9F57-4B70-BD6D-BB9C591E319B}.Signed|x86.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|Win32.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x64.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Debug|x86.Build.0 = Debug|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Any CPU.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Mixed Platforms.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Win32.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|Win32.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x64.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x64.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x86.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release Mono|x86.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Win32.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|Win32.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x64.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x64.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x86.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Release|x86.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Any CPU.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Any CPU.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Mixed Platforms.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Win32.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|Win32.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x64.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x64.Build.0 = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x86.ActiveCfg = Release|Any CPU
+ {1D74413B-E7CF-455B-B021-F52BDF881542}.Signed|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Mono.Nat/Mono.Nat.csproj b/Mono.Nat/Mono.Nat.csproj
new file mode 100644
index 0000000000..abf10f5130
--- /dev/null
+++ b/Mono.Nat/Mono.Nat.csproj
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{CB7F2326-6497-4A3D-BA03-48513B17A7BE}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>Mono.Nat</RootNamespace>
+ <AssemblyName>Mono.Nat</AssemblyName>
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <TargetFrameworkProfile />
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="..\SharedVersion.cs">
+ <Link>Properties\SharedVersion.cs</Link>
+ </Compile>
+ <Compile Include="AbstractNatDevice.cs" />
+ <Compile Include="AsyncResults\AsyncResult.cs" />
+ <Compile Include="Enums\MapState.cs" />
+ <Compile Include="Enums\ProtocolType.cs" />
+ <Compile Include="EventArgs\DeviceEventArgs.cs" />
+ <Compile Include="Exceptions\MappingException.cs" />
+ <Compile Include="INatDevice.cs" />
+ <Compile Include="ISearcher.cs" />
+ <Compile Include="Mapping.cs" />
+ <Compile Include="NatProtocol.cs" />
+ <Compile Include="NatUtility.cs" />
+ <Compile Include="Pmp\AsyncResults\PortMapAsyncResult.cs" />
+ <Compile Include="Pmp\PmpConstants.cs" />
+ <Compile Include="Pmp\PmpNatDevice.cs" />
+ <Compile Include="Pmp\Searchers\PmpSearcher.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Upnp\Messages\DiscoverDeviceMessage.cs" />
+ <Compile Include="Upnp\Messages\ErrorMessage.cs" />
+ <Compile Include="Upnp\Messages\GetServicesMessage.cs" />
+ <Compile Include="Upnp\Messages\Requests\CreatePortMappingMessage.cs" />
+ <Compile Include="Upnp\Messages\Responses\CreatePortMappingResponseMessage.cs" />
+ <Compile Include="Upnp\Messages\UpnpMessage.cs" />
+ <Compile Include="Upnp\Searchers\UpnpSearcher.cs" />
+ <Compile Include="Upnp\Upnp.cs" />
+ <Compile Include="Upnp\UpnpNatDevice.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Upnp\AsyncResults\" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
+ <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
+ <Name>MediaBrowser.Common</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
+ <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
+ <Name>MediaBrowser.Controller</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
+ <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
+ <Name>MediaBrowser.Model</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project> \ No newline at end of file
diff --git a/Mono.Nat/Mono.Nat.xproj b/Mono.Nat/Mono.Nat.xproj
deleted file mode 100644
index 3479a2a677..0000000000
--- a/Mono.Nat/Mono.Nat.xproj
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
- <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
- </PropertyGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
- <PropertyGroup Label="Globals">
- <ProjectGuid>4acab6a2-ac9a-4b50-baec-1fe4a1f3b8bc</ProjectGuid>
- <RootNamespace>Mono.Nat</RootNamespace>
- <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
- <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
- <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
- </PropertyGroup>
- <PropertyGroup>
- <SchemaVersion>2.0</SchemaVersion>
- </PropertyGroup>
- <ItemGroup>
- <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
- <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
- </ItemGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
-</Project> \ No newline at end of file
diff --git a/Mono.Nat/Properties/AssemblyInfo.cs b/Mono.Nat/Properties/AssemblyInfo.cs
index 2a4e75c210..18b1838175 100644
--- a/Mono.Nat/Properties/AssemblyInfo.cs
+++ b/Mono.Nat/Properties/AssemblyInfo.cs
@@ -2,15 +2,33 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
-// General Information about an assembly is controlled through the following
+// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
+[assembly: AssemblyTitle("Mono.Nat")]
+[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Mono.Nat")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("cb7f2326-6497-4a3d-ba03-48513b17a7be")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")] \ No newline at end of file
diff --git a/Mono.Nat/project.json b/Mono.Nat/project.json
deleted file mode 100644
index 3c38a62e13..0000000000
--- a/Mono.Nat/project.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "version": "1.0.0-*",
-
- "dependencies": {
-
- },
-
- "frameworks": {
- "net46": {
- "frameworkAssemblies": {
- "System.Collections": "4.0.0.0",
- "System.Net": "4.0.0.0",
- "System.Runtime": "4.0.0.0",
- "System.Threading": "4.0.0.0",
- "System.Threading.Tasks": "4.0.0.0",
- "System.Xml": "4.0.0.0"
- },
- "dependencies": {
- "MediaBrowser.Common": {
- "target": "project"
- },
- "MediaBrowser.Model": {
- "target": "project"
- }
- }
- },
- "netstandard1.6": {
- "imports": "dnxcore50",
- "dependencies": {
- "NETStandard.Library": "1.6.1",
- "MediaBrowser.Common": {
- "target": "project"
- },
- "MediaBrowser.Model": {
- "target": "project"
- },
- "System.Net.NetworkInformation": "4.3.0"
- }
- }
- }
-}
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index 64e4d14181..23fbb9bc32 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MediaBrowser.Common</id>
- <version>3.0.700</version>
+ <version>3.0.701</version>
<title>Emby.Common</title>
<authors>Emby Team</authors>
<owners>ebr,Luke,scottisafool</owners>
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 917288cb1e..8f59afce34 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>MediaBrowser.Server.Core</id>
- <version>3.0.700</version>
+ <version>3.0.701</version>
<title>Emby.Server.Core</title>
<authors>Emby Team</authors>
<owners>ebr,Luke,scottisafool</owners>
@@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Emby Server.</description>
<copyright>Copyright © Emby 2013</copyright>
<dependencies>
- <dependency id="MediaBrowser.Common" version="3.0.700" />
+ <dependency id="MediaBrowser.Common" version="3.0.701" />
</dependencies>
</metadata>
<files>
diff --git a/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj b/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
index 54e14e3e3a..e546830273 100644
--- a/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
+++ b/OpenSubtitlesHandler/OpenSubtitlesHandler.csproj
@@ -33,11 +33,6 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
- <Optimize>false</Optimize>
- <OutputPath>bin\Release Mono</OutputPath>
- <WarningLevel>4</WarningLevel>
- </PropertyGroup>
<ItemGroup>
<Compile Include="Console\OSHConsole.cs" />
<Compile Include="Interfaces\IMethodResponse.cs" />
diff --git a/RSSDP/SsdpCommunicationsServer.cs b/RSSDP/SsdpCommunicationsServer.cs
index e9dc4c54f7..91004b76fe 100644
--- a/RSSDP/SsdpCommunicationsServer.cs
+++ b/RSSDP/SsdpCommunicationsServer.cs
@@ -177,7 +177,7 @@ namespace Rssdp.Infrastructure
{
try
{
- await socket.SendWithLockAsync(messageData, messageData.Length, destination, cancellationToken).ConfigureAwait(false);
+ await socket.SendToAsync(messageData, 0, messageData.Length, destination, cancellationToken).ConfigureAwait(false);
}
catch (ObjectDisposedException)
{
@@ -392,11 +392,13 @@ namespace Rssdp.Infrastructure
var t = Task.Run(async () =>
{
var cancelled = false;
+ var receiveBuffer = new byte[8192];
+
while (!cancelled)
{
try
{
- var result = await socket.ReceiveAsync(CancellationToken.None).ConfigureAwait(false);
+ var result = await socket.ReceiveAsync(receiveBuffer, 0, receiveBuffer.Length, CancellationToken.None).ConfigureAwait(false);
if (result.ReceivedBytes > 0)
{
diff --git a/SocketHttpListener.Portable/Net/ChunkedInputStream.cs b/SocketHttpListener.Portable/Net/ChunkedInputStream.cs
deleted file mode 100644
index 6dfd8d8a1d..0000000000
--- a/SocketHttpListener.Portable/Net/ChunkedInputStream.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using SocketHttpListener.Primitives;
-
-namespace SocketHttpListener.Net
-{
- class ChunkedInputStream : RequestStream
- {
- bool disposed;
- ChunkStream decoder;
- HttpListenerContext context;
- bool no_more_data;
-
- //class ReadBufferState
- //{
- // public byte[] Buffer;
- // public int Offset;
- // public int Count;
- // public int InitialCount;
- // public HttpStreamAsyncResult Ares;
- // public ReadBufferState(byte[] buffer, int offset, int count,
- // HttpStreamAsyncResult ares)
- // {
- // Buffer = buffer;
- // Offset = offset;
- // Count = count;
- // InitialCount = count;
- // Ares = ares;
- // }
- //}
-
- public ChunkedInputStream(HttpListenerContext context, Stream stream,
- byte[] buffer, int offset, int length)
- : base(stream, buffer, offset, length)
- {
- this.context = context;
- WebHeaderCollection coll = (WebHeaderCollection)context.Request.Headers;
- decoder = new ChunkStream(coll);
- }
-
- //public ChunkStream Decoder
- //{
- // get { return decoder; }
- // set { decoder = value; }
- //}
-
- //public override int Read([In, Out] byte[] buffer, int offset, int count)
- //{
- // IAsyncResult ares = BeginRead(buffer, offset, count, null, null);
- // return EndRead(ares);
- //}
-
- //public override IAsyncResult BeginRead(byte[] buffer, int offset, int count,
- // AsyncCallback cback, object state)
- //{
- // if (disposed)
- // throw new ObjectDisposedException(GetType().ToString());
-
- // if (buffer == null)
- // throw new ArgumentNullException("buffer");
-
- // int len = buffer.Length;
- // if (offset < 0 || offset > len)
- // throw new ArgumentOutOfRangeException("offset exceeds the size of buffer");
-
- // if (count < 0 || offset > len - count)
- // throw new ArgumentOutOfRangeException("offset+size exceeds the size of buffer");
-
- // HttpStreamAsyncResult ares = new HttpStreamAsyncResult();
- // ares.Callback = cback;
- // ares.State = state;
- // if (no_more_data)
- // {
- // ares.Complete();
- // return ares;
- // }
- // int nread = decoder.Read(buffer, offset, count);
- // offset += nread;
- // count -= nread;
- // if (count == 0)
- // {
- // // got all we wanted, no need to bother the decoder yet
- // ares.Count = nread;
- // ares.Complete();
- // return ares;
- // }
- // if (!decoder.WantMore)
- // {
- // no_more_data = nread == 0;
- // ares.Count = nread;
- // ares.Complete();
- // return ares;
- // }
- // ares.Buffer = new byte[8192];
- // ares.Offset = 0;
- // ares.Count = 8192;
- // ReadBufferState rb = new ReadBufferState(buffer, offset, count, ares);
- // rb.InitialCount += nread;
- // base.BeginRead(ares.Buffer, ares.Offset, ares.Count, OnRead, rb);
- // return ares;
- //}
-
- //void OnRead(IAsyncResult base_ares)
- //{
- // ReadBufferState rb = (ReadBufferState)base_ares.AsyncState;
- // HttpStreamAsyncResult ares = rb.Ares;
- // try
- // {
- // int nread = base.EndRead(base_ares);
- // decoder.Write(ares.Buffer, ares.Offset, nread);
- // nread = decoder.Read(rb.Buffer, rb.Offset, rb.Count);
- // rb.Offset += nread;
- // rb.Count -= nread;
- // if (rb.Count == 0 || !decoder.WantMore || nread == 0)
- // {
- // no_more_data = !decoder.WantMore && nread == 0;
- // ares.Count = rb.InitialCount - rb.Count;
- // ares.Complete();
- // return;
- // }
- // ares.Offset = 0;
- // ares.Count = Math.Min(8192, decoder.ChunkLeft + 6);
- // base.BeginRead(ares.Buffer, ares.Offset, ares.Count, OnRead, rb);
- // }
- // catch (Exception e)
- // {
- // context.Connection.SendError(e.Message, 400);
- // ares.Complete(e);
- // }
- //}
-
- //public override int EndRead(IAsyncResult ares)
- //{
- // if (disposed)
- // throw new ObjectDisposedException(GetType().ToString());
-
- // HttpStreamAsyncResult my_ares = ares as HttpStreamAsyncResult;
- // if (ares == null)
- // throw new ArgumentException("Invalid IAsyncResult", "ares");
-
- // if (!ares.IsCompleted)
- // ares.AsyncWaitHandle.WaitOne();
-
- // if (my_ares.Error != null)
- // throw new HttpListenerException(400, "I/O operation aborted: " + my_ares.Error.Message);
-
- // return my_ares.Count;
- //}
-
- //protected override void Dispose(bool disposing)
- //{
- // if (!disposed)
- // {
- // disposed = true;
- // base.Dispose(disposing);
- // }
- //}
- }
-}
diff --git a/SocketHttpListener.Portable/Net/HttpConnection.cs b/SocketHttpListener.Portable/Net/HttpConnection.cs
deleted file mode 100644
index 65e7470f7e..0000000000
--- a/SocketHttpListener.Portable/Net/HttpConnection.cs
+++ /dev/null
@@ -1,558 +0,0 @@
-using System;
-using System.IO;
-using System.Text;
-using System.Threading.Tasks;
-using MediaBrowser.Model.Cryptography;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Net;
-using MediaBrowser.Model.System;
-using MediaBrowser.Model.Text;
-using SocketHttpListener.Primitives;
-
-namespace SocketHttpListener.Net
-{
- sealed class HttpConnection
- {
- const int BufferSize = 8192;
- IAcceptSocket sock;
- Stream stream;
- EndPointListener epl;
- MemoryStream ms;
- byte[] buffer;
- HttpListenerContext context;
- StringBuilder current_line;
- ListenerPrefix prefix;
- RequestStream i_stream;
- Stream o_stream;
- bool chunked;
- int reuses;
- bool context_bound;
- bool secure;
- int s_timeout = 300000; // 90k ms for first request, 15k ms from then on
- IpEndPointInfo local_ep;
- HttpListener last_listener;
- int[] client_cert_errors;
- ICertificate cert;
- Stream ssl_stream;
-
- private readonly ILogger _logger;
- private readonly ICryptoProvider _cryptoProvider;
- private readonly IMemoryStreamFactory _memoryStreamFactory;
- private readonly ITextEncoding _textEncoding;
- private readonly IStreamFactory _streamFactory;
- private readonly IFileSystem _fileSystem;
- private readonly IEnvironmentInfo _environment;
-
- private HttpConnection(ILogger logger, IAcceptSocket sock, EndPointListener epl, bool secure, ICertificate cert, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
- {
- _logger = logger;
- this.sock = sock;
- this.epl = epl;
- this.secure = secure;
- this.cert = cert;
- _cryptoProvider = cryptoProvider;
- _memoryStreamFactory = memoryStreamFactory;
- _textEncoding = textEncoding;
- _fileSystem = fileSystem;
- _environment = environment;
- _streamFactory = streamFactory;
- }
-
- private async Task InitStream()
- {
- if (secure == false)
- {
- stream = _streamFactory.CreateNetworkStream(sock, false);
- }
- else
- {
- //ssl_stream = epl.Listener.CreateSslStream(new NetworkStream(sock, false), false, (t, c, ch, e) =>
- //{
- // if (c == null)
- // return true;
- // var c2 = c as X509Certificate2;
- // if (c2 == null)
- // c2 = new X509Certificate2(c.GetRawCertData());
- // client_cert = c2;
- // client_cert_errors = new int[] { (int)e };
- // return true;
- //});
- //stream = ssl_stream.AuthenticatedStream;
-
- ssl_stream = _streamFactory.CreateSslStream(_streamFactory.CreateNetworkStream(sock, false), false);
- await _streamFactory.AuthenticateSslStreamAsServer(ssl_stream, cert).ConfigureAwait(false);
- stream = ssl_stream;
- }
- Init();
- }
-
- public static async Task<HttpConnection> Create(ILogger logger, IAcceptSocket sock, EndPointListener epl, bool secure, ICertificate cert, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
- {
- var connection = new HttpConnection(logger, sock, epl, secure, cert, cryptoProvider, streamFactory, memoryStreamFactory, textEncoding, fileSystem, environment);
-
- await connection.InitStream().ConfigureAwait(false);
-
- return connection;
- }
-
- public Stream Stream
- {
- get
- {
- return stream;
- }
- }
-
- internal int[] ClientCertificateErrors
- {
- get { return client_cert_errors; }
- }
-
- void Init()
- {
- if (ssl_stream != null)
- {
- //ssl_stream.AuthenticateAsServer(client_cert, true, (SslProtocols)ServicePointManager.SecurityProtocol, false);
- //_streamFactory.AuthenticateSslStreamAsServer(ssl_stream, cert);
- }
-
- context_bound = false;
- i_stream = null;
- o_stream = null;
- prefix = null;
- chunked = false;
- ms = _memoryStreamFactory.CreateNew();
- position = 0;
- input_state = InputState.RequestLine;
- line_state = LineState.None;
- context = new HttpListenerContext(this, _logger, _cryptoProvider, _memoryStreamFactory, _textEncoding, _fileSystem);
- }
-
- public bool IsClosed
- {
- get { return (sock == null); }
- }
-
- public int Reuses
- {
- get { return reuses; }
- }
-
- public IpEndPointInfo LocalEndPoint
- {
- get
- {
- if (local_ep != null)
- return local_ep;
-
- local_ep = (IpEndPointInfo)sock.LocalEndPoint;
- return local_ep;
- }
- }
-
- public IpEndPointInfo RemoteEndPoint
- {
- get { return (IpEndPointInfo)sock.RemoteEndPoint; }
- }
-
- public bool IsSecure
- {
- get { return secure; }
- }
-
- public ListenerPrefix Prefix
- {
- get { return prefix; }
- set { prefix = value; }
- }
-
- public async Task BeginReadRequest()
- {
- if (buffer == null)
- buffer = new byte[BufferSize];
-
- try
- {
- //if (reuses == 1)
- // s_timeout = 15000;
- var nRead = await stream.ReadAsync(buffer, 0, BufferSize).ConfigureAwait(false);
-
- OnReadInternal(nRead);
- }
- catch (Exception ex)
- {
- OnReadInternalException(ms, ex);
- }
- }
-
- public RequestStream GetRequestStream(bool chunked, long contentlength)
- {
- if (i_stream == null)
- {
- byte[] buffer;
- _memoryStreamFactory.TryGetBuffer(ms, out buffer);
-
- int length = (int)ms.Length;
- ms = null;
- if (chunked)
- {
- this.chunked = true;
- //context.Response.SendChunked = true;
- i_stream = new ChunkedInputStream(context, stream, buffer, position, length - position);
- }
- else
- {
- i_stream = new RequestStream(stream, buffer, position, length - position, contentlength);
- }
- }
- return i_stream;
- }
-
- public Stream GetResponseStream(bool isExpect100Continue = false)
- {
- // TODO: can we get this stream before reading the input?
- if (o_stream == null)
- {
- //context.Response.DetermineIfChunked();
-
- if (context.Response.SendChunked || isExpect100Continue || context.Request.IsWebSocketRequest || true)
- {
- var supportsDirectSocketAccess = !context.Response.SendChunked && !isExpect100Continue && !secure;
-
- o_stream = new ResponseStream(stream, context.Response, _memoryStreamFactory, _textEncoding, _fileSystem, sock, supportsDirectSocketAccess, _logger, _environment);
- }
- else
- {
- o_stream = stream;
- using (var headerStream = ResponseStream.GetHeaders(context.Response, _memoryStreamFactory, false))
- {
- headerStream.CopyTo(o_stream);
- }
- }
- }
- return o_stream;
- }
-
- void OnReadInternal(int nread)
- {
- ms.Write(buffer, 0, nread);
- if (ms.Length > 32768)
- {
- SendError("Bad request", 400);
- Close(true);
- return;
- }
-
- if (nread == 0)
- {
- //if (ms.Length > 0)
- // SendError (); // Why bother?
- CloseSocket();
- Unbind();
- return;
- }
-
- if (ProcessInput(ms))
- {
- if (!context.HaveError)
- context.Request.FinishInitialization();
-
- if (context.HaveError)
- {
- SendError();
- Close(true);
- return;
- }
-
- if (!epl.BindContext(context))
- {
- SendError("Invalid host", 400);
- Close(true);
- return;
- }
- HttpListener listener = epl.Listener;
- if (last_listener != listener)
- {
- RemoveConnection();
- listener.AddConnection(this);
- last_listener = listener;
- }
-
- context_bound = true;
- listener.RegisterContext(context);
- return;
- }
-
- BeginReadRequest();
- }
-
- private void OnReadInternalException(MemoryStream ms, Exception ex)
- {
- //_logger.ErrorException("Error in HttpConnection.OnReadInternal", ex);
-
- if (ms != null && ms.Length > 0)
- SendError();
- if (sock != null)
- {
- CloseSocket();
- Unbind();
- }
- }
-
- void RemoveConnection()
- {
- if (last_listener == null)
- epl.RemoveConnection(this);
- else
- last_listener.RemoveConnection(this);
- }
-
- enum InputState
- {
- RequestLine,
- Headers
- }
-
- enum LineState
- {
- None,
- CR,
- LF
- }
-
- InputState input_state = InputState.RequestLine;
- LineState line_state = LineState.None;
- int position;
-
- // true -> done processing
- // false -> need more input
- bool ProcessInput(MemoryStream ms)
- {
- byte[] buffer;
- _memoryStreamFactory.TryGetBuffer(ms, out buffer);
-
- int len = (int)ms.Length;
- int used = 0;
- string line;
-
- while (true)
- {
- if (context.HaveError)
- return true;
-
- if (position >= len)
- break;
-
- try
- {
- line = ReadLine(buffer, position, len - position, ref used);
- position += used;
- }
- catch
- {
- context.ErrorMessage = "Bad request";
- context.ErrorStatus = 400;
- return true;
- }
-
- if (line == null)
- break;
-
- if (line == "")
- {
- if (input_state == InputState.RequestLine)
- continue;
- current_line = null;
- ms = null;
- return true;
- }
-
- if (input_state == InputState.RequestLine)
- {
- context.Request.SetRequestLine(line);
- input_state = InputState.Headers;
- }
- else
- {
- try
- {
- context.Request.AddHeader(line);
- }
- catch (Exception e)
- {
- context.ErrorMessage = e.Message;
- context.ErrorStatus = 400;
- return true;
- }
- }
- }
-
- if (used == len)
- {
- ms.SetLength(0);
- position = 0;
- }
- return false;
- }
-
- string ReadLine(byte[] buffer, int offset, int len, ref int used)
- {
- if (current_line == null)
- current_line = new StringBuilder(128);
- int last = offset + len;
- used = 0;
-
- for (int i = offset; i < last && line_state != LineState.LF; i++)
- {
- used++;
- byte b = buffer[i];
- if (b == 13)
- {
- line_state = LineState.CR;
- }
- else if (b == 10)
- {
- line_state = LineState.LF;
- }
- else
- {
- current_line.Append((char)b);
- }
- }
-
- string result = null;
- if (line_state == LineState.LF)
- {
- line_state = LineState.None;
- result = current_line.ToString();
- current_line.Length = 0;
- }
-
- return result;
- }
-
- public void SendError(string msg, int status)
- {
- try
- {
- HttpListenerResponse response = context.Response;
- response.StatusCode = status;
- response.ContentType = "text/html";
- string description = HttpListenerResponse.GetStatusDescription(status);
- string str;
- if (msg != null)
- str = String.Format("<h1>{0} ({1})</h1>", description, msg);
- else
- str = String.Format("<h1>{0}</h1>", description);
-
- byte[] error = context.Response.ContentEncoding.GetBytes(str);
- response.ContentLength64 = error.Length;
- response.OutputStream.Write(error, 0, (int)error.Length);
- response.Close();
- }
- catch
- {
- // response was already closed
- }
- }
-
- public void SendError()
- {
- SendError(context.ErrorMessage, context.ErrorStatus);
- }
-
- void Unbind()
- {
- if (context_bound)
- {
- epl.UnbindContext(context);
- context_bound = false;
- }
- }
-
- public void Close()
- {
- Close(false);
- }
-
- private void CloseSocket()
- {
- if (sock == null)
- return;
-
- try
- {
- sock.Close();
- }
- catch
- {
- }
- finally
- {
- sock = null;
- }
- RemoveConnection();
- }
-
- internal void Close(bool force_close)
- {
- if (sock != null)
- {
- if (!context.Request.IsWebSocketRequest || force_close)
- {
- Stream st = GetResponseStream();
- if (st != null)
- {
- st.Dispose();
- }
-
- o_stream = null;
- }
- }
-
- if (sock != null)
- {
- force_close |= !context.Request.KeepAlive;
- if (!force_close)
- force_close = (string.Equals(context.Response.Headers["connection"], "close", StringComparison.OrdinalIgnoreCase));
- /*
- if (!force_close) {
-// bool conn_close = (status_code == 400 || status_code == 408 || status_code == 411 ||
-// status_code == 413 || status_code == 414 || status_code == 500 ||
-// status_code == 503);
- force_close |= (context.Request.ProtocolVersion <= HttpVersion.Version10);
- }
- */
-
- if (!force_close && context.Request.FlushInput())
- {
- reuses++;
- Unbind();
- Init();
- BeginReadRequest();
- return;
- }
-
- IAcceptSocket s = sock;
- sock = null;
- try
- {
- if (s != null)
- s.Shutdown(true);
- }
- catch
- {
- }
- finally
- {
- if (s != null)
- s.Close();
- }
- Unbind();
- RemoveConnection();
- return;
- }
- }
- }
-} \ No newline at end of file
diff --git a/SocketHttpListener.Portable/Net/HttpStreamAsyncResult.cs b/SocketHttpListener.Portable/Net/HttpStreamAsyncResult.cs
deleted file mode 100644
index 518c45acba..0000000000
--- a/SocketHttpListener.Portable/Net/HttpStreamAsyncResult.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using System;
-using System.Threading;
-
-namespace SocketHttpListener.Net
-{
- class HttpStreamAsyncResult : IAsyncResult
- {
- object locker = new object();
- ManualResetEvent handle;
- bool completed;
-
- internal byte[] Buffer;
- internal int Offset;
- internal int Count;
- internal AsyncCallback Callback;
- internal object State;
- internal int SynchRead;
- internal Exception Error;
-
- public void Complete(Exception e)
- {
- Error = e;
- Complete();
- }
-
- public void Complete()
- {
- lock (locker)
- {
- if (completed)
- return;
-
- completed = true;
- if (handle != null)
- handle.Set();
-
- if (Callback != null)
- Callback.BeginInvoke(this, null, null);
- }
- }
-
- public object AsyncState
- {
- get { return State; }
- }
-
- public WaitHandle AsyncWaitHandle
- {
- get
- {
- lock (locker)
- {
- if (handle == null)
- handle = new ManualResetEvent(completed);
- }
-
- return handle;
- }
- }
-
- public bool CompletedSynchronously
- {
- get { return (SynchRead == Count); }
- }
-
- public bool IsCompleted
- {
- get
- {
- lock (locker)
- {
- return completed;
- }
- }
- }
- }
-}
diff --git a/SocketHttpListener.Portable/Net/RequestStream.cs b/SocketHttpListener.Portable/Net/RequestStream.cs
deleted file mode 100644
index 58030500d1..0000000000
--- a/SocketHttpListener.Portable/Net/RequestStream.cs
+++ /dev/null
@@ -1,231 +0,0 @@
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace SocketHttpListener.Net
-{
- class RequestStream : Stream
- {
- byte[] buffer;
- int offset;
- int length;
- long remaining_body;
- bool disposed;
- Stream stream;
-
- internal RequestStream(Stream stream, byte[] buffer, int offset, int length)
- : this(stream, buffer, offset, length, -1)
- {
- }
-
- internal RequestStream(Stream stream, byte[] buffer, int offset, int length, long contentlength)
- {
- this.stream = stream;
- this.buffer = buffer;
- this.offset = offset;
- this.length = length;
- this.remaining_body = contentlength;
- }
-
- public override bool CanRead
- {
- get { return true; }
- }
-
- public override bool CanSeek
- {
- get { return false; }
- }
-
- public override bool CanWrite
- {
- get { return false; }
- }
-
- public override long Length
- {
- get { throw new NotSupportedException(); }
- }
-
- public override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
-
-
- protected override void Dispose(bool disposing)
- {
- disposed = true;
- }
-
- public override void Flush()
- {
- }
-
-
- // Returns 0 if we can keep reading from the base stream,
- // > 0 if we read something from the buffer.
- // -1 if we had a content length set and we finished reading that many bytes.
- int FillFromBuffer(byte[] buffer, int off, int count)
- {
- if (buffer == null)
- throw new ArgumentNullException("buffer");
- if (off < 0)
- throw new ArgumentOutOfRangeException("offset", "< 0");
- if (count < 0)
- throw new ArgumentOutOfRangeException("count", "< 0");
- int len = buffer.Length;
- if (off > len)
- throw new ArgumentException("destination offset is beyond array size");
- if (off > len - count)
- throw new ArgumentException("Reading would overrun buffer");
-
- if (this.remaining_body == 0)
- return -1;
-
- if (this.length == 0)
- return 0;
-
- int size = Math.Min(this.length, count);
- if (this.remaining_body > 0)
- size = (int)Math.Min(size, this.remaining_body);
-
- if (this.offset > this.buffer.Length - size)
- {
- size = Math.Min(size, this.buffer.Length - this.offset);
- }
- if (size == 0)
- return 0;
-
- Buffer.BlockCopy(this.buffer, this.offset, buffer, off, size);
- this.offset += size;
- this.length -= size;
- if (this.remaining_body > 0)
- remaining_body -= size;
- return size;
- }
-
- public override int Read([In, Out] byte[] buffer, int offset, int count)
- {
- if (disposed)
- throw new ObjectDisposedException(typeof(RequestStream).ToString());
-
- // Call FillFromBuffer to check for buffer boundaries even when remaining_body is 0
- int nread = FillFromBuffer(buffer, offset, count);
- if (nread == -1)
- { // No more bytes available (Content-Length)
- return 0;
- }
- else if (nread > 0)
- {
- return nread;
- }
-
- nread = stream.Read(buffer, offset, count);
- if (nread > 0 && remaining_body > 0)
- remaining_body -= nread;
- return nread;
- }
-
- public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- if (disposed)
- throw new ObjectDisposedException(typeof(RequestStream).ToString());
-
- int nread = FillFromBuffer(buffer, offset, count);
- if (nread > 0 || nread == -1)
- {
- return Math.Max(0, nread);
- }
-
- // Avoid reading past the end of the request to allow
- // for HTTP pipelining
- if (remaining_body >= 0 && count > remaining_body)
- count = (int)Math.Min(Int32.MaxValue, remaining_body);
-
- nread = await stream.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false);
- if (remaining_body > 0 && nread > 0)
- remaining_body -= nread;
- return nread;
- }
-
- //public override IAsyncResult BeginRead(byte[] buffer, int offset, int count,
- // AsyncCallback cback, object state)
- //{
- // if (disposed)
- // throw new ObjectDisposedException(typeof(RequestStream).ToString());
-
- // int nread = FillFromBuffer(buffer, offset, count);
- // if (nread > 0 || nread == -1)
- // {
- // HttpStreamAsyncResult ares = new HttpStreamAsyncResult();
- // ares.Buffer = buffer;
- // ares.Offset = offset;
- // ares.Count = count;
- // ares.Callback = cback;
- // ares.State = state;
- // ares.SynchRead = Math.Max(0, nread);
- // ares.Complete();
- // return ares;
- // }
-
- // // Avoid reading past the end of the request to allow
- // // for HTTP pipelining
- // if (remaining_body >= 0 && count > remaining_body)
- // count = (int)Math.Min(Int32.MaxValue, remaining_body);
- // return stream.BeginRead(buffer, offset, count, cback, state);
- //}
-
- //public override int EndRead(IAsyncResult ares)
- //{
- // if (disposed)
- // throw new ObjectDisposedException(typeof(RequestStream).ToString());
-
- // if (ares == null)
- // throw new ArgumentNullException("async_result");
-
- // if (ares is HttpStreamAsyncResult)
- // {
- // HttpStreamAsyncResult r = (HttpStreamAsyncResult)ares;
- // if (!ares.IsCompleted)
- // ares.AsyncWaitHandle.WaitOne();
- // return r.SynchRead;
- // }
-
- // // Close on exception?
- // int nread = stream.EndRead(ares);
- // if (remaining_body > 0 && nread > 0)
- // remaining_body -= nread;
- // return nread;
- //}
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- throw new NotSupportedException();
- }
-
- public override void SetLength(long value)
- {
- throw new NotSupportedException();
- }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- throw new NotSupportedException();
- }
-
- //public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count,
- // AsyncCallback cback, object state)
- //{
- // throw new NotSupportedException();
- //}
-
- //public override void EndWrite(IAsyncResult async_result)
- //{
- // throw new NotSupportedException();
- //}
- }
-}
diff --git a/SocketHttpListener.Portable/Net/ResponseStream.cs b/SocketHttpListener.Portable/Net/ResponseStream.cs
deleted file mode 100644
index 9552fe8ca0..0000000000
--- a/SocketHttpListener.Portable/Net/ResponseStream.cs
+++ /dev/null
@@ -1,453 +0,0 @@
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Net;
-using MediaBrowser.Model.System;
-using MediaBrowser.Model.Text;
-using SocketHttpListener.Primitives;
-
-namespace SocketHttpListener.Net
-{
- // FIXME: Does this buffer the response until Close?
- // Update: we send a single packet for the first non-chunked Write
- // What happens when we set content-length to X and write X-1 bytes then close?
- // what if we don't set content-length at all?
- public class ResponseStream : Stream
- {
- HttpListenerResponse response;
- bool disposed;
- bool trailer_sent;
- Stream stream;
- private readonly IMemoryStreamFactory _memoryStreamFactory;
- private readonly ITextEncoding _textEncoding;
- private readonly IFileSystem _fileSystem;
- private readonly IAcceptSocket _socket;
- private readonly bool _supportsDirectSocketAccess;
- private readonly ILogger _logger;
- private readonly IEnvironmentInfo _environment;
-
- internal ResponseStream(Stream stream, HttpListenerResponse response, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IAcceptSocket socket, bool supportsDirectSocketAccess, ILogger logger, IEnvironmentInfo environment)
- {
- this.response = response;
- _memoryStreamFactory = memoryStreamFactory;
- _textEncoding = textEncoding;
- _fileSystem = fileSystem;
- _socket = socket;
- _supportsDirectSocketAccess = supportsDirectSocketAccess;
- _logger = logger;
- _environment = environment;
- this.stream = stream;
- }
-
- public override bool CanRead
- {
- get { return false; }
- }
-
- public override bool CanSeek
- {
- get { return false; }
- }
-
- public override bool CanWrite
- {
- get { return true; }
- }
-
- public override long Length
- {
- get { throw new NotSupportedException(); }
- }
-
- public override long Position
- {
- get { throw new NotSupportedException(); }
- set { throw new NotSupportedException(); }
- }
-
-
- protected override void Dispose(bool disposing)
- {
- if (disposed == false)
- {
- disposed = true;
- byte[] bytes = null;
- MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false);
- bool chunked = response.SendChunked;
- if (stream.CanWrite)
- {
- try
- {
- if (ms != null)
- {
- long start = ms.Position;
- if (chunked && !trailer_sent)
- {
- bytes = GetChunkSizeBytes(0, true);
- ms.Position = ms.Length;
- ms.Write(bytes, 0, bytes.Length);
- }
- byte[] msBuffer;
- _memoryStreamFactory.TryGetBuffer(ms, out msBuffer);
- InternalWrite(msBuffer, (int)start, (int)(ms.Length - start));
- trailer_sent = true;
- }
- else if (chunked && !trailer_sent)
- {
- bytes = GetChunkSizeBytes(0, true);
- InternalWrite(bytes, 0, bytes.Length);
- trailer_sent = true;
- }
- }
- catch (IOException ex)
- {
- // Ignore error due to connection reset by peer
- }
- }
- response.Close();
- }
-
- base.Dispose(disposing);
- }
-
- internal static MemoryStream GetHeaders(HttpListenerResponse response, IMemoryStreamFactory memoryStreamFactory, bool closing)
- {
- // SendHeaders works on shared headers
- lock (response.headers_lock)
- {
- if (response.HeadersSent)
- return null;
- MemoryStream ms = memoryStreamFactory.CreateNew();
- response.SendHeaders(closing, ms);
- return ms;
- }
- }
-
- public override void Flush()
- {
- }
-
- static byte[] crlf = new byte[] { 13, 10 };
- byte[] GetChunkSizeBytes(int size, bool final)
- {
- string str = String.Format("{0:x}\r\n{1}", size, final ? "\r\n" : "");
- return _textEncoding.GetASCIIEncoding().GetBytes(str);
- }
-
- internal void InternalWrite(byte[] buffer, int offset, int count)
- {
- stream.Write(buffer, offset, count);
- }
-
- public override void Write(byte[] buffer, int offset, int count)
- {
- if (disposed)
- throw new ObjectDisposedException(GetType().ToString());
-
- if (count == 0)
- {
- //return;
- }
-
- byte[] bytes = null;
- MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false);
- bool chunked = response.SendChunked;
- if (ms != null)
- {
- long start = ms.Position; // After the possible preamble for the encoding
- ms.Position = ms.Length;
- if (chunked)
- {
- bytes = GetChunkSizeBytes(count, false);
- ms.Write(bytes, 0, bytes.Length);
- }
-
- int new_count = Math.Min(count, 16384 - (int)ms.Position + (int)start);
- ms.Write(buffer, offset, new_count);
- count -= new_count;
- offset += new_count;
- byte[] msBuffer;
- _memoryStreamFactory.TryGetBuffer(ms, out msBuffer);
- InternalWrite(msBuffer, (int)start, (int)(ms.Length - start));
- ms.SetLength(0);
- ms.Capacity = 0; // 'dispose' the buffer in ms.
- }
- else if (chunked)
- {
- bytes = GetChunkSizeBytes(count, false);
- InternalWrite(bytes, 0, bytes.Length);
- }
-
- if (count > 0)
- InternalWrite(buffer, offset, count);
- if (chunked)
- InternalWrite(crlf, 0, 2);
- }
-
- public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
- {
- if (disposed)
- throw new ObjectDisposedException(GetType().ToString());
-
- if (count == 0)
- {
- //return;
- }
-
- byte[] bytes = null;
- MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false);
- bool chunked = response.SendChunked;
- if (ms != null)
- {
- long start = ms.Position;
- ms.Position = ms.Length;
- if (chunked)
- {
- bytes = GetChunkSizeBytes(count, false);
- ms.Write(bytes, 0, bytes.Length);
- }
- ms.Write(buffer, offset, count);
- byte[] msBuffer;
- _memoryStreamFactory.TryGetBuffer(ms, out msBuffer);
- buffer = msBuffer;
- offset = (int)start;
- count = (int)(ms.Position - start);
- }
- else if (chunked)
- {
- bytes = GetChunkSizeBytes(count, false);
- InternalWrite(bytes, 0, bytes.Length);
- }
-
- if (count > 0)
- {
- await stream.WriteAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false);
- }
-
- if (chunked)
- stream.Write(crlf, 0, 2);
- }
-
- //public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count,
- // AsyncCallback cback, object state)
- //{
- // if (disposed)
- // throw new ObjectDisposedException(GetType().ToString());
-
- // byte[] bytes = null;
- // MemoryStream ms = GetHeaders(false);
- // bool chunked = response.SendChunked;
- // if (ms != null)
- // {
- // long start = ms.Position;
- // ms.Position = ms.Length;
- // if (chunked)
- // {
- // bytes = GetChunkSizeBytes(count, false);
- // ms.Write(bytes, 0, bytes.Length);
- // }
- // ms.Write(buffer, offset, count);
- // buffer = ms.ToArray();
- // offset = (int)start;
- // count = (int)(ms.Position - start);
- // }
- // else if (chunked)
- // {
- // bytes = GetChunkSizeBytes(count, false);
- // InternalWrite(bytes, 0, bytes.Length);
- // }
-
- // return stream.BeginWrite(buffer, offset, count, cback, state);
- //}
-
- //public override void EndWrite(IAsyncResult ares)
- //{
- // if (disposed)
- // throw new ObjectDisposedException(GetType().ToString());
-
- // if (ignore_errors)
- // {
- // try
- // {
- // stream.EndWrite(ares);
- // if (response.SendChunked)
- // stream.Write(crlf, 0, 2);
- // }
- // catch { }
- // }
- // else {
- // stream.EndWrite(ares);
- // if (response.SendChunked)
- // stream.Write(crlf, 0, 2);
- // }
- //}
-
- public override int Read([In, Out] byte[] buffer, int offset, int count)
- {
- throw new NotSupportedException();
- }
-
- //public override IAsyncResult BeginRead(byte[] buffer, int offset, int count,
- // AsyncCallback cback, object state)
- //{
- // throw new NotSupportedException();
- //}
-
- //public override int EndRead(IAsyncResult ares)
- //{
- // throw new NotSupportedException();
- //}
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- throw new NotSupportedException();
- }
-
- public override void SetLength(long value)
- {
- throw new NotSupportedException();
- }
-
- public Task TransmitFile(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
- {
- //if (_supportsDirectSocketAccess && offset == 0 && count == 0 && !response.SendChunked && response.ContentLength64 > 8192)
- //{
- // return TransmitFileOverSocket(path, offset, count, fileShareMode, cancellationToken);
- //}
- return TransmitFileManaged(path, offset, count, fileShareMode, cancellationToken);
- }
-
- private readonly byte[] _emptyBuffer = new byte[] { };
- private Task TransmitFileOverSocket(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
- {
- MemoryStream ms = GetHeaders(response, _memoryStreamFactory, false);
-
- byte[] buffer;
- if (ms != null)
- {
- using (var msCopy = new MemoryStream())
- {
- ms.CopyTo(msCopy);
- buffer = msCopy.ToArray();
- }
- }
- else
- {
- return TransmitFileManaged(path, offset, count, fileShareMode, cancellationToken);
- }
-
- _logger.Info("Socket sending file {0} {1}", path, response.ContentLength64);
- return _socket.SendFile(path, buffer, _emptyBuffer, cancellationToken);
- }
-
- private async Task TransmitFileManaged(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
- {
- var allowAsync = _environment.OperatingSystem != OperatingSystem.Windows;
-
- var fileOpenOptions = offset > 0
- ? FileOpenOptions.RandomAccess
- : FileOpenOptions.SequentialScan;
-
- if (allowAsync)
- {
- fileOpenOptions |= FileOpenOptions.Asynchronous;
- }
-
- // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039
-
- using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, fileShareMode, fileOpenOptions))
- {
- if (offset > 0)
- {
- fs.Position = offset;
- }
-
- var targetStream = this;
-
- if (count > 0)
- {
- if (allowAsync)
- {
- await CopyToInternalAsync(fs, targetStream, count, cancellationToken).ConfigureAwait(false);
- }
- else
- {
- await CopyToInternalAsyncWithSyncRead(fs, targetStream, count, cancellationToken).ConfigureAwait(false);
- }
- }
- else
- {
- if (allowAsync)
- {
- await fs.CopyToAsync(targetStream, 81920, cancellationToken).ConfigureAwait(false);
- }
- else
- {
- fs.CopyTo(targetStream, 81920);
- }
- }
- }
- }
-
- private static async Task CopyToInternalAsyncWithSyncRead(Stream source, Stream destination, long copyLength, CancellationToken cancellationToken)
- {
- var array = new byte[81920];
- int bytesRead;
-
- while ((bytesRead = source.Read(array, 0, array.Length)) != 0)
- {
- if (bytesRead == 0)
- {
- break;
- }
-
- var bytesToWrite = Math.Min(bytesRead, copyLength);
-
- if (bytesToWrite > 0)
- {
- await destination.WriteAsync(array, 0, Convert.ToInt32(bytesToWrite), cancellationToken).ConfigureAwait(false);
- }
-
- copyLength -= bytesToWrite;
-
- if (copyLength <= 0)
- {
- break;
- }
- }
- }
-
- private static async Task CopyToInternalAsync(Stream source, Stream destination, long copyLength, CancellationToken cancellationToken)
- {
- var array = new byte[81920];
- int bytesRead;
-
- while ((bytesRead = await source.ReadAsync(array, 0, array.Length, cancellationToken).ConfigureAwait(false)) != 0)
- {
- if (bytesRead == 0)
- {
- break;
- }
-
- var bytesToWrite = Math.Min(bytesRead, copyLength);
-
- if (bytesToWrite > 0)
- {
- await destination.WriteAsync(array, 0, Convert.ToInt32(bytesToWrite), cancellationToken).ConfigureAwait(false);
- }
-
- copyLength -= bytesToWrite;
-
- if (copyLength <= 0)
- {
- break;
- }
- }
- }
- }
-}
diff --git a/SocketHttpListener.Portable/Primitives/HttpListenerException.cs b/SocketHttpListener.Portable/Primitives/HttpListenerException.cs
deleted file mode 100644
index 7b383fd230..0000000000
--- a/SocketHttpListener.Portable/Primitives/HttpListenerException.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace SocketHttpListener.Primitives
-{
- public class HttpListenerException : Exception
- {
- public HttpListenerException(int statusCode, string message)
- : base(message)
- {
-
- }
- }
-}
diff --git a/SocketHttpListener.Portable/Properties/AssemblyInfo.cs b/SocketHttpListener.Portable/Properties/AssemblyInfo.cs
deleted file mode 100644
index 8704264603..0000000000
--- a/SocketHttpListener.Portable/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System.Resources;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("SocketHttpListener.Portable")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("SocketHttpListener.Portable")]
-[assembly: AssemblyCopyright("Copyright © 2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-[assembly: NeutralResourcesLanguage("en")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/SocketHttpListener.Portable/SocketHttpListener.Portable.nuget.targets b/SocketHttpListener.Portable/SocketHttpListener.Portable.nuget.targets
deleted file mode 100644
index e69ce0e64f..0000000000
--- a/SocketHttpListener.Portable/SocketHttpListener.Portable.nuget.targets
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="no"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Target Name="EmitMSBuildWarning" BeforeTargets="Build">
- <Warning Text="Packages containing MSBuild targets and props files cannot be fully installed in projects targeting multiple frameworks. The MSBuild targets and props files have been ignored." />
- </Target>
-</Project> \ No newline at end of file
diff --git a/SocketHttpListener.Portable/packages.config b/SocketHttpListener.Portable/packages.config
deleted file mode 100644
index 2aae715b5a..0000000000
--- a/SocketHttpListener.Portable/packages.config
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
- <package id="MediaBrowser.Common" version="3.0.689" targetFramework="portable45-net45+win8" />
- <package id="Patterns.Logging" version="1.0.0.6" targetFramework="portable45-net45+win8" />
-</packages> \ No newline at end of file
diff --git a/SocketHttpListener.Portable/project.json b/SocketHttpListener.Portable/project.json
deleted file mode 100644
index fbbe9eaf32..0000000000
--- a/SocketHttpListener.Portable/project.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "frameworks":{
- "netstandard1.6":{
- "dependencies":{
- "NETStandard.Library":"1.6.0",
- }
- },
- ".NETPortable,Version=v4.5,Profile=Profile7":{
- "buildOptions": {
- "define": [ ]
- },
- "frameworkAssemblies":{
-
- }
- }
- }
-} \ No newline at end of file
diff --git a/SocketHttpListener.Portable/ByteOrder.cs b/SocketHttpListener/ByteOrder.cs
index f5db52fd72..f5db52fd72 100644
--- a/SocketHttpListener.Portable/ByteOrder.cs
+++ b/SocketHttpListener/ByteOrder.cs
diff --git a/SocketHttpListener.Portable/CloseEventArgs.cs b/SocketHttpListener/CloseEventArgs.cs
index b1bb4b1960..b1bb4b1960 100644
--- a/SocketHttpListener.Portable/CloseEventArgs.cs
+++ b/SocketHttpListener/CloseEventArgs.cs
diff --git a/SocketHttpListener.Portable/CloseStatusCode.cs b/SocketHttpListener/CloseStatusCode.cs
index 62a268bce1..62a268bce1 100644
--- a/SocketHttpListener.Portable/CloseStatusCode.cs
+++ b/SocketHttpListener/CloseStatusCode.cs
diff --git a/SocketHttpListener.Portable/CompressionMethod.cs b/SocketHttpListener/CompressionMethod.cs
index 36a48d94cb..36a48d94cb 100644
--- a/SocketHttpListener.Portable/CompressionMethod.cs
+++ b/SocketHttpListener/CompressionMethod.cs
diff --git a/SocketHttpListener.Portable/ErrorEventArgs.cs b/SocketHttpListener/ErrorEventArgs.cs
index bf1d6fc95f..bf1d6fc95f 100644
--- a/SocketHttpListener.Portable/ErrorEventArgs.cs
+++ b/SocketHttpListener/ErrorEventArgs.cs
diff --git a/SocketHttpListener.Portable/Ext.cs b/SocketHttpListener/Ext.cs
index 87f0887ed4..87f0887ed4 100644
--- a/SocketHttpListener.Portable/Ext.cs
+++ b/SocketHttpListener/Ext.cs
diff --git a/SocketHttpListener.Portable/Fin.cs b/SocketHttpListener/Fin.cs
index f91401b995..f91401b995 100644
--- a/SocketHttpListener.Portable/Fin.cs
+++ b/SocketHttpListener/Fin.cs
diff --git a/SocketHttpListener.Portable/HttpBase.cs b/SocketHttpListener/HttpBase.cs
index 5172ba4975..5172ba4975 100644
--- a/SocketHttpListener.Portable/HttpBase.cs
+++ b/SocketHttpListener/HttpBase.cs
diff --git a/SocketHttpListener.Portable/HttpResponse.cs b/SocketHttpListener/HttpResponse.cs
index 5aca28c7c3..5aca28c7c3 100644
--- a/SocketHttpListener.Portable/HttpResponse.cs
+++ b/SocketHttpListener/HttpResponse.cs
diff --git a/SocketHttpListener.Portable/Mask.cs b/SocketHttpListener/Mask.cs
index adc2f098e9..adc2f098e9 100644
--- a/SocketHttpListener.Portable/Mask.cs
+++ b/SocketHttpListener/Mask.cs
diff --git a/SocketHttpListener.Portable/MessageEventArgs.cs b/SocketHttpListener/MessageEventArgs.cs
index 9dbadb9ab2..9dbadb9ab2 100644
--- a/SocketHttpListener.Portable/MessageEventArgs.cs
+++ b/SocketHttpListener/MessageEventArgs.cs
diff --git a/SocketHttpListener.Portable/Net/AuthenticationSchemeSelector.cs b/SocketHttpListener/Net/AuthenticationSchemeSelector.cs
index c6e7e538ec..c6e7e538ec 100644
--- a/SocketHttpListener.Portable/Net/AuthenticationSchemeSelector.cs
+++ b/SocketHttpListener/Net/AuthenticationSchemeSelector.cs
diff --git a/SocketHttpListener.Portable/Net/ChunkStream.cs b/SocketHttpListener/Net/ChunkStream.cs
index 3f3b4a667a..2de6c2c182 100644
--- a/SocketHttpListener.Portable/Net/ChunkStream.cs
+++ b/SocketHttpListener/Net/ChunkStream.cs
@@ -8,9 +8,39 @@ using System.Text;
namespace SocketHttpListener.Net
{
- class ChunkStream
+ // Licensed to the .NET Foundation under one or more agreements.
+ // See the LICENSE file in the project root for more information.
+ //
+ // System.Net.ResponseStream
+ //
+ // Author:
+ // Gonzalo Paniagua Javier (gonzalo@novell.com)
+ //
+ // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to
+ // permit persons to whom the Software is furnished to do so, subject to
+ // the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be
+ // included in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ //
+
+ internal sealed class ChunkStream
{
- enum State
+ private enum State
{
None,
PartialSize,
@@ -19,14 +49,14 @@ namespace SocketHttpListener.Net
Trailer
}
- class Chunk
+ private class Chunk
{
public byte[] Bytes;
public int Offset;
public Chunk(byte[] chunk)
{
- this.Bytes = chunk;
+ Bytes = chunk;
}
public int Read(byte[] buffer, int offset, int size)
@@ -38,33 +68,38 @@ namespace SocketHttpListener.Net
}
}
- internal WebHeaderCollection headers;
- int chunkSize;
- int chunkRead;
- int totalWritten;
- State state;
- //byte [] waitBuffer;
- StringBuilder saved;
- bool sawCR;
- bool gotit;
- int trailerState;
- List<Chunk> chunks;
+ internal WebHeaderCollection _headers;
+ private int _chunkSize;
+ private int _chunkRead;
+ private int _totalWritten;
+ private State _state;
+ private StringBuilder _saved;
+ private bool _sawCR;
+ private bool _gotit;
+ private int _trailerState;
+ private List<Chunk> _chunks;
+
+ public ChunkStream(byte[] buffer, int offset, int size, WebHeaderCollection headers)
+ : this(headers)
+ {
+ Write(buffer, offset, size);
+ }
public ChunkStream(WebHeaderCollection headers)
{
- this.headers = headers;
- saved = new StringBuilder();
- chunks = new List<Chunk>();
- chunkSize = -1;
- totalWritten = 0;
+ _headers = headers;
+ _saved = new StringBuilder();
+ _chunks = new List<Chunk>();
+ _chunkSize = -1;
+ _totalWritten = 0;
}
public void ResetBuffer()
{
- chunkSize = -1;
- chunkRead = 0;
- totalWritten = 0;
- chunks.Clear();
+ _chunkSize = -1;
+ _chunkRead = 0;
+ _totalWritten = 0;
+ _chunks.Clear();
}
public void WriteAndReadBack(byte[] buffer, int offset, int size, ref int read)
@@ -79,15 +114,15 @@ namespace SocketHttpListener.Net
return ReadFromChunks(buffer, offset, size);
}
- int ReadFromChunks(byte[] buffer, int offset, int size)
+ private int ReadFromChunks(byte[] buffer, int offset, int size)
{
- int count = chunks.Count;
+ int count = _chunks.Count;
int nread = 0;
var chunksForRemoving = new List<Chunk>(count);
for (int i = 0; i < count; i++)
{
- Chunk chunk = (Chunk)chunks[i];
+ Chunk chunk = _chunks[i];
if (chunk.Offset == chunk.Bytes.Length)
{
@@ -101,7 +136,7 @@ namespace SocketHttpListener.Net
}
foreach (var chunk in chunksForRemoving)
- chunks.Remove(chunk);
+ _chunks.Remove(chunk);
return nread;
}
@@ -112,44 +147,44 @@ namespace SocketHttpListener.Net
InternalWrite(buffer, ref offset, size);
}
- void InternalWrite(byte[] buffer, ref int offset, int size)
+ private void InternalWrite(byte[] buffer, ref int offset, int size)
{
- if (state == State.None || state == State.PartialSize)
+ if (_state == State.None || _state == State.PartialSize)
{
- state = GetChunkSize(buffer, ref offset, size);
- if (state == State.PartialSize)
+ _state = GetChunkSize(buffer, ref offset, size);
+ if (_state == State.PartialSize)
return;
- saved.Length = 0;
- sawCR = false;
- gotit = false;
+ _saved.Length = 0;
+ _sawCR = false;
+ _gotit = false;
}
- if (state == State.Body && offset < size)
+ if (_state == State.Body && offset < size)
{
- state = ReadBody(buffer, ref offset, size);
- if (state == State.Body)
+ _state = ReadBody(buffer, ref offset, size);
+ if (_state == State.Body)
return;
}
- if (state == State.BodyFinished && offset < size)
+ if (_state == State.BodyFinished && offset < size)
{
- state = ReadCRLF(buffer, ref offset, size);
- if (state == State.BodyFinished)
+ _state = ReadCRLF(buffer, ref offset, size);
+ if (_state == State.BodyFinished)
return;
- sawCR = false;
+ _sawCR = false;
}
- if (state == State.Trailer && offset < size)
+ if (_state == State.Trailer && offset < size)
{
- state = ReadTrailer(buffer, ref offset, size);
- if (state == State.Trailer)
+ _state = ReadTrailer(buffer, ref offset, size);
+ if (_state == State.Trailer)
return;
- saved.Length = 0;
- sawCR = false;
- gotit = false;
+ _saved.Length = 0;
+ _sawCR = false;
+ _gotit = false;
}
if (offset < size)
@@ -158,21 +193,21 @@ namespace SocketHttpListener.Net
public bool WantMore
{
- get { return (chunkRead != chunkSize || chunkSize != 0 || state != State.None); }
+ get { return (_chunkRead != _chunkSize || _chunkSize != 0 || _state != State.None); }
}
public bool DataAvailable
{
get
{
- int count = chunks.Count;
+ int count = _chunks.Count;
for (int i = 0; i < count; i++)
{
- Chunk ch = (Chunk)chunks[i];
+ Chunk ch = _chunks[i];
if (ch == null || ch.Bytes == null)
continue;
if (ch.Bytes.Length > 0 && ch.Offset < ch.Bytes.Length)
- return (state != State.Body);
+ return (_state != State.Body);
}
return false;
}
@@ -180,73 +215,73 @@ namespace SocketHttpListener.Net
public int TotalDataSize
{
- get { return totalWritten; }
+ get { return _totalWritten; }
}
public int ChunkLeft
{
- get { return chunkSize - chunkRead; }
+ get { return _chunkSize - _chunkRead; }
}
- State ReadBody(byte[] buffer, ref int offset, int size)
+ private State ReadBody(byte[] buffer, ref int offset, int size)
{
- if (chunkSize == 0)
+ if (_chunkSize == 0)
return State.BodyFinished;
int diff = size - offset;
- if (diff + chunkRead > chunkSize)
- diff = chunkSize - chunkRead;
+ if (diff + _chunkRead > _chunkSize)
+ diff = _chunkSize - _chunkRead;
byte[] chunk = new byte[diff];
Buffer.BlockCopy(buffer, offset, chunk, 0, diff);
- chunks.Add(new Chunk(chunk));
+ _chunks.Add(new Chunk(chunk));
offset += diff;
- chunkRead += diff;
- totalWritten += diff;
- return (chunkRead == chunkSize) ? State.BodyFinished : State.Body;
+ _chunkRead += diff;
+ _totalWritten += diff;
+ return (_chunkRead == _chunkSize) ? State.BodyFinished : State.Body;
}
- State GetChunkSize(byte[] buffer, ref int offset, int size)
+ private State GetChunkSize(byte[] buffer, ref int offset, int size)
{
- chunkRead = 0;
- chunkSize = 0;
+ _chunkRead = 0;
+ _chunkSize = 0;
char c = '\0';
while (offset < size)
{
c = (char)buffer[offset++];
if (c == '\r')
{
- if (sawCR)
+ if (_sawCR)
ThrowProtocolViolation("2 CR found");
- sawCR = true;
+ _sawCR = true;
continue;
}
- if (sawCR && c == '\n')
+ if (_sawCR && c == '\n')
break;
if (c == ' ')
- gotit = true;
+ _gotit = true;
- if (!gotit)
- saved.Append(c);
+ if (!_gotit)
+ _saved.Append(c);
- if (saved.Length > 20)
+ if (_saved.Length > 20)
ThrowProtocolViolation("chunk size too long.");
}
- if (!sawCR || c != '\n')
+ if (!_sawCR || c != '\n')
{
if (offset < size)
ThrowProtocolViolation("Missing \\n");
try
{
- if (saved.Length > 0)
+ if (_saved.Length > 0)
{
- chunkSize = Int32.Parse(RemoveChunkExtension(saved.ToString()), NumberStyles.HexNumber);
+ _chunkSize = Int32.Parse(RemoveChunkExtension(_saved.ToString()), NumberStyles.HexNumber);
}
}
catch (Exception)
@@ -257,26 +292,26 @@ namespace SocketHttpListener.Net
return State.PartialSize;
}
- chunkRead = 0;
+ _chunkRead = 0;
try
{
- chunkSize = Int32.Parse(RemoveChunkExtension(saved.ToString()), NumberStyles.HexNumber);
+ _chunkSize = Int32.Parse(RemoveChunkExtension(_saved.ToString()), NumberStyles.HexNumber);
}
catch (Exception)
{
ThrowProtocolViolation("Cannot parse chunk size.");
}
- if (chunkSize == 0)
+ if (_chunkSize == 0)
{
- trailerState = 2;
+ _trailerState = 2;
return State.Trailer;
}
return State.Body;
}
- static string RemoveChunkExtension(string input)
+ private static string RemoveChunkExtension(string input)
{
int idx = input.IndexOf(';');
if (idx == -1)
@@ -284,30 +319,30 @@ namespace SocketHttpListener.Net
return input.Substring(0, idx);
}
- State ReadCRLF(byte[] buffer, ref int offset, int size)
+ private State ReadCRLF(byte[] buffer, ref int offset, int size)
{
- if (!sawCR)
+ if (!_sawCR)
{
if ((char)buffer[offset++] != '\r')
ThrowProtocolViolation("Expecting \\r");
- sawCR = true;
+ _sawCR = true;
if (offset == size)
return State.BodyFinished;
}
- if (sawCR && (char)buffer[offset++] != '\n')
+ if (_sawCR && (char)buffer[offset++] != '\n')
ThrowProtocolViolation("Expecting \\n");
return State.None;
}
- State ReadTrailer(byte[] buffer, ref int offset, int size)
+ private State ReadTrailer(byte[] buffer, ref int offset, int size)
{
char c = '\0';
// short path
- if (trailerState == 2 && (char)buffer[offset] == '\r' && saved.Length == 0)
+ if (_trailerState == 2 && (char)buffer[offset] == '\r' && _saved.Length == 0)
{
offset++;
if (offset < size && (char)buffer[offset] == '\n')
@@ -318,7 +353,7 @@ namespace SocketHttpListener.Net
offset--;
}
- int st = trailerState;
+ int st = _trailerState;
string stString = "\r\n\r";
while (offset < size && st < 4)
{
@@ -337,34 +372,33 @@ namespace SocketHttpListener.Net
if (st > 0)
{
- saved.Append(stString.Substring(0, saved.Length == 0 ? st - 2 : st));
+ _saved.Append(stString.Substring(0, _saved.Length == 0 ? st - 2 : st));
st = 0;
- if (saved.Length > 4196)
+ if (_saved.Length > 4196)
ThrowProtocolViolation("Error reading trailer (too long).");
}
}
if (st < 4)
{
- trailerState = st;
+ _trailerState = st;
if (offset < size)
ThrowProtocolViolation("Error reading trailer.");
return State.Trailer;
}
- StringReader reader = new StringReader(saved.ToString());
+ StringReader reader = new StringReader(_saved.ToString());
string line;
while ((line = reader.ReadLine()) != null && line != "")
- headers.Add(line);
+ _headers.Add(line);
return State.None;
}
- static void ThrowProtocolViolation(string message)
+ private static void ThrowProtocolViolation(string message)
{
- WebException we = new WebException(message, null, WebExceptionStatus.UnknownError, null);
- //WebException we = new WebException(message, null, WebExceptionStatus.ServerProtocolViolation, null);
+ WebException we = new WebException(message, null, WebExceptionStatus.ServerProtocolViolation, null);
throw we;
}
}
diff --git a/SocketHttpListener/Net/ChunkedInputStream.cs b/SocketHttpListener/Net/ChunkedInputStream.cs
new file mode 100644
index 0000000000..2e0e1964be
--- /dev/null
+++ b/SocketHttpListener/Net/ChunkedInputStream.cs
@@ -0,0 +1,172 @@
+using System;
+using System.IO;
+using System.Net;
+using System.Runtime.InteropServices;
+using SocketHttpListener.Primitives;
+
+namespace SocketHttpListener.Net
+{
+ // Licensed to the .NET Foundation under one or more agreements.
+ // See the LICENSE file in the project root for more information.
+ //
+ // System.Net.ResponseStream
+ //
+ // Author:
+ // Gonzalo Paniagua Javier (gonzalo@novell.com)
+ //
+ // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to
+ // permit persons to whom the Software is furnished to do so, subject to
+ // the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be
+ // included in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ //
+
+ internal sealed class ChunkedInputStream : HttpRequestStream
+ {
+ private ChunkStream _decoder;
+ private readonly HttpListenerContext _context;
+ private bool _no_more_data;
+
+ private class ReadBufferState
+ {
+ public byte[] Buffer;
+ public int Offset;
+ public int Count;
+ public int InitialCount;
+ public HttpStreamAsyncResult Ares;
+ public ReadBufferState(byte[] buffer, int offset, int count, HttpStreamAsyncResult ares)
+ {
+ Buffer = buffer;
+ Offset = offset;
+ Count = count;
+ InitialCount = count;
+ Ares = ares;
+ }
+ }
+
+ public ChunkedInputStream(HttpListenerContext context, Stream stream, byte[] buffer, int offset, int length)
+ : base(stream, buffer, offset, length)
+ {
+ _context = context;
+ WebHeaderCollection coll = (WebHeaderCollection)context.Request.Headers;
+ _decoder = new ChunkStream(coll);
+ }
+
+ public ChunkStream Decoder
+ {
+ get { return _decoder; }
+ set { _decoder = value; }
+ }
+
+ protected override int ReadCore(byte[] buffer, int offset, int count)
+ {
+ IAsyncResult ares = BeginReadCore(buffer, offset, count, null, null);
+ return EndRead(ares);
+ }
+
+ protected override IAsyncResult BeginReadCore(byte[] buffer, int offset, int size, AsyncCallback cback, object state)
+ {
+ HttpStreamAsyncResult ares = new HttpStreamAsyncResult(this);
+ ares._callback = cback;
+ ares._state = state;
+ if (_no_more_data || size == 0 || _closed)
+ {
+ ares.Complete();
+ return ares;
+ }
+ int nread = _decoder.Read(buffer, offset, size);
+ offset += nread;
+ size -= nread;
+ if (size == 0)
+ {
+ // got all we wanted, no need to bother the decoder yet
+ ares._count = nread;
+ ares.Complete();
+ return ares;
+ }
+ if (!_decoder.WantMore)
+ {
+ _no_more_data = nread == 0;
+ ares._count = nread;
+ ares.Complete();
+ return ares;
+ }
+ ares._buffer = new byte[8192];
+ ares._offset = 0;
+ ares._count = 8192;
+ ReadBufferState rb = new ReadBufferState(buffer, offset, size, ares);
+ rb.InitialCount += nread;
+ base.BeginReadCore(ares._buffer, ares._offset, ares._count, OnRead, rb);
+ return ares;
+ }
+
+ private void OnRead(IAsyncResult base_ares)
+ {
+ ReadBufferState rb = (ReadBufferState)base_ares.AsyncState;
+ HttpStreamAsyncResult ares = rb.Ares;
+ try
+ {
+ int nread = base.EndRead(base_ares);
+ _decoder.Write(ares._buffer, ares._offset, nread);
+ nread = _decoder.Read(rb.Buffer, rb.Offset, rb.Count);
+ rb.Offset += nread;
+ rb.Count -= nread;
+ if (rb.Count == 0 || !_decoder.WantMore || nread == 0)
+ {
+ _no_more_data = !_decoder.WantMore && nread == 0;
+ ares._count = rb.InitialCount - rb.Count;
+ ares.Complete();
+ return;
+ }
+ ares._offset = 0;
+ ares._count = Math.Min(8192, _decoder.ChunkLeft + 6);
+ base.BeginReadCore(ares._buffer, ares._offset, ares._count, OnRead, rb);
+ }
+ catch (Exception e)
+ {
+ _context.Connection.SendError(e.Message, 400);
+ ares.Complete(e);
+ }
+ }
+
+ public override int EndRead(IAsyncResult asyncResult)
+ {
+ if (asyncResult == null)
+ throw new ArgumentNullException(nameof(asyncResult));
+
+ HttpStreamAsyncResult ares = asyncResult as HttpStreamAsyncResult;
+ if (ares == null || !ReferenceEquals(this, ares._parent))
+ {
+ throw new ArgumentException("Invalid async result");
+ }
+ if (ares._endCalled)
+ {
+ throw new InvalidOperationException("Invalid end call");
+ }
+ ares._endCalled = true;
+
+ if (!asyncResult.IsCompleted)
+ asyncResult.AsyncWaitHandle.WaitOne();
+
+ if (ares._error != null)
+ throw new HttpListenerException((int)HttpStatusCode.BadRequest, "Bad Request");
+
+ return ares._count;
+ }
+ }
+}
diff --git a/SocketHttpListener.Portable/Net/CookieHelper.cs b/SocketHttpListener/Net/CookieHelper.cs
index 470507d6b7..470507d6b7 100644
--- a/SocketHttpListener.Portable/Net/CookieHelper.cs
+++ b/SocketHttpListener/Net/CookieHelper.cs
diff --git a/SocketHttpListener.Portable/Net/EndPointListener.cs b/SocketHttpListener/Net/EndPointListener.cs
index 2106bbec56..2106bbec56 100644
--- a/SocketHttpListener.Portable/Net/EndPointListener.cs
+++ b/SocketHttpListener/Net/EndPointListener.cs
diff --git a/SocketHttpListener.Portable/Net/EndPointManager.cs b/SocketHttpListener/Net/EndPointManager.cs
index 6a00ed360a..6a00ed360a 100644
--- a/SocketHttpListener.Portable/Net/EndPointManager.cs
+++ b/SocketHttpListener/Net/EndPointManager.cs
diff --git a/SocketHttpListener/Net/HttpConnection.cs b/SocketHttpListener/Net/HttpConnection.cs
new file mode 100644
index 0000000000..9c87ff0763
--- /dev/null
+++ b/SocketHttpListener/Net/HttpConnection.cs
@@ -0,0 +1,536 @@
+using System;
+using System.IO;
+using System.Text;
+using System.Threading.Tasks;
+using MediaBrowser.Model.Cryptography;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Net;
+using MediaBrowser.Model.System;
+using MediaBrowser.Model.Text;
+using SocketHttpListener.Primitives;
+
+namespace SocketHttpListener.Net
+{
+ sealed class HttpConnection
+ {
+ private static AsyncCallback s_onreadCallback = new AsyncCallback(OnRead);
+ const int BufferSize = 8192;
+ IAcceptSocket _socket;
+ Stream _stream;
+ EndPointListener _epl;
+ MemoryStream _memoryStream;
+ byte[] _buffer;
+ HttpListenerContext _context;
+ StringBuilder _currentLine;
+ ListenerPrefix _prefix;
+ HttpRequestStream _requestStream;
+ Stream _responseStream;
+ bool _chunked;
+ int _reuses;
+ bool _contextBound;
+ bool secure;
+ int _timeout = 300000; // 90k ms for first request, 15k ms from then on
+ IpEndPointInfo local_ep;
+ HttpListener _lastListener;
+ int[] client_cert_errors;
+ ICertificate cert;
+ Stream ssl_stream;
+
+ private readonly ILogger _logger;
+ private readonly ICryptoProvider _cryptoProvider;
+ private readonly IMemoryStreamFactory _memoryStreamFactory;
+ private readonly ITextEncoding _textEncoding;
+ private readonly IStreamFactory _streamFactory;
+ private readonly IFileSystem _fileSystem;
+ private readonly IEnvironmentInfo _environment;
+
+ private HttpConnection(ILogger logger, IAcceptSocket socket, EndPointListener epl, bool secure, ICertificate cert, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
+ {
+ _logger = logger;
+ this._socket = socket;
+ this._epl = epl;
+ this.secure = secure;
+ this.cert = cert;
+ _cryptoProvider = cryptoProvider;
+ _memoryStreamFactory = memoryStreamFactory;
+ _textEncoding = textEncoding;
+ _fileSystem = fileSystem;
+ _environment = environment;
+ _streamFactory = streamFactory;
+ }
+
+ private async Task InitStream()
+ {
+ if (secure == false)
+ {
+ _stream = _streamFactory.CreateNetworkStream(_socket, false);
+ }
+ else
+ {
+ //ssl_stream = _epl.Listener.CreateSslStream(new NetworkStream(_socket, false), false, (t, c, ch, e) =>
+ //{
+ // if (c == null)
+ // return true;
+ // var c2 = c as X509Certificate2;
+ // if (c2 == null)
+ // c2 = new X509Certificate2(c.GetRawCertData());
+ // client_cert = c2;
+ // client_cert_errors = new int[] { (int)e };
+ // return true;
+ //});
+ //_stream = ssl_stream.AuthenticatedStream;
+
+ ssl_stream = _streamFactory.CreateSslStream(_streamFactory.CreateNetworkStream(_socket, false), false);
+ await _streamFactory.AuthenticateSslStreamAsServer(ssl_stream, cert).ConfigureAwait(false);
+ _stream = ssl_stream;
+ }
+ Init();
+ }
+
+ public static async Task<HttpConnection> Create(ILogger logger, IAcceptSocket sock, EndPointListener epl, bool secure, ICertificate cert, ICryptoProvider cryptoProvider, IStreamFactory streamFactory, IMemoryStreamFactory memoryStreamFactory, ITextEncoding textEncoding, IFileSystem fileSystem, IEnvironmentInfo environment)
+ {
+ var connection = new HttpConnection(logger, sock, epl, secure, cert, cryptoProvider, streamFactory, memoryStreamFactory, textEncoding, fileSystem, environment);
+
+ await connection.InitStream().ConfigureAwait(false);
+
+ return connection;
+ }
+
+ public Stream Stream
+ {
+ get
+ {
+ return _stream;
+ }
+ }
+
+ internal int[] ClientCertificateErrors
+ {
+ get { return client_cert_errors; }
+ }
+
+ void Init()
+ {
+ _contextBound = false;
+ _requestStream = null;
+ _responseStream = null;
+ _prefix = null;
+ _chunked = false;
+ _memoryStream = new MemoryStream();
+ _position = 0;
+ _inputState = InputState.RequestLine;
+ _lineState = LineState.None;
+ _context = new HttpListenerContext(this, _logger, _cryptoProvider, _memoryStreamFactory, _textEncoding, _fileSystem);
+ }
+
+ public bool IsClosed
+ {
+ get { return (_socket == null); }
+ }
+
+ public int Reuses
+ {
+ get { return _reuses; }
+ }
+
+ public IpEndPointInfo LocalEndPoint
+ {
+ get
+ {
+ if (local_ep != null)
+ return local_ep;
+
+ local_ep = (IpEndPointInfo)_socket.LocalEndPoint;
+ return local_ep;
+ }
+ }
+
+ public IpEndPointInfo RemoteEndPoint
+ {
+ get { return (IpEndPointInfo)_socket.RemoteEndPoint; }
+ }
+
+ public bool IsSecure
+ {
+ get { return secure; }
+ }
+
+ public ListenerPrefix Prefix
+ {
+ get { return _prefix; }
+ set { _prefix = value; }
+ }
+
+ public void BeginReadRequest()
+ {
+ if (_buffer == null)
+ _buffer = new byte[BufferSize];
+ try
+ {
+ if (_reuses == 1)
+ _timeout = 15000;
+ //_timer.Change(_timeout, Timeout.Infinite);
+ _stream.BeginRead(_buffer, 0, BufferSize, s_onreadCallback, this);
+ }
+ catch
+ {
+ //_timer.Change(Timeout.Infinite, Timeout.Infinite);
+ CloseSocket();
+ Unbind();
+ }
+ }
+
+ public HttpRequestStream GetRequestStream(bool chunked, long contentlength)
+ {
+ if (_requestStream == null)
+ {
+ byte[] buffer = _memoryStream.GetBuffer();
+ int length = (int)_memoryStream.Length;
+ _memoryStream = null;
+ if (chunked)
+ {
+ _chunked = true;
+ //_context.Response.SendChunked = true;
+ _requestStream = new ChunkedInputStream(_context, _stream, buffer, _position, length - _position);
+ }
+ else
+ {
+ _requestStream = new HttpRequestStream(_stream, buffer, _position, length - _position, contentlength);
+ }
+ }
+ return _requestStream;
+ }
+
+ public Stream GetResponseStream(bool isExpect100Continue = false)
+ {
+ // TODO: can we get this _stream before reading the input?
+ if (_responseStream == null)
+ {
+ var supportsDirectSocketAccess = !_context.Response.SendChunked && !isExpect100Continue && !secure;
+
+ _responseStream = new HttpResponseStream(_stream, _context.Response, false, _memoryStreamFactory, _socket, supportsDirectSocketAccess, _environment, _fileSystem, _logger);
+ }
+ return _responseStream;
+ }
+
+ private static void OnRead(IAsyncResult ares)
+ {
+ HttpConnection cnc = (HttpConnection)ares.AsyncState;
+ cnc.OnReadInternal(ares);
+ }
+
+ private void OnReadInternal(IAsyncResult ares)
+ {
+ //_timer.Change(Timeout.Infinite, Timeout.Infinite);
+ int nread = -1;
+ try
+ {
+ nread = _stream.EndRead(ares);
+ _memoryStream.Write(_buffer, 0, nread);
+ if (_memoryStream.Length > 32768)
+ {
+ SendError("Bad Request", 400);
+ Close(true);
+ return;
+ }
+ }
+ catch
+ {
+ if (_memoryStream != null && _memoryStream.Length > 0)
+ SendError();
+ if (_socket != null)
+ {
+ CloseSocket();
+ Unbind();
+ }
+ return;
+ }
+
+ if (nread == 0)
+ {
+ CloseSocket();
+ Unbind();
+ return;
+ }
+
+ if (ProcessInput(_memoryStream))
+ {
+ if (!_context.HaveError)
+ _context.Request.FinishInitialization();
+
+ if (_context.HaveError)
+ {
+ SendError();
+ Close(true);
+ return;
+ }
+
+ if (!_epl.BindContext(_context))
+ {
+ SendError("Invalid host", 400);
+ Close(true);
+ return;
+ }
+ HttpListener listener = _epl.Listener;
+ if (_lastListener != listener)
+ {
+ RemoveConnection();
+ listener.AddConnection(this);
+ _lastListener = listener;
+ }
+
+ _contextBound = true;
+ listener.RegisterContext(_context);
+ return;
+ }
+ _stream.BeginRead(_buffer, 0, BufferSize, s_onreadCallback, this);
+ }
+
+ private void RemoveConnection()
+ {
+ if (_lastListener == null)
+ _epl.RemoveConnection(this);
+ else
+ _lastListener.RemoveConnection(this);
+ }
+
+ private enum InputState
+ {
+ RequestLine,
+ Headers
+ }
+
+ private enum LineState
+ {
+ None,
+ CR,
+ LF
+ }
+
+ InputState _inputState = InputState.RequestLine;
+ LineState _lineState = LineState.None;
+ int _position;
+
+ // true -> done processing
+ // false -> need more input
+ private bool ProcessInput(MemoryStream ms)
+ {
+ byte[] buffer = ms.GetBuffer();
+ int len = (int)ms.Length;
+ int used = 0;
+ string line;
+
+ while (true)
+ {
+ if (_context.HaveError)
+ return true;
+
+ if (_position >= len)
+ break;
+
+ try
+ {
+ line = ReadLine(buffer, _position, len - _position, ref used);
+ _position += used;
+ }
+ catch
+ {
+ _context.ErrorMessage = "Bad request";
+ _context.ErrorStatus = 400;
+ return true;
+ }
+
+ if (line == null)
+ break;
+
+ if (line == "")
+ {
+ if (_inputState == InputState.RequestLine)
+ continue;
+ _currentLine = null;
+ ms = null;
+ return true;
+ }
+
+ if (_inputState == InputState.RequestLine)
+ {
+ _context.Request.SetRequestLine(line);
+ _inputState = InputState.Headers;
+ }
+ else
+ {
+ try
+ {
+ _context.Request.AddHeader(line);
+ }
+ catch (Exception e)
+ {
+ _context.ErrorMessage = e.Message;
+ _context.ErrorStatus = 400;
+ return true;
+ }
+ }
+ }
+
+ if (used == len)
+ {
+ ms.SetLength(0);
+ _position = 0;
+ }
+ return false;
+ }
+
+ private string ReadLine(byte[] buffer, int offset, int len, ref int used)
+ {
+ if (_currentLine == null)
+ _currentLine = new StringBuilder(128);
+ int last = offset + len;
+ used = 0;
+ for (int i = offset; i < last && _lineState != LineState.LF; i++)
+ {
+ used++;
+ byte b = buffer[i];
+ if (b == 13)
+ {
+ _lineState = LineState.CR;
+ }
+ else if (b == 10)
+ {
+ _lineState = LineState.LF;
+ }
+ else
+ {
+ _currentLine.Append((char)b);
+ }
+ }
+
+ string result = null;
+ if (_lineState == LineState.LF)
+ {
+ _lineState = LineState.None;
+ result = _currentLine.ToString();
+ _currentLine.Length = 0;
+ }
+
+ return result;
+ }
+
+ public void SendError(string msg, int status)
+ {
+ try
+ {
+ HttpListenerResponse response = _context.Response;
+ response.StatusCode = status;
+ response.ContentType = "text/html";
+ string description = HttpListenerResponse.GetStatusDescription(status);
+ string str;
+ if (msg != null)
+ str = string.Format("<h1>{0} ({1})</h1>", description, msg);
+ else
+ str = string.Format("<h1>{0}</h1>", description);
+
+ byte[] error = Encoding.Default.GetBytes(str);
+ response.Close(error, false);
+ }
+ catch
+ {
+ // response was already closed
+ }
+ }
+
+ public void SendError()
+ {
+ SendError(_context.ErrorMessage, _context.ErrorStatus);
+ }
+
+ private void Unbind()
+ {
+ if (_contextBound)
+ {
+ _epl.UnbindContext(_context);
+ _contextBound = false;
+ }
+ }
+
+ public void Close()
+ {
+ Close(false);
+ }
+
+ private void CloseSocket()
+ {
+ if (_socket == null)
+ return;
+
+ try
+ {
+ _socket.Close();
+ }
+ catch { }
+ finally
+ {
+ _socket = null;
+ }
+
+ RemoveConnection();
+ }
+
+ internal void Close(bool force)
+ {
+ if (_socket != null)
+ {
+ Stream st = GetResponseStream();
+ if (st != null)
+ st.Close();
+
+ _responseStream = null;
+ }
+
+ if (_socket != null)
+ {
+ force |= !_context.Request.KeepAlive;
+ if (!force)
+ force = (string.Equals(_context.Response.Headers["connection"], "close", StringComparison.OrdinalIgnoreCase));
+
+ if (!force && _context.Request.FlushInput())
+ {
+ if (_chunked && _context.Response.ForceCloseChunked == false)
+ {
+ // Don't close. Keep working.
+ _reuses++;
+ Unbind();
+ Init();
+ BeginReadRequest();
+ return;
+ }
+
+ _reuses++;
+ Unbind();
+ Init();
+ BeginReadRequest();
+ return;
+ }
+
+ IAcceptSocket s = _socket;
+ _socket = null;
+ try
+ {
+ if (s != null)
+ s.Shutdown(true);
+ }
+ catch
+ {
+ }
+ finally
+ {
+ if (s != null)
+ s.Close();
+ }
+ Unbind();
+ RemoveConnection();
+ return;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/SocketHttpListener.Portable/Net/HttpListener.cs b/SocketHttpListener/Net/HttpListener.cs
index b3e01425ca..b3e01425ca 100644
--- a/SocketHttpListener.Portable/Net/HttpListener.cs
+++ b/SocketHttpListener/Net/HttpListener.cs
diff --git a/SocketHttpListener.Portable/Net/HttpListenerBasicIdentity.cs b/SocketHttpListener/Net/HttpListenerBasicIdentity.cs
index faa26693d7..faa26693d7 100644
--- a/SocketHttpListener.Portable/Net/HttpListenerBasicIdentity.cs
+++ b/SocketHttpListener/Net/HttpListenerBasicIdentity.cs
diff --git a/SocketHttpListener.Portable/Net/HttpListenerContext.cs b/SocketHttpListener/Net/HttpListenerContext.cs
index 58d769f22a..58d769f22a 100644
--- a/SocketHttpListener.Portable/Net/HttpListenerContext.cs
+++ b/SocketHttpListener/Net/HttpListenerContext.cs
diff --git a/SocketHttpListener.Portable/Net/HttpListenerPrefixCollection.cs b/SocketHttpListener/Net/HttpListenerPrefixCollection.cs
index 0b05539eea..0b05539eea 100644
--- a/SocketHttpListener.Portable/Net/HttpListenerPrefixCollection.cs
+++ b/SocketHttpListener/Net/HttpListenerPrefixCollection.cs
diff --git a/SocketHttpListener.Portable/Net/HttpListenerRequest.cs b/SocketHttpListener/Net/HttpListenerRequest.cs
index cfbd492036..6a99eb0786 100644
--- a/SocketHttpListener.Portable/Net/HttpListenerRequest.cs
+++ b/SocketHttpListener/Net/HttpListenerRequest.cs
@@ -181,7 +181,7 @@ namespace SocketHttpListener.Net
if (String.Compare(Headers["Expect"], "100-continue", StringComparison.OrdinalIgnoreCase) == 0)
{
- var output = (ResponseStream)context.Connection.GetResponseStream(true);
+ var output = (HttpResponseStream)context.Connection.GetResponseStream(true);
var _100continue = _textEncoding.GetASCIIEncoding().GetBytes("HTTP/1.1 100 Continue\r\n\r\n");
diff --git a/SocketHttpListener.Portable/Net/HttpListenerResponse.cs b/SocketHttpListener/Net/HttpListenerResponse.cs
index 3cb6a0d752..da7aff0818 100644
--- a/SocketHttpListener.Portable/Net/HttpListenerResponse.cs
+++ b/SocketHttpListener/Net/HttpListenerResponse.cs
@@ -53,6 +53,11 @@ namespace SocketHttpListener.Net
}
}
+ public bool ForceCloseChunked
+ {
+ get { return false; }
+ }
+
public Encoding ContentEncoding
{
get
@@ -335,6 +340,48 @@ namespace SocketHttpListener.Net
context.Connection.Close(force);
}
+ public void Close(byte[] responseEntity, bool willBlock)
+ {
+ //CheckDisposed();
+
+ if (responseEntity == null)
+ {
+ throw new ArgumentNullException(nameof(responseEntity));
+ }
+
+ //if (_boundaryType != BoundaryType.Chunked)
+ {
+ ContentLength64 = responseEntity.Length;
+ }
+
+ if (willBlock)
+ {
+ try
+ {
+ OutputStream.Write(responseEntity, 0, responseEntity.Length);
+ }
+ finally
+ {
+ Close(false);
+ }
+ }
+ else
+ {
+ OutputStream.BeginWrite(responseEntity, 0, responseEntity.Length, iar =>
+ {
+ var thisRef = (HttpListenerResponse)iar.AsyncState;
+ try
+ {
+ thisRef.OutputStream.EndWrite(iar);
+ }
+ finally
+ {
+ thisRef.Close(false);
+ }
+ }, this);
+ }
+ }
+
public void Close()
{
if (disposed)
@@ -519,7 +566,7 @@ namespace SocketHttpListener.Net
public Task TransmitFile(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
{
- return ((ResponseStream)OutputStream).TransmitFile(path, offset, count, fileShareMode, cancellationToken);
+ return ((HttpResponseStream)OutputStream).TransmitFile(path, offset, count, fileShareMode, cancellationToken);
}
}
} \ No newline at end of file
diff --git a/SocketHttpListener/Net/HttpRequestStream.Managed.cs b/SocketHttpListener/Net/HttpRequestStream.Managed.cs
new file mode 100644
index 0000000000..cb02a4d5a2
--- /dev/null
+++ b/SocketHttpListener/Net/HttpRequestStream.Managed.cs
@@ -0,0 +1,196 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.ExceptionServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SocketHttpListener.Net
+{
+ // Licensed to the .NET Foundation under one or more agreements.
+ // See the LICENSE file in the project root for more information.
+ //
+ // System.Net.ResponseStream
+ //
+ // Author:
+ // Gonzalo Paniagua Javier (gonzalo@novell.com)
+ //
+ // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to
+ // permit persons to whom the Software is furnished to do so, subject to
+ // the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be
+ // included in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ //
+
+ internal partial class HttpRequestStream : Stream
+ {
+ private byte[] _buffer;
+ private int _offset;
+ private int _length;
+ private long _remainingBody;
+ protected bool _closed;
+ private Stream _stream;
+
+ internal HttpRequestStream(Stream stream, byte[] buffer, int offset, int length)
+ : this(stream, buffer, offset, length, -1)
+ {
+ }
+
+ internal HttpRequestStream(Stream stream, byte[] buffer, int offset, int length, long contentlength)
+ {
+ _stream = stream;
+ _buffer = buffer;
+ _offset = offset;
+ _length = length;
+ _remainingBody = contentlength;
+ }
+
+ // Returns 0 if we can keep reading from the base stream,
+ // > 0 if we read something from the buffer.
+ // -1 if we had a content length set and we finished reading that many bytes.
+ private int FillFromBuffer(byte[] buffer, int offset, int count)
+ {
+ if (_remainingBody == 0)
+ return -1;
+
+ if (_length == 0)
+ return 0;
+
+ int size = Math.Min(_length, count);
+ if (_remainingBody > 0)
+ size = (int)Math.Min(size, _remainingBody);
+
+ if (_offset > _buffer.Length - size)
+ {
+ size = Math.Min(size, _buffer.Length - _offset);
+ }
+ if (size == 0)
+ return 0;
+
+ Buffer.BlockCopy(_buffer, _offset, buffer, offset, size);
+ _offset += size;
+ _length -= size;
+ if (_remainingBody > 0)
+ _remainingBody -= size;
+ return size;
+ }
+
+ protected virtual int ReadCore(byte[] buffer, int offset, int size)
+ {
+ // Call FillFromBuffer to check for buffer boundaries even when remaining_body is 0
+ int nread = FillFromBuffer(buffer, offset, size);
+ if (nread == -1)
+ { // No more bytes available (Content-Length)
+ return 0;
+ }
+ else if (nread > 0)
+ {
+ return nread;
+ }
+
+ nread = _stream.Read(buffer, offset, size);
+ if (nread > 0 && _remainingBody > 0)
+ _remainingBody -= nread;
+ return nread;
+ }
+
+ protected virtual IAsyncResult BeginReadCore(byte[] buffer, int offset, int size, AsyncCallback cback, object state)
+ {
+ if (size == 0 || _closed)
+ {
+ HttpStreamAsyncResult ares = new HttpStreamAsyncResult(this);
+ ares._callback = cback;
+ ares._state = state;
+ ares.Complete();
+ return ares;
+ }
+
+ int nread = FillFromBuffer(buffer, offset, size);
+ if (nread > 0 || nread == -1)
+ {
+ HttpStreamAsyncResult ares = new HttpStreamAsyncResult(this);
+ ares._buffer = buffer;
+ ares._offset = offset;
+ ares._count = size;
+ ares._callback = cback;
+ ares._state = state;
+ ares._synchRead = Math.Max(0, nread);
+ ares.Complete();
+ return ares;
+ }
+
+ // Avoid reading past the end of the request to allow
+ // for HTTP pipelining
+ if (_remainingBody >= 0 && size > _remainingBody)
+ {
+ size = (int)Math.Min(int.MaxValue, _remainingBody);
+ }
+
+ return _stream.BeginRead(buffer, offset, size, cback, state);
+ }
+
+ public override int EndRead(IAsyncResult asyncResult)
+ {
+ if (asyncResult == null)
+ throw new ArgumentNullException(nameof(asyncResult));
+
+ var r = asyncResult as HttpStreamAsyncResult;
+
+ if (r != null)
+ {
+ if (!ReferenceEquals(this, r._parent))
+ {
+ throw new ArgumentException("Invalid async result");
+ }
+ if (r._endCalled)
+ {
+ throw new InvalidOperationException("Invalid end call");
+ }
+ r._endCalled = true;
+
+ if (!asyncResult.IsCompleted)
+ {
+ asyncResult.AsyncWaitHandle.WaitOne();
+ }
+
+ return r._synchRead;
+ }
+
+ if (_closed)
+ return 0;
+
+ int nread = 0;
+ try
+ {
+ nread = _stream.EndRead(asyncResult);
+ }
+ catch (IOException e) when (e.InnerException is ArgumentException || e.InnerException is InvalidOperationException)
+ {
+ throw e.InnerException;
+ }
+
+ if (_remainingBody > 0 && nread > 0)
+ {
+ _remainingBody -= nread;
+ }
+
+ return nread;
+ }
+ }
+}
diff --git a/SocketHttpListener/Net/HttpRequestStream.cs b/SocketHttpListener/Net/HttpRequestStream.cs
new file mode 100644
index 0000000000..c54da44a17
--- /dev/null
+++ b/SocketHttpListener/Net/HttpRequestStream.cs
@@ -0,0 +1,144 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace SocketHttpListener.Net
+{
+ // Licensed to the .NET Foundation under one or more agreements.
+ // See the LICENSE file in the project root for more information.
+ //
+ // System.Net.ResponseStream
+ //
+ // Author:
+ // Gonzalo Paniagua Javier (gonzalo@novell.com)
+ //
+ // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to
+ // permit persons to whom the Software is furnished to do so, subject to
+ // the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be
+ // included in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ //
+
+ internal partial class HttpRequestStream : Stream
+ {
+ public override bool CanSeek => false;
+ public override bool CanWrite => false;
+ public override bool CanRead => true;
+
+ public override int Read(byte[] buffer, int offset, int size)
+ {
+ if (buffer == null)
+ {
+ throw new ArgumentNullException(nameof(buffer));
+ }
+ if (offset < 0 || offset > buffer.Length)
+ {
+ throw new ArgumentOutOfRangeException(nameof(offset));
+ }
+ if (size < 0 || size > buffer.Length - offset)
+ {
+ throw new ArgumentOutOfRangeException(nameof(size));
+ }
+ if (size == 0 || _closed)
+ {
+ return 0;
+ }
+
+ return ReadCore(buffer, offset, size);
+ }
+
+ public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
+ {
+ if (buffer == null)
+ {
+ throw new ArgumentNullException(nameof(buffer));
+ }
+ if (offset < 0 || offset > buffer.Length)
+ {
+ throw new ArgumentOutOfRangeException(nameof(offset));
+ }
+ if (size < 0 || size > buffer.Length - offset)
+ {
+ throw new ArgumentOutOfRangeException(nameof(size));
+ }
+
+ return BeginReadCore(buffer, offset, size, callback, state);
+ }
+
+ public override void Flush() { }
+ public override Task FlushAsync(CancellationToken cancellationToken) => Task.CompletedTask;
+
+ public override long Length
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override long Position
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+
+ set
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void SetLength(long value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
+ {
+ return base.BeginWrite(buffer, offset, count, callback, state);
+ }
+
+ public override void EndWrite(IAsyncResult asyncResult)
+ {
+ base.EndWrite(asyncResult);
+ }
+
+ internal bool Closed => _closed;
+
+ protected override void Dispose(bool disposing)
+ {
+ _closed = true;
+ base.Dispose(disposing);
+ }
+ }
+}
diff --git a/SocketHttpListener/Net/HttpResponseStream.Managed.cs b/SocketHttpListener/Net/HttpResponseStream.Managed.cs
new file mode 100644
index 0000000000..2f580a1049
--- /dev/null
+++ b/SocketHttpListener/Net/HttpResponseStream.Managed.cs
@@ -0,0 +1,451 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.ExceptionServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Net;
+using MediaBrowser.Model.System;
+
+namespace SocketHttpListener.Net
+{
+ // Licensed to the .NET Foundation under one or more agreements.
+ // See the LICENSE file in the project root for more information.
+ //
+ // System.Net.ResponseStream
+ //
+ // Author:
+ // Gonzalo Paniagua Javier (gonzalo@novell.com)
+ //
+ // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining
+ // a copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to
+ // permit persons to whom the Software is furnished to do so, subject to
+ // the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be
+ // included in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ //
+
+ internal partial class HttpResponseStream : Stream
+ {
+ private HttpListenerResponse _response;
+ private bool _ignore_errors;
+ private bool _trailer_sent;
+ private Stream _stream;
+ private readonly IMemoryStreamFactory _memoryStreamFactory;
+ private readonly IAcceptSocket _socket;
+ private readonly bool _supportsDirectSocketAccess;
+ private readonly IEnvironmentInfo _environment;
+ private readonly IFileSystem _fileSystem;
+ private readonly ILogger _logger;
+
+ internal HttpResponseStream(Stream stream, HttpListenerResponse response, bool ignore_errors, IMemoryStreamFactory memoryStreamFactory, IAcceptSocket socket, bool supportsDirectSocketAccess, IEnvironmentInfo environment, IFileSystem fileSystem, ILogger logger)
+ {
+ _response = response;
+ _ignore_errors = ignore_errors;
+ _memoryStreamFactory = memoryStreamFactory;
+ _socket = socket;
+ _supportsDirectSocketAccess = supportsDirectSocketAccess;
+ _environment = environment;
+ _fileSystem = fileSystem;
+ _logger = logger;
+ _stream = stream;
+ }
+
+ private void DisposeCore()
+ {
+ byte[] bytes = null;
+ MemoryStream ms = GetHeaders(true);
+ bool chunked = _response.SendChunked;
+ if (_stream.CanWrite)
+ {
+ try
+ {
+ if (ms != null)
+ {
+ long start = ms.Position;
+ if (chunked && !_trailer_sent)
+ {
+ bytes = GetChunkSizeBytes(0, true);
+ ms.Position = ms.Length;
+ ms.Write(bytes, 0, bytes.Length);
+ }
+ InternalWrite(ms.GetBuffer(), (int)start, (int)(ms.Length - start));
+ _trailer_sent = true;
+ }
+ else if (chunked && !_trailer_sent)
+ {
+ bytes = GetChunkSizeBytes(0, true);
+ InternalWrite(bytes, 0, bytes.Length);
+ _trailer_sent = true;
+ }
+ }
+ catch (HttpListenerException)
+ {
+ // Ignore error due to connection reset by peer
+ }
+ }
+ _response.Close();
+ }
+
+ internal async Task WriteWebSocketHandshakeHeadersAsync()
+ {
+ if (_closed)
+ throw new ObjectDisposedException(GetType().ToString());
+
+ if (_stream.CanWrite)
+ {
+ MemoryStream ms = GetHeaders(closing: false, isWebSocketHandshake: true);
+ bool chunked = _response.SendChunked;
+
+ long start = ms.Position;
+ if (chunked)
+ {
+ byte[] bytes = GetChunkSizeBytes(0, true);
+ ms.Position = ms.Length;
+ ms.Write(bytes, 0, bytes.Length);
+ }
+
+ await InternalWriteAsync(ms.GetBuffer(), (int)start, (int)(ms.Length - start)).ConfigureAwait(false);
+ await _stream.FlushAsync().ConfigureAwait(false);
+ }
+ }
+
+ private MemoryStream GetHeaders(bool closing, bool isWebSocketHandshake = false)
+ {
+ // SendHeaders works on shared headers
+ lock (_response.headers_lock)
+ {
+ if (_response.HeadersSent)
+ return null;
+ var ms = _memoryStreamFactory.CreateNew();
+ _response.SendHeaders(closing, ms);
+ return ms;
+ }
+
+ //lock (_response._headersLock)
+ //{
+ // if (_response.SentHeaders)
+ // {
+ // return null;
+ // }
+
+ // MemoryStream ms = new MemoryStream();
+ // _response.SendHeaders(closing, ms, isWebSocketHandshake);
+ // return ms;
+ //}
+ }
+
+ private static byte[] s_crlf = new byte[] { 13, 10 };
+ private static byte[] GetChunkSizeBytes(int size, bool final)
+ {
+ string str = String.Format("{0:x}\r\n{1}", size, final ? "\r\n" : "");
+ return Encoding.ASCII.GetBytes(str);
+ }
+
+ internal void InternalWrite(byte[] buffer, int offset, int count)
+ {
+ if (_ignore_errors)
+ {
+ try
+ {
+ _stream.Write(buffer, offset, count);
+ }
+ catch { }
+ }
+ else
+ {
+ _stream.Write(buffer, offset, count);
+ }
+ }
+
+ internal Task InternalWriteAsync(byte[] buffer, int offset, int count) =>
+ _ignore_errors ? InternalWriteIgnoreErrorsAsync(buffer, offset, count) : _stream.WriteAsync(buffer, offset, count);
+
+ private async Task InternalWriteIgnoreErrorsAsync(byte[] buffer, int offset, int count)
+ {
+ try { await _stream.WriteAsync(buffer, offset, count).ConfigureAwait(false); }
+ catch { }
+ }
+
+ private void WriteCore(byte[] buffer, int offset, int size)
+ {
+ if (size == 0)
+ return;
+
+ byte[] bytes = null;
+ MemoryStream ms = GetHeaders(false);
+ bool chunked = _response.SendChunked;
+ if (ms != null)
+ {
+ long start = ms.Position; // After the possible preamble for the encoding
+ ms.Position = ms.Length;
+ if (chunked)
+ {
+ bytes = GetChunkSizeBytes(size, false);
+ ms.Write(bytes, 0, bytes.Length);
+ }
+
+ int new_count = Math.Min(size, 16384 - (int)ms.Position + (int)start);
+ ms.Write(buffer, offset, new_count);
+ size -= new_count;
+ offset += new_count;
+ InternalWrite(ms.GetBuffer(), (int)start, (int)(ms.Length - start));
+ ms.SetLength(0);
+ ms.Capacity = 0; // 'dispose' the buffer in ms.
+ }
+ else if (chunked)
+ {
+ bytes = GetChunkSizeBytes(size, false);
+ InternalWrite(bytes, 0, bytes.Length);
+ }
+
+ if (size > 0)
+ InternalWrite(buffer, offset, size);
+ if (chunked)
+ InternalWrite(s_crlf, 0, 2);
+ }
+
+ private IAsyncResult BeginWriteCore(byte[] buffer, int offset, int size, AsyncCallback cback, object state)
+ {
+ if (_closed)
+ {
+ HttpStreamAsyncResult ares = new HttpStreamAsyncResult(this);
+ ares._callback = cback;
+ ares._state = state;
+ ares.Complete();
+ return ares;
+ }
+
+ byte[] bytes = null;
+ MemoryStream ms = GetHeaders(false);
+ bool chunked = _response.SendChunked;
+ if (ms != null)
+ {
+ long start = ms.Position;
+ ms.Position = ms.Length;
+ if (chunked)
+ {
+ bytes = GetChunkSizeBytes(size, false);
+ ms.Write(bytes, 0, bytes.Length);
+ }
+ ms.Write(buffer, offset, size);
+ buffer = ms.GetBuffer();
+ offset = (int)start;
+ size = (int)(ms.Position - start);
+ }
+ else if (chunked)
+ {
+ bytes = GetChunkSizeBytes(size, false);
+ InternalWrite(bytes, 0, bytes.Length);
+ }
+
+ return _stream.BeginWrite(buffer, offset, size, cback, state);
+ }
+
+ private void EndWriteCore(IAsyncResult asyncResult)
+ {
+ if (_closed)
+ return;
+
+ if (_ignore_errors)
+ {
+ try
+ {
+ _stream.EndWrite(asyncResult);
+ if (_response.SendChunked)
+ _stream.Write(s_crlf, 0, 2);
+ }
+ catch { }
+ }
+ else
+ {
+ _stream.EndWrite(asyncResult);
+ if (_response.SendChunked)
+ _stream.Write(s_crlf, 0, 2);
+ }
+ }
+
+ private bool EnableSendFileWithSocket = false;
+
+ public Task TransmitFile(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
+ {
+ if (_supportsDirectSocketAccess && offset == 0 && count == 0 && !_response.SendChunked && _response.ContentLength64 > 8192)
+ {
+ if (EnableSendFileWithSocket)
+ {
+ return TransmitFileOverSocket(path, offset, count, fileShareMode, cancellationToken);
+ }
+ }
+ return TransmitFileManaged(path, offset, count, fileShareMode, cancellationToken);
+ }
+
+ private readonly byte[] _emptyBuffer = new byte[] { };
+ private Task TransmitFileOverSocket(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
+ {
+ var ms = GetHeaders(false);
+
+ byte[] preBuffer;
+ if (ms != null)
+ {
+ using (var msCopy = new MemoryStream())
+ {
+ ms.CopyTo(msCopy);
+ preBuffer = msCopy.ToArray();
+ }
+ }
+ else
+ {
+ return TransmitFileManaged(path, offset, count, fileShareMode, cancellationToken);
+ }
+
+ //_logger.Info("Socket sending file {0} {1}", path, response.ContentLength64);
+
+ var taskCompletion = new TaskCompletionSource<bool>();
+
+ Action<IAsyncResult> callback = callbackResult =>
+ {
+ try
+ {
+ _socket.EndSendFile(callbackResult);
+ taskCompletion.TrySetResult(true);
+ }
+ catch (Exception ex)
+ {
+ taskCompletion.TrySetException(ex);
+ }
+ };
+
+ var result = _socket.BeginSendFile(path, preBuffer, _emptyBuffer, new AsyncCallback(callback), null);
+
+ if (result.CompletedSynchronously)
+ {
+ callback(result);
+ }
+
+ cancellationToken.Register(() => taskCompletion.TrySetCanceled());
+
+ return taskCompletion.Task;
+ }
+
+ const int StreamCopyToBufferSize = 81920;
+ private async Task TransmitFileManaged(string path, long offset, long count, FileShareMode fileShareMode, CancellationToken cancellationToken)
+ {
+ var allowAsync = _environment.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows;
+
+ //if (count <= 0)
+ //{
+ // allowAsync = true;
+ //}
+
+ var fileOpenOptions = offset > 0
+ ? FileOpenOptions.RandomAccess
+ : FileOpenOptions.SequentialScan;
+
+ if (allowAsync)
+ {
+ fileOpenOptions |= FileOpenOptions.Asynchronous;
+ }
+
+ // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039
+
+ using (var fs = _fileSystem.GetFileStream(path, FileOpenMode.Open, FileAccessMode.Read, fileShareMode, fileOpenOptions))
+ {
+ if (offset > 0)
+ {
+ fs.Position = offset;
+ }
+
+ var targetStream = this;
+
+ if (count > 0)
+ {
+ if (allowAsync)
+ {
+ await CopyToInternalAsync(fs, targetStream, count, cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ await CopyToInternalAsyncWithSyncRead(fs, targetStream, count, cancellationToken).ConfigureAwait(false);
+ }
+ }
+ else
+ {
+ if (allowAsync)
+ {
+ await fs.CopyToAsync(targetStream, StreamCopyToBufferSize, cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ fs.CopyTo(targetStream, StreamCopyToBufferSize);
+ }
+ }
+ }
+ }
+
+ private static async Task CopyToInternalAsyncWithSyncRead(Stream source, Stream destination, long copyLength, CancellationToken cancellationToken)
+ {
+ var array = new byte[StreamCopyToBufferSize];
+ int bytesRead;
+
+ while ((bytesRead = source.Read(array, 0, array.Length)) != 0)
+ {
+ var bytesToWrite = Math.Min(bytesRead, copyLength);
+
+ if (bytesToWrite > 0)
+ {
+ await destination.WriteAsync(array, 0, Convert.ToInt32(bytesToWrite), cancellationToken).ConfigureAwait(false);
+ }
+
+ copyLength -= bytesToWrite;
+
+ if (copyLength <= 0)
+ {
+ break;
+ }
+ }
+ }
+
+ private static async Task CopyToInternalAsync(Stream source, Stream destination, long copyLength, CancellationToken cancellationToken)
+ {
+ var array = new byte[StreamCopyToBufferSize];
+ int bytesRead;
+
+ while ((bytesRead = await source.ReadAsync(array, 0, array.Length, cancellationToken).ConfigureAwait(false)) != 0)
+ {
+ var bytesToWrite = Math.Min(bytesRead, copyLength);
+
+ if (bytesToWrite > 0)
+ {
+ await destination.WriteAsync(array, 0, Convert.ToInt32(bytesToWrite), cancellationToken).ConfigureAwait(false);
+ }
+
+ copyLength -= bytesToWrite;
+
+ if (copyLength <= 0)
+ {
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/SocketHttpListener/Net/HttpResponseStream.cs b/SocketHttpListener/Net/HttpResponseStream.cs
new file mode 100644
index 0000000000..f7140be66c
--- /dev/null
+++ b/SocketHttpListener/Net/HttpResponseStream.cs
@@ -0,0 +1,139 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace SocketHttpListener.Net
+{
+ internal sealed partial class HttpResponseStream : Stream
+ {
+ private bool _closed;
+ internal bool Closed => _closed;
+
+ public override bool CanRead => false;
+ public override bool CanSeek => false;
+ public override bool CanWrite => true;
+
+ public override void Flush() { }
+ public override Task FlushAsync(CancellationToken cancellationToken) => Task.CompletedTask;
+
+ public override long Length
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override long Position
+ {
+ get
+ {
+ throw new NotImplementedException();
+ }
+
+ set
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void SetLength(long value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
+ {
+ return base.BeginRead(buffer, offset, count, callback, state);
+ }
+
+ public override int EndRead(IAsyncResult asyncResult)
+ {
+ return base.EndRead(asyncResult);
+ }
+
+ public override void Write(byte[] buffer, int offset, int size)
+ {
+ if (buffer == null)
+ {
+ throw new ArgumentNullException(nameof(buffer));
+ }
+ if (offset < 0 || offset > buffer.Length)
+ {
+ throw new ArgumentOutOfRangeException(nameof(offset));
+ }
+ if (size < 0 || size > buffer.Length - offset)
+ {
+ throw new ArgumentOutOfRangeException(nameof(size));
+ }
+ if (_closed)
+ {
+ return;
+ }
+
+ WriteCore(buffer, offset, size);
+ }
+
+ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
+ {
+ if (buffer == null)
+ {
+ throw new ArgumentNullException(nameof(buffer));
+ }
+ if (offset < 0 || offset > buffer.Length)
+ {
+ throw new ArgumentOutOfRangeException(nameof(offset));
+ }
+ if (size < 0 || size > buffer.Length - offset)
+ {
+ throw new ArgumentOutOfRangeException(nameof(size));
+ }
+
+ return BeginWriteCore(buffer, offset, size, callback, state);
+ }
+
+ public override void EndWrite(IAsyncResult asyncResult)
+ {
+ if (asyncResult == null)
+ {
+ throw new ArgumentNullException(nameof(asyncResult));
+ }
+
+ EndWriteCore(asyncResult);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ try
+ {
+ if (disposing)
+ {
+ if (_closed)
+ {
+ return;
+ }
+ _closed = true;
+ DisposeCore();
+ }
+ }
+ finally
+ {
+ base.Dispose(disposing);
+ }
+ }
+ }
+}
diff --git a/SocketHttpListener.Portable/Net/HttpStatusCode.cs b/SocketHttpListener/Net/HttpStatusCode.cs
index 93da82ba08..93da82ba08 100644
--- a/SocketHttpListener.Portable/Net/HttpStatusCode.cs
+++ b/SocketHttpListener/Net/HttpStatusCode.cs
diff --git a/SocketHttpListener/Net/HttpStreamAsyncResult.cs b/SocketHttpListener/Net/HttpStreamAsyncResult.cs
new file mode 100644
index 0000000000..e7e516c6b4
--- /dev/null
+++ b/SocketHttpListener/Net/HttpStreamAsyncResult.cs
@@ -0,0 +1,85 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace SocketHttpListener.Net
+{
+ internal class HttpStreamAsyncResult : IAsyncResult
+ {
+ private object _locker = new object();
+ private ManualResetEvent _handle;
+ private bool _completed;
+
+ internal readonly object _parent;
+ internal byte[] _buffer;
+ internal int _offset;
+ internal int _count;
+ internal AsyncCallback _callback;
+ internal object _state;
+ internal int _synchRead;
+ internal Exception _error;
+ internal bool _endCalled;
+
+ internal HttpStreamAsyncResult(object parent)
+ {
+ _parent = parent;
+ }
+
+ public void Complete(Exception e)
+ {
+ _error = e;
+ Complete();
+ }
+
+ public void Complete()
+ {
+ lock (_locker)
+ {
+ if (_completed)
+ return;
+
+ _completed = true;
+ if (_handle != null)
+ _handle.Set();
+
+ if (_callback != null)
+ Task.Run(() => _callback(this));
+ }
+ }
+
+ public object AsyncState
+ {
+ get { return _state; }
+ }
+
+ public WaitHandle AsyncWaitHandle
+ {
+ get
+ {
+ lock (_locker)
+ {
+ if (_handle == null)
+ _handle = new ManualResetEvent(_completed);
+ }
+
+ return _handle;
+ }
+ }
+
+ public bool CompletedSynchronously
+ {
+ get { return (_synchRead == _count); }
+ }
+
+ public bool IsCompleted
+ {
+ get
+ {
+ lock (_locker)
+ {
+ return _completed;
+ }
+ }
+ }
+ }
+}
diff --git a/SocketHttpListener.Portable/Net/HttpVersion.cs b/SocketHttpListener/Net/HttpVersion.cs
index c0839b46d5..c0839b46d5 100644
--- a/SocketHttpListener.Portable/Net/HttpVersion.cs
+++ b/SocketHttpListener/Net/HttpVersion.cs
diff --git a/SocketHttpListener.Portable/Net/ListenerPrefix.cs b/SocketHttpListener/Net/ListenerPrefix.cs
index 2c314da506..2c314da506 100644
--- a/SocketHttpListener.Portable/Net/ListenerPrefix.cs
+++ b/SocketHttpListener/Net/ListenerPrefix.cs
diff --git a/SocketHttpListener.Portable/Net/WebHeaderCollection.cs b/SocketHttpListener/Net/WebHeaderCollection.cs
index d20f99b9b8..d20f99b9b8 100644
--- a/SocketHttpListener.Portable/Net/WebHeaderCollection.cs
+++ b/SocketHttpListener/Net/WebHeaderCollection.cs
diff --git a/SocketHttpListener.Portable/Net/WebSockets/HttpListenerWebSocketContext.cs b/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs
index 034ac17d20..034ac17d20 100644
--- a/SocketHttpListener.Portable/Net/WebSockets/HttpListenerWebSocketContext.cs
+++ b/SocketHttpListener/Net/WebSockets/HttpListenerWebSocketContext.cs
diff --git a/SocketHttpListener.Portable/Net/WebSockets/WebSocketContext.cs b/SocketHttpListener/Net/WebSockets/WebSocketContext.cs
index 3ffa6e639a..3ffa6e639a 100644
--- a/SocketHttpListener.Portable/Net/WebSockets/WebSocketContext.cs
+++ b/SocketHttpListener/Net/WebSockets/WebSocketContext.cs
diff --git a/SocketHttpListener.Portable/Opcode.cs b/SocketHttpListener/Opcode.cs
index 62b7d8585c..62b7d8585c 100644
--- a/SocketHttpListener.Portable/Opcode.cs
+++ b/SocketHttpListener/Opcode.cs
diff --git a/SocketHttpListener.Portable/PayloadData.cs b/SocketHttpListener/PayloadData.cs
index a6318da2b8..a6318da2b8 100644
--- a/SocketHttpListener.Portable/PayloadData.cs
+++ b/SocketHttpListener/PayloadData.cs
diff --git a/SocketHttpListener.Portable/Primitives/ICertificate.cs b/SocketHttpListener/Primitives/ICertificate.cs
index 1289da13d7..1289da13d7 100644
--- a/SocketHttpListener.Portable/Primitives/ICertificate.cs
+++ b/SocketHttpListener/Primitives/ICertificate.cs
diff --git a/SocketHttpListener.Portable/Primitives/IStreamFactory.cs b/SocketHttpListener/Primitives/IStreamFactory.cs
index 57e21e31bc..57e21e31bc 100644
--- a/SocketHttpListener.Portable/Primitives/IStreamFactory.cs
+++ b/SocketHttpListener/Primitives/IStreamFactory.cs
diff --git a/SocketHttpListener.Portable/Primitives/ITextEncoding.cs b/SocketHttpListener/Primitives/ITextEncoding.cs
index b10145687b..b10145687b 100644
--- a/SocketHttpListener.Portable/Primitives/ITextEncoding.cs
+++ b/SocketHttpListener/Primitives/ITextEncoding.cs
diff --git a/MediaBrowser.Server.Startup.Common/Properties/AssemblyInfo.cs b/SocketHttpListener/Properties/AssemblyInfo.cs
index c8e0378046..8876cea4fe 100644
--- a/MediaBrowser.Server.Startup.Common/Properties/AssemblyInfo.cs
+++ b/SocketHttpListener/Properties/AssemblyInfo.cs
@@ -1,15 +1,16 @@
using System.Reflection;
+using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
-[assembly: AssemblyTitle("MediaBrowser.Server.Startup.Common")]
+[assembly: AssemblyTitle("SocketHttpListener")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("MediaBrowser.Server.Startup.Common")]
-[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyProduct("SocketHttpListener")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -19,7 +20,7 @@ using System.Runtime.InteropServices;
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("fcc1d690-3a86-4c4b-baef-439c53e1547a")]
+[assembly: Guid("1d74413b-e7cf-455b-b021-f52bdf881542")]
// Version information for an assembly consists of the following four values:
//
@@ -27,4 +28,7 @@ using System.Runtime.InteropServices;
// Minor Version
// Build Number
// Revision
-// \ No newline at end of file
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
diff --git a/SocketHttpListener.Portable/Rsv.cs b/SocketHttpListener/Rsv.cs
index 668059b8a3..668059b8a3 100644
--- a/SocketHttpListener.Portable/Rsv.cs
+++ b/SocketHttpListener/Rsv.cs
diff --git a/SocketHttpListener.Portable/SocketHttpListener.Portable.csproj b/SocketHttpListener/SocketHttpListener.csproj
index ee902462b0..fde6ed544e 100644
--- a/SocketHttpListener.Portable/SocketHttpListener.Portable.csproj
+++ b/SocketHttpListener/SocketHttpListener.csproj
@@ -2,19 +2,16 @@
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
- <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
- <ProjectGuid>{4F26D5D8-A7B0-42B3-BA42-7CB7D245934E}</ProjectGuid>
+ <ProjectGuid>{1D74413B-E7CF-455B-B021-F52BDF881542}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>SocketHttpListener.Portable</RootNamespace>
- <AssemblyName>SocketHttpListener.Portable</AssemblyName>
- <DefaultLanguage>en-US</DefaultLanguage>
+ <RootNamespace>SocketHttpListener</RootNamespace>
+ <AssemblyName>SocketHttpListener</AssemblyName>
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
- <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
- <TargetFrameworkProfile>Profile7</TargetFrameworkProfile>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -34,6 +31,19 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="..\SharedVersion.cs">
+ <Link>Properties\SharedVersion.cs</Link>
+ </Compile>
<Compile Include="ByteOrder.cs" />
<Compile Include="CloseEventArgs.cs" />
<Compile Include="CloseStatusCode.cs" />
@@ -58,18 +68,19 @@
<Compile Include="Net\HttpListenerPrefixCollection.cs" />
<Compile Include="Net\HttpListenerRequest.cs" />
<Compile Include="Net\HttpListenerResponse.cs" />
+ <Compile Include="Net\HttpRequestStream.cs" />
+ <Compile Include="Net\HttpRequestStream.Managed.cs" />
+ <Compile Include="Net\HttpResponseStream.cs" />
+ <Compile Include="Net\HttpResponseStream.Managed.cs" />
<Compile Include="Net\HttpStatusCode.cs" />
<Compile Include="Net\HttpStreamAsyncResult.cs" />
<Compile Include="Net\HttpVersion.cs" />
<Compile Include="Net\ListenerPrefix.cs" />
- <Compile Include="Net\RequestStream.cs" />
- <Compile Include="Net\ResponseStream.cs" />
<Compile Include="Net\WebHeaderCollection.cs" />
<Compile Include="Net\WebSockets\HttpListenerWebSocketContext.cs" />
<Compile Include="Net\WebSockets\WebSocketContext.cs" />
<Compile Include="Opcode.cs" />
<Compile Include="PayloadData.cs" />
- <Compile Include="Primitives\HttpListenerException.cs" />
<Compile Include="Primitives\ICertificate.cs" />
<Compile Include="Primitives\IStreamFactory.cs" />
<Compile Include="Primitives\ITextEncoding.cs" />
@@ -81,9 +92,6 @@
<Compile Include="WebSocketState.cs" />
</ItemGroup>
<ItemGroup>
- <None Include="packages.config" />
- </ItemGroup>
- <ItemGroup>
<ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
<Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
<Name>MediaBrowser.Common</Name>
@@ -93,11 +101,7 @@
<Name>MediaBrowser.Model</Name>
</ProjectReference>
</ItemGroup>
- <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
- <PropertyGroup>
- <PostBuildEvent>
- </PostBuildEvent>
- </PropertyGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
diff --git a/SocketHttpListener.Portable/WebSocket.cs b/SocketHttpListener/WebSocket.cs
index 9966d3fcf9..9966d3fcf9 100644
--- a/SocketHttpListener.Portable/WebSocket.cs
+++ b/SocketHttpListener/WebSocket.cs
diff --git a/SocketHttpListener.Portable/WebSocketException.cs b/SocketHttpListener/WebSocketException.cs
index 260721317c..260721317c 100644
--- a/SocketHttpListener.Portable/WebSocketException.cs
+++ b/SocketHttpListener/WebSocketException.cs
diff --git a/SocketHttpListener.Portable/WebSocketFrame.cs b/SocketHttpListener/WebSocketFrame.cs
index 44fa4a5dc3..44fa4a5dc3 100644
--- a/SocketHttpListener.Portable/WebSocketFrame.cs
+++ b/SocketHttpListener/WebSocketFrame.cs
diff --git a/SocketHttpListener.Portable/WebSocketState.cs b/SocketHttpListener/WebSocketState.cs
index 73b3a49ddc..73b3a49ddc 100644
--- a/SocketHttpListener.Portable/WebSocketState.cs
+++ b/SocketHttpListener/WebSocketState.cs
diff --git a/global.json b/global.json
deleted file mode 100644
index 6bc8a74b39..0000000000
--- a/global.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "projects": [ "src", "test", "." ],
- "sdk": {
- "version": "1.0.0-preview2-003131"
- }
-}
diff --git a/src/Emby.Server/ApplicationPathHelper.cs b/src/Emby.Server/ApplicationPathHelper.cs
deleted file mode 100644
index c611ff3727..0000000000
--- a/src/Emby.Server/ApplicationPathHelper.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace Emby.Server
-{
- public class ApplicationPathHelper
- {
- public static string GetProgramDataPath(string appDirectory)
- {
- var useDebugPath = false;
-
-#if DEBUG
- useDebugPath = true;
-#endif
-
- var programDataPath = useDebugPath ?
- "programdata" :
- "programdata";
-
- programDataPath = programDataPath
- .Replace('/', Path.DirectorySeparatorChar)
- .Replace('\\', Path.DirectorySeparatorChar);
-
- // If it's a relative path, e.g. "..\"
- if (!Path.IsPathRooted(programDataPath))
- {
- programDataPath = Path.Combine(appDirectory, programDataPath);
-
- programDataPath = Path.GetFullPath(programDataPath);
- }
-
- Directory.CreateDirectory(programDataPath);
-
- return programDataPath;
- }
- }
-}
diff --git a/src/Emby.Server/CoreAppHost.cs b/src/Emby.Server/CoreAppHost.cs
deleted file mode 100644
index 43142b5e85..0000000000
--- a/src/Emby.Server/CoreAppHost.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Reflection;
-using System.Threading.Tasks;
-using Emby.Server.Core;
-using Emby.Server.Implementations.FFMpeg;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.System;
-using Emby.Server.Implementations;
-
-namespace Emby.Server
-{
- public class CoreAppHost : ApplicationHost
- {
- public CoreAppHost(ServerApplicationPaths applicationPaths, ILogManager logManager, StartupOptions options, IFileSystem fileSystem, IPowerManagement powerManagement, string releaseAssetFilename, IEnvironmentInfo environmentInfo, MediaBrowser.Controller.Drawing.IImageEncoder imageEncoder, ISystemEvents systemEvents, IMemoryStreamFactory memoryStreamFactory, MediaBrowser.Common.Net.INetworkManager networkManager, Action<string, string> certificateGenerator, Func<string> defaultUsernameFactory)
- : base(applicationPaths, logManager, options, fileSystem, powerManagement, releaseAssetFilename, environmentInfo, imageEncoder, systemEvents, memoryStreamFactory, networkManager, certificateGenerator, defaultUsernameFactory)
- {
- }
-
- protected override void RestartInternal()
- {
- Program.Restart();
- }
-
- protected override void ShutdownInternal()
- {
- Program.Shutdown();
- }
-
- protected override List<Assembly> GetAssembliesWithPartsInternal()
- {
- var list = new List<Assembly>();
-
- list.Add(GetType().GetTypeInfo().Assembly);
-
- return list;
- }
-
- public override bool CanSelfRestart
- {
- get
- {
- return Program.CanSelfRestart;
- }
- }
-
- public override bool CanSelfUpdate
- {
- get
- {
- return Program.CanSelfUpdate;
- }
- }
- }
-}
diff --git a/src/Emby.Server/CoreSystemEvents.cs b/src/Emby.Server/CoreSystemEvents.cs
deleted file mode 100644
index 7afb94160d..0000000000
--- a/src/Emby.Server/CoreSystemEvents.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using System;
-using MediaBrowser.Model.System;
-
-namespace Emby.Server
-{
- public class CoreSystemEvents : ISystemEvents
- {
- public event EventHandler Resume;
- public event EventHandler Suspend;
- public event EventHandler SessionLogoff;
- public event EventHandler SystemShutdown;
- }
-}
diff --git a/src/Emby.Server/Emby.Server.xproj b/src/Emby.Server/Emby.Server.xproj
deleted file mode 100644
index 78276d17d8..0000000000
--- a/src/Emby.Server/Emby.Server.xproj
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup>
- <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
- <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
- </PropertyGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
- <PropertyGroup Label="Globals">
- <ProjectGuid>ddaff431-0b3d-4857-8762-990a32dc8472</ProjectGuid>
- <RootNamespace>Emby.Server</RootNamespace>
- <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
- <OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
- <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
- </PropertyGroup>
- <PropertyGroup>
- <SchemaVersion>2.0</SchemaVersion>
- </PropertyGroup>
- <ItemGroup>
- <ProjectReference Include="..\..\BDInfo\BDInfo.csproj" />
- <ProjectReference Include="..\..\DvdLib\DvdLib.csproj" />
- <ProjectReference Include="..\..\Emby.Dlna\Emby.Dlna.csproj" />
- <ProjectReference Include="..\..\Emby.Drawing\Emby.Drawing.csproj" />
- <ProjectReference Include="..\..\Emby.Photos\Emby.Photos.csproj" />
- <ProjectReference Include="..\..\Emby.Server.Implementations\Emby.Server.Implementations.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.Api\MediaBrowser.Api.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.Common\MediaBrowser.Common.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.LocalMetadata\MediaBrowser.LocalMetadata.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.Providers\MediaBrowser.Providers.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.Server.Implementations\MediaBrowser.Server.Implementations.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.WebDashboard\MediaBrowser.WebDashboard.csproj" />
- <ProjectReference Include="..\..\MediaBrowser.XbmcMetadata\MediaBrowser.XbmcMetadata.csproj" />
- <ProjectReference Include="..\..\OpenSubtitlesHandler\OpenSubtitlesHandler.csproj" />
- <ProjectReference Include="..\..\RSSDP\RSSDP.csproj" />
- <ProjectReference Include="..\..\SocketHttpListener.Portable\SocketHttpListener.Portable.csproj" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="..\..\SharedVersion.cs">
- <Link>Properties\SharedVersion.cs</Link>
- </Compile>
- </ItemGroup>
- <Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.targets" Condition="'$(VSToolsPath)' != ''" />
-</Project> \ No newline at end of file
diff --git a/src/Emby.Server/IO/MemoryStreamFactory.cs b/src/Emby.Server/IO/MemoryStreamFactory.cs
deleted file mode 100644
index 37ac2959ed..0000000000
--- a/src/Emby.Server/IO/MemoryStreamFactory.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using System;
-using System.IO;
-using MediaBrowser.Model.IO;
-
-namespace Emby.Server.IO
-{
- public class MemoryStreamFactory : IMemoryStreamFactory
- {
- public MemoryStream CreateNew()
- {
- return new MemoryStream();
- }
-
- public MemoryStream CreateNew(int capacity)
- {
- return new MemoryStream(capacity);
- }
-
- public MemoryStream CreateNew(byte[] buffer)
- {
- return new MemoryStream(buffer);
- }
-
- public bool TryGetBuffer(MemoryStream stream, out byte[] buffer)
- {
- ArraySegment<byte> arrayBuffer;
- stream.TryGetBuffer(out arrayBuffer);
-
- buffer = arrayBuffer.Array;
- return true;
- }
- }
-}
diff --git a/src/Emby.Server/PowerManagement.cs b/src/Emby.Server/PowerManagement.cs
deleted file mode 100644
index 85e3b72a69..0000000000
--- a/src/Emby.Server/PowerManagement.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using MediaBrowser.Model.System;
-
-namespace Emby.Server
-{
- public class PowerManagement : IPowerManagement
- {
- public void PreventSystemStandby()
- {
- }
-
- public void AllowSystemStandby()
- {
- }
- }
-}
diff --git a/src/Emby.Server/Program.cs b/src/Emby.Server/Program.cs
deleted file mode 100644
index 5e55cfa290..0000000000
--- a/src/Emby.Server/Program.cs
+++ /dev/null
@@ -1,346 +0,0 @@
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Server.Implementations;
-using Microsoft.Win32;
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using Emby.Common.Implementations.EnvironmentInfo;
-using Emby.Common.Implementations.IO;
-using Emby.Common.Implementations.Logging;
-using Emby.Common.Implementations.Networking;
-using Emby.Drawing;
-using Emby.Server.Core;
-using Emby.Server.Implementations.Browser;
-using Emby.Server.Implementations.IO;
-using MediaBrowser.Common.Net;
-using Emby.Server.IO;
-using Emby.Server.Implementations;
-
-namespace Emby.Server
-{
- public class Program
- {
- private static ApplicationHost _appHost;
-
- private static ILogger _logger;
-
- private static bool _appHostDisposed;
-
- [DllImport("kernel32.dll", SetLastError = true)]
- static extern bool SetDllDirectory(string lpPathName);
-
- /// <summary>
- /// Defines the entry point of the application.
- /// </summary>
- public static void Main(string[] args)
- {
- var options = new StartupOptions(Environment.GetCommandLineArgs());
-
- var environmentInfo = new EnvironmentInfo();
-
- var baseDirectory = System.AppContext.BaseDirectory;
- string archPath = baseDirectory;
- if (environmentInfo.SystemArchitecture == MediaBrowser.Model.System.Architecture.X64)
- {
- archPath = Path.Combine(archPath, "x64");
- }
- else if (environmentInfo.SystemArchitecture == MediaBrowser.Model.System.Architecture.X86)
- {
- archPath = Path.Combine(archPath, "x86");
- }
- else
- {
- archPath = Path.Combine(archPath, "arm");
- }
-
- //Wand.SetMagickCoderModulePath(architecturePath);
-
- if (environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
- {
- SetDllDirectory(archPath);
- }
-
- var appPaths = CreateApplicationPaths(baseDirectory);
- SetSqliteProvider();
-
- var logManager = new NlogManager(appPaths.LogDirectoryPath, "server");
- logManager.ReloadLogger(LogSeverity.Debug);
- logManager.AddConsoleOutput();
-
- var logger = _logger = logManager.GetLogger("Main");
-
- ApplicationHost.LogEnvironmentInfo(logger, appPaths, true);
-
- AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
-
- //if (IsAlreadyRunning(applicationPath, currentProcess))
- //{
- // logger.Info("Shutting down because another instance of Emby Server is already running.");
- // return;
- //}
-
- if (PerformUpdateIfNeeded(appPaths, logger))
- {
- logger.Info("Exiting to perform application update.");
- return;
- }
-
- RunApplication(appPaths, logManager, options, environmentInfo);
- }
-
- private static void SetSqliteProvider()
- {
- SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
- }
-
- /// <summary>
- /// Determines whether [is already running] [the specified current process].
- /// </summary>
- /// <param name="applicationPath">The application path.</param>
- /// <param name="currentProcess">The current process.</param>
- /// <returns><c>true</c> if [is already running] [the specified current process]; otherwise, <c>false</c>.</returns>
- private static bool IsAlreadyRunning(string applicationPath, Process currentProcess)
- {
- var duplicate = Process.GetProcesses().FirstOrDefault(i =>
- {
- try
- {
- if (currentProcess.Id == i.Id)
- {
- return false;
- }
- }
- catch (Exception)
- {
- return false;
- }
-
- try
- {
- //_logger.Info("Module: {0}", i.MainModule.FileName);
- if (string.Equals(applicationPath, i.MainModule.FileName, StringComparison.OrdinalIgnoreCase))
- {
- return true;
- }
- return false;
- }
- catch (Exception)
- {
- return false;
- }
- });
-
- if (duplicate != null)
- {
- _logger.Info("Found a duplicate process. Giving it time to exit.");
-
- if (!duplicate.WaitForExit(30000))
- {
- _logger.Info("The duplicate process did not exit.");
- return true;
- }
- }
-
- return false;
- }
-
- /// <summary>
- /// Creates the application paths.
- /// </summary>
- private static ServerApplicationPaths CreateApplicationPaths(string appDirectory)
- {
- var resourcesPath = appDirectory;
-
- return new ServerApplicationPaths(ApplicationPathHelper.GetProgramDataPath(appDirectory), appDirectory, resourcesPath);
- }
-
- /// <summary>
- /// Gets a value indicating whether this instance can self restart.
- /// </summary>
- /// <value><c>true</c> if this instance can self restart; otherwise, <c>false</c>.</value>
- public static bool CanSelfRestart
- {
- get
- {
- return true;
- }
- }
-
- /// <summary>
- /// Gets a value indicating whether this instance can self update.
- /// </summary>
- /// <value><c>true</c> if this instance can self update; otherwise, <c>false</c>.</value>
- public static bool CanSelfUpdate
- {
- get
- {
- return false;
- }
- }
-
- private static readonly TaskCompletionSource<bool> ApplicationTaskCompletionSource = new TaskCompletionSource<bool>();
-
- /// <summary>
- /// Runs the application.
- /// </summary>
- /// <param name="appPaths">The app paths.</param>
- /// <param name="logManager">The log manager.</param>
- /// <param name="options">The options.</param>
- private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options, EnvironmentInfo environmentInfo)
- {
- var fileSystem = new ManagedFileSystem(logManager.GetLogger("FileSystem"), true, true, false, appPaths.TempDirectory);
-
- fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem));
-
- var imageEncoder = new NullImageEncoder();
-
- _appHost = new CoreAppHost(appPaths,
- logManager,
- options,
- fileSystem,
- new PowerManagement(),
- "emby.windows.zip",
- environmentInfo,
- imageEncoder,
- new CoreSystemEvents(),
- new MemoryStreamFactory(),
- new NetworkManager(logManager.GetLogger("NetworkManager")),
- GenerateCertificate,
- () => "EmbyUser");
-
- var initProgress = new Progress<double>();
-
- if (environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
- {
- // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes
- SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT |
- ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);
- }
-
- var task = _appHost.Init(initProgress);
- Task.WaitAll(task);
-
- task = task.ContinueWith(new Action<Task>(a => _appHost.RunStartupTasks()), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent);
-
- Task.WaitAll(task);
-
- task = ApplicationTaskCompletionSource.Task;
- Task.WaitAll(task);
- }
-
- private static void GenerateCertificate(string certPath, string certHost)
- {
- //CertificateGenerator.CreateSelfSignCertificatePfx(certPath, certHost, _logger);
- }
-
- /// <summary>
- /// Handles the UnhandledException event of the CurrentDomain control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="UnhandledExceptionEventArgs"/> instance containing the event data.</param>
- static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- var exception = (Exception)e.ExceptionObject;
-
- new UnhandledExceptionWriter(_appHost.ServerConfigurationManager.ApplicationPaths, _logger, _appHost.LogManager).Log(exception);
-
- ShowMessageBox("Unhandled exception: " + exception.Message);
-
- if (!Debugger.IsAttached)
- {
- Environment.Exit(Marshal.GetHRForException(exception));
- }
- }
-
- /// <summary>
- /// Performs the update if needed.
- /// </summary>
- /// <param name="appPaths">The app paths.</param>
- /// <param name="logger">The logger.</param>
- /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
- private static bool PerformUpdateIfNeeded(ServerApplicationPaths appPaths, ILogger logger)
- {
- return false;
- }
-
- private static void ShowMessageBox(string msg)
- {
-
- }
-
- public static void Shutdown()
- {
- DisposeAppHost();
-
- //_logger.Info("Calling Application.Exit");
- //Application.Exit();
-
- _logger.Info("Calling Environment.Exit");
- Environment.Exit(0);
-
- _logger.Info("Calling ApplicationTaskCompletionSource.SetResult");
- ApplicationTaskCompletionSource.SetResult(true);
- }
-
- public static void Restart()
- {
- DisposeAppHost();
-
- // todo: start new instance
-
- Shutdown();
- }
-
- private static void DisposeAppHost()
- {
- if (!_appHostDisposed)
- {
- _logger.Info("Disposing app host");
-
- _appHostDisposed = true;
- _appHost.Dispose();
- }
- }
-
- /// <summary>
- /// Sets the error mode.
- /// </summary>
- /// <param name="uMode">The u mode.</param>
- /// <returns>ErrorModes.</returns>
- [DllImport("kernel32.dll")]
- static extern ErrorModes SetErrorMode(ErrorModes uMode);
-
- /// <summary>
- /// Enum ErrorModes
- /// </summary>
- [Flags]
- public enum ErrorModes : uint
- {
- /// <summary>
- /// The SYSTE m_ DEFAULT
- /// </summary>
- SYSTEM_DEFAULT = 0x0,
- /// <summary>
- /// The SE m_ FAILCRITICALERRORS
- /// </summary>
- SEM_FAILCRITICALERRORS = 0x0001,
- /// <summary>
- /// The SE m_ NOALIGNMENTFAULTEXCEPT
- /// </summary>
- SEM_NOALIGNMENTFAULTEXCEPT = 0x0004,
- /// <summary>
- /// The SE m_ NOGPFAULTERRORBOX
- /// </summary>
- SEM_NOGPFAULTERRORBOX = 0x0002,
- /// <summary>
- /// The SE m_ NOOPENFILEERRORBOX
- /// </summary>
- SEM_NOOPENFILEERRORBOX = 0x8000
- }
- }
-}
diff --git a/src/Emby.Server/Properties/AssemblyInfo.cs b/src/Emby.Server/Properties/AssemblyInfo.cs
deleted file mode 100644
index 2674312bb4..0000000000
--- a/src/Emby.Server/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("Emby.Server")]
-[assembly: AssemblyTrademark("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("ddaff431-0b3d-4857-8762-990a32dc8472")]
diff --git a/src/Emby.Server/project.json b/src/Emby.Server/project.json
deleted file mode 100644
index e1ff8cbccb..0000000000
--- a/src/Emby.Server/project.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "version": "3.1.0.1",
- "buildOptions": {
- "emitEntryPoint": true
- },
-
- "dependencies": {
- "Emby.Common.Implementations": "1.0.0-*",
- "Emby.Server.Core": "1.0.0-*",
- "Microsoft.NETCore.App": {
- "type": "platform",
- "version": "1.1.0"
- },
- "Mono.Nat": "1.0.0-*",
- "System.Runtime.Extensions": "4.3.0",
- "System.Diagnostics.Process": "4.3.0",
- "Microsoft.Win32.Registry": "4.3.0",
- "SQLitePCLRaw.provider.sqlite3.netstandard11": "1.1.1"
- },
-
- "runtimes": {
- "win7-x86": {},
- "win7-x64": {},
- "win8-x86": {},
- "win8-x64": {},
- "win8-arm": {},
- "win81-x86": {},
- "win81-x64": {},
- "win81-arm": {},
- "win10-x86": {},
- "win10-x64": {},
- "win10-arm": {},
- "win10-arm64": {},
- "osx.10.10-x64": {},
- "osx.10.11-x64": {},
- "osx.10.12-x64": ,
- "rhel.7.0-x64": {},
- "rhel.7.1-x64": {},
- "rhel.7.2-x64": {},
- "ubuntu.14.04-x64": {},
- "ubuntu.14.10-x64": {},
- "ubuntu.15.04-x64": {},
- "ubuntu.15.10-x64": {},
- "ubuntu.16.04-x64": {},
- "ubuntu.16.10-x64": {},
- "centos.7-x64": {},
- "debian.8-x64": {},
- "fedora.23-x64": {},
- "fedora.24-x64": {},
- "opensuse.13.2-x64": {},
- "opensuse.42.1-x64": {},
- "ol.7-x64": {},
- "ol.7.0-x64": {},
- "ol.7.1-x64": {},
- "ol.7.2-x64": {}
- },
-
- "frameworks": {
- "netcoreapp1.1": {
- "imports": "dnxcore50",
- "dependencies": {
- "BDInfo": {
- "target": "project"
- },
- "DvdLib": {
- "target": "project"
- },
- "Emby.Dlna": {
- "target": "project"
- },
- "Emby.Drawing": {
- "target": "project"
- },
- "Emby.Photos": {
- "target": "project"
- },
- "Emby.Server.Implementations": {
- "target": "project"
- },
- "MediaBrowser.Api": {
- "target": "project"
- },
- "MediaBrowser.Common": {
- "target": "project"
- },
- "MediaBrowser.Controller": {
- "target": "project"
- },
- "MediaBrowser.LocalMetadata": {
- "target": "project"
- },
- "MediaBrowser.MediaEncoding": {
- "target": "project"
- },
- "MediaBrowser.Model": {
- "target": "project"
- },
- "MediaBrowser.Providers": {
- "target": "project"
- },
- "MediaBrowser.Server.Implementations": {
- "target": "project"
- },
- "MediaBrowser.WebDashboard": {
- "target": "project"
- },
- "MediaBrowser.XbmcMetadata": {
- "target": "project"
- },
- "OpenSubtitlesHandler": {
- "target": "project"
- },
- "RSSDP": {
- "target": "project"
- },
- "SocketHttpListener.Portable": {
- "target": "project"
- }
- }
- }
- }
-}