diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 8ef9d19c9f..97ba647727 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -107,7 +107,7 @@ namespace MediaBrowser.Controller.Entities protected void AddChildrenInternal(IEnumerable children) { - lock (ChildrenSyncLock) + lock (_childrenSyncLock) { var newChildren = _children.ToList(); newChildren.AddRange(children); @@ -116,7 +116,7 @@ namespace MediaBrowser.Controller.Entities } protected void AddChildInternal(BaseItem child) { - lock (ChildrenSyncLock) + lock (_childrenSyncLock) { var newChildren = _children.ToList(); newChildren.Add(child); @@ -126,7 +126,7 @@ namespace MediaBrowser.Controller.Entities protected void RemoveChildrenInternal(IEnumerable children) { - lock (ChildrenSyncLock) + lock (_childrenSyncLock) { _children = _children.Except(children).ToList(); } @@ -134,7 +134,7 @@ namespace MediaBrowser.Controller.Entities protected void ClearChildrenInternal() { - lock (ChildrenSyncLock) + lock (_childrenSyncLock) { _children = new List(); } @@ -513,11 +513,11 @@ namespace MediaBrowser.Controller.Entities /// /// The children /// - private List _children; + private IReadOnlyList _children; /// /// The _children sync lock /// - protected object ChildrenSyncLock = new object(); + private readonly object _childrenSyncLock = new object(); /// /// Gets or sets the actual children. /// diff --git a/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs b/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs index f069d40c1f..a4d99ae17e 100644 --- a/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs +++ b/MediaBrowser.Server.Implementations/IO/DirectoryWatchers.cs @@ -66,7 +66,7 @@ namespace MediaBrowser.Server.Implementations.IO public async void RemoveTempIgnore(string path) { // This is an arbitraty amount of time, but delay it because file system writes often trigger events after RemoveTempIgnore has been called. - await Task.Delay(1000).ConfigureAwait(false); + await Task.Delay(1500).ConfigureAwait(false); string val; _tempIgnoredPaths.TryRemove(path, out val); diff --git a/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs b/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs index ca878476f0..5ef04ef9d8 100644 --- a/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs +++ b/MediaBrowser.Server.Implementations/Library/LuceneSearchEngine.cs @@ -1,10 +1,4 @@ -using Lucene.Net.Analysis.Standard; -using Lucene.Net.Documents; -using Lucene.Net.Index; -using Lucene.Net.QueryParsers; -using Lucene.Net.Search; -using Lucene.Net.Store; -using MediaBrowser.Controller; +using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; @@ -30,37 +24,6 @@ namespace MediaBrowser.Server.Implementations.Library _libraryManager = libraryManager; _logger = logManager.GetLogger("Lucene"); - - //string luceneDbPath = serverPaths.DataPath + "\\SearchIndexDB"; - //if (!System.IO.Directory.Exists(luceneDbPath)) - // System.IO.Directory.CreateDirectory(luceneDbPath); - //else if(File.Exists(luceneDbPath + "\\write.lock")) - // File.Delete(luceneDbPath + "\\write.lock"); - - //LuceneSearch.Init(luceneDbPath, _logger); - - //BaseItem.LibraryManager.LibraryChanged += LibraryChanged; - } - - //public void LibraryChanged(object source, ChildrenChangedEventArgs changeInformation) - //{ - // Task.Run(() => - // { - // if (changeInformation.ItemsAdded.Count + changeInformation.ItemsUpdated.Count > 0) - // { - // LuceneSearch.AddUpdateLuceneIndex(changeInformation.ItemsAdded.Concat(changeInformation.ItemsUpdated)); - // } - - // if (changeInformation.ItemsRemoved.Count > 0) - // { - // LuceneSearch.RemoveFromLuceneIndex(changeInformation.ItemsRemoved); - // } - // }); - //} - - public void AddItemsToIndex(IEnumerable items) - { - LuceneSearch.AddUpdateLuceneIndex(items); } /// @@ -72,15 +35,7 @@ namespace MediaBrowser.Server.Implementations.Library /// searchTerm public IEnumerable Search(IEnumerable items, string searchTerm) { - if (string.IsNullOrEmpty(searchTerm)) - { - throw new ArgumentNullException("searchTerm"); - } - - var hits = LuceneSearch.Search(searchTerm, items.Count()); - - //return hits; - return hits.Where(searchHit => items.Any(p => p.Id == searchHit.Id)); + return items; } public void Dispose() @@ -362,231 +317,4 @@ namespace MediaBrowser.Server.Implementations.Library return term.Split().Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); } } - - public static class LuceneSearch - { - private static ILogger logger; - - private static string path; - private static object lockOb = new object(); - - private static FSDirectory _directory; - private static FSDirectory directory - { - get - { - if (_directory == null) - { - logger.Info("Opening new Directory: " + path); - _directory = FSDirectory.Open(path); - } - return _directory; - } - set - { - _directory = value; - } - } - - private static IndexWriter _writer; - private static IndexWriter writer - { - get - { - if (_writer == null) - { - logger.Info("Opening new IndexWriter"); - _writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED); - } - return _writer; - } - set - { - _writer = value; - } - } - - private static Dictionary bonusTerms; - - public static void Init(string path, ILogger logger) - { - logger.Info("Lucene: Init"); - - bonusTerms = new Dictionary(); - bonusTerms.Add("Name", 2); - bonusTerms.Add("Overview", 1); - - // Optimize the DB on initialization - // TODO: Test whether this has.. - // Any effect what-so-ever (apart from initializing the indexwriter on the mainthread context, which makes things a whole lot easier) - // Costs too much time - // Is heavy on the CPU / Memory - - LuceneSearch.logger = logger; - LuceneSearch.path = path; - - writer.Optimize(); - } - - private static StandardAnalyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); - - private static Searcher searcher = null; - - private static Document createDocument(BaseItem data) - { - Document doc = new Document(); - - doc.Add(new Field("Id", data.Id.ToString(), Field.Store.YES, Field.Index.NO)); - doc.Add(new Field("Name", data.Name, Field.Store.YES, Field.Index.ANALYZED) { Boost = 2 }); - doc.Add(new Field("Overview", data.Overview != null ? data.Overview : "", Field.Store.YES, Field.Index.ANALYZED)); - - return doc; - } - - private static void Create(BaseItem item) - { - lock (lockOb) - { - try - { - if (searcher != null) - { - try - { - searcher.Dispose(); - } - catch (Exception e) - { - logger.ErrorException("Error in Lucene while creating index (disposing alive searcher)", e, item); - } - - searcher = null; - } - - _removeFromLuceneIndex(item); - _addToLuceneIndex(item); - } - catch (Exception e) - { - logger.ErrorException("Error in Lucene while creating index", e, item); - } - } - } - - private static void _addToLuceneIndex(BaseItem data) - { - // Prevent double entries - var doc = createDocument(data); - - writer.AddDocument(doc); - } - - private static void _removeFromLuceneIndex(BaseItem data) - { - var query = new TermQuery(new Term("Id", data.Id.ToString())); - writer.DeleteDocuments(query); - } - - public static void AddUpdateLuceneIndex(IEnumerable items) - { - foreach (var item in items) - { - logger.Info("Adding/Updating BaseItem " + item.Name + "(" + item.Id.ToString() + ") to/on Lucene Index"); - Create(item); - } - - writer.Commit(); - writer.Flush(true, true, true); - } - - public static void RemoveFromLuceneIndex(IEnumerable items) - { - foreach (var item in items) - { - logger.Info("Removing BaseItem " + item.Name + "(" + item.Id.ToString() + ") from Lucene Index"); - _removeFromLuceneIndex(item); - } - - writer.Commit(); - writer.Flush(true, true, true); - } - - public static IEnumerable Search(string searchQuery, int maxHits) - { - var results = new List(); - - lock (lockOb) - { - try - { - if (searcher == null) - { - searcher = new IndexSearcher(directory, true); - } - - BooleanQuery finalQuery = new BooleanQuery(); - - MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, new string[] { "Name", "Overview" }, analyzer, bonusTerms); - - string[] terms = searchQuery.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); - foreach (string term in terms) - finalQuery.Add(parser.Parse(term.Replace("~", "") + "~0.75"), Occur.SHOULD); - foreach (string term in terms) - finalQuery.Add(parser.Parse(term.Replace("*", "") + "*"), Occur.SHOULD); - - logger.Debug("Querying Lucene with query: " + finalQuery.ToString()); - - long start = DateTime.Now.Ticks; - var searchResult = searcher.Search(finalQuery, maxHits); - foreach (var searchHit in searchResult.ScoreDocs) - { - Document hit = searcher.Doc(searchHit.Doc); - results.Add(BaseItem.LibraryManager.GetItemById(Guid.Parse(hit.Get("Id")))); - } - long total = DateTime.Now.Ticks - start; - float msTotal = (float)total / TimeSpan.TicksPerMillisecond; - logger.Debug(searchResult.ScoreDocs.Length + " result" + (searchResult.ScoreDocs.Length == 1 ? "" : "s") + " in " + msTotal + " ms."); - } - catch (Exception e) - { - logger.ErrorException("Error while searching Lucene index", e); - } - } - - return results; - } - - public static void CloseAll() - { - logger.Debug("Lucene: CloseAll"); - if (writer != null) - { - logger.Debug("Lucene: CloseAll - Writer is alive"); - writer.Flush(true, true, true); - writer.Commit(); - writer.WaitForMerges(); - writer.Dispose(); - writer = null; - } - if (analyzer != null) - { - logger.Debug("Lucene: CloseAll - Analyzer is alive"); - analyzer.Close(); - analyzer.Dispose(); - analyzer = null; - } - if (searcher != null) - { - logger.Debug("Lucene: CloseAll - Searcher is alive"); - searcher.Dispose(); - searcher = null; - } - if (directory != null) - { - logger.Debug("Lucene: CloseAll - Directory is alive"); - directory.Dispose(); - directory = null; - } - } - } } diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj index f409b72059..86e250fe42 100644 --- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj +++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj @@ -37,12 +37,6 @@ ..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll - - ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll - - - ..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll - diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config index 5d94634084..d4d92f09fc 100644 --- a/MediaBrowser.Server.Implementations/packages.config +++ b/MediaBrowser.Server.Implementations/packages.config @@ -1,7 +1,6 @@  - @@ -13,6 +12,5 @@ - \ No newline at end of file diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj index 61ec19dd57..477f2fd45c 100644 --- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj +++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj @@ -119,10 +119,6 @@ ..\packages\Hardcodet.Wpf.TaskbarNotification.1.0.4.0\lib\net40\Hardcodet.Wpf.TaskbarNotification.dll - - False - ..\packages\DotNetZip.1.9.1.8\lib\net20\Ionic.Zip.dll - ..\packages\MahApps.Metro.0.11.0.17-ALPHA\lib\net45\MahApps.Metro.dll diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config index e680b556ff..d776597ec1 100644 --- a/MediaBrowser.ServerApplication/packages.config +++ b/MediaBrowser.ServerApplication/packages.config @@ -1,6 +1,5 @@  - diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index eb846cd2f0..0b8b04a2f1 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -16,6 +16,7 @@ +