public void AddCategoryMapping(string trackerCategory, TorznabCategory torznabCategory, string trackerCategoryDesc = null) { _categoryMapping.Add(new CategoryMapping(trackerCategory, trackerCategoryDesc, torznabCategory.ID)); if (!_categories.Contains(torznabCategory)) { _categories.Add(torznabCategory); } // add 1:1 categories if (trackerCategoryDesc != null && trackerCategory != null) { //TODO convert to int.TryParse() to avoid using throw as flow control try { var trackerCategoryInt = int.Parse(trackerCategory); var customCat = new TorznabCategory(trackerCategoryInt + 100000, trackerCategoryDesc); if (!_categories.Contains(customCat)) { _categories.Add(customCat); } } catch (FormatException) { // trackerCategory is not an integer, continue } } }
public void AddCategoryMapping(string trackerCategory, TorznabCategory torznabCategory, string trackerCategoryDesc = null) { _categoryMapping.Add(new CategoryMapping(trackerCategory, trackerCategoryDesc, torznabCategory.ID)); AddTorznabCategoryTree(torznabCategory); if (trackerCategoryDesc == null) { return; } // create custom cats (1:1 categories) if trackerCategoryDesc is defined // - if trackerCategory is "integer" we use that number to generate custom category id // - if trackerCategory is "string" we compute a hash to generate fixed integer id for the custom category // the hash is not perfect but it should work in most cases. we can't use sequential numbers because // categories are updated frequently and the id must be fixed to work in 3rd party apps if (!int.TryParse(trackerCategory, out var trackerCategoryInt)) { var hashed = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(trackerCategory)); trackerCategoryInt = BitConverter.ToUInt16(hashed, 0); // id between 0 and 65535 < 100000 } var customCat = new TorznabCategory(trackerCategoryInt + 100000, trackerCategoryDesc); _categoryMapping.Add(new CategoryMapping(trackerCategory, trackerCategoryDesc, customCat.ID)); AddTorznabCategoryTree(customCat); }
/// <summary> /// If there are parent categories in TorznabQuery.Categories the children categories are added /// </summary> /// <param name="query">Search query</param> /// <param name="mapChildrenCatsToParent">If enabled, children categories will add the parent category to the list</param> /// <returns></returns> public List <int> ExpandTorznabQueryCategories(TorznabQuery query, bool mapChildrenCatsToParent = false) { var expandedQueryCats = new List <int>(); foreach (var queryCategory in query.Categories) { expandedQueryCats.Add(queryCategory); if (queryCategory >= 100000) { continue; } var parentCat = _torznabCategoryTree.FirstOrDefault(c => c.ID == queryCategory); if (parentCat != null) { // if it's parent cat we add all the children expandedQueryCats.AddRange(parentCat.SubCategories.Select(c => c.ID)); } else if (mapChildrenCatsToParent) { // if it's child cat and mapChildrenCatsToParent is enabled we add the parent var queryCategoryTorznab = new TorznabCategory(queryCategory, ""); parentCat = _torznabCategoryTree.FirstOrDefault(c => c.Contains(queryCategoryTorznab)); if (parentCat != null) { expandedQueryCats.Add(parentCat.ID); } } } return(expandedQueryCats.Distinct().ToList()); }
public bool Contains(TorznabCategory cat) { if (this == cat) { return(true); } if (SubCategories.Contains(cat)) { return(true); } return(false); }
private void AddTorznabCategoryTree(TorznabCategory torznabCategory) { // build the category tree if (TorznabCatType.ParentCats.Contains(torznabCategory)) { // parent cat if (!_torznabCategoryTree.Contains(torznabCategory)) { _torznabCategoryTree.Add(torznabCategory.CopyWithoutSubCategories()); } } else { // child or custom cat var parentCat = TorznabCatType.ParentCats.FirstOrDefault(c => c.Contains(torznabCategory)); if (parentCat != null) { // child cat var nodeCat = _torznabCategoryTree.FirstOrDefault(c => c.Equals(parentCat)); if (nodeCat != null) { // parent cat already exists if (!nodeCat.Contains(torznabCategory)) { nodeCat.SubCategories.Add(torznabCategory); } } else { // create parent cat and add child nodeCat = parentCat.CopyWithoutSubCategories(); nodeCat.SubCategories.Add(torznabCategory); _torznabCategoryTree.Add(nodeCat); } } else { // custom cat _torznabCategoryTree.Add(torznabCategory); } } }
public List <TorznabCategory> GetTorznabCategoryTree(bool sorted = false) { if (!sorted) { return(_torznabCategoryTree); } // we build a new tree, original is unsorted // first torznab categories ordered by id and then custom cats ordered by name var sortedTree = _torznabCategoryTree .Select(c => { var sortedSubCats = c.SubCategories.OrderBy(x => x.ID); var newCat = new TorznabCategory(c.ID, c.Name); newCat.SubCategories.AddRange(sortedSubCats); return(newCat); }).OrderBy(x => x.ID >= 100000 ? "zzz" + x.Name : x.ID.ToString()).ToList(); return(sortedTree); }