def checkHitOrDownloadLimit(p): if p.settings.hitLimit > 0 or p.settings.downloadLimit > 0: if p.settings.hitLimitResetTime: comparisonTime = arrow.utcnow().replace(hour=p.settings.hitLimitResetTime, minute=0, second=0) if comparisonTime > arrow.utcnow(): comparisonTime = arrow.get(comparisonTime.datetime - datetime.timedelta(days=1)) # Arrow is too dumb to properly subtract 1 day (throws an error on every first of the month) else: # Use rolling time window comparisonTime = arrow.get(arrow.utcnow().datetime - datetime.timedelta(days=1)) if p.settings.hitLimit > 0: apiHitsQuery = IndexerApiAccess().select().where((IndexerApiAccess.indexer == p.indexer) & (IndexerApiAccess.time > comparisonTime) & IndexerApiAccess.response_successful) apiHits = apiHitsQuery.count() if apiHits >= p.settings.hitLimit: if p.settings.hitLimitResetTime: logger.info("Did not pick %s because its API hit limit of %d was reached. Will pick again after %02d:00" % (p, p.settings.hitLimit, p.settings.hitLimitResetTime)) else: try: firstHitTimeInWindow = arrow.get(list(apiHitsQuery.order_by(IndexerApiAccess.time.desc()).offset(p.settings.hitLimit - 1).dicts())[0]["time"]).to("local") nextHitAfter = arrow.get(firstHitTimeInWindow + datetime.timedelta(days=1)) logger.info("Did not pick %s because its API hit limit of %d was reached. Next possible hit at %s" % (p, p.settings.hitLimit, nextHitAfter.format('YYYY-MM-DD HH:mm'))) except IndexerApiAccess.DoesNotExist: logger.info("Did not pick %s because its API hit limit of %d was reached" % (p, p.settings.hitLimit)) return False, "API limit reached" else: logger.debug("%s has had %d of a maximum of %d API hits since %02d:%02d" % (p, apiHits, p.settings.hitLimit, comparisonTime.hour, comparisonTime.minute)) if p.settings.downloadLimit > 0: downloadsQuery = IndexerNzbDownload().select(IndexerApiAccess, IndexerNzbDownload).join(IndexerApiAccess).where((IndexerApiAccess.indexer == p.indexer) & (IndexerApiAccess.time > comparisonTime)) downloads = downloadsQuery.count() if downloads >= p.settings.downloadLimit: if p.settings.hitLimitResetTime: logger.info("Did not pick %s because its download limit of %d was reached. Will pick again after %02d:00" % (p, p.settings.downloadLimit, p.settings.hitLimitResetTime)) else: try: firstHitTimeInWindow = arrow.get(list(downloadsQuery.order_by(IndexerApiAccess.time.desc()).offset(p.settings.downloadLimit - 1).limit(1).dicts())[0]["time"]).to("local") nextHitAfter = arrow.get(firstHitTimeInWindow + datetime.timedelta(days=1)) logger.info("Did not pick %s because its download limit of %d was reached. Next possible hit at %s" % (p, p.settings.downloadLimit, nextHitAfter.format('YYYY-MM-DD HH:mm'))) except IndexerApiAccess.DoesNotExist: logger.info("Did not pick %s because its download limit of %d was reached" % (p, p.settings.downloadLimit)) return False, "Download limit reached" else: logger.debug("%s has had %d of a maximum of %d downloads since %02d:%02d" % (p, downloads, p.settings.downloadLimit, comparisonTime.hour, comparisonTime.minute)) return True, None
def checkHitOrDownloadLimit(p): if p.settings.hitLimit > 0 or p.settings.downloadLimit > 0: if p.settings.hitLimitResetTime: comparisonTime = arrow.utcnow().replace(hour=p.settings.hitLimitResetTime, minute=0, second=0) if comparisonTime > arrow.utcnow(): comparisonTime = arrow.get(comparisonTime.datetime - datetime.timedelta(days=1)) # Arrow is too dumb to properly subtract 1 day (throws an error on every first of the month) else: # Use rolling time window comparisonTime = arrow.get(arrow.utcnow().datetime - datetime.timedelta(days=1)) if p.settings.hitLimit > 0: apiHitsQuery = IndexerApiAccess().select().where((IndexerApiAccess.indexer == p.indexer) & (IndexerApiAccess.time > comparisonTime) & IndexerApiAccess.response_successful) apiHits = apiHitsQuery.count() if apiHits >= p.settings.hitLimit: if p.settings.hitLimitResetTime: logger.info("Did not pick %s because its API hit limit of %d was reached. Will pick again after %02d:00" % (p, p.settings.hitLimit, p.settings.hitLimitResetTime)) else: try: firstHitTimeInWindow = arrow.get(list(apiHitsQuery.order_by(IndexerApiAccess.time.desc()).offset(p.settings.hitLimit-1).dicts())[0]["time"]).to("local") nextHitAfter = arrow.get(firstHitTimeInWindow + datetime.timedelta(days=1)) logger.info("Did not pick %s because its API hit limit of %d was reached. Next possible hit at %s" % (p, p.settings.hitLimit, nextHitAfter.format('YYYY-MM-DD HH:mm'))) except IndexerApiAccess.DoesNotExist: logger.info("Did not pick %s because its API hit limit of %d was reached" % (p, p.settings.hitLimit)) return False, "API limit reached" else: logger.debug("%s has had %d of a maximum of %d API hits since %02d:%02d" % (p, apiHits, p.settings.hitLimit, comparisonTime.hour, comparisonTime.minute)) if p.settings.downloadLimit > 0: downloadsQuery = IndexerNzbDownload().select(IndexerApiAccess, IndexerNzbDownload).join(IndexerApiAccess).where((IndexerApiAccess.indexer == p.indexer) & (IndexerApiAccess.time > comparisonTime)) downloads = downloadsQuery.count() if downloads >= p.settings.downloadLimit: if p.settings.hitLimitResetTime: logger.info("Did not pick %s because its download limit of %d was reached. Will pick again after %02d:00" % (p, p.settings.downloadLimit, p.settings.hitLimitResetTime)) else: try: firstHitTimeInWindow = arrow.get(list(downloadsQuery.order_by(IndexerApiAccess.time.desc()).offset(p.settings.downloadLimit-1).limit(1).dicts())[0]["time"]).to("local") nextHitAfter = arrow.get(firstHitTimeInWindow + datetime.timedelta(days=1)) logger.info("Did not pick %s because its download limit of %d was reached. Next possible hit at %s" % (p, p.settings.downloadLimit, nextHitAfter.format('YYYY-MM-DD HH:mm'))) except IndexerApiAccess.DoesNotExist: logger.info("Did not pick %s because its download limit of %d was reached" % (p, p.settings.downloadLimit)) return False, "Download limit reached" else: logger.debug("%s has had %d of a maximum of %d downloads since %02d:%02d" % (p, downloads, p.settings.downloadLimit, comparisonTime.hour, comparisonTime.minute)) return True, None