Example #1
0
        public ExportCatalog(DefaultMetadataProvider defaultMetadataProvider)
        {
            MetadataProviders.Add(defaultMetadataProvider);
            DefaultMetadataProvider = defaultMetadataProvider;

            Types.TryAdd(defaultMetadataProvider.GetType(), new List <ITypeInfo>());
        }
Example #2
0
        private async Task <string> GetSeriesByRemoteId(string id, MetadataProviders idType, CancellationToken cancellationToken)
        {
            var idTypeString = idType.ToString().ToLower();

            if (idTypeString == "tvdb")
            {
                idTypeString = "thetvdb";
            }

            var url = string.Format(UrlByRemoteId, idTypeString, id);

            using (var response = await _httpClient.GetResponse(new HttpRequestOptions
            {
                Url = url,
                ResourcePool = TvMazeResourcePool,
                CancellationToken = cancellationToken
            }).ConfigureAwait(false))
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var arr = response.ResponseUrl.Split('/');
                    return(arr[arr.Length - 1]);
                }
            }

            return(null);
        }
Example #3
0
        private IEnumerable <ITypeInfo> GetTypes <TProvider>() where TProvider : class, IMetadataProvider
        {
            var metadataProviderType = typeof(TProvider);

            if (!Types.ContainsKey(metadataProviderType))
            {
                throw new NotImplementedException($"Provider {metadataProviderType.Name} not registered.");
            }

            var providerTypes = Types[metadataProviderType];

            if (providerTypes.Count == 0)
            {
                var metadataProvider = MetadataProviders.FirstOrDefault(o => o.GetType() == metadataProviderType);

                var exportedTypes  = Assemblies.SelectMany(o => o.GetExportedTypes().Where(t => t.HasAttribute <ExportAttribute>()));
                var projectedTypes = exportedTypes.Select(o => metadataProvider.Create(o));
                foreach (var t in projectedTypes)
                {
                    providerTypes.Add(t);
                }
            }

            return(providerTypes);
        }
Example #4
0
 public void RegisterMetadataProvider(IMetadataProvider provider)
 {
     if (!Types.ContainsKey(provider.GetType()))
     {
         MetadataProviders.Add(provider);
         Types.TryAdd(provider.GetType(), new List <ITypeInfo>());
     }
 }
Example #5
0
 /// <summary>
 /// Sets a provider id.
 /// </summary>
 /// <param name="instance">The instance.</param>
 /// <param name="provider">The provider.</param>
 /// <param name="value">The value.</param>
 public static void SetProviderId(this IHasProviderIds instance, MetadataProviders provider, string value)
 {
     instance.SetProviderId(provider.ToString(), value);
 }
Example #6
0
 /// <summary>
 /// Gets a provider id.
 /// </summary>
 /// <param name="instance">The instance.</param>
 /// <param name="provider">The provider.</param>
 /// <returns>System.String.</returns>
 public static string?GetProviderId(this IHasProviderIds instance, MetadataProviders provider)
 {
     return(instance.GetProviderId(provider.ToString()));
 }
Example #7
0
 /// <summary>
 /// Determines whether [has provider identifier] [the specified instance].
 /// </summary>
 /// <param name="instance">The instance.</param>
 /// <param name="provider">The provider.</param>
 /// <returns><c>true</c> if [has provider identifier] [the specified instance]; otherwise, <c>false</c>.</returns>
 public static bool HasProviderId(this IHasProviderIds instance, MetadataProviders provider)
 {
     return(!string.IsNullOrEmpty(instance.GetProviderId(provider.ToString())));
 }
Example #8
0
 public XamlApp()
 {
     MetadataProviders.Add(new ControlPlaygroundUwpLib.ControlPlaygroundUwpLib_XamlTypeInfo.XamlMetaDataProvider());
 }
Example #9
0
 /// <summary>
 /// Sets a provider id
 /// </summary>
 /// <param name="instance">The instance.</param>
 /// <param name="provider">The provider.</param>
 /// <param name="value">The value.</param>
 public static void SetProviderId(this IHasProviderIds instance, MetadataProviders provider, string value)
 {
     instance.SetProviderId(provider.ToString(), value);
 }
