Skip to content

Commit

Permalink
misc
Browse files Browse the repository at this point in the history
  • Loading branch information
chapmanjacobd committed Feb 9, 2025
1 parent 0fe5eac commit d219cec
Show file tree
Hide file tree
Showing 22 changed files with 444 additions and 203 deletions.
5 changes: 4 additions & 1 deletion library/createdb/computers_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from pathlib import Path

from library import usage
from library.mediadb import db_playlists
from library.mediadb import db_media, db_playlists
from library.utils import arggroups, argparse_utils, consts, db_utils, objects, remote_processes
from library.utils.log_utils import log

Expand Down Expand Up @@ -102,4 +102,7 @@ def computer_add(args, hostnames):
def computers_add():
args = parse_args()

db_playlists.create(args)
db_media.create(args)

computer_add(args, args.hostnames)
2 changes: 2 additions & 0 deletions library/createdb/fs_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,8 @@ def fs_add(args=None) -> None:
sys.argv = ["lb", *args]

args = parse_args(SC.fs_add, usage.fs_add)
db_playlists.create(args)
db_media.create(args)
extractor(args, args.paths)


Expand Down
4 changes: 2 additions & 2 deletions library/createdb/links_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,9 +370,9 @@ def links_update() -> None:
new_media = extractor(args_env, playlist["path"])

if new_media > 0:
db_playlists.decrease_update_delay(args, playlist["path"])
db_playlists.update_more_frequently(args, playlist["path"])
else:
db_playlists.increase_update_delay(args, playlist["path"])
db_playlists.update_less_frequently(args, playlist["path"])

if playlist_count > 3:
time.sleep(random.uniform(0.05, 2))
Expand Down
4 changes: 2 additions & 2 deletions library/createdb/reddit_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,8 +364,8 @@ def reddit_update(args=None) -> None:
elif extractor_key == "reddit_praw_redditor":
redditor_new(args, {"path": path, "name": name})

db_playlists.decrease_update_delay(args, playlist["path"])
db_playlists.update_more_frequently(args, playlist["path"])
except skip_errors as e:
db_playlists.increase_update_delay(args, playlist["path"])
db_playlists.update_less_frequently(args, playlist["path"])
log.error("[%s] skipping: %s", name, e)
continue
2 changes: 2 additions & 0 deletions library/createdb/tabs_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ def tabs_add(args=None) -> None:
args = parse_args()
paths = list(gen_paths(args))

db_media.create(args)

tabs = iterables.list_dict_filter_bool([consolidate_url(args, path) for path in get_new_paths(args, paths)])
for tab in tabs:
db_media.add(args, tab)
Expand Down
5 changes: 4 additions & 1 deletion library/createdb/torrents_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from pathlib import Path

from library import usage
from library.mediadb import db_playlists
from library.mediadb import db_media, db_playlists
from library.utils import arg_utils, arggroups, argparse_utils, consts, db_utils, iterables, nums, objects, printing
from library.utils.file_utils import trash
from library.utils.log_utils import log
Expand Down Expand Up @@ -85,6 +85,9 @@ def extract_metadata(path):
def torrents_add():
args = parse_args()

db_playlists.create(args)
db_media.create(args)

scanned_set = set(arg_utils.gen_paths(args, default_exts=(".torrent",)))

known_hashes = set()
Expand Down
4 changes: 4 additions & 0 deletions library/createdb/tube_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ def tube_add(args=None) -> None:
args = parse_args(SC.tube_add, usage=usage.tube_add)
paths = arg_utils.gen_paths(args)

db_playlists.create(args)
db_media.create(args)

