public bool TryExtractMetadata(IResourceAccessor mediaItemAccessor, IDictionary <Guid, IList <MediaItemAspect> > extractedAspectData, bool importOnly, bool forceQuickMode) { IFileSystemResourceAccessor fsra = mediaItemAccessor as IFileSystemResourceAccessor; if (fsra == null || !fsra.IsFile) { return(false); } if (extractedAspectData.ContainsKey(AudioAspect.ASPECT_ID)) { return(false); } try { var extension = DosPathHelper.GetExtension(fsra.ResourceName).ToLowerInvariant(); if (extension != ".ts") { return(false); } using (MediaInfoWrapper mediaInfo = ReadMediaInfo(fsra)) { // Before we start evaluating the file, check if it is not a video file ( if (mediaInfo.IsValid && (mediaInfo.GetVideoCount() != 0 || mediaInfo.GetAudioCount() == 0)) { return(false); } string fileName = ProviderPathHelper.GetFileNameWithoutExtension(fsra.Path) ?? string.Empty; MediaItemAspect.SetAttribute(extractedAspectData, MediaAspect.ATTR_TITLE, fileName); MultipleMediaItemAspect providerResourceAspect = MediaItemAspect.CreateAspect(extractedAspectData, ProviderResourceAspect.Metadata); providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_SIZE, fsra.Size); providerResourceAspect.SetAttribute(ProviderResourceAspect.ATTR_MIME_TYPE, "slimtv/radio"); var audioBitrate = mediaInfo.GetAudioBitrate(0); if (audioBitrate.HasValue) { MediaItemAspect.SetAttribute(extractedAspectData, AudioAspect.ATTR_BITRATE, (int)(audioBitrate.Value / 1000)); // We store kbit/s; } var audioChannels = mediaInfo.GetAudioChannels(0); if (audioChannels.HasValue) { MediaItemAspect.SetAttribute(extractedAspectData, AudioAspect.ATTR_CHANNELS, audioChannels.Value); } var audioSampleRate = mediaInfo.GetAudioSampleRate(0); if (audioSampleRate.HasValue) { MediaItemAspect.SetAttribute(extractedAspectData, AudioAspect.ATTR_SAMPLERATE, audioSampleRate.Value); } MediaItemAspect.SetAttribute(extractedAspectData, AudioAspect.ATTR_ENCODING, mediaInfo.GetAudioCodec(0)); // MediaInfo returns milliseconds, we need seconds long?time = mediaInfo.GetPlaytime(0); if (time.HasValue && time > 1000) { MediaItemAspect.SetAttribute(extractedAspectData, AudioAspect.ATTR_DURATION, time.Value / 1000); } } return(true); } catch (Exception e) { // Only log at the info level here - And simply return false. This makes the importer know that we // couldn't perform our task here ServiceRegistration.Get <ILogger>().Info("RadioRecordingMetadataExtractor: Exception reading resource '{0}' (Text: '{1}')", fsra.CanonicalLocalResourcePath, e.Message); return(false); } }
public void AddMediaInfo(MediaInfoWrapper mediaInfo) { // This method will be called at least one time, for video DVDs it will be called multiple times for the different // .ifo files. The first time this method is called, the given media info instance is the "major" instance, i.e. // in case of a video DVD, it is the video_ts.ifo file. // We will collect most of our interesting attributes by taking the first one which is available. All others will then be // ignored. Only for some attributes, all values will be collected. for (int i = 0; i < mediaInfo.GetVideoCount(); i++) { if (!_ar.HasValue) { _ar = mediaInfo.GetAR(i); } if (!_frameRate.HasValue) { _frameRate = mediaInfo.GetFramerate(i); } if (!_width.HasValue) { _width = mediaInfo.GetWidth(i); } if (!_height.HasValue) { _height = mediaInfo.GetHeight(i); } if (!_playTime.HasValue) { long?time = mediaInfo.GetPlaytime(i); if (time.HasValue && time > 1000) { _playTime = time.Value; } } if (!_vidBitRate.HasValue) { _vidBitRate = mediaInfo.GetVidBitrate(i); } string vidCodec = mediaInfo.GetVidCodec(i); if (!string.IsNullOrEmpty(vidCodec) && !_vidCodecs.Contains(vidCodec)) { _vidCodecs.Add(vidCodec); } } _audioStreamCount = mediaInfo.GetAudioCount(); for (int i = 0; i < _audioStreamCount; i++) { if (!_audBitRate.HasValue) { _audBitRate = mediaInfo.GetAudioBitrate(i); } string audCodec = mediaInfo.GetAudioCodec(i); if (!string.IsNullOrEmpty(audCodec) && !_audCodecs.Contains(audCodec)) { _audCodecs.Add(audCodec); } string audLang = mediaInfo.GetAudioLanguage(i); if (!string.IsNullOrEmpty(audLang) && !_audioLanguages.Contains(audLang)) { _audioLanguages.Add(audLang); } } }