protected override ImporterConverterAbstract GetNext(IEventListener iel, CancellationToken iCancellationToken) { try { IMccDescompactor Sex = Context.RarManager.InstanciateExctractor(_FN, iel, Context); if (Sex == null) return null; bool exportsuccess = false; using (Sex) { exportsuccess = Sex.Extract(iel, iCancellationToken); } OutPutFiles = Sex.DescompactedFiles; if (iCancellationToken.IsCancellationRequested) { return null; } if (exportsuccess==false) return null; return new XMLImporter(Sex.RootXML, _ImportAllMetaData, Context.Folders.File) { Rerooter = Sex.Rerooter}; } catch (Exception e) { iel.Report(new UnknownRarError(_FN)); Trace.WriteLine("Decompressing problem " + e.ToString()); return null; } }
protected override ImporterConverterAbstract GetNext(IEventListener iel, CancellationToken iCancellationToken) { string dp = Path.GetFileName(_FileName); iel.Report(new ExtractProgessEventArgs(dp)); ImporterConverterAbstract next = null; try { IRarDescompactor Sex = Context.RarManager.InstanciateExctractorWithPassword(_FileName, iel); if (Sex == null) { return next; } using (Sex) { if (iCancellationToken.IsCancellationRequested) return null; Sex.DescompactedFiles = _ExtractedFiles; bool res = Sex.Extract(iel, iCancellationToken); _RarFileNames =Sex.ArchiveNames; if (iCancellationToken.IsCancellationRequested) return null; if (res) { NonRecursiveFolderInspector nfr = new NonRecursiveFolderInspector(_IInternalMusicSession,_ExtractedFiles, Sex.Helper, iel); ImporterConverterAbstract[] Importers = nfr.Importers; if (Importers.Length == 0) { iel.Report(new NoMusicImportErrorEventArgs(Sex.Helper.DisplayName)); } else if (Importers.Length > 1) { Trace.WriteLine("Unhandled configuration in a rar file"); iel.Report(new UnhandledRarFile(Sex.Helper.DisplayName)); } else next = Importers[0]; } } } catch(Exception e) { iel.Report(new UnknownRarError(dp)); Trace.WriteLine("Decompressing problem " + e.ToString()); next = null; } return next; }
protected override ImporterConverterAbstract GetNext(IEventListener iel, CancellationToken iCancellationToken) { iel.Report(new ImportProgessEventArgs(_NameClue.DisplayName)); List<Track> LocalTrack = GetTracks(iel, iCancellationToken).CancelableToList(iCancellationToken); if (iCancellationToken.IsCancellationRequested) { RawImportEnded(KOEndImport()); return null; } if (LocalTrack.Count == 0) { ImportEnded(); return null; } List<string> Pictures = Images.OrderBy( imp => { string ifn = Path.GetFileNameWithoutExtension(imp).ToLower(); return (ifn.Contains("cover") || ifn.Contains("front"))? 0 : 1; } ).ToList(); foreach (Album Al in (from r in LocalTrack select r.Owner).Distinct<Album>()) { using (IModifiableAlbum AM = Al.GetModifiableAlbum(true, Context)) { if (AM.FrontImage != null) continue; int i = 0; foreach (string apic in Pictures) { IAlbumPicture res = AM.AddAlbumPicture(apic, i); if (res != null) i++; } if (iCancellationToken.IsCancellationRequested) { RawImportEnded(KOEndImport()); return null; } AM.Commit(); } } ImportEnded(); return null; }
protected override ImporterConverterAbstract GetNext(IEventListener iel, CancellationToken iCancellationToken) { iel.Report(new ImportProgessEventArgs(_FN)); IList<AlbumDescriptor> Als = AlbumDescriptorExchanger.Import(_FN, true, _Reroot, Rerooter); if (Als == null) { iel.Report(new UnsupportedFormat(_FN)); return null; } Als.TakeWhileNotCancelled(iCancellationToken).Apply(al => Album.GetAlbumFromExportAlbum(al, Context, this, _ImportAllMetaData)); if (iCancellationToken.IsCancellationRequested) { RawImportEnded(KOEndImport()); return null; } ImportEnded(); return null; }
private void ExtractCallBack(ExtractFileCallbackArgs efc, IEventListener iel, CancellationToken iCancellationToken) { switch (efc.Reason) { case ExtractFileCallbackReason.Start: string nd = null; bool root = false; if (efc.ArchiveFileInfo.FileName == MusicExporter.XMLName) { nd = _ICC.Folders.Temp; root = true; } else { nd = _ICC.Folders.File; } efc.ExtractToFile = FileInternalToolBox.CreateNewAvailableName(Path.Combine(nd, efc.ArchiveFileInfo.FileName)); if (root) _RX = efc.ExtractToFile; else { Directory.CreateDirectory(Path.GetDirectoryName(efc.ExtractToFile)); } if ((!efc.ArchiveFileInfo.IsDirectory) && !(root)) { iel.Report(new ExtractProgessEventArgs(string.Format("{0} from {1}", Path.GetFileName(efc.ArchiveFileInfo.SafePath()), _Sex.FileName))); AddAssociationIfNeeded(efc.ArchiveFileInfo.FileName, efc.ExtractToFile); } DescompactedFiles.Add(efc.ExtractToFile); break; case ExtractFileCallbackReason.Failure: iel.OnFactorisableError<UnableToExtractFileFromRar>(string.Format("{0} from {1} : {2}", Path.GetFileName(efc.ArchiveFileInfo.FileName), _Sex.FileName, efc.Exception)); efc.Exception = null; efc.ExtractToFile = null; _Success = false; break; } if (iCancellationToken.IsCancellationRequested) { _Success = false; efc.CancelExtraction = true; } }
protected override ImporterConverterAbstract GetNext(IEventListener iel, CancellationToken iCancellationToken) { if (iCancellationToken.IsCancellationRequested) { return null; } SpaceChecker sc = new SpaceChecker(Context.ConvertManager.PathFromOutput(_ListMusic[0], _ClueName), _ListMusic); if (!sc.OK) { iel.Report(new NotEnougthSpace(sc.ToString())); return null; } try { _TargetConvertedMusic = ConvertMusic(iel, iCancellationToken).ToList(); } catch (ImportExportException iee) { throw iee; } catch (Exception e) { Trace.WriteLine(string.Format("Exception during music convestion, could be ok if this a cancellation exception {0}", e)); return null; } if (iCancellationToken.IsCancellationRequested) { return null; } if (_TargetConvertedMusic.Count == 0) { return null; } return new MusicImporter(_TargetConvertedMusic, _ListImage, _ClueName); }
private IEnumerable<string> ConvertMusic(IEventListener iel, CancellationToken iCancellationToken) { int Current = 0; if (iCancellationToken.IsCancellationRequested) yield break; foreach (string Music in _ListMusic) { iel.Report(new ConvertProgessEventArgs(_ClueName.DisplayName, ++Current, _ListMusic.Count)); string OutDirectory = Context.ConvertManager.PathFromOutput(Music, _ClueName); string TempDir = Context.Folders.Temp; using (IMusicFileConverter imf = _IMusicConverter.GetMusicConverter(Music, OutDirectory, TempDir)) { if (iCancellationToken.IsCancellationRequested) yield break; bool res = imf.ConvertTomp3(); if (res) { AddConvertedFiles(Music, imf.ConvertName); yield return imf.ConvertName; } else { Trace.WriteLine("Unable to convert file"+Music); iel.OnFactorisableError<UnableToConvertFile>(Music); } } } }
static internal ICollector CollectorForMusicToConvert(IMusicConverter iMusicConverter, List<string> Music, List<string> Image, List<string> Cue, IImportHelper ClueName, IEventListener IEL) { int ccont = Cue.Count; int mcount =Music.Count; if (ccont >= mcount) { if ((ccont == 1) && (mcount==1)) { AlbumDescriptor ad = AlbumDescriptor.FromCUESheet(Cue[0]); if (ad != null) { string mus = Path.GetFileNameWithoutExtension(Music[0]).RemoveInvalidCharacters().ToLower(); if ((Path.GetFileNameWithoutExtension(ad.CUEFile).RemoveInvalidCharacters().ToLower() == mus) || (mus == Path.GetFileNameWithoutExtension(Cue[0]).RemoveInvalidCharacters().ToLower())) { if ((ad.CheckCueConsistency() == false) || (iMusicConverter.GetFileLengthInSeconds(Music[0]) <= ad.GetCueMinLengthInseconds())) { CueWillbeDiscarded cwd = new CueWillbeDiscarded(Cue[0],Music[0]); IEL.Report(cwd); if (cwd.Continue == false) return null; } else { return new CollectorForCueConvertMusic(iMusicConverter, Music[0], Image, ad, ClueName); } } } } else { var cues = Cue.Select(c=>AlbumDescriptor.FromCUESheet(c)).Where(c=>c!=null); //Cherchons les matchs parfaits CuePairingHelper cph = new CuePairingHelper(Music, cues).SetCueGlue(c => Path.GetFileName(c.CUEFile).RemoveInvalidCharacters().ToLower()) .SetMusicGlue(M => Path.GetFileName(M).RemoveInvalidCharacters().ToLower()).Compute(); List<Tuple<string, AlbumDescriptor>> OK = cph.Matches; if (cph.FullMatch) { return new CollectorForCueConvertMusic(iMusicConverter,OK, Image, ClueName); } //Cherchons les matchs imparfaits pour les cue restants cph = new CuePairingHelper(cph.Remaining, cues).SetCueGlue(c => Path.GetFileNameWithoutExtension(c.CUEFile).RemoveInvalidCharacters().ToLower()) .SetMusicGlue(M => Path.GetFileNameWithoutExtension(M).RemoveInvalidCharacters().ToLower()).Compute(); OK.AddRange(cph.Matches); if (cph.FullMatch) { return new CollectorForCueConvertMusic(iMusicConverter,OK, Image, ClueName); } //Derniere chance cph = new CuePairingHelper(cph.Remaining, cues).SetCueGlue(c => Path.GetFileNameWithoutExtension(c.CUESheetFileName).RemoveInvalidCharacters().ToLower()) .SetMusicGlue(M => Path.GetFileNameWithoutExtension(M).RemoveInvalidCharacters().ToLower()).Compute(); if (cph.FullMatch) { OK.AddRange(cph.Matches); return new CollectorForCueConvertMusic(iMusicConverter,OK, Image, ClueName); } } } return new CollectorForConvertMusic(iMusicConverter,Music, Image, ClueName); }
protected override ImporterConverterAbstract GetNext(IEventListener iel, CancellationToken iCancellationToken) { int CDnumber = _IMusicConverter.GetDriverNumber(_Driver); if (!CDHelper.CanOpenCDDoor(CDnumber)) { //ca pue un lecteur de cd qu'on ne peut pas ouvrir //je ne fair rien dans ce cas (cle 3G?) Trace.WriteLine("Problem due to device detected as CD driver"); return null; } using (CDLocker cdl = CDLocker.GetLocker(CDnumber)) { if (!cdl.IsOK) { iel.Report(new NoCDInsertedArgs()); Trace.WriteLine("CD driver not ready"); return null; } if (!CDHelper.IsCDAudio(CDnumber)) { iel.Report(new NoCDAudioInsertedArgs()); System.Diagnostics.Trace.WriteLine("CD not audio"); return null; } iel.Report(new CDIndentifyingProgessEventArgs()); CDInfoHandler cih = new CDInfoHandler(CDnumber); IEnumerable<MatchAlbum> albums = Context.FindFromHashes(cih.IDs.RawHash); if (albums.Any()) { OtherAlbumsConfirmationNeededEventArgs error = new OtherAlbumsConfirmationNeededEventArgs(albums); iel.Report(error); System.Diagnostics.Trace.WriteLine("CD potentially aleady imported"); if (!error.Continue) { System.Diagnostics.Trace.WriteLine("stopping import"); return null; } } IWebQuery webq = Context.Session.WebQueryFactory.FromCDInfo(cih); webq.NeedCoverArt = false; IInternetFinder ifn = Context.Session.GetInternetFinder(webq); ifn.Compute(iCancellationToken,null); AmbigueousCDInformationArgs acfi = new AmbigueousCDInformationArgs(ifn.Result.Found, AlbumDescriptor.CreateBasicFromCD(cih, Context)); iel.Report(acfi); if (!acfi.Continue) return null; AlbumDescriptor ifad = acfi.SelectedInfo as AlbumDescriptor; iel.Report(new CDImportingProgessEventArgs(ifad.Name)); ifad.MergeIDsFromCDInfos(cih); IMusicfilesConverter IMC = _IMusicConverter.GetCDMusicConverter(ifad, Context.Folders.File, false, CDnumber); if (IMC == null) { TimeSpan ts = TimeSpan.FromSeconds(7); int repeat = 0; int Maxtent = 3; while ((IMC == null) && (repeat < Maxtent)) { bool Forcebute = repeat == (Maxtent - 1); Thread.Sleep(ts); IMC = _IMusicConverter.GetCDMusicConverter(ifad, Context.Folders.File, Forcebute, CDnumber); repeat++; Trace.WriteLine(string.Format("Trial {0} to get CDMusicConverter, Forcebute {1} success {2}", repeat, Forcebute, (IMC == null))); ts = TimeSpan.FromSeconds(ts.TotalSeconds * 3); } if (IMC == null) { System.Diagnostics.Trace.WriteLine("no importer returned"); iel.Report(new CDInUse()); return null; } } Action ParrallelCoverLoading = null; IList<WebMatch<IFullAlbumDescriptor>> resultwithimage = null; if (acfi.PreprocessedWebInfo != null) { resultwithimage = acfi.PreprocessedWebInfo; ParrallelCoverLoading = () => acfi.PreprocessedWebInfo.Apply(wr => wr.FindItem.LoadImages()); } else { IWebQuery webqim = new WebQueryFactory(Context.Session).FromAlbumDescriptor(ifad); webqim.NeedCoverArt = true; IInternetFinder ifni = Context.Session.GetInternetFinder(webqim); resultwithimage = new List<WebMatch<IFullAlbumDescriptor>>(); if (ifad.HasImage()) { resultwithimage.Add(new WebMatch<IFullAlbumDescriptor>(ifad, MatchPrecision.Suspition, acfi.Provider)); } ParrallelCoverLoading = () => { ifad.LoadImages(); ifni.Compute(iCancellationToken,null); resultwithimage.AddCollection(ifni.Result.Found); }; } int TN = ifad.TrackDescriptors.Count; IAsyncResult ias = ParrallelCoverLoading.BeginInvoke(null, null); bool feedbacknegative = false; IProgress<TrackConverted> progress = new SimpleProgress<TrackConverted> ( (e) => { iel.Report(new ConvertProgessEventArgs(ifad.Name, (int)e.Track.TrackNumber, TN)); if (e.OK) { _TDs.Add(e.Track); } else { feedbacknegative = true; iel.OnFactorisableError<UnableToConvertFile>(e.Track.Name); } } ); bool convres = IMC.ConvertTomp3(progress, iCancellationToken); if ((convres == false) && (_TDs.Count == 0) && (feedbacknegative == false)) { iel.Report(new CDUnknownErrorArgs()); return null; } if (iCancellationToken.IsCancellationRequested) { return null; } if (!ias.IsCompleted) { iel.Report(new CDImportingProgessAdditionalCoverInfoEventArgs(ifad)); } if (_OpenCDDoorOnComplete) CDHelper.OpenCDDoor(); bool okfound = ias.AsyncWaitHandle.WaitOne(TimeSpan.FromMinutes(3), false); //j'attends pas plus de 1 minute apres avoir grave le cd pour trouver //les pochettes sur internet Trace.WriteLine(string.Format("CD import cover from internet time out result (false:timedout): {0}!", okfound)); if (resultwithimage != null) { int tracknumber = ifad.RawTrackDescriptors.Count; var images = resultwithimage.Where(wr => ((wr.FindItem.MatchTrackNumberOnDisk(tracknumber)) && (wr.FindItem.Images != null) && (wr.FindItem.Images.Count > 0))).ToList(); if (images.Count > 0) { Trace.WriteLine(string.Format("{0} Image(s) found!!", images.Count)); CDCoverInformationArgs cdfi = new CDCoverInformationArgs(images, ifad); iel.Report(cdfi); } else { Trace.WriteLine(string.Format("Information found but no matching image found for CD:{0} !",ifad)); } } else { Trace.WriteLine("No image found for CD!"); } Trace.WriteLine("Import CD OK"); return new MusicWithMetadaImporter(_TDs.ToArray(), new List<string>(), new ICDInfosHelperAdpt(ifad)); } }
private bool OnErrorUserExit(IEventListener iel,CorruptedRarOrMissingPasswordArgs cr) { iel.Report(cr); if ((cr.accept) && (cr.SavePassword)) _IUnrarUserSettings. AddPassword(cr.Password); if (_AddRar!=cr.SavePassword) { _IUnrarUserSettings.AddUseRarPasswordToList = cr.SavePassword; _AddRar = cr.SavePassword; return true; } return false; }
protected override ImporterConverterAbstract GetNext(IEventListener iel, CancellationToken iCancellationToken) { if (_Done) throw new InvalidOperationException("reentrance"); _Done = true; if (!Analyse()) { //Cue does not match..let's do the easy way. return new MusicConverterImporter(_IMusicConverter, _MusicandCueFile.Select(i => i.Item1).ToList(), _ListImage, _ClueName); } foreach (Tuple<string, AlbumDescriptor> MAC in _MusicandCueFile) { _MusicConverted.Add(MAC.Item1); _MusicConverted.Add(MAC.Item2.CUESheetFileName); } List<TrackConverted> tracks = new List<TrackConverted>(); SpaceChecker sc = new SpaceChecker(Context.ConvertManager.PathFromOutput(_MusicandCueFile[0].Item1, _ClueName), from mac in _MusicandCueFile select mac.Item1); if (!sc.OK) { iel.Report(new NotEnougthSpace(sc.ToString())); return null; } if (iCancellationToken.IsCancellationRequested) { return null; } foreach (Tuple<string, AlbumDescriptor> MAC in _MusicandCueFile) { string MusicPath = MAC.Item1; AlbumDescriptor Cs = MAC.Item2; int Current = 1; iel.Report(new ConvertProgessEventArgs(_ClueName.DisplayName, Current, Cs.RawTrackDescriptors.Count)); bool OK = false; using (IMusicfilesConverter imcc = _IMusicConverter.GetMusicConverter(MusicPath, Cs.RawTrackDescriptors, Context.ConvertManager.PathFromOutput(MusicPath, _ClueName), Context.Folders.Temp)) { IProgress<TrackConverted> progress = new SimpleProgress<TrackConverted> ( (e) => { iel.Report(new ConvertProgessEventArgs(_ClueName.DisplayName, ++Current, Cs.RawTrackDescriptors.Count)); if (e.OK) { tracks.Add(e); AddConvertedFiles(MusicPath, e.Track.Path); } else iel.OnFactorisableError<UnableToConvertFile>(e.Track.Name); }); OK = imcc.ConvertTomp3(progress, iCancellationToken); } } if (iCancellationToken.IsCancellationRequested) { return null; } return new MusicWithMetadaImporter((from t in tracks select t.Track).ToArray<ITrackDescriptor>(), _ListImage, _ClueName); ; }
private void ExtractCallBack(ExtractFileCallbackArgs efc, IEventListener iel, CancellationToken iCancellationToken) { switch (efc.Reason) { case ExtractFileCallbackReason.Start: string Dest = GetFileName(efc.ArchiveFileInfo); if (Dest == null) { efc.ExtractToFile = null; break; } efc.ExtractToFile = Dest; if (!efc.ArchiveFileInfo.IsDirectory) iel.Report(new ExtractProgessEventArgs(string.Format("{0} from {1}", Path.GetFileName(efc.ArchiveFileInfo.SafePath()), RarContext.DisplayName))); Files.Add(Dest); break; case ExtractFileCallbackReason.Failure: iel.OnFactorisableError<UnableToExtractFileFromRar>(string.Format("{0} from {1} : {2}", Path.GetFileName(efc.ArchiveFileInfo.SafePath()), RarContext.DisplayName, efc.Exception)); efc.Exception = null; efc.ExtractToFile = null; _DOK = false; break; } if (iCancellationToken.IsCancellationRequested) efc.CancelExtraction = true; }
public bool Extract(IEventListener Listener, CancellationToken iCancellationToken) { if (!CanBeImported) { Listener.Report(new FileTooLongArgs((_RarContext as IImportHelper).DisplayName)); return false; } if (!ContainsMusic) { Listener.Report(new NoMusicImportErrorEventArgs((_RarContext as IImportHelper).DisplayName)); return false; } //check available space SpaceChecker sc = new SpaceChecker(Root, _Sex.UnpackedSize * (ContainsCompressedMusic ? 2 : 1)); if (!sc.OK) { Listener.Report(new NotEnougthSpace(sc.ToString())); return false; } return PrivateDecompactor(Listener, iCancellationToken); }
IImporter IImporter.Import(IEventListener iel, CancellationToken iCancellationToken) { ITracksDescriptorBuilder TD = TrackDescriptor.GetItunesBuilder(); try { FileInfo iTunesFile = new FileInfo(_MyXMLFile); if (!iTunesFile.Exists) { iel.Report(new FileNotFoundArgs("Itunes Library")); return null; } iel.Report(new ImportProgessEventArgs("Itunes Library")); int Count = Convert.ToInt32(iTunesFile.Length / 1500); XmlReaderSettings settings = new XmlReaderSettings(); settings.DtdProcessing = DtdProcessing.Ignore; using (XmlReader reader = XmlReader.Create(_MyXMLFile, settings)) { if (!reader.Read()) { iel.Report(new ItunesImportError()); return null; } if (!reader.ReadToFollowing(iTunesKeys.List)) { iel.Report(new ItunesImportError()); return null; } if (!reader.ReadToDescendant(iTunesKeys.dict)) { iel.Report(new ItunesImportError()); return null; } if (!reader.ReadToDescendant(iTunesKeys.dict)) { iel.Report(new ItunesImportError()); return null; } XmlReader reader2 = reader.ReadSubtree(); if (!reader2.Read()) { iel.Report(new ItunesImportError()); return null; } if (!reader2.ReadToDescendant(iTunesKeys.dict)) { iel.Report(new ItunesImportError()); return null; } int Compt = 0; do { if ((Compt % 50) == 0) iel.Report(new ImportingTrack(Compt + 1)); IAttributeObjectBuilder<TrackDescriptor> TuD = TD.DescribeNewTrack(); XmlReader inner = reader2.ReadSubtree(); while (inner.ReadToFollowing(iTunesKeys.Key)) { TuD.DescribeAttribute(inner.ReadString(), () => { inner.Read(); return inner.ReadString(); }); } ITrackDescriptor itd = TuD.Mature(); if ((_ImportBrokenTrack) || (File.Exists(itd.Path))) Track.GetTrackFromTrackDescriptor(itd, false, _IIC); Compt++; } while (reader2.ReadToFollowing(iTunesKeys.dict)); } } catch (Exception e) { iel.Report(new ItunesImportError()); Trace.WriteLine(e.ToString()); } return null; }