Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions config_example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,29 @@ sonarr:
addRequesterIdTag: true # Add telegram user id as tag on series
adminRestrictions: false

# Sportarr Configuration (sports leagues via https://github.com/Sportarr/Sportarr)
sportarr:
server:
addr:
port : 1867 # Default is 1867
path: / # Default is / . If set, it must start and finish with / . Eg: /sportarr/
ssl: false # Default false
auth:
apikey:
username:
password:
search: true # Start search after adding league
seasonFolder: true
excludedRootFolders: # If set must not have a trailing slash Eg: /mnt/Media
- # First excluded folder, add others with a "-" on a new line (same indentation)
narrowRootFolderNames: true # If true, only the last folder name will be shown instead of full path
excludedQualityProfiles:
-
defaultTags: # If set must be existing tags
- telegram
addRequesterIdTag: true # Add telegram user id as tag on league
adminRestrictions: false

# Radarr Configuration
radarr:
server:
Expand Down Expand Up @@ -81,6 +104,7 @@ entrypointHelp: help # help entrypoint
entrypointAdd: start # start or a custom entrypoint
entrypointAllSeries: allSeries # allSeries or a custom entrypoint
entrypointAllMovies: allMovies # allMovies or a custom entrypoint
entrypointAllSports: allSports # allSports or a custom entrypoint
entrypointTransmission: transmission # transmission or a custom entrypoint
entrypointSabnzbd: sabnzbd # sabnzbd or a custom entrypoint

Expand Down
53 changes: 41 additions & 12 deletions src/addarr.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import logger
import radarr as radarr
import sonarr as sonarr
import sportarr as sportarr
import delete as delete
import all as all
from config import checkConfigValues, config, checkConfig
Expand Down Expand Up @@ -71,6 +72,14 @@ def main():
all.allSeries,
)

allSports_handler_command = CommandHandler(config["entrypointAllSports"], all.allSports)
allSports_handler_text = MessageHandler(
filters.Regex(
re.compile(r"^" + config["entrypointAllSports"] + "$", re.IGNORECASE)
),
all.allSports,
)

allMovies_handler_command = CommandHandler(config["entrypointAllMovies"], all.allMovies)
allMovies_handler_text = MessageHandler(
filters.Regex(
Expand All @@ -93,10 +102,10 @@ def main():
SERIE_MOVIE_DELETE: [MessageHandler(filters.TEXT, choiceSerieMovie)],
READ_DELETE_CHOICE: [
MessageHandler(
filters.Regex(f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")})$'),
filters.Regex(f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")}|{i18n.t("addarr.Sport")})$'),
delete.confirmDelete,
),
CallbackQueryHandler(delete.confirmDelete, pattern=f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")})$')
CallbackQueryHandler(delete.confirmDelete, pattern=f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")}|{i18n.t("addarr.Sport")})$')
],
GIVE_OPTION: [
CallbackQueryHandler(delete.deleteSerieMovie, pattern=f'({i18n.t("addarr.Delete")})'),
Expand All @@ -123,6 +132,7 @@ def main():
CommandHandler(config["entrypointAdd"], startSerieMovie),
CommandHandler(i18n.t("addarr.Movie"), startSerieMovie),
CommandHandler(i18n.t("addarr.Series"), startSerieMovie),
CommandHandler(i18n.t("addarr.Sport"), startSerieMovie),
MessageHandler(
filters.Regex(
re.compile(r'^' + config["entrypointAdd"] + '$', re.IGNORECASE)
Expand All @@ -134,10 +144,10 @@ def main():
SERIE_MOVIE_AUTHENTICATED: [MessageHandler(filters.TEXT, choiceSerieMovie)],
READ_CHOICE: [
MessageHandler(
filters.Regex(f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")})$'),
filters.Regex(f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")}|{i18n.t("addarr.Sport")})$'),
searchSerieMovie,
),
CallbackQueryHandler(searchSerieMovie, pattern=f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")})$'),
CallbackQueryHandler(searchSerieMovie, pattern=f'^({i18n.t("addarr.Movie")}|{i18n.t("addarr.Series")}|{i18n.t("addarr.Sport")})$'),
MessageHandler(
filters.Regex(f'^({i18n.t("addarr.New")})$'),
startSerieMovie
Expand Down Expand Up @@ -238,6 +248,8 @@ def main():
application.add_handler(auth_handler_text)
application.add_handler(allSeries_handler_command)
application.add_handler(allSeries_handler_text)
application.add_handler(allSports_handler_command)
application.add_handler(allSports_handler_text)
application.add_handler(allMovies_handler_command)
application.add_handler(allMovies_handler_text)
application.add_handler(addMovieserie_handler)
Expand Down Expand Up @@ -341,6 +353,7 @@ async def choiceSerieMovie(update, context):

if reply.lower() not in [
i18n.t("addarr.Series").lower(),
i18n.t("addarr.Sport").lower(),
i18n.t("addarr.Movie").lower(),
]:
logger.debug(
Expand All @@ -350,6 +363,7 @@ async def choiceSerieMovie(update, context):

if context.user_data.get("choice") in [
i18n.t("addarr.Series"),
i18n.t("addarr.Sport"),
i18n.t("addarr.Movie"),
]:
logger.debug(
Expand All @@ -367,6 +381,10 @@ async def choiceSerieMovie(update, context):
'\U0001F4FA '+i18n.t("addarr.Series"),
callback_data=i18n.t("addarr.Series")
),
InlineKeyboardButton(
'\U0001F3C6 '+i18n.t("addarr.Sport"),
callback_data=i18n.t("addarr.Sport")
),
],
[ InlineKeyboardButton(
'\U0001F50D '+i18n.t("addarr.New"),
Expand Down Expand Up @@ -479,7 +497,7 @@ async def searchSerieMovie(update, context):
if choice == i18n.t("addarr.Movie"):
message=i18n.t("addarr.messages.This", subjectWithArticle=i18n.t("addarr.MovieWithArticle").lower())
else:
message=i18n.t("addarr.messages.This", subjectWithArticle=i18n.t("addarr.SeriesWithArticle").lower())
message=i18n.t("addarr.messages.This", subjectWithArticle=serieOrSportArticle(context).lower())
msg = await context.bot.send_message(
chat_id=update.effective_message.chat_id, text=message, reply_markup=markup
)
Expand Down Expand Up @@ -571,7 +589,7 @@ async def nextOption(update, context):
if choice == i18n.t("addarr.Movie"):
message=i18n.t("addarr.messages.This", subjectWithArticle=i18n.t("addarr.MovieWithArticle").lower())
else:
message=i18n.t("addarr.messages.This", subjectWithArticle=i18n.t("addarr.SeriesWithArticle").lower())
message=i18n.t("addarr.messages.This", subjectWithArticle=serieOrSportArticle(context).lower())
msg = await context.bot.send_message(
chat_id=update.effective_message.chat_id, text=message, reply_markup=markup
)
Expand Down Expand Up @@ -841,7 +859,7 @@ async def addSerieMovie(update, context):
if choice == i18n.t("addarr.Movie"):
message=i18n.t("addarr.messages.AddSuccess", subjectWithArticle=i18n.t("addarr.MovieWithArticle"))
else:
message=i18n.t("addarr.messages.AddSuccess", subjectWithArticle=i18n.t("addarr.SeriesWithArticle"))
message=i18n.t("addarr.messages.AddSuccess", subjectWithArticle=serieOrSportArticle(context))
await context.bot.edit_message_text(
message_id=context.user_data["update_msg"],
chat_id=update.effective_message.chat_id,
Expand All @@ -852,7 +870,7 @@ async def addSerieMovie(update, context):
if choice == i18n.t("addarr.Movie"):
message2=i18n.t("addarr.Notifications.AddSuccess", subjectWithArticle=i18n.t("addarr.MovieWithArticle"),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
else:
message2=i18n.t("addarr.Notifications.AddSuccess", subjectWithArticle=i18n.t("addarr.SeriesWithArticle"),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
message2=i18n.t("addarr.Notifications.AddSuccess", subjectWithArticle=serieOrSportArticle(context),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
await context.bot.send_message(
chat_id=adminNotifyId, text=message2
)
Expand All @@ -862,7 +880,7 @@ async def addSerieMovie(update, context):
if choice == i18n.t("addarr.Movie"):
message=i18n.t("addarr.messages.AddFailed", subjectWithArticle=i18n.t("addarr.MovieWithArticle").lower())
else:
message=i18n.t("addarr.messages.AddFailed", subjectWithArticle=i18n.t("addarr.SeriesWithArticle").lower())
message=i18n.t("addarr.messages.AddFailed", subjectWithArticle=serieOrSportArticle(context).lower())
await context.bot.edit_message_text(
message_id=context.user_data["update_msg"],
chat_id=update.effective_message.chat_id,
Expand All @@ -873,7 +891,7 @@ async def addSerieMovie(update, context):
if choice == i18n.t("addarr.Movie"):
message2=i18n.t("addarr.Notifications.AddFailed", subjectWithArticle=i18n.t("addarr.MovieWithArticle"),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
else:
message2=i18n.t("addarr.Notifications.AddFailed", subjectWithArticle=i18n.t("addarr.SeriesWithArticle"),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
message2=i18n.t("addarr.Notifications.AddFailed", subjectWithArticle=serieOrSportArticle(context),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
await context.bot.send_message(
chat_id=adminNotifyId, text=message2
)
Expand All @@ -883,7 +901,7 @@ async def addSerieMovie(update, context):
if choice == i18n.t("addarr.Movie"):
message=i18n.t("addarr.messages.Exist", subjectWithArticle=i18n.t("addarr.MovieWithArticle"))
else:
message=i18n.t("addarr.messages.Exist", subjectWithArticle=i18n.t("addarr.SeriesWithArticle"))
message=i18n.t("addarr.messages.Exist", subjectWithArticle=serieOrSportArticle(context))
await context.bot.edit_message_text(
message_id=context.user_data["update_msg"],
chat_id=update.effective_message.chat_id,
Expand All @@ -895,17 +913,26 @@ async def addSerieMovie(update, context):
if choice == i18n.t("addarr.Movie"):
message2=i18n.t("addarr.Notifications.Exist", subjectWithArticle=i18n.t("addarr.MovieWithArticle"),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
else:
message2=i18n.t("addarr.Notifications.Exist", subjectWithArticle=i18n.t("addarr.SeriesWithArticle"),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
message2=i18n.t("addarr.Notifications.Exist", subjectWithArticle=serieOrSportArticle(context),title=context.user_data['output'][position]['title'],first_name=update.effective_message.chat.first_name, chat_id=update.effective_message.chat.id)
await context.bot.send_message(
chat_id=adminNotifyId, text=message2
)
clearUserData(context)
return ConversationHandler.END


def serieOrSportArticle(context):
"""Sport shares the series flow; only the user-facing wording differs."""
if context.user_data.get("choice") == i18n.t("addarr.Sport"):
return i18n.t("addarr.SportWithArticle")
return serieOrSportArticle(context)


def getService(context):
if context.user_data.get("choice") == i18n.t("addarr.Series"):
return sonarr
elif context.user_data.get("choice") == i18n.t("addarr.Sport"):
return sportarr
elif context.user_data.get("choice") == i18n.t("addarr.Movie"):
return radarr
else:
Expand All @@ -928,7 +955,9 @@ async def help(update, context):
delete=config["entrypointDelete"],
movie=i18n.t("addarr.Movie").lower(),
serie=i18n.t("addarr.Series").lower(),
sport=i18n.t("addarr.Sport").lower(),
allSeries=config["entrypointAllSeries"],
allSports=config["entrypointAllSports"],
allMovies=config["entrypointAllMovies"],
transmission=config["entrypointTransmission"],
sabnzbd=config["entrypointSabnzbd"],
Expand Down
39 changes: 38 additions & 1 deletion src/all.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from translations import i18n
import radarr as radarr
import sonarr as sonarr
import sportarr as sportarr

# Set up logging
logLevel = logging.DEBUG if config.get("debugLogging", False) else logging.INFO
Expand Down Expand Up @@ -84,4 +85,40 @@ async def allMovies(update, context):
chat_id=update.effective_message.chat_id,
text=subString,
)
return ConversationHandler.END
return ConversationHandler.END

async def allSports(update, context):
if config.get("enableAllowlist") and not checkAllowed(update,"regular"):
#When using this mode, bot will remain silent if user is not in the allowlist.txt
logger.info("Allowlist is enabled, but userID isn't added into 'allowlist.txt'. So bot stays silent")
return ConversationHandler.END

if sportarr.config.get("adminRestrictions") and not checkAllowed(update,"admin"):
await context.bot.send_message(
chat_id=update.effective_message.chat_id,
text=i18n.t("addarr.NotAdmin"),
)
return ConversationHandler.END

if not checkId(update):
if (
await authentication(update, context) == "added"
): # To also stop the beginning command
return ConversationHandler.END
else:
result = sportarr.allSeries()
content = format_long_list_message(result)

if isinstance(content, str):
await context.bot.send_message(
chat_id=update.effective_message.chat_id,
text=content,
)
else:
# print every substring
for subString in content:
await context.bot.send_message(
chat_id=update.effective_message.chat_id,
text=subString,
)
return ConversationHandler.END
14 changes: 14 additions & 0 deletions src/definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,25 @@
"entrypointDelete": "delete", #start or a custom entrypoint
"entrypointAllSeries": "allSeries", #allSeries or a custom entrypoint
"entrypointAllMovies": "allMovies", #allSeries or a custom entrypoint
"entrypointAllSports": "allSports", #allSports or a custom entrypoint
"entrypointTransmission": "transmission", #transmission or a custom entrypoint
"entrypointSabnzbd": "sabnzbd", #sabnzbd or a custom entrypoint
"logToConsole": True,
"debugLogging": False,
"language": "en-us",
"transmission": { "enable": False },
# Sportarr ships disabled by default so existing configs keep working
"sportarr": {
"server": { "addr": "", "port": 1867, "path": "/", "ssl": False },
"auth": { "apikey": "", "username": None, "password": None },
"search": True,
"seasonFolder": True,
"excludedRootFolders": [],
"narrowRootFolderNames": True,
"excludedQualityProfiles": [],
"defaultTags": [],
"addRequesterIdTag": True,
"adminRestrictions": False,
},
"enableAdmin": False
}
Loading