Example #10
0
 /// <summary>
 /// Gets a provider id
 /// </summary>
 /// <param name="instance">The instance.</param>
 /// <param name="provider">The provider.</param>
 /// <returns>System.String.</returns>
 public static string GetProviderId(this IHasProviderIds instance, MetadataProviders provider)
 {
     return instance.GetProviderId(provider.ToString());
 }
 /// <summary>
 /// Determines whether [has provider identifier] [the specified instance].
 /// </summary>
 /// <param name="instance">The instance.</param>
 /// <param name="provider">The provider.</param>
 /// <returns><c>true</c> if [has provider identifier] [the specified instance]; otherwise, <c>false</c>.</returns>
 public static bool HasProviderId(this IHasProviderIds instance, MetadataProviders provider)
 {
     return !string.IsNullOrEmpty(instance.GetProviderId(provider.ToString()));
 }
        /// <summary>
        /// Runs all metadata providers for an entity, and returns true or false indicating if at least one was refreshed and requires persistence
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <param name="force">if set to <c>true</c> [force].</param>
        /// <param name="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param>
        /// <returns>Task{System.Boolean}.</returns>
        public async Task <bool> ExecuteMetadataProviders(BaseItem item, CancellationToken cancellationToken, bool force = false, bool allowSlowProviders = true)
        {
            // Allow providers of the same priority to execute in parallel
            MetadataProviderPriority?currentPriority = null;
            var currentTasks = new List <Task <bool> >();

            var result = false;

            cancellationToken.ThrowIfCancellationRequested();

            // Determine if supported providers have changed
            var supportedProviders = MetadataProviders.Where(p => p.Supports(item)).ToList();

            BaseProviderInfo supportedProvidersInfo;

            if (SupportedProvidersKey == Guid.Empty)
            {
                SupportedProvidersKey = "SupportedProviders".GetMD5();
            }

            var  supportedProvidersHash = string.Join("+", supportedProviders.Select(i => i.GetType().Name)).GetMD5();
            bool providersChanged;

            item.ProviderData.TryGetValue(SupportedProvidersKey, out supportedProvidersInfo);
            if (supportedProvidersInfo == null)
            {
                // First time
                supportedProvidersInfo = new BaseProviderInfo {
                    ProviderId = SupportedProvidersKey, FileSystemStamp = supportedProvidersHash
                };
                providersChanged = force = true;
            }
            else
            {
                // Force refresh if the supported providers have changed
                providersChanged = force = force || supportedProvidersInfo.FileSystemStamp != supportedProvidersHash;
            }

            // If providers have changed, clear provider info and update the supported providers hash
            if (providersChanged)
            {
                _logger.Debug("Providers changed for {0}. Clearing and forcing refresh.", item.Name);
                item.ProviderData.Clear();
                supportedProvidersInfo.FileSystemStamp = supportedProvidersHash;
            }

            if (force)
            {
                item.ClearMetaValues();
            }

            // Run the normal providers sequentially in order of priority
            foreach (var provider in supportedProviders)
            {
                cancellationToken.ThrowIfCancellationRequested();

                // Skip if internet providers are currently disabled
                if (provider.RequiresInternet && !ConfigurationManager.Configuration.EnableInternetProviders)
                {
                    continue;
                }

                // Skip if is slow and we aren't allowing slow ones
                if (provider.IsSlow && !allowSlowProviders)
                {
                    continue;
                }

                // Skip if internet provider and this type is not allowed
                if (provider.RequiresInternet && ConfigurationManager.Configuration.EnableInternetProviders && ConfigurationManager.Configuration.InternetProviderExcludeTypes.Contains(item.GetType().Name, StringComparer.OrdinalIgnoreCase))
                {
                    continue;
                }

                // When a new priority is reached, await the ones that are currently running and clear the list
                if (currentPriority.HasValue && currentPriority.Value != provider.Priority && currentTasks.Count > 0)
                {
                    var results = await Task.WhenAll(currentTasks).ConfigureAwait(false);

                    result |= results.Contains(true);

                    currentTasks.Clear();
                }

                // Put this check below the await because the needs refresh of the next tier of providers may depend on the previous ones running
                //  This is the case for the fan art provider which depends on the movie and tv providers having run before them
                if (!force && !provider.NeedsRefresh(item))
                {
                    continue;
                }

                currentTasks.Add(FetchAsync(provider, item, force, cancellationToken));
                currentPriority = provider.Priority;
            }

            if (currentTasks.Count > 0)
            {
                var results = await Task.WhenAll(currentTasks).ConfigureAwait(false);

                result |= results.Contains(true);
            }

            if (providersChanged)
            {
                item.ProviderData[SupportedProvidersKey] = supportedProvidersInfo;
            }

            return(result || providersChanged);
        }
        /// <summary>
        /// Initializes this <see cref="LocalOutputAdapter"/>.
        /// </summary>
        /// <exception cref="ArgumentException"><b>InstanceName</b> is missing from the <see cref="AdapterBase.Settings"/>.</exception>
        public override void Initialize()
        {
            base.Initialize();

            Dictionary<string, string> settings = Settings;
            string setting;
            ulong badDataMessageInterval;

            // Validate settings.
            if (!settings.TryGetValue("instanceName", out m_instanceName) || string.IsNullOrWhiteSpace(m_instanceName))
                m_instanceName = Name.ToLower();

            // Track instance in static dictionary
            Instances[InstanceName] = this;

            if (!settings.TryGetValue("archivePath", out m_archivePath))
                m_archivePath = FilePath.GetAbsolutePath(FilePath.AddPathSuffix("Archive"));

            if (settings.TryGetValue("refreshMetadata", out setting) || settings.TryGetValue("autoRefreshMetadata", out setting))
                m_autoRefreshMetadata = setting.ParseBoolean();

            if (settings.TryGetValue("badDataMessageInterval", out setting) && ulong.TryParse(setting, out badDataMessageInterval))
                m_badDataMessageInterval = badDataMessageInterval;

            //if (settings.TryGetValue("useNamespaceReservation", out setting))
            //    m_useNamespaceReservation = setting.ParseBoolean();
            //else
            //    m_useNamespaceReservation = false;

            // Initialize metadata file.
            m_instanceName = m_instanceName.ToLower();
            m_archive.MetadataFile.FileName = Path.Combine(m_archivePath, m_instanceName + "_dbase.dat");
            m_archive.MetadataFile.PersistSettings = true;
            m_archive.MetadataFile.SettingsCategory = m_instanceName + m_archive.MetadataFile.SettingsCategory;
            m_archive.MetadataFile.FileAccessMode = FileAccess.ReadWrite;
            m_archive.MetadataFile.Initialize();

            // Initialize state file.
            m_archive.StateFile.FileName = Path.Combine(m_archivePath, m_instanceName + "_startup.dat");
            m_archive.StateFile.PersistSettings = true;
            m_archive.StateFile.SettingsCategory = m_instanceName + m_archive.StateFile.SettingsCategory;
            m_archive.StateFile.FileAccessMode = FileAccess.ReadWrite;
            m_archive.StateFile.Initialize();

            // Initialize intercom file.
            m_archive.IntercomFile.FileName = Path.Combine(m_archivePath, "scratch.dat");
            m_archive.IntercomFile.PersistSettings = true;
            m_archive.IntercomFile.SettingsCategory = m_instanceName + m_archive.IntercomFile.SettingsCategory;
            m_archive.IntercomFile.FileAccessMode = FileAccess.ReadWrite;
            m_archive.IntercomFile.Initialize();

            // Initialize data archive file.           
            m_archive.FileName = Path.Combine(m_archivePath, m_instanceName + "_archive.d");
            m_archive.FileSize = 100;
            m_archive.CompressData = false;
            m_archive.PersistSettings = true;
            m_archive.SettingsCategory = m_instanceName + m_archive.SettingsCategory;

            m_archive.RolloverStart += m_archive_RolloverStart;
            m_archive.RolloverComplete += m_archive_RolloverComplete;
            m_archive.RolloverException += m_archive_RolloverException;

            m_archive.DataReadException += m_archive_DataReadException;
            m_archive.DataWriteException += m_archive_DataWriteException;

            m_archive.OffloadStart += m_archive_OffloadStart;
            m_archive.OffloadComplete += m_archive_OffloadComplete;
            m_archive.OffloadException += m_archive_OffloadException;

            m_archive.OrphanDataReceived += m_archive_OrphanDataReceived;
            m_archive.FutureDataReceived += m_archive_FutureDataReceived;
            m_archive.OutOfSequenceDataReceived += m_archive_OutOfSequenceDataReceived;

            m_archive.Initialize();

            // Provide web service support.
            m_dataServices = new DataServices();
            m_dataServices.AdapterCreated += DataServices_AdapterCreated;
            m_dataServices.AdapterLoaded += DataServices_AdapterLoaded;
            m_dataServices.AdapterUnloaded += DataServices_AdapterUnloaded;
            m_dataServices.AdapterLoadException += AdapterLoader_AdapterLoadException;

            // Provide metadata sync support.
            m_metadataProviders = new MetadataProviders();
            m_metadataProviders.AdapterCreated += MetadataProviders_AdapterCreated;
            m_metadataProviders.AdapterLoaded += MetadataProviders_AdapterLoaded;
            m_metadataProviders.AdapterUnloaded += MetadataProviders_AdapterUnloaded;
            m_metadataProviders.AdapterLoadException += AdapterLoader_AdapterLoadException;

            // Provide archive replication support.
            m_replicationProviders = new ReplicationProviders();
            m_replicationProviders.AdapterCreated += ReplicationProviders_AdapterCreated;
            m_replicationProviders.AdapterLoaded += ReplicationProviders_AdapterLoaded;
            m_replicationProviders.AdapterUnloaded += ReplicationProviders_AdapterUnloaded;
            m_replicationProviders.AdapterLoadException += AdapterLoader_AdapterLoadException;
        }