diff --git a/gallery_dl/cloudflare.py b/gallery_dl/cloudflare.py
index 676e723f..414a461d 100644
--- a/gallery_dl/cloudflare.py
+++ b/gallery_dl/cloudflare.py
@@ -41,7 +41,7 @@ def solve_challenge(session, response):
params["jschl_answer"] = solve_jschl(response.url, page)
time.sleep(4)
- url = urllib.parse.urljoin(response.url, "/cdn-cgi/l/chk_jschl")
+ url = text.urljoin(response.url, "/cdn-cgi/l/chk_jschl")
return session.get(url, params=params)
diff --git a/gallery_dl/extractor/booru.py b/gallery_dl/extractor/booru.py
index aaddbaac..0113f62c 100644
--- a/gallery_dl/extractor/booru.py
+++ b/gallery_dl/extractor/booru.py
@@ -10,7 +10,6 @@
from .common import SharedConfigExtractor, Message
from .. import text
-from urllib.parse import urljoin
from xml.etree import ElementTree
import datetime
import operator
@@ -52,7 +51,7 @@ class BooruExtractor(SharedConfigExtractor):
try:
url = image["file_url"]
if url.startswith("/"):
- url = urljoin(self.api_url, url)
+ url = text.urljoin(self.api_url, url)
image.update(data)
yield Message.Url, url, text.nameext_from_url(url, image)
except KeyError:
diff --git a/gallery_dl/extractor/hbrowse.py b/gallery_dl/extractor/hbrowse.py
index fde517ac..f1f04ed2 100644
--- a/gallery_dl/extractor/hbrowse.py
+++ b/gallery_dl/extractor/hbrowse.py
@@ -10,7 +10,6 @@
from .common import ChapterExtractor, MangaExtractor
from .. import text
-from urllib.parse import urljoin
import json
@@ -61,7 +60,7 @@ class HbrowseMangaExtractor(HbrowseExtractor, MangaExtractor):
title, pos = text.extract(page, '>View ', '<', pos)
data["chapter"] = text.parse_int(url.rpartition("/")[2][1:])
data["title"] = title
- results.append((urljoin(self.root, url), data.copy()))
+ results.append((text.urljoin(self.root, url), data.copy()))
class HbrowseChapterExtractor(HbrowseExtractor, ChapterExtractor):
diff --git a/gallery_dl/extractor/hentaifoundry.py b/gallery_dl/extractor/hentaifoundry.py
index e697aaab..23713fc0 100644
--- a/gallery_dl/extractor/hentaifoundry.py
+++ b/gallery_dl/extractor/hentaifoundry.py
@@ -10,7 +10,6 @@
from .common import Extractor, Message
from .. import text, util, exception
-from urllib.parse import urljoin
class HentaifoundryExtractor(Extractor):
@@ -47,7 +46,7 @@ class HentaifoundryExtractor(Extractor):
def get_image_metadata(self, url):
"""Collect metadata for an image"""
- page = self.request(urljoin(self.root, url)).text
+ page = self.request(text.urljoin(self.root, url)).text
index = url.rsplit("/", 2)[1]
title, pos = text.extract(
page, 'Pictures » ', '<')
diff --git a/gallery_dl/extractor/imagehosts.py b/gallery_dl/extractor/imagehosts.py
index d3d07826..1b029d33 100644
--- a/gallery_dl/extractor/imagehosts.py
+++ b/gallery_dl/extractor/imagehosts.py
@@ -12,7 +12,6 @@ from .common import Extractor, Message
from .. import text, exception
from ..cache import memcache
from os.path import splitext
-from urllib.parse import urljoin
class ImagehostImageExtractor(Extractor):
@@ -142,8 +141,7 @@ class ImagevenueImageExtractor(ImagehostImageExtractor):
def get_info(self, page):
url = text.extract(page, 'SRC="', '"')[0]
- url = urljoin(self.url, url)
- return url, url
+ return text.urljoin(self.url, url), url
class ImagetwistImageExtractor(ImagehostImageExtractor):
diff --git a/gallery_dl/extractor/khinsider.py b/gallery_dl/extractor/khinsider.py
index ddbe56c3..cde65827 100644
--- a/gallery_dl/extractor/khinsider.py
+++ b/gallery_dl/extractor/khinsider.py
@@ -10,7 +10,6 @@
from .common import AsynchronousExtractor, Message
from .. import text, exception
-from urllib.parse import urljoin
class KhinsiderSoundtrackExtractor(AsynchronousExtractor):
@@ -63,7 +62,8 @@ class KhinsiderSoundtrackExtractor(AsynchronousExtractor):
page = text.extract(page, '', '
')[0]
for num, url in enumerate(text.extract_iter(
page, '