rssVideos: Filter by duration
This commit is contained in:
parent
7aeecb1bff
commit
7423a93203
|
@ -136,12 +136,17 @@ class RVElement:
|
||||||
return infos
|
return infos
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def skip(self) -> bool:
|
def duration(self) -> int:
|
||||||
assert self.is_video
|
assert self.is_video
|
||||||
assert self.ytdl_infos
|
assert self.ytdl_infos
|
||||||
|
return self.ytdl_infos["duration"]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def skip(self) -> bool:
|
||||||
|
assert self.is_video
|
||||||
if (
|
if (
|
||||||
self.parent.args.max_duration > 0
|
self.parent.args.max_duration > 0
|
||||||
and self.ytdl_infos["duration"] > self.parent.args.max_duration
|
and self.duration > self.parent.args.max_duration
|
||||||
):
|
):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
@ -185,6 +190,17 @@ class RVElement:
|
||||||
return
|
return
|
||||||
self.download()
|
self.download()
|
||||||
|
|
||||||
|
MATCHES_DURATION_MULTIPLIERS = {"s": 1, "m": 60, "h": 3600, None: 1}
|
||||||
|
|
||||||
|
MATCHES_DURATION_COMPARATORS = {
|
||||||
|
"<": int.__lt__,
|
||||||
|
"-": int.__lt__,
|
||||||
|
">": int.__gt__,
|
||||||
|
"+": int.__gt__,
|
||||||
|
"=": int.__eq__,
|
||||||
|
None: int.__le__,
|
||||||
|
}
|
||||||
|
|
||||||
def matches_search(self, args: configargparse.Namespace) -> bool:
|
def matches_search(self, args: configargparse.Namespace) -> bool:
|
||||||
if not self.is_video:
|
if not self.is_video:
|
||||||
return False
|
return False
|
||||||
|
@ -196,6 +212,32 @@ class RVElement:
|
||||||
return False
|
return False
|
||||||
if args.link and not re.search(args.link, self.link):
|
if args.link and not re.search(args.link, self.link):
|
||||||
return False
|
return False
|
||||||
|
if args.duration:
|
||||||
|
dur = args.duration
|
||||||
|
|
||||||
|
mult_index = dur[-1].lower()
|
||||||
|
if mult_index.isdigit():
|
||||||
|
mult_index = None
|
||||||
|
else:
|
||||||
|
dur = dur[:-1]
|
||||||
|
try:
|
||||||
|
multiplier = self.MATCHES_DURATION_MULTIPLIERS[mult_index]
|
||||||
|
except IndexError:
|
||||||
|
raise ValueError(f"Unknown duration multiplier: {mult_index}")
|
||||||
|
|
||||||
|
comp_index = dur[0]
|
||||||
|
if comp_index.isdigit():
|
||||||
|
comp_index = None
|
||||||
|
else:
|
||||||
|
dur = dur[1:]
|
||||||
|
try:
|
||||||
|
comparator = self.MATCHES_DURATION_COMPARATORS[comp_index]
|
||||||
|
except IndexError:
|
||||||
|
raise ValueError(f"Unknown duration comparator: {comp_index}")
|
||||||
|
|
||||||
|
duration = int(dur)
|
||||||
|
if not comparator(self.duration, duration * multiplier):
|
||||||
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
@ -359,9 +401,10 @@ def get_args() -> configargparse.Namespace:
|
||||||
sc_list = subparsers.add_parser("list")
|
sc_list = subparsers.add_parser("list")
|
||||||
sc_list.set_defaults(subcommand=RVCommand.list)
|
sc_list.set_defaults(subcommand=RVCommand.list)
|
||||||
sc_list.add("--guid", help="Regex to filter guid")
|
sc_list.add("--guid", help="Regex to filter guid")
|
||||||
sc_list.add("--creator", help="Regex to filter creator")
|
sc_list.add("--creator", help="Regex to filter by creator")
|
||||||
sc_list.add("--title", help="Regex to filter titles")
|
sc_list.add("--title", help="Regex to filter by title")
|
||||||
sc_list.add("--link", help="Regex to filter link")
|
sc_list.add("--link", help="Regex to filter by link")
|
||||||
|
sc_list.add("--duration", help="Comparative to filter by duration")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
args.videos = os.path.realpath(os.path.expanduser(args.videos))
|
args.videos = os.path.realpath(os.path.expanduser(args.videos))
|
||||||
|
|
Loading…
Reference in a new issue