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()
Exemple #4
0
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()
Exemple #7
0
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
Exemple #8
0
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("")