| 
									
										
										
										
											2024-10-23 15:56:56 -05:00
										 |  |  | package convids | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2024-10-23 15:56:56 -05:00
										 |  |  | 	"iter" | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 	"regexp" | 
					
						
							| 
									
										
										
										
											2024-10-23 15:56:56 -05:00
										 |  |  | 	"slices" | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2024-10-23 15:56:56 -05:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | var ErrNoName = errors.New("missing name") | 
					
						
							| 
									
										
										
										
											2024-10-23 22:22:41 -05:00
										 |  |  | var ErrNilPointer = errors.New("nil pointer") | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 22:10:31 -05:00
										 |  |  | var animePattern = `^\[.+\] ` | 
					
						
							|  |  |  | var animeRegexp = regexp.MustCompile(animePattern) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | func (s *Show) Match(path string) (bool, error) { | 
					
						
							| 
									
										
										
										
											2024-10-23 22:22:41 -05:00
										 |  |  | 	if s == nil { | 
					
						
							|  |  |  | 		return false, ErrNilPointer | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 	if s.Pattern != "" { | 
					
						
							|  |  |  | 		return s.matchRegexp(path) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if s.Name == "" { | 
					
						
							|  |  |  | 		return false, ErrNoName | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-10-23 22:10:31 -05:00
										 |  |  | 	if s.Anime { | 
					
						
							|  |  |  | 		if !animeRegexp.MatchString(path) { | 
					
						
							|  |  |  | 			return false, nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		path = animeRegexp.ReplaceAllString(path, "") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 	return strings.HasPrefix(path, s.Name), nil | 
					
						
							| 
									
										
										
										
											2024-10-23 15:56:56 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | func (s *Show) matchRegexp(path string) (f bool, err error) { | 
					
						
							|  |  |  | 	if s.re == nil { | 
					
						
							|  |  |  | 		p := s.Pattern | 
					
						
							| 
									
										
										
										
											2024-10-23 22:10:31 -05:00
										 |  |  | 		if s.Anime { | 
					
						
							| 
									
										
										
										
											2024-10-28 20:01:03 -05:00
										 |  |  | 			p = animePattern + strings.TrimPrefix(p, "^") | 
					
						
							| 
									
										
										
										
											2024-10-23 22:10:31 -05:00
										 |  |  | 		} else if !strings.HasPrefix(p, "^") { | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 			p = "^" + p | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		s.re, err = regexp.Compile(p) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return s.re.MatchString(path), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (ss *Shows) All() iter.Seq[*Show] { | 
					
						
							| 
									
										
										
										
											2024-10-23 22:22:41 -05:00
										 |  |  | 	if ss == nil { | 
					
						
							|  |  |  | 		return func(func(*Show) bool) {} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 	return slices.Values(*ss) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 15:20:09 -06:00
										 |  |  | func (d *Data) AllShows(outputGroup GroupPrinter) iter.Seq[*Show] { | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 	return func(yield func(*Show) bool) { | 
					
						
							| 
									
										
										
										
											2024-10-23 22:22:41 -05:00
										 |  |  | 		if d == nil || d.Config == nil { | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-11-04 15:20:09 -06:00
										 |  |  | 		for _, groupName := range d.Config.Groups { | 
					
						
							|  |  |  | 			group := (*d.Shows)[groupName] | 
					
						
							|  |  |  | 			if group == nil || len(*group) < 1 { | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 				continue | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-11-04 15:20:09 -06:00
										 |  |  | 			if outputGroup != nil { | 
					
						
							|  |  |  | 				outputGroup(groupName, *group) | 
					
						
							| 
									
										
										
										
											2024-10-23 15:56:56 -05:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-11-04 15:20:09 -06:00
										 |  |  | 			for sh := range group.All() { | 
					
						
							|  |  |  | 				if sh == nil { | 
					
						
							| 
									
										
										
										
											2024-10-23 21:24:10 -05:00
										 |  |  | 					continue | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2024-11-04 15:20:09 -06:00
										 |  |  | 				if !yield(sh) { | 
					
						
							| 
									
										
										
										
											2024-10-23 15:56:56 -05:00
										 |  |  | 					return | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |