mirror of
https://github.com/aykhans/series-robot-web.git
synced 2025-06-07 00:29:01 +00:00
Added peridoic email sender with Celery
This commit is contained in:
parent
221c753690
commit
ad04604b6c
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,3 +5,4 @@ db.sqlite3
|
|||||||
src/config/settings/static
|
src/config/settings/static
|
||||||
.env
|
.env
|
||||||
Backup-codes-series.notification.txt
|
Backup-codes-series.notification.txt
|
||||||
|
celerybeat-schedule
|
21
README.md
21
README.md
@ -10,7 +10,24 @@ rename .env.example to .env<br />
|
|||||||
|
|
||||||
**python3 manage.py makemigrations account --settings=config.settings.development<br />
|
**python3 manage.py makemigrations account --settings=config.settings.development<br />
|
||||||
python3 manage.py makemigrations series --settings=config.settings.development<br />
|
python3 manage.py makemigrations series --settings=config.settings.development<br />
|
||||||
python3 manage.py migrate --settings=config.settings.development<br />**
|
python3 manage.py migrate --settings=config.settings.development<br />**<br />
|
||||||
|
|
||||||
## Run for Dev
|
## Run for Dev
|
||||||
**python3 manage.py runserver --settings=config.settings.development**
|
**python3 manage.py runserver --settings=config.settings.development**<br /><br /><br />
|
||||||
|
## Run Periodic Tasks with RabbitMQ
|
||||||
|
### Installition RabbitMQ
|
||||||
|
**sudo apt-get install rabbitmq-server**<br />
|
||||||
|
**sudo systemctl start rabbitmq-server**<br />
|
||||||
|
### Run Celery
|
||||||
|
**celery -A config worker -l info**<br />
|
||||||
|
**celery -A config beat -l info**<br /><br />
|
||||||
|
## Run Periodic Tasks with Redis
|
||||||
|
### **add these two settings to base settings**<br />
|
||||||
|
**CELERY_BROKER_URL = "redis://localhost:6379"<br />
|
||||||
|
CELERY_RESULT_BACKEND = "redis://localhost:6379"**
|
||||||
|
### Installition Redis
|
||||||
|
**sudo apt install redis**<br />
|
||||||
|
**redis-server**<br />
|
||||||
|
### Run Celery
|
||||||
|
**celery -A config worker -l info**<br />
|
||||||
|
**celery -A config beat -l info**
|
@ -1,12 +1,32 @@
|
|||||||
|
amqp==5.1.1
|
||||||
asgiref==3.5.2
|
asgiref==3.5.2
|
||||||
|
async-timeout==4.0.2
|
||||||
|
billiard==3.6.4.0
|
||||||
|
celery==5.2.7
|
||||||
certifi==2022.6.15
|
certifi==2022.6.15
|
||||||
charset-normalizer==2.1.1
|
charset-normalizer==2.1.1
|
||||||
|
click==8.1.3
|
||||||
|
click-didyoumean==0.3.0
|
||||||
|
click-plugins==1.1.1
|
||||||
|
click-repl==0.2.0
|
||||||
|
Deprecated==1.2.13
|
||||||
Django==4.1
|
Django==4.1
|
||||||
django-autoslug==1.9.8
|
django-autoslug==1.9.8
|
||||||
|
django-compat==1.0.15
|
||||||
django-crispy-forms==1.14.0
|
django-crispy-forms==1.14.0
|
||||||
django-environ==0.9.0
|
django-environ==0.9.0
|
||||||
|
django-smtp-ssl
|
||||||
idna==3.3
|
idna==3.3
|
||||||
|
kombu==5.2.4
|
||||||
|
packaging==21.3
|
||||||
|
prompt-toolkit==3.0.31
|
||||||
|
pyparsing==3.0.9
|
||||||
|
pytz==2022.2.1
|
||||||
|
redis==4.3.4
|
||||||
requests==2.28.1
|
requests==2.28.1
|
||||||
|
six==1.16.0
|
||||||
sqlparse==0.4.2
|
sqlparse==0.4.2
|
||||||
urllib3==1.26.12
|
urllib3==1.26.12
|
||||||
django-smtp-ssl
|
vine==5.0.0
|
||||||
|
wcwidth==0.2.5
|
||||||
|
wrapt==1.14.1
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
from .celery import app as celery_app
|
||||||
|
|
||||||
|
__all__ = ("celery_app",)
|
15
src/config/celery.py
Normal file
15
src/config/celery.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import os
|
||||||
|
from celery import Celery
|
||||||
|
|
||||||
|
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.development")
|
||||||
|
app = Celery("django_celery")
|
||||||
|
app.config_from_object("django.conf:settings", namespace="CELERY")
|
||||||
|
app.autodiscover_tasks()
|
||||||
|
|
||||||
|
app.conf.beat_schedule = {
|
||||||
|
'send-emails': {
|
||||||
|
'task': 'send_emails',
|
||||||
|
'schedule': 86400,
|
||||||
|
},
|
||||||
|
}
|
@ -93,3 +93,6 @@ EMAIL_HOST_USER = 'series.notification@gmail.com'
|
|||||||
EMAIL_PORT = 465
|
EMAIL_PORT = 465
|
||||||
EMAIL_USE_SSL = True
|
EMAIL_USE_SSL = True
|
||||||
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
|
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
|
||||||
|
|
||||||
|
# CELERY_BROKER_URL = "redis://localhost:6379"
|
||||||
|
# CELERY_RESULT_BACKEND = "redis://localhost:6379"
|
79
src/series/tasks.py
Normal file
79
src/series/tasks.py
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
from celery import shared_task
|
||||||
|
from account.models import User
|
||||||
|
from requests import get
|
||||||
|
from datetime import datetime
|
||||||
|
from django.template.loader import render_to_string
|
||||||
|
from django.core.mail import EmailMessage
|
||||||
|
from celery.utils.log import get_task_logger
|
||||||
|
|
||||||
|
|
||||||
|
logger = get_task_logger(__name__)
|
||||||
|
|
||||||
|
def get_request(link):
|
||||||
|
raw_data = get(link)
|
||||||
|
|
||||||
|
if raw_data.status_code == 200:
|
||||||
|
data = raw_data.json()
|
||||||
|
if not data['errorMessage']:
|
||||||
|
return data
|
||||||
|
logger.info(f"error message: {data['errorMessage']}\nlink: {link}")
|
||||||
|
return None
|
||||||
|
logger.info(f"status code: {raw_data.status_code}\nlink: {link}")
|
||||||
|
|
||||||
|
def episode_counter(imdb_api_key, s, data):
|
||||||
|
now_date = datetime.strptime(datetime.strftime(datetime.utcnow(),'%d %b %Y'), '%d %b %Y')
|
||||||
|
new_episodes_count = 0
|
||||||
|
|
||||||
|
for n in data['tvSeriesInfo']['seasons'][data['tvSeriesInfo']['seasons'].index(str(s.last_season)):]:
|
||||||
|
data = get_request(f"https://imdb-api.com/en/API/SeasonEpisodes/{imdb_api_key}/{s.imdb_id}/{n}")
|
||||||
|
if data is None: return None
|
||||||
|
|
||||||
|
episodes = data['episodes']
|
||||||
|
for i in range(int(s.last_episode) if n == str(s.last_season) else 0, len(episodes)):
|
||||||
|
released_date = episodes[i]['released'].replace('.', '')
|
||||||
|
try:
|
||||||
|
episode_date = datetime.strptime(released_date, '%d %b %Y')
|
||||||
|
if (episode_date - now_date).days > 0:
|
||||||
|
raise ValueError
|
||||||
|
except ValueError:
|
||||||
|
return new_episodes_count, int(last_n)+1, last_i+1 if new_episodes_count > 0 else 0, 0, 0
|
||||||
|
last_i = i
|
||||||
|
new_episodes_count += 1
|
||||||
|
last_n = n
|
||||||
|
|
||||||
|
return new_episodes_count, n, i+1 if new_episodes_count > 0 else 0, 0, 0
|
||||||
|
|
||||||
|
@shared_task(name='send_emails')
|
||||||
|
def send_feedback_email_task():
|
||||||
|
users = User.objects.filter(email_notification_is_active=True)
|
||||||
|
for user in users:
|
||||||
|
series = user.series.filter(show=True).order_by('-id')
|
||||||
|
series_new_episodes = []
|
||||||
|
|
||||||
|
for s in series:
|
||||||
|
data = get_request(f"https://imdb-api.com/en/API/Title/{user.imdb_api_key}/{s.imdb_id}")
|
||||||
|
|
||||||
|
if data is None:
|
||||||
|
series_new_episodes = []
|
||||||
|
break
|
||||||
|
data = episode_counter(user.imdb_api_key, s, data)
|
||||||
|
if data is None:
|
||||||
|
series_new_episodes = []
|
||||||
|
break
|
||||||
|
|
||||||
|
if data[0]:
|
||||||
|
series_new_episodes.append([s,
|
||||||
|
{'count': data[0],
|
||||||
|
'last_season': data[1],
|
||||||
|
'last_episode': data[2]}
|
||||||
|
])
|
||||||
|
|
||||||
|
if series_new_episodes:
|
||||||
|
message = render_to_string('new_episodes_verification.html', {
|
||||||
|
'user': user,
|
||||||
|
'data': series_new_episodes
|
||||||
|
})
|
||||||
|
email = EmailMessage(
|
||||||
|
'New Episodes!', message, to=[user.email]
|
||||||
|
)
|
||||||
|
email.send()
|
9
src/series/templates/new_episodes_verification.html
Normal file
9
src/series/templates/new_episodes_verification.html
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{% autoescape off %}
|
||||||
|
|
||||||
|
Hi {{ user.username }},
|
||||||
|
There are new episodes of the series you recorded.
|
||||||
|
{% for s, d in data %}
|
||||||
|
{{d.count}} episodes of {{s.title}} you haven't watched (watched episode: {{s.last_season}} - {{s.last_episode}}).
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endautoescape %}
|
Loading…
x
Reference in New Issue
Block a user