diff --git a/manage.py b/manage.py index b227836..dc55940 100644 --- a/manage.py +++ b/manage.py @@ -6,7 +6,7 @@ def main(): """Run administrative tasks.""" - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapps.settings') + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webapps.settings") try: from django.core.management import execute_from_command_line except ImportError as exc: @@ -18,5 +18,5 @@ def main(): execute_from_command_line(sys.argv) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/torrscrapper/apps.py b/torrscrapper/apps.py index fc30f78..7d9835c 100644 --- a/torrscrapper/apps.py +++ b/torrscrapper/apps.py @@ -2,4 +2,4 @@ class TorrscrapperConfig(AppConfig): - name = 'torrscrapper' + name = "torrscrapper" diff --git a/torrscrapper/migrations/0001_initial.py b/torrscrapper/migrations/0001_initial.py index 167e4dd..bfaf2f2 100644 --- a/torrscrapper/migrations/0001_initial.py +++ b/torrscrapper/migrations/0001_initial.py @@ -7,25 +7,29 @@ class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='Movies', + name="Movies", fields=[ - ('id', models.AutoField(auto_created=True, - primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.TextField()), - ('image_url', models.TextField()), - ('release_date', models.CharField(max_length=20)), - ('synopsis', models.TextField()), - ('quality_720p', models.TextField(default='NULL')), - ('quality_720p_size', models.CharField( - default='NULL', max_length=20)), - ('quality_1080p', models.TextField(default='NULL')), - ('quality_1080p_size', models.CharField( - default='NULL', max_length=20)), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.TextField()), + ("image_url", models.TextField()), + ("release_date", models.CharField(max_length=20)), + ("synopsis", models.TextField()), + ("quality_720p", models.TextField(default="NULL")), + ("quality_720p_size", models.CharField(default="NULL", max_length=20)), + ("quality_1080p", models.TextField(default="NULL")), + ("quality_1080p_size", models.CharField(default="NULL", max_length=20)), ], ), ] diff --git a/torrscrapper/migrations/__pycache__/0001_initial.cpython-39.pyc b/torrscrapper/migrations/__pycache__/0001_initial.cpython-39.pyc index 8cdd194..4a10464 100644 Binary files a/torrscrapper/migrations/__pycache__/0001_initial.cpython-39.pyc and b/torrscrapper/migrations/__pycache__/0001_initial.cpython-39.pyc differ diff --git a/torrscrapper/models.py b/torrscrapper/models.py index b1b0afb..498f8d3 100644 --- a/torrscrapper/models.py +++ b/torrscrapper/models.py @@ -8,10 +8,10 @@ class Movies(models.Model): image_url = models.TextField() release_date = models.CharField(max_length=20) synopsis = models.TextField() - quality_720p = models.TextField(default='NULL') - quality_720p_size = models.CharField(max_length=20, default='NULL') - quality_1080p = models.TextField(default='NULL') - quality_1080p_size = models.CharField(max_length=20, default='NULL') + quality_720p = models.TextField(default="NULL") + quality_720p_size = models.CharField(max_length=20, default="NULL") + quality_1080p = models.TextField(default="NULL") + quality_1080p_size = models.CharField(max_length=20, default="NULL") class Games(models.Model): diff --git a/torrscrapper/scraping_utils.py b/torrscrapper/scraping_utils.py index 63afa6f..0bb02b5 100644 --- a/torrscrapper/scraping_utils.py +++ b/torrscrapper/scraping_utils.py @@ -17,11 +17,11 @@ # Formatter for the log messages formatter = logging.Formatter( - '%(asctime)s - %(levelname)s - %(message)s', - datefmt='%Y-%m-%d %H:%M:%S') + "%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" +) # File handler for outputting log messages to a file -file_handler = logging.FileHandler('scraping_logs.log', encoding='utf-8') +file_handler = logging.FileHandler("scraping_logs.log", encoding="utf-8") file_handler.setFormatter(formatter) # Stream handler for outputting log messages to the console @@ -33,13 +33,13 @@ logger.addHandler(stream_handler) ## global variables -scraper = cloudscraper.create_scraper(browser='chrome') +scraper = cloudscraper.create_scraper(browser="chrome") def scrape_data(keywords, selected_sites): site_scrapers = { - 'pirate_bay': get_pirate_bay_torrents, - '1337x': get_1337x_torrents, + "pirate_bay": get_pirate_bay_torrents, + "1337x": get_1337x_torrents, } combined_results = [] @@ -56,8 +56,7 @@ def scrape_data(keywords, selected_sites): if site_key in site_scrapers: scraper_function = site_scrapers[site_key] start_time = time.time() - logging.info( - f"🌐 Site #{index} - Starting scraping for site: {site_key}") + logging.info(f"🌐 Site #{index} - Starting scraping for site: {site_key}") # Append results from each site to the combined_results list combined_results.extend(scraper_function(keywords, index)) @@ -65,36 +64,40 @@ def scrape_data(keywords, selected_sites): end_time = time.time() time_taken = end_time - start_time logging.info( - f"Site #{index} - Completed scraping. Time taken: {time_taken:.2f} seconds") + f"Site #{index} - Completed scraping. Time taken: {time_taken:.2f} seconds" + ) logging.info(f"Site #{index} - --------------------------------") overall_end_time = time.time() overall_time_taken = overall_end_time - overall_start_time logging.info( - f"🎉 Ending the scraping session. Total time taken: {overall_time_taken:.2f} seconds") + f"🎉 Ending the scraping session. Total time taken: {overall_time_taken:.2f} seconds" + ) logging.info(f"Overall collected {len(combined_results)} torrents") logging.info("---------------------------------------------------") return sort_torrents_by_seeds(combined_results) + # Function to sort torrents by the number of seeds def sort_torrents_by_seeds(torrents): - return sorted(torrents, key=lambda x: int(x['seeds']), reverse=True) + return sorted(torrents, key=lambda x: int(x["seeds"]), reverse=True) async def fetch_magnet(session, magnet_url, torrent): async with session.get(magnet_url) as response: if response.status == 200: magnet_content = await response.read() - magnet_soup = BeautifulSoup(magnet_content, 'html.parser') + magnet_soup = BeautifulSoup(magnet_content, "html.parser") magnet_link = magnet_soup.find( - 'a', href=lambda href: href and 'magnet:?' in href) + "a", href=lambda href: href and "magnet:?" in href + ) if magnet_link: - torrent['magnet'] = magnet_link.get('href') + torrent["magnet"] = magnet_link.get("href") else: - torrent['magnet'] = "" + torrent["magnet"] = "" else: print(f"Error fetching magnet link for {torrent['title']}") @@ -103,53 +106,57 @@ async def get_1337x_torrents_async(keywords, torrents): async with aiohttp.ClientSession() as session: tasks = [] for torrent in torrents: - magnet_url = torrent['magnet'] + magnet_url = torrent["magnet"] if magnet_url: - task = asyncio.create_task( - fetch_magnet(session, magnet_url, torrent)) + task = asyncio.create_task(fetch_magnet(session, magnet_url, torrent)) tasks.append(task) # Limiting the number of parallel requests to 5 for now chunk_size = 5 for i in range(0, len(tasks), chunk_size): - await asyncio.gather(*tasks[i:i + chunk_size]) + await asyncio.gather(*tasks[i : i + chunk_size]) def get_1337x_torrents(keywords, index): torrents = [] - search_url = SiteURLs.X1337_BASE_URL + '/search/' + keywords + '/1/' + search_url = SiteURLs.X1337_BASE_URL + "/search/" + keywords + "/1/" try: # Add timeout of 10 seconds response = scraper.get(search_url, timeout=10) parsed_url = urlparse(response.url) query_params = parse_qs(parsed_url.query) - url_status_code = int(query_params.get('status', [None])[0]) + url_status_code = int(query_params.get("status", [None])[0]) if url_status_code: url_status_code = int(url_status_code) - if response.status_code == 200 and url_status_code is not None and url_status_code != 403: + if ( + response.status_code == 200 + and url_status_code is not None + and url_status_code != 403 + ): logging.info( - f"Site #{index} - Initial request to site {search_url} was successful") - soup = BeautifulSoup(response.content, 'html.parser') - rows = soup.find_all('tr') + f"Site #{index} - Initial request to site {search_url} was successful" + ) + soup = BeautifulSoup(response.content, "html.parser") + rows = soup.find_all("tr") for row in rows: - cols = row.find_all('td') + cols = row.find_all("td") if cols: - name_col = cols[0].find_all('a', href=True) - if len(name_col) >= 2 and name_col[1]['href'].startswith( - '/torrent/'): + name_col = cols[0].find_all("a", href=True) + if len(name_col) >= 2 and name_col[1]["href"].startswith( + "/torrent/" + ): name = name_col[1].text.strip() - href = SiteURLs.X1337_BASE_URL + name_col[1]['href'] + href = SiteURLs.X1337_BASE_URL + name_col[1]["href"] seeds = cols[1].text leeches = cols[2].text - size_element = cols[4].find( - text=True, recursive=False).strip() + size_element = cols[4].find(text=True, recursive=False).strip() size = size_element if size_element else None torrent = { - 'title': name, - 'magnet': href, - 'seeds': seeds, - 'peers': leeches, - 'size': size + "title": name, + "magnet": href, + "seeds": seeds, + "peers": leeches, + "size": size, } torrents.append(torrent) @@ -159,11 +166,11 @@ def get_1337x_torrents(keywords, index): return torrents else: if url_status_code: - logging.error( - f"Failed to scrape 1337x. Status code: {url_status_code}") + logging.error(f"Failed to scrape 1337x. Status code: {url_status_code}") else: logging.error( - f"Failed to scrape 1337x. Status code: {response.status_code}") + f"Failed to scrape 1337x. Status code: {response.status_code}" + ) return [] except cloudscraper.requests.exceptions.ConnectionError as e: logging.error(f"Connection error occurred: {str(e)}") @@ -187,33 +194,37 @@ def create_magnet_pirate_bay(info_hash, name): """ trackers = [ - 'udp://tracker.coppersurfer.tk:6969/announce', - 'udp://tracker.openbittorrent.com:6969/announce', - 'udp://9.rarbg.to:2710/announce', - 'udp://9.rarbg.me:2780/announce', - 'udp://9.rarbg.to:2730/announce', - 'udp://tracker.opentrackr.org:1337', - 'http://p4p.arenabg.com:1337/announce', - 'udp://tracker.torrent.eu.org:451/announce', - 'udp://tracker.tiny-vps.com:6969/announce', - 'udp://open.stealth.si:80/announce' + "udp://tracker.coppersurfer.tk:6969/announce", + "udp://tracker.openbittorrent.com:6969/announce", + "udp://9.rarbg.to:2710/announce", + "udp://9.rarbg.me:2780/announce", + "udp://9.rarbg.to:2730/announce", + "udp://tracker.opentrackr.org:1337", + "http://p4p.arenabg.com:1337/announce", + "udp://tracker.torrent.eu.org:451/announce", + "udp://tracker.tiny-vps.com:6969/announce", + "udp://open.stealth.si:80/announce", ] - tracker_str = ''.join(['&tr=' + urllib.parse.quote(tracker) - for tracker in trackers]) - magnet_link = f'magnet:?xt=urn:btih:{info_hash}&dn={urllib.parse.quote(name)}{tracker_str}' + tracker_str = "".join( + ["&tr=" + urllib.parse.quote(tracker) for tracker in trackers] + ) + magnet_link = ( + f"magnet:?xt=urn:btih:{info_hash}&dn={urllib.parse.quote(name)}{tracker_str}" + ) return magnet_link def get_pirate_bay_torrents(keywords, index): torrents = [] - search_url = SiteURLs.PIRATE_BAY_BASE_URL + 'q=' + keywords + search_url = SiteURLs.PIRATE_BAY_BASE_URL + "q=" + keywords response = scraper.get(search_url) if response.status_code == 200: logging.info( - f"Site #{index} - Initial request to site {search_url} was successful") + f"Site #{index} - Initial request to site {search_url} was successful" + ) json_data = response.json() for item in json_data: name = item.get("name") @@ -223,16 +234,17 @@ def get_pirate_bay_torrents(keywords, index): # Converts bytes to human-readable format size = humanize.naturalsize(int(item.get("size")), binary=True) torrent = { - 'title': name, - 'seeds': seeders, - 'peers': leechers, - 'magnet': create_magnet_pirate_bay(info_hash, name), - 'size': size + "title": name, + "seeds": seeders, + "peers": leechers, + "magnet": create_magnet_pirate_bay(info_hash, name), + "size": size, } torrents.append(torrent) logging.info(f"Site #{index} - Collected {len(torrents)} torrents") else: logging.error( - f"Site #{index} - Failed to scrape Pirate Bay. Status code: {response.status_code}") + f"Site #{index} - Failed to scrape Pirate Bay. Status code: {response.status_code}" + ) return torrents diff --git a/torrscrapper/urls.py b/torrscrapper/urls.py index 10c4c24..ae24f0b 100644 --- a/torrscrapper/urls.py +++ b/torrscrapper/urls.py @@ -8,17 +8,10 @@ path("privacy_policy", views.privacy_policy, name="privacy_policy"), path("contact_us", views.contact_us, name="contact_us"), path( - "contact_us/submitform", - views.contact_form_submit, - name="contact_form_submit"), + "contact_us/submitform", views.contact_form_submit, name="contact_form_submit" + ), path("categories/movies", views.movies, name="movies"), - path( - "categories/movies/", - views.movies_single, - name="movies_single"), + path("categories/movies/", views.movies_single, name="movies_single"), path("categories/games", views.games, name="games"), - path( - "categories/games/", - views.games_single, - name="games_single"), + path("categories/games/", views.games_single, name="games_single"), ] diff --git a/torrscrapper/views.py b/torrscrapper/views.py index 5ddc432..8e8d053 100644 --- a/torrscrapper/views.py +++ b/torrscrapper/views.py @@ -9,85 +9,85 @@ def index(request): return render(request, "torrscrapper/index.html") + # Helper Function for Validating Input Length def validate_input_length(value, min_length, max_length): return min_length <= len(value) <= max_length + # Search Torrents View def searchTorrents(request): context = {} - keywords = request.GET['keywords'].lower() - selected_sites = request.GET.getlist('sites') + keywords = request.GET["keywords"].lower() + selected_sites = request.GET.getlist("sites") torrents_data = scrape_data(keywords, selected_sites) context["torrents"] = torrents_data context["keywords"] = keywords return render(request, "torrscrapper/searchResults.html", context) + # DMCA View def dmca(request): return render(request, "torrscrapper/DMCA.html") + # Privacy Policy View def privacy_policy(request): return render(request, "torrscrapper/privacy.html") + # Contact Us View def contact_us(request): - context = {'submission': False, 'errors': []} + context = {"submission": False, "errors": []} return render(request, "torrscrapper/contact.html", context) + # Contact Form Submission View def contact_form_submit(request): - context = {'success': False, 'errors': []} - name = request.POST.get('name', '') - email = request.POST.get('email', '') - subject = request.POST.get('subject', '') - message = request.POST.get('message', '') + context = {"success": False, "errors": []} + name = request.POST.get("name", "") + email = request.POST.get("email", "") + subject = request.POST.get("subject", "") + message = request.POST.get("message", "") if not validate_input_length(name, 2, 100): - context['errors'].append( - "Your name should be between 2 to 100 characters") + context["errors"].append("Your name should be between 2 to 100 characters") if not validate_input_length(subject, 4, 200): - context['errors'].append( - "Your subject should be between 4 to 200 characters") + context["errors"].append("Your subject should be between 4 to 200 characters") if not validate_input_length(message, 10, 500): - context['errors'].append( - "Message should be between 10 to 500 characters") + context["errors"].append("Message should be between 10 to 500 characters") - if not context['errors']: - Contact.objects.create( - name=name, - email=email, - subject=subject, - message=message) - context['success'] = True + if not context["errors"]: + Contact.objects.create(name=name, email=email, subject=subject, message=message) + context["success"] = True return render(request, "torrscrapper/contact.html", context) + # Movies View def movies(request): - context = {'search_flag': False} - keywords = request.GET.get('keywords', '') + context = {"search_flag": False} + keywords = request.GET.get("keywords", "") if keywords: - context['search_flag'] = True - context['search_keywords'] = keywords + context["search_flag"] = True + context["search_keywords"] = keywords movies_queryset = Movies.objects.filter(title__icontains=keywords) paginator = Paginator(movies_queryset, 15) else: @@ -96,7 +96,7 @@ def movies(request): movies_count = movies_queryset.count() # Default to page 1 if not provided - page_number = request.GET.get('page', 1) + page_number = request.GET.get("page", 1) try: paged_movies = paginator.page(page_number) @@ -105,35 +105,37 @@ def movies(request): except EmptyPage: paged_movies = paginator.page(paginator.num_pages) - context['all_movies_length'] = movies_count - context['all_movies'] = paged_movies + context["all_movies_length"] = movies_count + context["all_movies"] = paged_movies return render(request, "torrscrapper/category/movies.html", context) + # Single Movie View def movies_single(request, movie_id): movie = get_object_or_404(Movies, pk=movie_id) - context = {'movie': movie} + context = {"movie": movie} return render(request, "torrscrapper/category/movies_single.html", context) + # Games View def games(request): - context = {'search_flag': False} - keywords = request.GET.get('keywords', '') + context = {"search_flag": False} + keywords = request.GET.get("keywords", "") if keywords: - context['search_flag'] = True - context['search_keywords'] = keywords + context["search_flag"] = True + context["search_keywords"] = keywords games_queryset = Games.objects.filter(title__icontains=keywords) else: games_queryset = Games.objects.all() games_count = games_queryset.count() paginator = Paginator(games_queryset, 6) - page_number = request.GET.get('page', 1) + page_number = request.GET.get("page", 1) try: paged_games = paginator.page(page_number) @@ -142,14 +144,15 @@ def games(request): except EmptyPage: paged_games = paginator.page(paginator.num_pages) - context['all_games_length'] = games_count - context['all_games'] = paged_games + context["all_games_length"] = games_count + context["all_games"] = paged_games return render(request, "torrscrapper/category/games.html", context) + # Single Game View def games_single(request, game_id): game = get_object_or_404(Games, pk=game_id) - context = {'game': game} + context = {"game": game} return render(request, "torrscrapper/category/games_single.html", context) diff --git a/webapps/__pycache__/settings.cpython-39.pyc b/webapps/__pycache__/settings.cpython-39.pyc index 89dd1fd..90948b5 100644 Binary files a/webapps/__pycache__/settings.cpython-39.pyc and b/webapps/__pycache__/settings.cpython-39.pyc differ diff --git a/webapps/__pycache__/urls.cpython-39.pyc b/webapps/__pycache__/urls.cpython-39.pyc index 741cbfc..bca8a74 100644 Binary files a/webapps/__pycache__/urls.cpython-39.pyc and b/webapps/__pycache__/urls.cpython-39.pyc differ diff --git a/webapps/__pycache__/wsgi.cpython-39.pyc b/webapps/__pycache__/wsgi.cpython-39.pyc index 0bfff09..81070ff 100644 Binary files a/webapps/__pycache__/wsgi.cpython-39.pyc and b/webapps/__pycache__/wsgi.cpython-39.pyc differ diff --git a/webapps/asgi.py b/webapps/asgi.py index 5474129..6b242da 100644 --- a/webapps/asgi.py +++ b/webapps/asgi.py @@ -11,6 +11,6 @@ from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapps.settings') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webapps.settings") application = get_asgi_application() diff --git a/webapps/settings.py b/webapps/settings.py index 4b0cf9d..7798f4f 100644 --- a/webapps/settings.py +++ b/webapps/settings.py @@ -12,6 +12,7 @@ from pathlib import Path import os + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -20,65 +21,65 @@ # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'test@123' +SECRET_KEY = "test@123" # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['*'] +ALLOWED_HOSTS = ["*"] # Application definition INSTALLED_APPS = [ - 'torrscrapper.apps.TorrscrapperConfig', - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', + "torrscrapper.apps.TorrscrapperConfig", + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", ] MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'whitenoise.middleware.WhiteNoiseMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + "django.middleware.security.SecurityMiddleware", + "whitenoise.middleware.WhiteNoiseMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", ] -ROOT_URLCONF = 'webapps.urls' +ROOT_URLCONF = "webapps.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates')], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [os.path.join(BASE_DIR, "templates")], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", ], }, }, ] -WSGI_APPLICATION = 'webapps.wsgi.application' +WSGI_APPLICATION = "webapps.wsgi.application" # Database # https://docs.djangoproject.com/en/3.1/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", } } @@ -88,16 +89,16 @@ AUTH_PASSWORD_VALIDATORS = [ { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", }, { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, ] @@ -105,9 +106,9 @@ # Internationalization # https://docs.djangoproject.com/en/3.1/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -119,6 +120,6 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.1/howto/static-files/ -STATIC_ROOT = os.path.join(BASE_DIR, 'static') -STATIC_URL = '/static/' -STATICFILES_DIRS = [os.path.join(BASE_DIR, 'webapps/static')] +STATIC_ROOT = os.path.join(BASE_DIR, "static") +STATIC_URL = "/static/" +STATICFILES_DIRS = [os.path.join(BASE_DIR, "webapps/static")] diff --git a/webapps/urls.py b/webapps/urls.py index 729b3c9..63adc46 100644 --- a/webapps/urls.py +++ b/webapps/urls.py @@ -17,6 +17,6 @@ from django.urls import path, include urlpatterns = [ - path('', include('torrscrapper.urls')), - path('admin/', admin.site.urls), + path("", include("torrscrapper.urls")), + path("admin/", admin.site.urls), ] diff --git a/webapps/wsgi.py b/webapps/wsgi.py index 4988f87..7c6c854 100644 --- a/webapps/wsgi.py +++ b/webapps/wsgi.py @@ -11,6 +11,6 @@ from django.core.wsgi import get_wsgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'webapps.settings') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webapps.settings") application = get_wsgi_application()