def main(config, db, **kwargs): reddit.init_reddit(config) has_new_episode = [] # Check services for new episodes enabled_services = db.get_services(enabled=True) for service in enabled_services: service_handler = services.get_service_handler(service) streams = db.get_streams(service=service) debug("{} streams found".format(len(streams))) for stream in streams: show = db.get_show(stream=stream) if show is None or not show.enabled: continue info("Checking stream \"{}\"".format(stream.show_key)) debug(stream) # Check latest episode episode = service_handler.get_latest_episode( stream, useragent=config.useragent) if not episode: info(" Show/episode not found") continue if _process_new_episode(config, db, show, stream, episode): has_new_episode.append(show) # Check generic services other_shows = set(db.get_shows(missing_stream=True)) | set( db.get_shows(delayed=True)) if len(other_shows) > 0: info("Checking generic services for {} shows".format(len(other_shows))) for show in other_shows: info(" Checking show {} ({})".format(show.name, show.id)) stream = Stream.from_show(show) for service in enabled_services: service_handler = services.get_service_handler(service) if service_handler.is_generic: debug(" Checking service {}".format(service_handler.name)) episode = service_handler.get_latest_episode( stream, useragent=config.useragent) if not episode: debug(" No episode found") continue if _process_new_episode(config, db, show, stream, episode): has_new_episode.append(show) break else: info(" No episode found") debug("") debug("Summary of shows with new episodes:") for show in has_new_episode: debug(" {}".format(show.name)) debug("")
def main(config, db, **kwargs): reddit.init_reddit(config) has_new_episode = [] # Check services for new episodes enabled_services = db.get_services(enabled=True) for service in enabled_services: service_handler = services.get_service_handler(service) streams = db.get_streams(service=service) debug("{} streams found".format(len(streams))) for stream in streams: show = db.get_show(stream=stream) if show is None or not show.enabled: continue info("Checking stream \"{}\"".format(stream.show_key)) debug(stream) # Check latest episode episode = service_handler.get_latest_episode(stream, useragent=config.useragent) if not episode: info(" Show/episode not found") continue if _process_new_episode(config, db, show, stream, episode): has_new_episode.append(show) # Check generic services other_shows = set(db.get_shows(missing_stream=True)) | set(db.get_shows(delayed=True)) if len(other_shows) > 0: info("Checking generic services for {} shows".format(len(other_shows))) for show in other_shows: info(" Checking show {} ({})".format(show.name, show.id)) stream = Stream.from_show(show) for service in enabled_services: service_handler = services.get_service_handler(service) if service_handler.is_generic: debug(" Checking service {}".format(service_handler.name)) episode = service_handler.get_latest_episode(stream, useragent=config.useragent) if not episode: debug(" No episode found") continue if _process_new_episode(config, db, show, stream, episode): has_new_episode.append(show) break else: info(" No episode found") debug("") debug("Summary of shows with new episodes:") for show in has_new_episode: debug(" {}".format(show.name)) debug("")
def _check_missing_stream_info(config, db, update_db=True): info("Checking for missing stream info") streams = db.get_streams(missing_name=True) for stream in streams: service_info = db.get_service(id=stream.service) info("Updating missing stream info of {} ({}/{})".format( stream.name, service_info.name, stream.show_key)) service = services.get_service_handler(key=service_info.key) stream = service.get_stream_info(stream, useragent=config.useragent) if not stream: error(" Stream info not found") continue debug(" name={}".format(stream.name)) debug(" key={}".format(stream.show_key)) debug(" id={}".format(stream.show_id)) if update_db: db.update_stream(stream, name=stream.name, show_id=stream.show_id, show_key=stream.show_key, commit=False) if update_db: db.commit()
def _gen_text_streams(db, formats, show): debug("Generating stream text for show {}".format(show)) stream_texts = list() streams = db.get_streams(show=show) for stream in streams: if stream.active: service = db.get_service(id=stream.service) if service.enabled and service.use_in_post: service_handler = services.get_service_handler(service) text = safe_format( formats["stream"], service_name=service.name, stream_link=service_handler.get_stream_link(stream)) stream_texts.append(text) lite_streams = db.get_lite_streams(show=show) for lite_stream in lite_streams: text = safe_format(formats["stream"], service_name=lite_stream.service_name, stream_link=lite_stream.url) stream_texts.append(text) if len(stream_texts) > 0: return "\n".join(stream_texts) else: return "*None*"
def _gen_text_streams(db, formats, show): debug("Generating stream text for show {}".format(show)) streams = db.get_streams(show=show) if len(streams) > 0: stream_texts = list() for stream in streams: if stream.active: service = db.get_service(id=stream.service) if service.enabled and service.use_in_post: service_handler = services.get_service_handler(service) text = safe_format(formats["stream"], service_name=service.name, stream_link=service_handler.get_stream_link(stream)) stream_texts.append(text) return "\n".join(stream_texts) else: return "*None*"
def _check_missing_stream_info(config, db, update_db=True): streams = db.get_streams(missing_name=True) for stream in streams: service_info = db.get_service(id=stream.service) info("Updating missing stream info of {} ({}/{})".format(stream.name, service_info.name, stream.show_key)) service = services.get_service_handler(key=service_info.key) stream = service.get_stream_info(stream, useragent=config.useragent) if not stream: error(" Stream info not found") continue debug(" name={}".format(stream.name)) debug(" key={}".format(stream.show_key)) debug(" id={}".format(stream.show_id)) if update_db: db.update_stream(stream, name=stream.name, show_id=stream.show_id, show_key=stream.show_key, commit=False) if update_db: db.commit()
def _edit_with_file(db, edit_file): import yaml info("Parsing show edit file \"{}\"".format(edit_file)) try: with open(edit_file, "r", encoding="UTF-8") as f: parsed = list(yaml.full_load_all(f)) except yaml.YAMLError: exception("Failed to parse edit file") return debug(" num shows={}".format(len(parsed))) for doc in parsed: name = doc["title"] stype = str_to_showtype(doc.get("type", "tv")) # convert to enum? length = doc.get("length", 0) has_source = doc.get("has_source", False) is_nsfw = doc.get("is_nsfw", False) info("Adding show \"{}\" ({})".format(name, stype)) debug(" has_source={}".format(has_source)) debug(" is_nsfw={}".format(is_nsfw)) if stype == ShowType.UNKNOWN: error("Invalid show type \"{}\"".format(stype)) return False show = UnprocessedShow(None, None, name, [], stype, length, has_source, is_nsfw) found_ids = db.search_show_ids_by_names(name, exact=True) debug("Found ids: {found_ids}") if len(found_ids) == 0: show_id = db.add_show(show, commit=False) elif len(found_ids) == 1: show_id = found_ids.pop() db.update_show(show_id, show, commit=False) else: error("More than one ID found for show") return False # Info if "info" in doc: infos = doc["info"] for info_key in infos: url = infos[info_key] if not url: continue debug(" Info {}: {}".format(info_key, url)) info_handler = services.get_link_handler(key=info_key) if info_handler: info_id = info_handler.extract_show_id(url) debug(" id={}".format(info_id)) if not db.has_link(info_key, info_id): show.site_key = info_key show.show_key = info_id db.add_link(show, show_id, commit=False) else: error(" Info handler not installed") # Streams if "streams" in doc: streams = doc["streams"] for service_key in streams: url = streams[service_key] if not url: continue remote_offset = 0 try: roi = url.rfind("|") if roi > 0: if roi + 1 < len(url): remote_offset = int(url[roi + 1:]) url = url[:roi] except: exception( "Improperly formatted stream URL \"{}\"".format(url)) continue info(" Stream {}: {}".format(service_key, url)) service_id = service_key.split('|')[0] stream_handler = services.get_service_handler(key=service_id) if stream_handler: show_key = stream_handler.extract_show_key(url) debug(" id={}".format(show_key)) if not db.has_stream(service_id, show_key): s = UnprocessedStream(service_id, show_key, None, "", remote_offset, 0) db.add_stream(s, show_id, commit=False) else: service = db.get_service(key=service_id) s = db.get_stream(service_tuple=(service, show_key)) db.update_stream(s, show_key=show_key, remote_offset=remote_offset, commit=False) elif "|" in service_key: # Lite stream service, service_name = service_key.split("|", maxsplit=1) db.add_lite_stream(show_id, service, service_name, url) else: error(" Stream handler not installed") # Aliases if "alias" in doc: aliases = doc["alias"] for alias in aliases: db.add_alias(show_id, alias) info( f"Added {len(aliases)} alias{'es' if len(aliases) > 1 else ''}" ) return True
def _edit_with_file(db, edit_file): import yaml info("Parsing show edit file \"{}\"".format(edit_file)) try: with open(edit_file, "r", encoding="UTF-8") as f: parsed = list(yaml.load_all(f)) except yaml.YAMLError: exception("Failed to parse edit file") return debug(" num shows={}".format(len(parsed))) for doc in parsed: name = doc["title"] stype = str_to_showtype(doc["type"]) # convert to enum? length = doc["length"] if "length" in doc else 0 has_source = doc["has_source"] info("Adding show \"{}\" ({})".format(name, stype)) debug(" has_source={}".format(has_source)) if stype == ShowType.UNKNOWN: error("Invalid show type \"{}\"".format(stype)) return False show = UnprocessedShow(None, None, name, [], stype, length, has_source) found_ids = db.search_show_ids_by_names(name, exact=True) if len(found_ids) == 0: show_id = db.add_show(show, commit=False) elif len(found_ids) == 1: show_id = found_ids.pop() db.update_show(show_id, show, commit=False) else: error("More than one ID found for show") return False # Info if "info" in doc: infos = doc["info"] for info_key in infos: url = infos[info_key] if not url: continue debug(" Info {}: {}".format(info_key, url)) info_handler = services.get_link_handler(key=info_key) if info_handler: info_id = info_handler.extract_show_id(url) debug(" id={}".format(info_id)) if not db.has_link(info_key, info_id): show.site_key = info_key show.show_key = info_id db.add_link(show, show_id, commit=False) else: error(" Info handler not installed") # Streams if "streams" in doc: streams = doc["streams"] for service_key in streams: url = streams[service_key] if not url: continue remote_offset = 0 try: roi = url.rfind("|") if roi > 0: if roi+1 < len(url): remote_offset = int(url[roi+1:]) url = url[:roi] except: exception("Improperly formatted stream URL \"{}\"".format(url)) continue info(" Stream {}: {}".format(service_key, url)) stream_handler = services.get_service_handler(key=service_key) if stream_handler: show_key = stream_handler.extract_show_key(url) debug(" id={}".format(show_key)) if not db.has_stream(service_key, show_key): s = UnprocessedStream(service_key, show_key, None, "", remote_offset, 0) db.add_stream(s, show_id, commit=False) else: service = db.get_service(key=service_key) s = db.get_stream(service_tuple=(service, show_key)) db.update_stream(s, show=show_id, show_key=show_key, remote_offset=remote_offset, commit=False) else: error(" Stream handler not installed") return True
def main(config, db, **kwargs): reddit.init_reddit(config) has_new_episode = [] # Check services for new episodes enabled_services = db.get_services(enabled=True) for service in enabled_services: try: service_handler = services.get_service_handler(service) streams = db.get_streams(service=service) debug("{} streams found".format(len(streams))) recent_episodes = service_handler.get_recent_episodes(streams, useragent=config.useragent) info(f"{len(recent_episodes)} episodes for active shows on service {service}") for stream, episodes in recent_episodes.items(): show = db.get_show(stream=stream) if show is None or not show.enabled: continue info("Checking stream \"{}\"".format(stream.show_key)) debug(stream) if not episodes: info(" Show/episode not found") continue for episode in sorted(episodes, key=lambda e: e.number): if _process_new_episode(config, db, show, stream, episode): has_new_episode.append(show) except IOError: error(f'Error while getting shows on service {service}') # Check generic services # Note : selecting only shows with missing streams avoids troll torrents, # but also can cause delays if supported services are later than unsupported ones other_shows = set(db.get_shows(missing_stream=True)) | set(db.get_shows(delayed=True)) #other_shows = set(db.get_shows(missing_stream=False)) | set(db.get_shows(delayed=True)) if len(other_shows) > 0: info("Checking generic services for {} shows".format(len(other_shows))) other_streams = [Stream.from_show(show) for show in other_shows] for service in enabled_services: try: service_handler = services.get_service_handler(service) if service_handler.is_generic: debug(" Checking service {}".format(service_handler.name)) recent_episodes = service_handler.get_recent_episodes(other_streams, useragent=config.useragent) info(f"{len(recent_episodes)} episodes for active shows on generic service {service}") for stream, episodes in recent_episodes.items(): show = db.get_show(stream=stream) if show is None or not show.enabled: continue info("Checking stream \"{}\"".format(stream.show_key)) debug(stream) if not episodes: info(" No episode found") continue for episode in sorted(episodes, key=lambda e: e.number): if _process_new_episode(config, db, show, stream, episode): has_new_episode.append(show) except IOError: error(f'Error while getting shows on service {service}') debug("") debug("Summary of shows with new episodes:") for show in has_new_episode: debug(" {}".format(show.name)) debug("")