if args.insert_only:
args.db["media"].insert_all(
[
Expand Down Expand Up @@ -89,6 +92,7 @@ def tube_update(args=None) -> None:
sys.argv = ["tubeupdate", *args]

args = parse_args(SC.tube_update, usage=usage.tube_update)

tube_playlists = db_playlists.get_all(
args,
sql_filters=["AND extractor_key NOT IN ('Local', 'reddit_praw_redditor', 'reddit_praw_subreddit')"],
Expand Down
6 changes: 3 additions & 3 deletions library/createdb/tube_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ def run(self, info) -> tuple[list, dict]: # pylint: disable=arguments-renamed

entry = objects.dumbcopy(info)
if entry:
if db_playlists.media_exists(args, playlist_path, webpath) and not args.ignore_errors:
if db_playlists.media_exists(args, webpath, playlist_path) and not args.ignore_errors:
raise ExistingPlaylistVideoReached

if not info.get("playlist_id") or webpath == playlist_path:
Expand Down Expand Up @@ -172,9 +172,9 @@ def run(self, info) -> tuple[list, dict]: # pylint: disable=arguments-renamed

if args.action == consts.SC.tube_update:
if added_media_count > count_before_extract:
db_playlists.decrease_update_delay(args, playlist_path)
db_playlists.update_more_frequently(args, playlist_path)
else:
db_playlists.increase_update_delay(args, playlist_path)
db_playlists.update_less_frequently(args, playlist_path)


def yt_subs_config(args):
Expand Down
17 changes: 9 additions & 8 deletions library/createdb/web_add.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,16 +184,14 @@ def spider(args, paths: list):

if link in traversed_paths or link in paths:
continue
if web.is_index(link):
if web.is_subpath(path, link):
paths.append(link)
continue

if db_media.exists(args, link):
known_paths.add(link)
continue
else:
new_paths[link] = objects.merge_dict_values_str(new_paths.get(link) or {}, link_dict)

if web.is_subpath(path, link) and web.is_html(link):
paths.append(link)
else: # not HTML page
if path in traversed_paths or path in paths:
pass
Expand Down Expand Up @@ -263,6 +261,9 @@ def web_add(args=None) -> None:

args = parse_args(consts.SC.web_add, usage=usage.web_add)

db_playlists.create(args)
db_media.create(args)

if args.insert_only:
media_new = set()
media_known = set()
Expand Down Expand Up @@ -300,7 +301,7 @@ def web_update(args=None) -> None:

web_playlists = db_playlists.get_all(
args,
sql_filters="extractor_key = 'WebFolder'",
sql_filters=["AND extractor_key = 'WebFolder'"],
order_by="""length(path)-length(REPLACE(path, '/', '')) desc
, random()
""",
Expand All @@ -320,9 +321,9 @@ def web_update(args=None) -> None:
new_media = spider(args_env, [playlist["path"]])

if new_media > 0:
db_playlists.decrease_update_delay(args, playlist["path"])
db_playlists.update_more_frequently(args, playlist["path"])
else:
db_playlists.increase_update_delay(args, playlist["path"])
db_playlists.update_less_frequently(args, playlist["path"])

if playlist_count > 3:
time.sleep(random.uniform(0.05, 2))
Expand Down
8 changes: 7 additions & 1 deletion library/mediadb/db_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,15 @@ def exists(args, media_id) -> bool:
def create(args):
args.db.create_table(
"history",
{"media_id": int, "time_played": int, "playhead": int, "done": int},
{
"media_id": int,
"time_played": int,
"playhead": int,
"done": bool,
},
pk="id",
if_not_exists=True,
strict=True,
)


Expand Down
75 changes: 61 additions & 14 deletions library/mediadb/db_media.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import argparse, os, sqlite3
from collections.abc import Collection
from pathlib import Path
from typing import Counter

from library.createdb import fs_add_metadata
from library.createdb.subtitle import clean_up_temp_dirs
Expand All @@ -9,6 +10,31 @@
from library.utils.log_utils import log


def create(args):
args.db.create_table(
"media",
{
"id": int,
"playlists_id": int,
"time_created": int,
"time_modified": int,
"time_deleted": int,
"time_uploaded": int,
"time_downloaded": int,
"size": int,
"duration": int,
# "fps": float,
"path": str,
# "title": str,
# "webpath": str,
# "error": str,
},
pk="id",
if_not_exists=True,
strict=True,
)


def exists(args, path) -> bool:
m_columns = db_utils.columns(args, "media")
try:
Expand Down Expand Up @@ -73,13 +99,16 @@ def consolidate(v: dict) -> dict | None:
cv["time_modified"] = 0 # this should be 0 if the file has never been downloaded
cv["time_deleted"] = 0
cv["time_downloaded"] = 0
language = v.pop("language", None)
cv["language"] = iterables.safe_unpack(
v.pop("language", None),
v.pop("lang_code", None),
)
cv["tags"] = strings.combine(
"language:" + language if language else None,
v.pop("description", None),
v.pop("caption", None),
v.pop("content", None),
v.pop("categories", None),
v.pop("catname", None),
v.pop("genre", None),
v.pop("tags", None),
v.pop("labels", None),
Expand Down Expand Up @@ -121,6 +150,7 @@ def consolidate(v: dict) -> dict | None:
account.pop("id", None),
v.pop("name", None),
v.pop("author", None),
v.pop("author_info", None),
v.pop("post_author", None),
v.pop("blog_name", None),
v.pop("uuid", None),
Expand Down Expand Up @@ -541,39 +571,56 @@ def get_playlist_media(args, playlist_paths) -> list[dict]:
return media


def get_next_dir_media(args, folder):
def get_next_dir_media(args, folder, limit=1):
if args.play_in_order:
media = get_dir_media(args, [folder], limit=100)
media = get_dir_media(args, [folder], limit=limit * 100)
media = natsort_media(args, media)
m = media[0:1]
m = media[0:limit]
else:
m = get_dir_media(args, [folder], limit=1)[0:1]
m = get_dir_media(args, [folder], limit=limit)[0:limit]
return m


def get_sibling_media(args, media):
if args.fetch_siblings in ("all", "always"):
dirs = {str(Path(d["path"]).parent) + os.sep for d in media}
media = get_dir_media(args, dirs)

elif args.fetch_siblings == "each":
parents = {str(Path(d["path"]).parent) + os.sep for d in media}
parent_counts = Counter(str(Path(d["path"]).parent) + os.sep for d in media)
media = []
for parent in parents:
media.extend(get_next_dir_media(args, parent))
for parent, count in parent_counts.items():
media.extend(
get_next_dir_media(
args, parent, limit=min(args.fetch_siblings_max, count) if args.fetch_siblings_max > 0 else count
)
)

elif args.fetch_siblings == "if-audiobook":
new_media = []
seen = set()
seen_parents = {}
for d in media:
if "audiobook" in d["path"].lower():
parent = str(Path(d["path"]).parent) + os.sep
if parent not in seen:
seen.add(parent)
new_media.extend(get_next_dir_media(args, parent))
if parent not in seen_parents:
seen_parents[parent] = sum(1 for m in media if str(Path(m["path"]).parent) + os.sep == parent)
count = seen_parents[parent]
new_media.extend(
get_next_dir_media(
args,
parent,
limit=min(args.fetch_siblings_max, count) if args.fetch_siblings_max > 0 else count,
)
)
else:
new_media.append(d)
media = new_media

# TODO: all-if>10, each-if=10 --folder-counts functionality could be replicated here
elif args.fetch_siblings.isdigit():
parents = {str(Path(d["path"]).parent) + os.sep for d in media}
media = []
for parent in parents:
media.extend(get_next_dir_media(args, parent, limit=int(args.fetch_siblings)))

return media

Expand Down
Loading

0 comments on commit d219cec

Please sign in to comment.