diff --git a/crawl.py b/crawl.py index 5c8d4ec..f93d4ad 100755 --- a/crawl.py +++ b/crawl.py @@ -3,7 +3,7 @@ import json import sys import login -from yggtorrentscraper import YggTorrentScraper +from yggcrawl import YggTorrentScraper scraper = YggTorrentScraper(requests.session()) from yggtorrentscraper import set_yggtorrent_tld set_yggtorrent_tld("se") @@ -33,7 +33,7 @@ most_completed = scraper.most_completed() if(scraper.login(login.user, login.passwd)): print("Login success") + first_torrent = research[0] + scraper.download_from_torrent_url(first_torrent) else: print("Login failed") - -#scraper.download_from_torrent_url('') diff --git a/install.sh b/install.sh index 9ac7714..17a4ff0 100644 --- a/install.sh +++ b/install.sh @@ -15,8 +15,8 @@ sbotc() { # Install YGGTorrentScraper yggts() { echo -e "${c_yellow}Installing YGGTorrentScraper...$c_" - [[ -z $(which pip3) ]] && sudo apt install python3-pip - pip3 install yggtorrentscraper + # [[ -z $(which pip3) ]] && sudo apt install python3-pip + #pip3 install yggtorrentscraper } torrengo() { diff --git a/yggcrawl/__init__.py b/yggcrawl/__init__.py new file mode 100644 index 0000000..fa5ad71 --- /dev/null +++ b/yggcrawl/__init__.py @@ -0,0 +1,11 @@ +""" +__init__.py main +""" + +from .yggtorrentscraper import ( + YggTorrentScraper, + set_yggtorrent_tld, + get_yggtorrent_tld, +) +from .torrent import Torrent, TorrentComment, TorrentFile +from .categories import categories diff --git a/yggcrawl/__pycache__/__init__.cpython-37.pyc b/yggcrawl/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..6ec08ad Binary files /dev/null and b/yggcrawl/__pycache__/__init__.cpython-37.pyc differ diff --git a/yggcrawl/__pycache__/categories.cpython-37.pyc b/yggcrawl/__pycache__/categories.cpython-37.pyc new file mode 100644 index 0000000..6cf8690 Binary files /dev/null and b/yggcrawl/__pycache__/categories.cpython-37.pyc differ diff --git a/yggcrawl/__pycache__/torrent.cpython-37.pyc b/yggcrawl/__pycache__/torrent.cpython-37.pyc new file mode 100644 index 0000000..150ffb0 Binary files /dev/null and b/yggcrawl/__pycache__/torrent.cpython-37.pyc differ diff --git a/yggcrawl/__pycache__/yggtorrentscraper.cpython-37.pyc b/yggcrawl/__pycache__/yggtorrentscraper.cpython-37.pyc new file mode 100644 index 0000000..99ee7fc Binary files /dev/null and b/yggcrawl/__pycache__/yggtorrentscraper.cpython-37.pyc differ diff --git a/yggcrawl/categories.py b/yggcrawl/categories.py new file mode 100644 index 0000000..d26de45 --- /dev/null +++ b/yggcrawl/categories.py @@ -0,0 +1,3893 @@ +categories = [ + { + "name": "films_&_videos", + "id": "2145", + "subcategories": [ + { + "name": "animation", + "id": "2178", + "options": [ + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + { + "name": "genre", + "id": "33", + "multiple": "1", + "values": [ + "action", + "animalier", + "animation", + "arts", + "arts_martiaux", + "aventure", + "ballet", + "biopic", + "choregraphie", + "classique", + "comedie", + "comedie_dramatique", + "court-metrage", + "culinaire", + "danse_contemporaine", + "decouverte", + "divers", + "documentaire", + "drame", + "enquete", + "epouvante_&_horreur", + "espionnage", + "famille", + "fantastique", + "fiction", + "film_noir", + "gore", + "guerre", + "historique", + "humour", + "interactif", + "judiciaire", + "litterature", + "manga", + "musical", + "nanar", + "nature", + "opera", + "opera_rock", + "pedagogie", + "peplum", + "philosophie", + "policier", + "politique_&_geopolitique", + "religions_&_croyances", + "romance", + "sante_&_bien-etre", + "science_fiction", + "sciences_&_technologies", + "societe", + "sports_&_loisirs", + "tele-realite", + "theatre", + "thriller", + "varietes_tv", + "voyages_&_tourisme", + "western", + ], + }, + ], + }, + { + "name": "animation_serie", + "id": "2179", + "options": [ + { + "name": "episode", + "id": "34", + "values": [ + "saison_complete", + "episode_01", + "episode_02", + "episode_03", + "episode_04", + "episode_05", + "episode_06", + "episode_07", + "episode_08", + "episode_09", + "episode_10", + "episode_11", + "episode_12", + "episode_13", + "episode_14", + "episode_15", + "episode_16", + "episode_17", + "episode_18", + "episode_19", + "episode_20", + "episode_21", + "episode_22", + "episode_23", + "episode_24", + "episode_25", + "episode_26", + "episode_27", + "episode_28", + "episode_29", + "episode_30", + "episode_31", + "episode_32", + "episode_33", + "episode_34", + "episode_35", + "episode_36", + "episode_37", + "episode_38", + "episode_39", + "episode_40", + "episode_41", + "episode_42", + "episode_43", + "episode_44", + "episode_45", + "episode_46", + "episode_47", + "episode_48", + "episode_49", + "episode_50", + "episode_51", + "episode_52", + "episode_53", + "episode_54", + "episode_55", + "episode_56", + "episode_57", + "episode_58", + "episode_59", + "episode_60", + "non_communique", + ], + }, + { + "name": "saison", + "id": "35", + "values": [ + "serie_integrale", + "hors_saison", + "non_communique", + "saison_01", + "saison_02", + "saison_03", + "saison_04", + "saison_05", + "saison_06", + "saison_07", + "saison_08", + "saison_09", + "saison_10", + "saison_11", + "saison_12", + "saison_13", + "saison_14", + "saison_15", + "saison_16", + "saison_17", + "saison_18", + "saison_19", + "saison_20", + "saison_21", + "saison_22", + "saison_23", + "saison_24", + "saison_25", + "saison_26", + "saison_27", + "saison_28", + "saison_29", + "saison_30", + ], + }, + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + { + "name": "genre", + "id": "33", + "multiple": "1", + "values": [ + "action", + "animalier", + "animation", + "arts", + "arts_martiaux", + "aventure", + "ballet", + "biopic", + "choregraphie", + "classique", + "comedie", + "comedie_dramatique", + "court-metrage", + "culinaire", + "danse_contemporaine", + "decouverte", + "divers", + "documentaire", + "drame", + "enquete", + "epouvante_&_horreur", + "espionnage", + "famille", + "fantastique", + "fiction", + "film_noir", + "gore", + "guerre", + "historique", + "humour", + "interactif", + "judiciaire", + "litterature", + "manga", + "musical", + "nanar", + "nature", + "opera", + "opera_rock", + "pedagogie", + "peplum", + "philosophie", + "policier", + "politique_&_geopolitique", + "religions_&_croyances", + "romance", + "sante_&_bien-etre", + "science_fiction", + "sciences_&_technologies", + "societe", + "sports_&_loisirs", + "tele-realite", + "theatre", + "thriller", + "varietes_tv", + "voyages_&_tourisme", + "western", + ], + }, + ], + }, + { + "name": "concert", + "id": "2180", + "options": [ + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + ], + }, + { + "name": "documentaire", + "id": "2181", + "options": [ + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + { + "name": "genre", + "id": "33", + "multiple": "1", + "values": [ + "action", + "animalier", + "animation", + "arts", + "arts_martiaux", + "aventure", + "ballet", + "biopic", + "choregraphie", + "classique", + "comedie", + "comedie_dramatique", + "court-metrage", + "culinaire", + "danse_contemporaine", + "decouverte", + "divers", + "documentaire", + "drame", + "enquete", + "epouvante_&_horreur", + "espionnage", + "famille", + "fantastique", + "fiction", + "film_noir", + "gore", + "guerre", + "historique", + "humour", + "interactif", + "judiciaire", + "litterature", + "manga", + "musical", + "nanar", + "nature", + "opera", + "opera_rock", + "pedagogie", + "peplum", + "philosophie", + "policier", + "politique_&_geopolitique", + "religions_&_croyances", + "romance", + "sante_&_bien-etre", + "science_fiction", + "sciences_&_technologies", + "societe", + "sports_&_loisirs", + "tele-realite", + "theatre", + "thriller", + "varietes_tv", + "voyages_&_tourisme", + "western", + ], + }, + ], + }, + { + "name": "emission_tv", + "id": "2182", + "options": [ + { + "name": "episode", + "id": "34", + "values": [ + "saison_complete", + "episode_01", + "episode_02", + "episode_03", + "episode_04", + "episode_05", + "episode_06", + "episode_07", + "episode_08", + "episode_09", + "episode_10", + "episode_11", + "episode_12", + "episode_13", + "episode_14", + "episode_15", + "episode_16", + "episode_17", + "episode_18", + "episode_19", + "episode_20", + "episode_21", + "episode_22", + "episode_23", + "episode_24", + "episode_25", + "episode_26", + "episode_27", + "episode_28", + "episode_29", + "episode_30", + "episode_31", + "episode_32", + "episode_33", + "episode_34", + "episode_35", + "episode_36", + "episode_37", + "episode_38", + "episode_39", + "episode_40", + "episode_41", + "episode_42", + "episode_43", + "episode_44", + "episode_45", + "episode_46", + "episode_47", + "episode_48", + "episode_49", + "episode_50", + "episode_51", + "episode_52", + "episode_53", + "episode_54", + "episode_55", + "episode_56", + "episode_57", + "episode_58", + "episode_59", + "episode_60", + "non_communique", + ], + }, + { + "name": "saison", + "id": "35", + "values": [ + "serie_integrale", + "hors_saison", + "non_communique", + "saison_01", + "saison_02", + "saison_03", + "saison_04", + "saison_05", + "saison_06", + "saison_07", + "saison_08", + "saison_09", + "saison_10", + "saison_11", + "saison_12", + "saison_13", + "saison_14", + "saison_15", + "saison_16", + "saison_17", + "saison_18", + "saison_19", + "saison_20", + "saison_21", + "saison_22", + "saison_23", + "saison_24", + "saison_25", + "saison_26", + "saison_27", + "saison_28", + "saison_29", + "saison_30", + ], + }, + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + { + "name": "genre", + "id": "33", + "multiple": "1", + "values": [ + "action", + "animalier", + "animation", + "arts", + "arts_martiaux", + "aventure", + "ballet", + "biopic", + "choregraphie", + "classique", + "comedie", + "comedie_dramatique", + "court-metrage", + "culinaire", + "danse_contemporaine", + "decouverte", + "divers", + "documentaire", + "drame", + "enquete", + "epouvante_&_horreur", + "espionnage", + "famille", + "fantastique", + "fiction", + "film_noir", + "gore", + "guerre", + "historique", + "humour", + "interactif", + "judiciaire", + "litterature", + "manga", + "musical", + "nanar", + "nature", + "opera", + "opera_rock", + "pedagogie", + "peplum", + "philosophie", + "policier", + "politique_&_geopolitique", + "religions_&_croyances", + "romance", + "sante_&_bien-etre", + "science_fiction", + "sciences_&_technologies", + "societe", + "sports_&_loisirs", + "tele-realite", + "theatre", + "thriller", + "varietes_tv", + "voyages_&_tourisme", + "western", + ], + }, + ], + }, + { + "name": "film", + "id": "2183", + "options": [ + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + { + "name": "genre", + "id": "33", + "multiple": "1", + "values": [ + "action", + "animalier", + "animation", + "arts", + "arts_martiaux", + "aventure", + "ballet", + "biopic", + "choregraphie", + "classique", + "comedie", + "comedie_dramatique", + "court-metrage", + "culinaire", + "danse_contemporaine", + "decouverte", + "divers", + "documentaire", + "drame", + "enquete", + "epouvante_&_horreur", + "espionnage", + "famille", + "fantastique", + "fiction", + "film_noir", + "gore", + "guerre", + "historique", + "humour", + "interactif", + "judiciaire", + "litterature", + "manga", + "musical", + "nanar", + "nature", + "opera", + "opera_rock", + "pedagogie", + "peplum", + "philosophie", + "policier", + "politique_&_geopolitique", + "religions_&_croyances", + "romance", + "sante_&_bien-etre", + "science_fiction", + "sciences_&_technologies", + "societe", + "sports_&_loisirs", + "tele-realite", + "theatre", + "thriller", + "varietes_tv", + "voyages_&_tourisme", + "western", + ], + }, + ], + }, + { + "name": "serie_tv", + "id": "2184", + "options": [ + { + "name": "episode", + "id": "34", + "values": [ + "saison_complete", + "episode_01", + "episode_02", + "episode_03", + "episode_04", + "episode_05", + "episode_06", + "episode_07", + "episode_08", + "episode_09", + "episode_10", + "episode_11", + "episode_12", + "episode_13", + "episode_14", + "episode_15", + "episode_16", + "episode_17", + "episode_18", + "episode_19", + "episode_20", + "episode_21", + "episode_22", + "episode_23", + "episode_24", + "episode_25", + "episode_26", + "episode_27", + "episode_28", + "episode_29", + "episode_30", + "episode_31", + "episode_32", + "episode_33", + "episode_34", + "episode_35", + "episode_36", + "episode_37", + "episode_38", + "episode_39", + "episode_40", + "episode_41", + "episode_42", + "episode_43", + "episode_44", + "episode_45", + "episode_46", + "episode_47", + "episode_48", + "episode_49", + "episode_50", + "episode_51", + "episode_52", + "episode_53", + "episode_54", + "episode_55", + "episode_56", + "episode_57", + "episode_58", + "episode_59", + "episode_60", + "non_communique", + ], + }, + { + "name": "saison", + "id": "35", + "values": [ + "serie_integrale", + "hors_saison", + "non_communique", + "saison_01", + "saison_02", + "saison_03", + "saison_04", + "saison_05", + "saison_06", + "saison_07", + "saison_08", + "saison_09", + "saison_10", + "saison_11", + "saison_12", + "saison_13", + "saison_14", + "saison_15", + "saison_16", + "saison_17", + "saison_18", + "saison_19", + "saison_20", + "saison_21", + "saison_22", + "saison_23", + "saison_24", + "saison_25", + "saison_26", + "saison_27", + "saison_28", + "saison_29", + "saison_30", + ], + }, + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + { + "name": "genre", + "id": "33", + "multiple": "1", + "values": [ + "action", + "animalier", + "animation", + "arts", + "arts_martiaux", + "aventure", + "ballet", + "biopic", + "choregraphie", + "classique", + "comedie", + "comedie_dramatique", + "court-metrage", + "culinaire", + "danse_contemporaine", + "decouverte", + "divers", + "documentaire", + "drame", + "enquete", + "epouvante_&_horreur", + "espionnage", + "famille", + "fantastique", + "fiction", + "film_noir", + "gore", + "guerre", + "historique", + "humour", + "interactif", + "judiciaire", + "litterature", + "manga", + "musical", + "nanar", + "nature", + "opera", + "opera_rock", + "pedagogie", + "peplum", + "philosophie", + "policier", + "politique_&_geopolitique", + "religions_&_croyances", + "romance", + "sante_&_bien-etre", + "science_fiction", + "sciences_&_technologies", + "societe", + "sports_&_loisirs", + "tele-realite", + "theatre", + "thriller", + "varietes_tv", + "voyages_&_tourisme", + "western", + ], + }, + ], + }, + { + "name": "spectacle", + "id": "2185", + "options": [ + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + { + "name": "genre", + "id": "33", + "multiple": "1", + "values": [ + "action", + "animalier", + "animation", + "arts", + "arts_martiaux", + "aventure", + "ballet", + "biopic", + "choregraphie", + "classique", + "comedie", + "comedie_dramatique", + "court-metrage", + "culinaire", + "danse_contemporaine", + "decouverte", + "divers", + "documentaire", + "drame", + "enquete", + "epouvante_&_horreur", + "espionnage", + "famille", + "fantastique", + "fiction", + "film_noir", + "gore", + "guerre", + "historique", + "humour", + "interactif", + "judiciaire", + "litterature", + "manga", + "musical", + "nanar", + "nature", + "opera", + "opera_rock", + "pedagogie", + "peplum", + "philosophie", + "policier", + "politique_&_geopolitique", + "religions_&_croyances", + "romance", + "sante_&_bien-etre", + "science_fiction", + "sciences_&_technologies", + "societe", + "sports_&_loisirs", + "tele-realite", + "theatre", + "thriller", + "varietes_tv", + "voyages_&_tourisme", + "western", + ], + }, + ], + }, + { + "name": "sport", + "id": "2186", + "options": [ + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + ], + }, + { + "name": "video-clips", + "id": "2187", + "options": [ + { + "name": "langue", + "id": "29", + "multiple": "1", + "values": [ + "anglais", + "francais_(vff/truefrench)", + "muet", + "multi_(francais_inclus)", + "multi_(quebecois_inclus)", + "quebecois_(vfq/french)", + "vfstfr", + "vostfr", + ], + }, + { + "name": "qualite", + "id": "30", + "values": [ + "bdrip/brrip_[rip_sd_(non_hd)_depuis_bluray_ou_hdrip]", + "bluray_4k_[full_ou_remux]", + "bluray_[full]", + "bluray_[remux]", + "dvd-r_5_[dvd_<_4.37gb]", + "dvd-r_9_[dvd_>_4.37gb]", + "dvdrip_[rip_depuis_dvd-r]", + "hdrip_1080_[rip_hd_depuis_bluray]", + "hdrip_4k_[rip_hd_4k_depuis_source_4k]", + "hdrip_720_[rip_hd_depuis_bluray]", + "tvrip_[rip_sd_(non_hd)_depuis_source_tv_hd/sd]", + "tvriphd_1080_[rip_hd_depuis_source_tv_hd]", + "tvriphd_4k_[rip_hd_4k_depuis_source_tv_4k]", + "tvriphd_720_[rip_hd_depuis_source_tv_hd]", + "vcd/svcd/vhsrip", + "web-dl", + "web-dl_1080", + "web-dl_4k", + "web-dl_720", + "webrip", + "webrip_1080", + "webrip_4k", + "webrip_720", + ], + }, + { + "name": "systeme", + "id": "31", + "multiple": "1", + "values": [ + "nintendo_ds/3ds", + "pc/platine/lecteur_multimedia/etc", + "smartphone/tablette/psp/psvita", + ], + }, + { + "name": "type", + "id": "32", + "values": [ + "2d_(standard)", + "3d_converti_(non_officiel/amateur)", + "3d_converti_(post-production)", + "3d_natif_(production)", + ], + }, + ], + }, + ], + }, + { + "name": "ebook", + "id": "2140", + "subcategories": [ + { + "name": "audio", + "id": "2151", + "options": [ + { + "name": "format", + "id": "14", + "values": [ + "aac_(m4a)", + "ac3", + "aif", + "alac_(m4a)", + "bluray_pure_audio", + "dsd", + "dts", + "flac_(16_bit)", + "flac_(24_bit)", + "monkey's_audio", + "mp3", + "mpc", + "ogg", + "samples", + "wav", + "wavpack", + "wma", + ], + }, + { + "name": "type", + "id": "15", + "values": [ + "album", + "bande_originale_de_film/jeu", + "discographie", + "ep", + "integrale/coffret", + "live/concert", + "mix/medley", + "piste_audio_de_film", + "radio", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "17", + "multiple": "1", + "values": [ + "actualites", + "animaux", + "art", + "astrologie", + "auto-moto-vehicules", + "aventure", + "beaute", + "bien-etre", + "biographie", + "bricolage", + "cinema", + "comedie", + "conte", + "cuisine_et_vin", + "decoration", + "dictionnaire", + "droit", + "economie", + "encyclopedies", + "esoterisme", + "fantastique", + "fantasy", + "guerre", + "heroic_fantasy", + "histoire", + "humour", + "informatique", + "internet", + "jardinage", + "jeunesse", + "jeux_video", + "journalisme", + "linguistique", + "litterature", + "loisir", + "manuel", + "medecine", + "musique", + "nature", + "nouvelles", + "paranormal", + "parascolaire", + "partitions", + "philosophie", + "photos", + "poesie", + "polar", + "policier", + "politique", + "professionnel", + "religion", + "roman", + "sante", + "science", + "science_humaine", + "science-fiction", + "scolaire", + "societe", + "spiritualite", + "sport", + "suspense", + "technique", + "terreur", + "theatre", + "thriller", + "tourisme", + "vie_pratique", + "voyage", + ], + }, + ], + }, + { + "name": "bds", + "id": "2152", + "options": [ + { + "name": "format", + "id": "18", + "values": [ + "azw", + "cb7", + "cba", + "cbr", + "cbt", + "cbz", + "djvu", + "doc", + "epub", + "jpg", + "mobi", + "pdf", + "png", + "prc", + ], + }, + { + "name": "langue", + "id": "19", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "20", + "multiple": "1", + "values": [ + "actualites", + "animaux", + "art", + "astrologie", + "auto-moto-vehicules", + "aventure", + "beaute", + "bien-etre", + "biographie", + "bricolage", + "cinema", + "comedie", + "conte", + "cuisine_et_vin", + "decoration", + "dictionnaire", + "droit", + "economie", + "encyclopedies", + "esoterisme", + "fantastique", + "fantasy", + "guerre", + "heroic_fantasy", + "histoire", + "humour", + "informatique", + "internet", + "jardinage", + "jeunesse", + "jeux_video", + "journalisme", + "linguistique", + "litterature", + "loisir", + "manuel", + "medecine", + "musique", + "nature", + "nouvelles", + "paranormal", + "parascolaire", + "partitions", + "philosophie", + "photos", + "poesie", + "polar", + "policier", + "politique", + "professionnel", + "religion", + "roman", + "sante", + "science", + "science_humaine", + "science-fiction", + "scolaire", + "societe", + "spiritualite", + "sport", + "suspense", + "technique", + "terreur", + "theatre", + "thriller", + "tourisme", + "vie_pratique", + "voyage", + ], + }, + ], + }, + { + "name": "comics", + "id": "2153", + "options": [ + { + "name": "format", + "id": "18", + "values": [ + "azw", + "cb7", + "cba", + "cbr", + "cbt", + "cbz", + "djvu", + "doc", + "epub", + "jpg", + "mobi", + "pdf", + "png", + "prc", + ], + }, + { + "name": "langue", + "id": "19", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "20", + "multiple": "1", + "values": [ + "actualites", + "animaux", + "art", + "astrologie", + "auto-moto-vehicules", + "aventure", + "beaute", + "bien-etre", + "biographie", + "bricolage", + "cinema", + "comedie", + "conte", + "cuisine_et_vin", + "decoration", + "dictionnaire", + "droit", + "economie", + "encyclopedies", + "esoterisme", + "fantastique", + "fantasy", + "guerre", + "heroic_fantasy", + "histoire", + "humour", + "informatique", + "internet", + "jardinage", + "jeunesse", + "jeux_video", + "journalisme", + "linguistique", + "litterature", + "loisir", + "manuel", + "medecine", + "musique", + "nature", + "nouvelles", + "paranormal", + "parascolaire", + "partitions", + "philosophie", + "photos", + "poesie", + "polar", + "policier", + "politique", + "professionnel", + "religion", + "roman", + "sante", + "science", + "science_humaine", + "science-fiction", + "scolaire", + "societe", + "spiritualite", + "sport", + "suspense", + "technique", + "terreur", + "theatre", + "thriller", + "tourisme", + "vie_pratique", + "voyage", + ], + }, + ], + }, + { + "name": "livres", + "id": "2154", + "options": [ + { + "name": "format", + "id": "18", + "values": [ + "azw", + "cb7", + "cba", + "cbr", + "cbt", + "cbz", + "djvu", + "doc", + "epub", + "jpg", + "mobi", + "pdf", + "png", + "prc", + ], + }, + { + "name": "langue", + "id": "19", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "20", + "multiple": "1", + "values": [ + "actualites", + "animaux", + "art", + "astrologie", + "auto-moto-vehicules", + "aventure", + "beaute", + "bien-etre", + "biographie", + "bricolage", + "cinema", + "comedie", + "conte", + "cuisine_et_vin", + "decoration", + "dictionnaire", + "droit", + "economie", + "encyclopedies", + "esoterisme", + "fantastique", + "fantasy", + "guerre", + "heroic_fantasy", + "histoire", + "humour", + "informatique", + "internet", + "jardinage", + "jeunesse", + "jeux_video", + "journalisme", + "linguistique", + "litterature", + "loisir", + "manuel", + "medecine", + "musique", + "nature", + "nouvelles", + "paranormal", + "parascolaire", + "partitions", + "philosophie", + "photos", + "poesie", + "polar", + "policier", + "politique", + "professionnel", + "religion", + "roman", + "sante", + "science", + "science_humaine", + "science-fiction", + "scolaire", + "societe", + "spiritualite", + "sport", + "suspense", + "technique", + "terreur", + "theatre", + "thriller", + "tourisme", + "vie_pratique", + "voyage", + ], + }, + ], + }, + { + "name": "manga", + "id": "2155", + "options": [ + { + "name": "format", + "id": "18", + "values": [ + "azw", + "cb7", + "cba", + "cbr", + "cbt", + "cbz", + "djvu", + "doc", + "epub", + "jpg", + "mobi", + "pdf", + "png", + "prc", + ], + }, + { + "name": "langue", + "id": "19", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "20", + "multiple": "1", + "values": [ + "actualites", + "animaux", + "art", + "astrologie", + "auto-moto-vehicules", + "aventure", + "beaute", + "bien-etre", + "biographie", + "bricolage", + "cinema", + "comedie", + "conte", + "cuisine_et_vin", + "decoration", + "dictionnaire", + "droit", + "economie", + "encyclopedies", + "esoterisme", + "fantastique", + "fantasy", + "guerre", + "heroic_fantasy", + "histoire", + "humour", + "informatique", + "internet", + "jardinage", + "jeunesse", + "jeux_video", + "journalisme", + "linguistique", + "litterature", + "loisir", + "manuel", + "medecine", + "musique", + "nature", + "nouvelles", + "paranormal", + "parascolaire", + "partitions", + "philosophie", + "photos", + "poesie", + "polar", + "policier", + "politique", + "professionnel", + "religion", + "roman", + "sante", + "science", + "science_humaine", + "science-fiction", + "scolaire", + "societe", + "spiritualite", + "sport", + "suspense", + "technique", + "terreur", + "theatre", + "thriller", + "tourisme", + "vie_pratique", + "voyage", + ], + }, + ], + }, + { + "name": "presse", + "id": "2156", + "options": [ + { + "name": "format", + "id": "18", + "values": [ + "azw", + "cb7", + "cba", + "cbr", + "cbt", + "cbz", + "djvu", + "doc", + "epub", + "jpg", + "mobi", + "pdf", + "png", + "prc", + ], + }, + { + "name": "langue", + "id": "19", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "20", + "multiple": "1", + "values": [ + "actualites", + "animaux", + "art", + "astrologie", + "auto-moto-vehicules", + "aventure", + "beaute", + "bien-etre", + "biographie", + "bricolage", + "cinema", + "comedie", + "conte", + "cuisine_et_vin", + "decoration", + "dictionnaire", + "droit", + "economie", + "encyclopedies", + "esoterisme", + "fantastique", + "fantasy", + "guerre", + "heroic_fantasy", + "histoire", + "humour", + "informatique", + "internet", + "jardinage", + "jeunesse", + "jeux_video", + "journalisme", + "linguistique", + "litterature", + "loisir", + "manuel", + "medecine", + "musique", + "nature", + "nouvelles", + "paranormal", + "parascolaire", + "partitions", + "philosophie", + "photos", + "poesie", + "polar", + "policier", + "politique", + "professionnel", + "religion", + "roman", + "sante", + "science", + "science_humaine", + "science-fiction", + "scolaire", + "societe", + "spiritualite", + "sport", + "suspense", + "technique", + "terreur", + "theatre", + "thriller", + "tourisme", + "vie_pratique", + "voyage", + ], + }, + ], + }, + ], + }, + { + "name": "audio", + "id": "2139", + "subcategories": [ + {"name": "karaoke", "id": "2147", "options": []}, + { + "name": "musique", + "id": "2148", + "options": [ + { + "name": "format", + "id": "6", + "values": [ + "aac_(m4a)", + "ac3", + "aif", + "alac_(m4a)", + "bluray_pure_audio", + "dsd", + "dts", + "flac_(16_bit)", + "flac_(24_bit)", + "monkey's_audio", + "mp3", + "mpc", + "ogg", + "samples", + "wav", + "wavpack", + "wma", + ], + }, + { + "name": "qualite", + "id": "7", + "values": ["bluray_audio", "cd", "sacd", "vinyle", "web"], + }, + { + "name": "type", + "id": "8", + "values": [ + "album", + "bande_originale_de_film/jeu", + "discographie", + "ep", + "integrale/coffret", + "live/concert", + "mix/medley", + "piste_audio_de_film", + "radio", + ], + }, + { + "name": "genre", + "id": "9", + "multiple": "1", + "values": [ + "acid_house", + "acid_jazz", + "africaine", + "alternative", + "ambiance", + "b.o/ost_de_film", + "b.o/ost_de_jeu_video", + "baroque", + "black_metal", + "blues", + "boogie", + "bossa_nova", + "britpop", + "celtique", + "chill_out", + "cirque", + "classique", + "comedie_musicale", + "compilation", + "concerto", + "country", + "creole", + "dance_pop", + "dark_metal", + "death_metal", + "disco", + "divers", + "doom_metal", + "drum_&_bass", + "drumstep", + "dubstep", + "east_coast", + "electro", + "electro_house", + "electronique", + "enfants", + "eurodance", + "experimental", + "flamenco", + "folk", + "folk_pop", + "free_jazz_&_avant-garde", + "funk", + "fusion", + "fusion_&_jazz", + "g-funk", + "gangsta_rap", + "garage", + "gospel", + "gothique", + "grind_core", + "grunge", + "hard_core", + "hard_rock", + "hard_rock_metal", + "heavy_metal", + "hip-hop", + "house", + "humour", + "hymnes", + "indie", + "indie_dance", + "industriel", + "instrumental", + "intelligent_dance_music", + "jazz", + "jump_up", + "jungle", + "kiosque", + "latin_jazz", + "lecture", + "liquidstep", + "medieval", + "metal", + "metal_progressif", + "moombahton", + "motown", + "musique_sacree", + "musiques_du_monde", + "musiques_militaires", + "new_age", + "new_wave", + "nu_disco", + "old_school", + "oldies", + "opera_et_voix", + "piece", + "pop", + "pop_electro", + "pop_r&b", + "pop_reggae", + "pop_rock", + "popcorn", + "post-rock", + "progressive_house", + "punk", + "r&b", + "radio", + "rag_time", + "raggamuffin", + "rap", + "reggae", + "relaxation", + "remix", + "rock", + "rock_alternatif", + "rock_gothique", + "rock_hardcore", + "rock_progressif", + "roots", + "rythm_and_blues", + "salsa", + "samba", + "shoegaze", + "ska", + "soul", + "speed_metal", + "symphonie", + "techno", + "thrash", + "trance", + "trap", + "tribal", + "trip-hop", + "underground", + "variete_francaise", + "variete_internationale", + "vocal_&_traditionnel", + "west_coast", + "zeuhl", + "zouk", + ], + }, + ], + }, + { + "name": "podcast_radio", + "id": "2150", + "options": [ + { + "name": "format", + "id": "12", + "values": [ + "aac_(m4a)", + "ac3", + "aif", + "alac_(m4a)", + "bluray_pure_audio", + "dsd", + "dts", + "flac_(16_bit)", + "flac_(24_bit)", + "monkey's_audio", + "mp3", + "mpc", + "ogg", + "samples", + "wav", + "wavpack", + "wma", + ], + }, + { + "name": "genre", + "id": "13", + "multiple": "1", + "values": [ + "humour", + "litteraire", + "loisirs", + "musical", + "politique/societe", + "radio_libre", + "sciences", + "sports", + ], + }, + ], + }, + { + "name": "samples", + "id": "2149", + "options": [ + { + "name": "format", + "id": "10", + "values": [ + "aac_(m4a)", + "ac3", + "aif", + "alac_(m4a)", + "bluray_pure_audio", + "dsd", + "dts", + "flac_(16_bit)", + "flac_(24_bit)", + "monkey's_audio", + "mp3", + "mpc", + "ogg", + "samples", + "wav", + "wavpack", + "wma", + ], + }, + { + "name": "genre", + "id": "11", + "multiple": "1", + "values": [ + "acid_house", + "acid_jazz", + "africaine", + "alternative", + "ambiance", + "b.o/ost_de_film", + "b.o/ost_de_jeu_video", + "baroque", + "black_metal", + "blues", + "boogie", + "bossa_nova", + "britpop", + "celtique", + "chill_out", + "cirque", + "classique", + "comedie_musicale", + "compilation", + "concerto", + "country", + "creole", + "dance_pop", + "dark_metal", + "death_metal", + "disco", + "divers", + "doom_metal", + "drum_&_bass", + "drumstep", + "dubstep", + "east_coast", + "electro", + "electro_house", + "electronique", + "enfants", + "eurodance", + "experimental", + "flamenco", + "folk", + "folk_pop", + "free_jazz_&_avant-garde", + "funk", + "fusion", + "fusion_&_jazz", + "g-funk", + "gangsta_rap", + "garage", + "gospel", + "gothique", + "grind_core", + "grunge", + "hard_core", + "hard_rock", + "hard_rock_metal", + "heavy_metal", + "hip-hop", + "house", + "humour", + "hymnes", + "indie", + "indie_dance", + "industriel", + "instrumental", + "intelligent_dance_music", + "jazz", + "jump_up", + "jungle", + "kiosque", + "latin_jazz", + "lecture", + "liquidstep", + "medieval", + "metal", + "metal_progressif", + "moombahton", + "motown", + "musique_sacree", + "musiques_du_monde", + "musiques_militaires", + "new_age", + "new_wave", + "nu_disco", + "old_school", + "oldies", + "opera_et_voix", + "piece", + "pop", + "pop_electro", + "pop_r&b", + "pop_reggae", + "pop_rock", + "popcorn", + "post-rock", + "progressive_house", + "punk", + "r&b", + "radio", + "rag_time", + "raggamuffin", + "rap", + "reggae", + "relaxation", + "remix", + "rock", + "rock_alternatif", + "rock_gothique", + "rock_hardcore", + "rock_progressif", + "roots", + "rythm_and_blues", + "salsa", + "samba", + "shoegaze", + "ska", + "soul", + "speed_metal", + "symphonie", + "techno", + "thrash", + "trance", + "trap", + "tribal", + "trip-hop", + "underground", + "variete_francaise", + "variete_internationale", + "vocal_&_traditionnel", + "west_coast", + "zeuhl", + "zouk", + ], + }, + ], + }, + ], + }, + { + "name": "applications", + "id": "2144", + "subcategories": [ + { + "name": "autre", + "id": "2177", + "options": [ + { + "name": "genre", + "id": "28", + "multiple": "1", + "values": [ + "accessibilite", + "administration", + "agenda", + "album_et_visionneuse", + "animation_2d_et_3d", + "animaux", + "anonymat", + "anti-spam", + "anti-spyware", + "anti-trojan", + "antivirus", + "architecture", + "aspiration_de_site", + "astrologie_et_voyance", + "astronomie_et_espace", + "audio", + "automobile", + "bricolage", + "bureautique", + "cao_et_pao", + "client_ftp", + "codec", + "commerce_electronique", + "communaute", + "communication", + "compression", + "comptabilite", + "controle_parental", + "courrier", + "crack", + "cryptage_et_securite", + "cuisine", + "developpement", + "developpement_web", + "editeur_de_site", + "edition_multimedia", + "education_et_scolarite", + "electronique", + "firewall", + "firmware", + "genealogie", + "geographie", + "gestionnaire_de_fichiers", + "gestionnaire_de_sites", + "graphisme", + "gravure", + "lecteur_multimedia", + "loader", + "maison", + "meteo", + "musique", + "navigateur_web", + "nettoyage_et_optimisation", + "organiseur", + "partage_de_fichiers", + "permis", + "photographie", + "planification", + "reconnaisance", + "referencement", + "registre", + "reseau", + "sante", + "sauvegarde", + "science", + "serveur_ftp", + "sport", + "systeme", + "systeme_d'exploitation", + "traducteur", + "utilitaire", + "video", + "wallpaper", + "webcam", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + ], + }, + { + "name": "formation", + "id": "2176", + "options": [ + { + "name": "genre", + "id": "28", + "multiple": "1", + "values": [ + "accessibilite", + "administration", + "agenda", + "album_et_visionneuse", + "animation_2d_et_3d", + "animaux", + "anonymat", + "anti-spam", + "anti-spyware", + "anti-trojan", + "antivirus", + "architecture", + "aspiration_de_site", + "astrologie_et_voyance", + "astronomie_et_espace", + "audio", + "automobile", + "bricolage", + "bureautique", + "cao_et_pao", + "client_ftp", + "codec", + "commerce_electronique", + "communaute", + "communication", + "compression", + "comptabilite", + "controle_parental", + "courrier", + "crack", + "cryptage_et_securite", + "cuisine", + "developpement", + "developpement_web", + "editeur_de_site", + "edition_multimedia", + "education_et_scolarite", + "electronique", + "firewall", + "firmware", + "genealogie", + "geographie", + "gestionnaire_de_fichiers", + "gestionnaire_de_sites", + "graphisme", + "gravure", + "lecteur_multimedia", + "loader", + "maison", + "meteo", + "musique", + "navigateur_web", + "nettoyage_et_optimisation", + "organiseur", + "partage_de_fichiers", + "permis", + "photographie", + "planification", + "reconnaisance", + "referencement", + "registre", + "reseau", + "sante", + "sauvegarde", + "science", + "serveur_ftp", + "sport", + "systeme", + "systeme_d'exploitation", + "traducteur", + "utilitaire", + "video", + "wallpaper", + "webcam", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + ], + }, + { + "name": "linux", + "id": "2171", + "options": [ + { + "name": "genre", + "id": "28", + "multiple": "1", + "values": [ + "accessibilite", + "administration", + "agenda", + "album_et_visionneuse", + "animation_2d_et_3d", + "animaux", + "anonymat", + "anti-spam", + "anti-spyware", + "anti-trojan", + "antivirus", + "architecture", + "aspiration_de_site", + "astrologie_et_voyance", + "astronomie_et_espace", + "audio", + "automobile", + "bricolage", + "bureautique", + "cao_et_pao", + "client_ftp", + "codec", + "commerce_electronique", + "communaute", + "communication", + "compression", + "comptabilite", + "controle_parental", + "courrier", + "crack", + "cryptage_et_securite", + "cuisine", + "developpement", + "developpement_web", + "editeur_de_site", + "edition_multimedia", + "education_et_scolarite", + "electronique", + "firewall", + "firmware", + "genealogie", + "geographie", + "gestionnaire_de_fichiers", + "gestionnaire_de_sites", + "graphisme", + "gravure", + "lecteur_multimedia", + "loader", + "maison", + "meteo", + "musique", + "navigateur_web", + "nettoyage_et_optimisation", + "organiseur", + "partage_de_fichiers", + "permis", + "photographie", + "planification", + "reconnaisance", + "referencement", + "registre", + "reseau", + "sante", + "sauvegarde", + "science", + "serveur_ftp", + "sport", + "systeme", + "systeme_d'exploitation", + "traducteur", + "utilitaire", + "video", + "wallpaper", + "webcam", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + ], + }, + { + "name": "macos", + "id": "2172", + "options": [ + { + "name": "genre", + "id": "28", + "multiple": "1", + "values": [ + "accessibilite", + "administration", + "agenda", + "album_et_visionneuse", + "animation_2d_et_3d", + "animaux", + "anonymat", + "anti-spam", + "anti-spyware", + "anti-trojan", + "antivirus", + "architecture", + "aspiration_de_site", + "astrologie_et_voyance", + "astronomie_et_espace", + "audio", + "automobile", + "bricolage", + "bureautique", + "cao_et_pao", + "client_ftp", + "codec", + "commerce_electronique", + "communaute", + "communication", + "compression", + "comptabilite", + "controle_parental", + "courrier", + "crack", + "cryptage_et_securite", + "cuisine", + "developpement", + "developpement_web", + "editeur_de_site", + "edition_multimedia", + "education_et_scolarite", + "electronique", + "firewall", + "firmware", + "genealogie", + "geographie", + "gestionnaire_de_fichiers", + "gestionnaire_de_sites", + "graphisme", + "gravure", + "lecteur_multimedia", + "loader", + "maison", + "meteo", + "musique", + "navigateur_web", + "nettoyage_et_optimisation", + "organiseur", + "partage_de_fichiers", + "permis", + "photographie", + "planification", + "reconnaisance", + "referencement", + "registre", + "reseau", + "sante", + "sauvegarde", + "science", + "serveur_ftp", + "sport", + "systeme", + "systeme_d'exploitation", + "traducteur", + "utilitaire", + "video", + "wallpaper", + "webcam", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + ], + }, + { + "name": "smartphone", + "id": "2174", + "options": [ + { + "name": "genre", + "id": "28", + "multiple": "1", + "values": [ + "accessibilite", + "administration", + "agenda", + "album_et_visionneuse", + "animation_2d_et_3d", + "animaux", + "anonymat", + "anti-spam", + "anti-spyware", + "anti-trojan", + "antivirus", + "architecture", + "aspiration_de_site", + "astrologie_et_voyance", + "astronomie_et_espace", + "audio", + "automobile", + "bricolage", + "bureautique", + "cao_et_pao", + "client_ftp", + "codec", + "commerce_electronique", + "communaute", + "communication", + "compression", + "comptabilite", + "controle_parental", + "courrier", + "crack", + "cryptage_et_securite", + "cuisine", + "developpement", + "developpement_web", + "editeur_de_site", + "edition_multimedia", + "education_et_scolarite", + "electronique", + "firewall", + "firmware", + "genealogie", + "geographie", + "gestionnaire_de_fichiers", + "gestionnaire_de_sites", + "graphisme", + "gravure", + "lecteur_multimedia", + "loader", + "maison", + "meteo", + "musique", + "navigateur_web", + "nettoyage_et_optimisation", + "organiseur", + "partage_de_fichiers", + "permis", + "photographie", + "planification", + "reconnaisance", + "referencement", + "registre", + "reseau", + "sante", + "sauvegarde", + "science", + "serveur_ftp", + "sport", + "systeme", + "systeme_d'exploitation", + "traducteur", + "utilitaire", + "video", + "wallpaper", + "webcam", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "systeme", + "id": "26", + "values": [ + "android", + "bada", + "ios", + "meego", + "rim", + "symbian", + "webos", + "windows_mobile", + "windows_rt", + ], + }, + ], + }, + { + "name": "tablette", + "id": "2175", + "options": [ + { + "name": "genre", + "id": "28", + "multiple": "1", + "values": [ + "accessibilite", + "administration", + "agenda", + "album_et_visionneuse", + "animation_2d_et_3d", + "animaux", + "anonymat", + "anti-spam", + "anti-spyware", + "anti-trojan", + "antivirus", + "architecture", + "aspiration_de_site", + "astrologie_et_voyance", + "astronomie_et_espace", + "audio", + "automobile", + "bricolage", + "bureautique", + "cao_et_pao", + "client_ftp", + "codec", + "commerce_electronique", + "communaute", + "communication", + "compression", + "comptabilite", + "controle_parental", + "courrier", + "crack", + "cryptage_et_securite", + "cuisine", + "developpement", + "developpement_web", + "editeur_de_site", + "edition_multimedia", + "education_et_scolarite", + "electronique", + "firewall", + "firmware", + "genealogie", + "geographie", + "gestionnaire_de_fichiers", + "gestionnaire_de_sites", + "graphisme", + "gravure", + "lecteur_multimedia", + "loader", + "maison", + "meteo", + "musique", + "navigateur_web", + "nettoyage_et_optimisation", + "organiseur", + "partage_de_fichiers", + "permis", + "photographie", + "planification", + "reconnaisance", + "referencement", + "registre", + "reseau", + "sante", + "sauvegarde", + "science", + "serveur_ftp", + "sport", + "systeme", + "systeme_d'exploitation", + "traducteur", + "utilitaire", + "video", + "wallpaper", + "webcam", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "systeme", + "id": "26", + "values": [ + "android", + "bada", + "ios", + "meego", + "rim", + "symbian", + "webos", + "windows_mobile", + "windows_rt", + ], + }, + ], + }, + { + "name": "windows", + "id": "2173", + "options": [ + { + "name": "genre", + "id": "28", + "multiple": "1", + "values": [ + "accessibilite", + "administration", + "agenda", + "album_et_visionneuse", + "animation_2d_et_3d", + "animaux", + "anonymat", + "anti-spam", + "anti-spyware", + "anti-trojan", + "antivirus", + "architecture", + "aspiration_de_site", + "astrologie_et_voyance", + "astronomie_et_espace", + "audio", + "automobile", + "bricolage", + "bureautique", + "cao_et_pao", + "client_ftp", + "codec", + "commerce_electronique", + "communaute", + "communication", + "compression", + "comptabilite", + "controle_parental", + "courrier", + "crack", + "cryptage_et_securite", + "cuisine", + "developpement", + "developpement_web", + "editeur_de_site", + "edition_multimedia", + "education_et_scolarite", + "electronique", + "firewall", + "firmware", + "genealogie", + "geographie", + "gestionnaire_de_fichiers", + "gestionnaire_de_sites", + "graphisme", + "gravure", + "lecteur_multimedia", + "loader", + "maison", + "meteo", + "musique", + "navigateur_web", + "nettoyage_et_optimisation", + "organiseur", + "partage_de_fichiers", + "permis", + "photographie", + "planification", + "reconnaisance", + "referencement", + "registre", + "reseau", + "sante", + "sauvegarde", + "science", + "serveur_ftp", + "sport", + "systeme", + "systeme_d'exploitation", + "traducteur", + "utilitaire", + "video", + "wallpaper", + "webcam", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + ], + }, + ], + }, + { + "name": "jeux_video", + "id": "2142", + "subcategories": [ + { + "name": "autre", + "id": "2167", + "options": [ + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "linux", + "id": "2159", + "options": [ + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "macos", + "id": "2160", + "options": [ + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "microsoft", + "id": "2162", + "options": [ + { + "name": "console", + "id": "23", + "values": ["xbox", "xbox_360", "xbox_one"], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "nintendo", + "id": "2163", + "options": [ + { + "name": "console", + "id": "24", + "values": ["3ds", "ds", "gamecube", "wii", "wiiu"], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "smartphone", + "id": "2165", + "options": [ + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "systeme", + "id": "26", + "values": [ + "android", + "bada", + "ios", + "meego", + "rim", + "symbian", + "webos", + "windows_mobile", + "windows_rt", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "sony", + "id": "2164", + "options": [ + { + "name": "console", + "id": "25", + "values": [ + "playstation", + "playstation2", + "playstation3", + "playstation4", + "psp", + "vita", + ], + }, + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "tablette", + "id": "2166", + "options": [ + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "systeme", + "id": "26", + "values": [ + "android", + "bada", + "ios", + "meego", + "rim", + "symbian", + "webos", + "windows_mobile", + "windows_rt", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + { + "name": "windows", + "id": "2161", + "options": [ + { + "name": "langue", + "id": "16", + "values": [ + "anglais", + "francais", + "japonais", + "multi_(francais_inclus)", + ], + }, + { + "name": "genre", + "id": "22", + "multiple": "1", + "values": [ + "action", + "aventure", + "beat'em_all", + "city_builder", + "combat", + "course", + "crack", + "dlc", + "educatif", + "flipper", + "fps", + "gestion", + "hack'n_slash", + "infiltration", + "jeu_de_role", + "ludo-educatif", + "mmo", + "objets_caches", + "party_game", + "plates-formes", + "point'n'click", + "puzzle-game", + "reflexion", + "roguelike", + "rythme", + "shoot'em_up", + "simulation", + "sport", + "strategie", + "survival-horror", + "tactique", + "tower_defense", + "tps", + "update", + "visual_novel", + "wargame", + ], + }, + ], + }, + ], + }, + { + "name": "emulation", + "id": "2141", + "subcategories": [ + {"name": "emulateur", "id": "2157", "options": []}, + {"name": "rom/iso", "id": "2158", "options": []}, + ], + }, + { + "name": "gps", + "id": "2143", + "subcategories": [ + {"name": "applications", "id": "2168", "options": []}, + {"name": "cartes", "id": "2169", "options": []}, + {"name": "divers", "id": "2170", "options": []}, + ], + }, +] diff --git a/yggcrawl/tests/__init__.py b/yggcrawl/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/yggcrawl/tests/test_change_tld.py b/yggcrawl/tests/test_change_tld.py new file mode 100644 index 0000000..b42c67b --- /dev/null +++ b/yggcrawl/tests/test_change_tld.py @@ -0,0 +1,26 @@ +import unittest + +from ..yggtorrentscraper import ( + YggTorrentScraper, + set_yggtorrent_tld, + get_yggtorrent_tld, +) + + +class TestChangeYggtorrentTLD(unittest.TestCase): + current_yggtorrent_tld = get_yggtorrent_tld() + + def test_read_tld(self): + self.current_yggtorrent_tld = get_yggtorrent_tld() + + self.assertTrue(self.current_yggtorrent_tld == "se") + + def test_set_yggtorrent_tld(self): + + set_yggtorrent_tld("newtld") + + self.assertTrue(get_yggtorrent_tld() == "newtld") + pass + + def tearDown(self): + set_yggtorrent_tld(self.current_yggtorrent_tld) diff --git a/yggcrawl/tests/test_download.py b/yggcrawl/tests/test_download.py new file mode 100644 index 0000000..61861c6 --- /dev/null +++ b/yggcrawl/tests/test_download.py @@ -0,0 +1,65 @@ +import os +import shutil +import unittest + +import requests + +from ..yggtorrentscraper import YggTorrentScraper + + +class TestDownload(unittest.TestCase): + scraper = None + destination_path = None + + def __init__(self, *args, **kwargs): + super(TestDownload, self).__init__(*args, **kwargs) + yggtorrent_identifiant = os.environ.get("YGGTORRENT_IDENTIFIANT") + yggtorrent_password = os.environ.get("YGGTORRENT_PASSWORD") + + self.destination_path = os.path.join( + ".", "yggtorrentscraper", "tests", "test_download" + ) + + self.scraper = YggTorrentScraper(requests.session()) + + self.scraper.login(yggtorrent_identifiant, yggtorrent_password) + + def test_download_from_torrent(self): + most_completed = self.scraper.most_completed() + + torrent = self.scraper.extract_details(most_completed[0]) + + self.assertTrue(torrent.url is not None) + + file_full_path = self.scraper.download_from_torrent( + torrent=torrent, destination_path=self.destination_path + ) + + self.assertTrue(os.path.getsize(file_full_path) > 1000) + + def test_download_from_torrent_url(self): + file_full_path = self.scraper.download_from_torrent_url( + torrent_url="https://www2.yggtorrent.pe/torrent/filmvideo/serie-tv/440445-game-of-thrones-s08e02-multi-1080p-amzn-web-dl-dd5-1-x264-ark01", + destination_path=self.destination_path, + ) + + self.assertTrue(os.path.getsize(file_full_path) > 1000) + + def test_download_from_torrent_download_url(self): + most_completed = self.scraper.most_completed() + + torrent = self.scraper.extract_details(most_completed[0]) + + self.assertTrue(torrent.url is not None) + + file_full_path = self.scraper.download_from_torrent_download_url( + torrent_url=torrent.url, destination_path=self.destination_path + ) + + self.assertTrue(os.path.getsize(file_full_path) > 1000) + + def tearDown(self): + if os.path.exists(self.destination_path): + shutil.rmtree(self.destination_path, ignore_errors=True) + + self.scraper.logout() diff --git a/yggcrawl/tests/test_extract_details.py b/yggcrawl/tests/test_extract_details.py new file mode 100644 index 0000000..4ac644b --- /dev/null +++ b/yggcrawl/tests/test_extract_details.py @@ -0,0 +1,60 @@ +import os +import unittest + +import requests + +from ..yggtorrentscraper import YggTorrentScraper + + +class TestExtractDetails(unittest.TestCase): + scraper = YggTorrentScraper(requests.session()) + + def test_extract_details(self): + torrent = self.scraper.extract_details( + "https://www2.yggtorrent.pe/torrent/filmvideo/serie-tv/440445-game-of-thrones-s08e02-multi-1080p-amzn-web-dl-dd5-1-x264-ark01" + ) + + self.assertTrue(torrent.name is not None) + self.assertTrue(torrent.uploaded_datetime is not None) + self.assertTrue(torrent.size is not None) + self.assertTrue(torrent.uploader is not None) + + self.assertTrue(len(torrent.keywords) > 0) + + self.assertTrue(torrent.completed > -1) + self.assertTrue(torrent.seeders > -1) + self.assertTrue(torrent.leechers > -1) + + self.assertTrue(torrent.url is None) + + self.assertTrue(len(torrent.files) > 0) + self.assertTrue(len(torrent.comments) > 0) + + def test_extract_details_logged(self): + yggtorrent_identifiant = os.environ.get("YGGTORRENT_IDENTIFIANT") + yggtorrent_password = os.environ.get("YGGTORRENT_PASSWORD") + + self.scraper.login(yggtorrent_identifiant, yggtorrent_password) + + torrent = self.scraper.extract_details( + "https://www2.yggtorrent.pe/torrent/filmvideo/serie-tv/440445-game-of-thrones-s08e02-multi-1080p-amzn-web-dl-dd5-1-x264-ark01" + ) + + self.assertTrue(torrent.name is not None) + self.assertTrue(torrent.uploaded_datetime is not None) + self.assertTrue(torrent.size is not None) + self.assertTrue(torrent.uploader is not None) + + self.assertTrue(len(torrent.keywords) > 0) + + self.assertTrue(torrent.completed > -1) + self.assertTrue(torrent.seeders > -1) + self.assertTrue(torrent.leechers > -1) + + self.assertTrue(torrent.url is not None) + + self.assertTrue(len(torrent.files) > 0) + self.assertTrue(len(torrent.comments) > 0) + + def tearDown(self): + self.scraper.logout() diff --git a/yggcrawl/tests/test_login.py b/yggcrawl/tests/test_login.py new file mode 100644 index 0000000..4e5ebd0 --- /dev/null +++ b/yggcrawl/tests/test_login.py @@ -0,0 +1,30 @@ +import os +import unittest + +import requests + +from ..yggtorrentscraper import YggTorrentScraper + + +class TestAuthentification(unittest.TestCase): + def setUp(self): + self.scraper = YggTorrentScraper(requests.session()) + + def test_login_success(self): + yggtorrent_identifiant = os.environ.get("YGGTORRENT_IDENTIFIANT") + yggtorrent_password = os.environ.get("YGGTORRENT_PASSWORD") + + self.assertTrue(yggtorrent_identifiant is not None) + self.assertTrue(yggtorrent_password is not None) + + self.assertTrue(self.scraper.login(yggtorrent_identifiant, yggtorrent_password)) + + self.scraper.logout() + + def test_login_failed(self): + self.assertFalse(self.scraper.login("myidentifiant", "mypassword")) + + self.scraper.logout() + + def tearDown(self): + self.scraper.logout() diff --git a/yggcrawl/tests/test_logout.py b/yggcrawl/tests/test_logout.py new file mode 100644 index 0000000..19607b6 --- /dev/null +++ b/yggcrawl/tests/test_logout.py @@ -0,0 +1,27 @@ +import os +import unittest + +import requests + +from ..yggtorrentscraper import YggTorrentScraper + + +class TestLogout(unittest.TestCase): + def setUp(self): + self.scraper = YggTorrentScraper(requests.session()) + + def test_logout_success(self): + yggtorrent_identifiant = os.environ.get("YGGTORRENT_IDENTIFIANT") + yggtorrent_password = os.environ.get("YGGTORRENT_PASSWORD") + + self.assertTrue(self.scraper.login(yggtorrent_identifiant, yggtorrent_password)) + + self.assertTrue(self.scraper.logout()) + + def test_logout_failed(self): + self.scraper.login("myidentifiant", "mypassword") + + self.assertFalse(self.scraper.logout()) + + def tearDown(self): + self.scraper.logout() diff --git a/yggcrawl/tests/test_most_completed.py b/yggcrawl/tests/test_most_completed.py new file mode 100644 index 0000000..e3652c1 --- /dev/null +++ b/yggcrawl/tests/test_most_completed.py @@ -0,0 +1,16 @@ +import unittest + +import requests +from ..yggtorrentscraper import YggTorrentScraper + + +class TestMostCompleted(unittest.TestCase): + scraper = YggTorrentScraper(session=requests.session()) + + def test_most_completed(self): + most_completed = self.scraper.most_completed() + + self.assertEqual(len(most_completed), 100) + + def tearDown(self): + self.scraper.logout() diff --git a/yggcrawl/tests/test_search.py b/yggcrawl/tests/test_search.py new file mode 100644 index 0000000..8a14845 --- /dev/null +++ b/yggcrawl/tests/test_search.py @@ -0,0 +1,70 @@ +import unittest + +import requests + +from ..yggtorrentscraper import YggTorrentScraper + + +class TestResearch(unittest.TestCase): + scraper = YggTorrentScraper(requests.session()) + + torrent_name = "walking dead s09" + torrent_uploader = "brandit" + + torrent_name_2 = "blue oyster cult" + + def test_search_by_name(self): + torrents_url = self.scraper.search({"name": self.torrent_name}) + + torrent = self.scraper.extract_details(torrents_url[0]) + + splited_searched_name = self.torrent_name.split(" ") + + for word in splited_searched_name: + self.assertTrue(word.lower() in torrent.name.lower()) + + def test_search_by_uploader(self): + torrents_url = self.scraper.search( + {"name": self.torrent_name, "uploader": self.torrent_uploader} + ) + + for torrent_url in torrents_url: + torrent = self.scraper.extract_details(torrent_url) + + self.assertTrue(torrent.uploader.lower() == self.torrent_uploader.lower()) + + def test_search_sort_completed_asc(self): + torrents_url = self.scraper.search( + {"name": "blue oyster cult", "sort": "completed", "order": "asc"} + ) + + torrent_old = None + + for torrent_url in torrents_url: + torrent = self.scraper.extract_details(torrent_url) + + if torrent_old is not None: + self.assertTrue(torrent_old.completed <= torrent.completed) + torrent_old = torrent + + def test_search_sort_completed_desc(self): + torrents_url = self.scraper.search( + {"name": "blue oyster cult", "sort": "completed", "order": "desc"} + ) + + torrent_old = None + + for torrent_url in torrents_url: + torrent = self.scraper.extract_details(torrent_url) + + if torrent_old is not None: + self.assertTrue(torrent_old.completed >= torrent.completed) + torrent_old = torrent + + def test_search_multiple_page(self): + torrents_url = self.scraper.search({"name": "walking dead"}) + + self.assertTrue(len(torrents_url) > 200) + + def tearDown(self): + self.scraper.logout() diff --git a/yggcrawl/tests/test_torrent.py b/yggcrawl/tests/test_torrent.py new file mode 100644 index 0000000..227bcd5 --- /dev/null +++ b/yggcrawl/tests/test_torrent.py @@ -0,0 +1,32 @@ +import os +import unittest + +import requests + +from ..yggtorrentscraper import YggTorrentScraper + + +class TestTorrent(unittest.TestCase): + scraper = YggTorrentScraper(requests.session()) + + def test_str(self): + torrent_url = self.scraper.most_completed()[0] + + torrent = self.scraper.extract_details(torrent_url) + + torrent.__str__(files=True, comments=True) + + def test_str_logged(self): + yggtorrent_identifiant = os.environ.get("YGGTORRENT_IDENTIFIANT") + yggtorrent_password = os.environ.get("YGGTORRENT_PASSWORD") + + self.scraper.login(yggtorrent_identifiant, yggtorrent_password) + + torrent_url = self.scraper.most_completed()[0] + + torrent = self.scraper.extract_details(torrent_url) + + torrent.__str__(files=True, comments=True) + + def tearDown(self): + self.scraper.logout() diff --git a/yggcrawl/torrent.py b/yggcrawl/torrent.py new file mode 100644 index 0000000..a2d2488 --- /dev/null +++ b/yggcrawl/torrent.py @@ -0,0 +1,146 @@ +import os + + +class Torrent: + """ + Torrent entity + """ + + name = None + uploaded_datetime = None + size = None + uploader = None + + keywords = [] + + completed = -1 + seeders = -1 + leechers = -1 + + url = None + + files = [] + comments = [] + + def __str__(self, comments=False, files=False): + to_string = "" + + to_string += "Name : " + to_string += self.name + to_string += os.linesep + + to_string += "Url : " + + if self.url is not None: + to_string += self.url + else: + to_string += "N/A" + + to_string += os.linesep + to_string += os.linesep + + to_string += f"Keywords ({len(self.keywords)}) : " + to_string += os.linesep + + for keyword in self.keywords: + to_string += f"- {keyword}" + to_string += os.linesep + + to_string += os.linesep + + to_string += "Uploaded : " + to_string += str(self.uploaded_datetime) + to_string += os.linesep + + to_string += "Size : " + to_string += str(self.size) + to_string += os.linesep + + to_string += "Uploader : " + to_string += self.uploader + to_string += os.linesep + + to_string += "Completed : " + to_string += str(self.completed) + to_string += os.linesep + + to_string += "Seeders : " + to_string += str(self.seeders) + to_string += os.linesep + + to_string += "Leechers : " + to_string += str(self.leechers) + to_string += os.linesep + + to_string += os.linesep + + to_string += f"Files ({len(self.files)})" + to_string += os.linesep + + if files: + for file in self.files: + to_string += str(file) + to_string += os.linesep + + to_string += os.linesep + + to_string += f"Comments ({len(self.comments)})" + to_string += os.linesep + + if comments: + for comment in self.comments: + to_string += str(comment) + to_string += os.linesep + + return to_string + + +class TorrentFile: + + """ + Torrent's file entity + """ + + size = "" + file_name = "" + + def __str__(self): + to_string = "" + + to_string += "size : " + to_string += self.size + to_string += os.linesep + + to_string += "file_name : " + to_string += self.file_name + to_string += os.linesep + + return to_string + + +class TorrentComment: + + """ + Torrent's comment entity + """ + + author = "" + posted = "" + text = "" + + def __str__(self): + to_string = "" + + to_string += "Author : " + to_string += self.author + to_string += os.linesep + + to_string += "Posted : " + to_string += str(self.posted) + to_string += os.linesep + + to_string += "Text : " + to_string += str(self.text) + to_string += os.linesep + + return to_string diff --git a/yggcrawl/yggtorrentscraper.py b/yggcrawl/yggtorrentscraper.py new file mode 100644 index 0000000..7a7cb3d --- /dev/null +++ b/yggcrawl/yggtorrentscraper.py @@ -0,0 +1,453 @@ +import datetime +import logging +import os +import re + +import requests +from bs4 import BeautifulSoup + +from .torrent import Torrent, TorrentComment, TorrentFile +from .categories import categories + +YGGTORRENT_TLD = "se" + +YGGTORRENT_BASE_URL = f"https://www2.yggtorrent.{YGGTORRENT_TLD}" + +YGGTORRENT_LOGIN_URL = f"{YGGTORRENT_BASE_URL}/user/login" +YGGTORRENT_LOGOUT_URL = f"{YGGTORRENT_BASE_URL}/user/logout?attempt=1" + +YGGTORRENT_SEARCH_URL = f"{YGGTORRENT_BASE_URL}/engine/search?name=" + +logger = logging.getLogger("yggtorrentscraper") + +YGGTORRENT_DOMAIN = f".yggtorrent.{YGGTORRENT_TLD}" +YGGTORRENT_TOKEN_COOKIE = "ygg_" + +YGGTORRENT_SEARCH_URL_DESCRIPTION = "&description=" +YGGTORRENT_SEARCH_URL_FILE = "&file=" +YGGTORRENT_SEARCH_URL_UPLOADER = "&uploader=" +YGGTORRENT_SEARCH_URL_CATEGORY = "&category=" +YGGTORRENT_SEARCH_URL_SUB_CATEGORY = "&sub_category=" +YGGTORRENT_SEARCH_URL_ORDER = "&order=" +YGGTORRENT_SEARCH_URL_SORT = "&sort=" +YGGTORRENT_SEARCH_URL_DO = "&do=" +YGGTORRENT_SEARCH_URL_PAGE = "&page=" + +YGGTORRENT_SEARCH_URL_DESCRIPTION = "&description=" +YGGTORRENT_SEARCH_URL_FILE = "&file=" +YGGTORRENT_SEARCH_URL_UPLOADER = "&uploader=" +YGGTORRENT_SEARCH_URL_CATEGORY = "&category=" +YGGTORRENT_SEARCH_URL_SUB_CATEGORY = "&sub_category=" +YGGTORRENT_SEARCH_URL_ORDER = "&order=" +YGGTORRENT_SEARCH_URL_SORT = "&sort=" +YGGTORRENT_SEARCH_URL_DO = "&do=" +YGGTORRENT_SEARCH_URL_PAGE = "&page=" + +YGGTORRENT_GET_FILES = f"{YGGTORRENT_BASE_URL}/engine/get_files?torrent=" +YGGTORRENT_GET_INFO = f"https://www2.yggtorrentchg/engine/get_nfo?torrent=" + +YGGTORRENT_MOST_COMPLETED_URL = f"{YGGTORRENT_BASE_URL}/engine/mostcompleted" + +TORRENT_PER_PAGE = 50 + +YGGTORRENT_FILES_URL = f"{YGGTORRENT_BASE_URL}/engine/get_files?torrent=" + + +def set_yggtorrent_tld(yggtorrent_tld=None): + """ + Redefine all string variable according to new TLD + """ + + global YGGTORRENT_TLD + global YGGTORRENT_BASE_URL + global YGGTORRENT_LOGIN_URL + global YGGTORRENT_SEARCH_URL + global YGGTORRENT_DOMAIN + global YGGTORRENT_GET_FILES + global YGGTORRENT_GET_INFO + global YGGTORRENT_MOST_COMPLETED_URL + global YGGTORRENT_FILES_URL + + YGGTORRENT_TLD = yggtorrent_tld + + YGGTORRENT_BASE_URL = f"https://www2.yggtorrent.{YGGTORRENT_TLD}" + + YGGTORRENT_LOGIN_URL = f"{YGGTORRENT_BASE_URL}/user/login" + YGGTORRENT_SEARCH_URL = f"{YGGTORRENT_BASE_URL}/user/logout" + + YGGTORRENT_SEARCH_URL = f"{YGGTORRENT_BASE_URL}/engine/search?name=" + + YGGTORRENT_DOMAIN = ".yggtorrent.gg" + + YGGTORRENT_GET_FILES = f"{YGGTORRENT_BASE_URL}/engine/get_files?torrent=" + YGGTORRENT_GET_INFO = f"https://www2.yggtorrentchg/engine/get_nfo?torrent=" + + YGGTORRENT_MOST_COMPLETED_URL = f"{YGGTORRENT_BASE_URL}/engine/mostcompleted" + + YGGTORRENT_FILES_URL = f"{YGGTORRENT_BASE_URL}/engine/get_files?torrent=" + + +def get_yggtorrent_tld(): + return YGGTORRENT_TLD + + +class YggTorrentScraper: + session = None + + def __init__(self, session): + self.session = session + + def login(self, identifiant, password): + """ + Login request with the specified identifiant and password, return an yggtorrent_token, necessary to download + """ + self.session.cookies.clear() + + headers = { + "Content-Type": "application/x-www-form-urlencoded", + "User-Agent": "PostmanRuntime/7.17.1", + "Accept": "*/*", + "Cache-Control": "no-cache", + "Host": f"www.yggtorrent.{YGGTORRENT_TLD}", + "Accept-Encoding": "gzip, deflate", + "Connection": "keep-alive", + } + + response = self.session.post( + YGGTORRENT_LOGIN_URL, + data={"id": identifiant, "pass": password}, + headers=headers, + ) + + logger.debug("status_code : %s", response.status_code) + + yggtorrent_token = None + + if response.status_code == 200: + logger.debug("Login successful") + yggtorrent_token = response.cookies.get_dict()[YGGTORRENT_TOKEN_COOKIE] + + cookie = requests.cookies.create_cookie( + domain=YGGTORRENT_DOMAIN, + name=YGGTORRENT_TOKEN_COOKIE, + value=yggtorrent_token, + ) + + self.session.cookies.set_cookie(cookie) + + return True + else: + logger.debug("Login failed") + + return False + + def logout(self): + """ + Logout request + """ + response = self.session.get(YGGTORRENT_LOGOUT_URL) + + self.session.cookies.clear() + + logger.debug("status_code : %s", response.status_code) + + if response.status_code == 200: + logger.debug("Logout successful") + + return True + else: + logger.debug("Logout failed") + + return False + + def search(self, parameters): + search_url = create_search_url(parameters) + + torrents_url = self.get_torrents_url(search_url, parameters) + + return torrents_url + + def extract_details(self, torrent_url): + """ + Extract informations from torrent's url + """ + logger.debug("torrent_url : %s", torrent_url) + + torrents = [] + + response = self.session.get(torrent_url) + + torrent_page = BeautifulSoup(response.content, features="lxml") + + torrent = Torrent() + + term_tags = torrent_page.find_all("a", {"class": "term"}) + + for term_tag in term_tags: + torrent.keywords.append(term_tag.text) + + connection_tags = torrent_page.find("tr", {"id": "adv_search_cat"}).find_all( + "strong" + ) + + informations_tag = ( + torrent_page.find("table", {"class": "informations"}) + .find("tbody") + .find_all("tr") + ) + + download_button = torrent_page.find("a", {"class": "butt"}) + + if download_button.has_attr("href"): + torrent.url = download_button["href"] + + torrent.seeders = int(connection_tags[0].text.replace(" ", "")) + torrent.leechers = int(connection_tags[1].text.replace(" ", "")) + torrent.completed = int(connection_tags[2].text.replace(" ", "")) + + torrent.name = informations_tag[0].find_all("td")[1].text + torrent.size = informations_tag[3].find_all("td")[1].text + torrent.uploader = informations_tag[5].find_all("td")[1].text + + mydatetime = re.search( + "([0-9]*\/[0-9]*\/[0-9]* [0-9]*:[0-9]*)", + informations_tag[6].find_all("td")[1].text, + 0, + ).group(0) + + torrent.uploaded_datetime = datetime.datetime.strptime( + mydatetime, "%d/%m/%Y %H:%M" + ) + + message_tags = torrent_page.find_all("div", {"class": "message"}) + + for message_tag in message_tags: + torrent_comment = TorrentComment() + + torrent_comment.author = message_tag.find("a").text + torrent_comment.posted = message_tag.find("strong").text + torrent_comment.text = message_tag.find( + "span", {"id": "comment_text"} + ).text.strip() + + torrent.comments.append(torrent_comment) + + torrents.append(torrent) + + torrent_id = torrent_page.find("form", {"id": "report-torrent"}).find( + "input", {"type": "hidden", "name": "target"} + )["value"] + + response = self.session.get(YGGTORRENT_GET_FILES + torrent_id) + + files_page = BeautifulSoup(response.content, features="lxml") + + file_tags = files_page.find_all("tr") + + for file_tag in file_tags: + torrent_file = TorrentFile() + + td_tags = file_tag.find_all("td") + + torrent_file.file_size = ( + td_tags[0] + .text.replace("\\r", "") + .replace("\\n", "") + .replace("\\t", "") + .strip() + ) + torrent_file.file_name = ( + td_tags[1] + .text.replace("\\r", "") + .replace("\\n", "") + .replace("\\t", "") + .replace("\\", "") + .replace(" ", "") + .strip() + ) + + torrent.files.append(torrent_file) + + return torrent + + def most_completed(self): + """ + Return the most completed torrents url (TOP 100) + """ + + header = {"Accept": "application/json, text/javascript, */*; q=0.01"} + self.session.post(YGGTORRENT_MOST_COMPLETED_URL, headers=header) + + json_response = self.session.post( + YGGTORRENT_MOST_COMPLETED_URL, headers=header + ).json() + + torrents_url = [] + + for json_item in json_response: + root = BeautifulSoup(json_item[1], features="lxml") + + a_tag = root.find("a") + + torrents_url.append(a_tag["href"]) + + return torrents_url + + def get_torrents_url(self, search_url, parameters): + """ + Return + """ + + response = self.session.get(search_url) + + search_page = BeautifulSoup(response.content, features="lxml") + + pagination = search_page.find("ul", {"class": "pagination"}) + + if pagination is None: + limit_page = 1 + else: + pagination_item = pagination.find_all("a") + + limit_page = int(pagination_item[-1]["data-ci-pagination-page"]) + + torrents = [] + + for page in range(0, limit_page): + parameters["page"] = page * TORRENT_PER_PAGE + + search_url = create_search_url(parameters) + + response = self.session.get(search_url) + + search_page = BeautifulSoup(response.content, features="lxml") + + torrents_tag = search_page.findAll("a", {"id": "torrent_name"}) + + for torrent_tag in torrents_tag: + torrents.append(torrent_tag["href"]) + + return torrents + +#kopa + def download_from_torrent_url(self, torrent_url=None, destination_path="./data/files/"): + if torrent_url is not None: + torrent = self.extract_details(torrent_url) + + return self.download_from_torrent_download_url( + torrent_url=torrent.url, destination_path=destination_path + ) + + def download_from_torrent(self, torrent=None, destination_path="./data/files/"): + if torrent is not None: + return self.download_from_torrent_download_url( + torrent_url=torrent.url, destination_path=destination_path + ) + + def download_from_torrent_download_url( + self, torrent_url=None, destination_path="./data/files/" + ): + if torrent_url is None: + raise Exception("Invalid torrent_url, make sure you are logged") + + response = self.session.get(YGGTORRENT_BASE_URL + torrent_url) + + temp_file_name = response.headers.get("content-disposition") + + file_name = temp_file_name[temp_file_name.index("filename=") + 10 : -1] + + if not os.path.exists(destination_path): + os.makedirs(destination_path) + + file_full_path = os.path.join(destination_path, file_name) + + file = open(file_full_path, "wb") + + file.write(response.content) + + file.close() + + return file_full_path + + +def create_search_url(parameters): + """ + Return a formated URL for torrent's search + """ + + formated_search_url = YGGTORRENT_SEARCH_URL + + if "name" in parameters: + formated_search_url += parameters["name"].replace(" ", "+") + + if "page" in parameters: + formated_search_url += YGGTORRENT_SEARCH_URL_PAGE + formated_search_url += str(parameters["page"]) + + if "descriptions" in parameters: + formated_search_url += YGGTORRENT_SEARCH_URL_DESCRIPTION + + for description in parameters["descriptions"]: + formated_search_url += description + formated_search_url += "+" + + if "files" in parameters: + formated_search_url += YGGTORRENT_SEARCH_URL_FILE + + for file in parameters["files"]: + formated_search_url += file + formated_search_url += "+" + + if "uploader" in parameters: + formated_search_url += YGGTORRENT_SEARCH_URL_UPLOADER + formated_search_url += parameters["uploader"] + + if "sort" in parameters: + formated_search_url += YGGTORRENT_SEARCH_URL_SORT + formated_search_url += parameters["sort"] + + if "order" in parameters: + formated_search_url += YGGTORRENT_SEARCH_URL_ORDER + formated_search_url += parameters["order"] + + if "category" in parameters: + for category in categories: + if parameters["category"] == category["name"]: + formated_search_url += YGGTORRENT_SEARCH_URL_CATEGORY + formated_search_url += category["id"] + + if "subcategory" in parameters: + for subcategory in category["subcategories"]: + if parameters["subcategory"] == subcategory["name"]: + formated_search_url += YGGTORRENT_SEARCH_URL_SUB_CATEGORY + formated_search_url += subcategory["id"] + if "options" in parameters: + for key, values in parameters["options"].items(): + for option in subcategory["options"]: + if key == option["name"]: + for searched_value in values: + for index, value in enumerate( + option["values"] + ): + if searched_value == value: + formated_search_url += ( + "&option_" + ) + formated_search_url += option[ + "name" + ] + # options_index.append(index) + if "multiple" in option: + formated_search_url += ( + "%3Amultiple" + ) + + formated_search_url += "[]=" + formated_search_url += str( + index + 1 + ) + + formated_search_url += YGGTORRENT_SEARCH_URL_DO + formated_search_url += "search" + + return formated_search_url