3
\$\begingroup\$

This is a project that finds a specific anime (show) and checks to see if there is a new episode of it .

this is also the first time that i used def like this and wanted to ask how this project looks and how i could improve it ?

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.keys import Keys
import time

path = "c:/users/admin/appdata/local/programs/python/python38-32/chromedriver.exe"

driver = webdriver.Chrome(path)

chose = int(input("Press 1 for Black Clover \nPress 2 for Fire Force : "))

class BlackClover:
    def __init__(self, title):
        # lets the user chose which anime(show) he or she wants to watch.
        self.title = title  

        # goes to the website that i want .
        self.url = driver.get("https://www.gogoanime.movie/")

        # i let it sleep for a few seconds before it goes to the next task
        time.sleep(3)

        # goes the english speaking anime (shows)
        self.dub = driver.find_element_by_xpath('//*[@id="load_recent_release"]/div[1]/h2/a[2]')
        self.dub.send_keys(Keys.RETURN)

        # will be used later to filter out the episode number .
        self.numbers = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
        self.divider = []

        # the anime name (shows name).
        self.clover = "Black Clover (TV) (Dub)"

    def checker(self):
        # will be used to retrieve the episode of the anime (show).
        global episode

        # will be used to go through the li element (HTML)
        global n
        n = 1
        total = 0

        # checks to see if the first li element is equal to "Black Clover (TV) (Dub)".
        first_anime = WebDriverWait(driver, 3).until(ec.visibility_of_element_located(
            (By.XPATH, '//*[@id="load_recent_release"]/div[2]/ul/li[1]/p[1]/a'))).get_attribute("innerHTML")

        if first_anime == "Black Clover (TV) (Dub)":
            print("first good")
            driver.find_element_by_xpath('//*[@id="load_recent_release"]/div[2]/ul/li[1]/p[1]/a').send_keys(Keys.RETURN)

        # if it is not equal to "Black Clover (TV) (Dub)" it will loop through the next li element until it finds it.
        else:
            while True:

                # the next li element
                name = WebDriverWait(driver,3).until(ec.visibility_of_element_located(
                    (By.XPATH, f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[1]/a'))).get_attribute("innerHTML")

                if name == self.clover:
                    print("good")

                    # checks which episode it's on and looks if it's a new episode
                    episode = WebDriverWait(driver,2).until(ec.visibility_of_element_located(
                        (By.XPATH, f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[2]'))).get_attribute("innerHTML")

                    # retrieves the episode number
                    self.episodes()
                    break

                if name != self.clover:
                    print("bad")
                    total += 1
                    n+= 1

                    if total == 20:
                        print("nothing")
                        break

EDIT : i let the user chose which anime(show) he or she wants to check by entering 1 or 2 in the input variable called chose at the top.

Thanks to @fabrizzio_gz .

    def episodes(self):
        global joiner

        # divider is a empty list
        divider = self.divider

        # copies the the variable "episode"
        k= list(episode)
        splitter = list(episode)

        # gets the last three numbers in "k".
        number = len(k)-3
        last_number = k[number:]
        last_number_2 = k[-1]

        # checks to see if there are any numbers in the the variable "splitter" .
        for i in splitter:

            # if the i in splitter isn't a number it replaces it with a empty string.
            if i not in self.numbers:
                t = splitter.index(i)
                splitter[t] = ""
                print(splitter)

            # if i is a number then it will add to the list with the variablename "divider" .
            if i in self.numbers:
                divider.append(i)

                if divider == last_number and self.title == "Black Clover (TV) (Dub)":

                    # this joins all the numbers together in the list
                    joiner = ''.join(divider)

                    # checks to see if the episode is greater then 129
                    if int(joiner) > 129:
                        time.sleep(2)

                        # when the episode is greater then 129 it clicks the anime (show).
                        click = driver.find_element_by_xpath(f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[1]/a')
                        click.send_keys(Keys.RETURN)
                        break
                    else :
                        # if the episode isn't greater then 129 then it returns the following .
                        return print("no new episode of : BLACK CLOVER ")

                else:
                    joiner = ''.join(divider)
                    if int(joiner) >= 4:
                        time.sleep(2)

                            # when the episode is greater then 4 it clicks the anime (show).
                        click = driver.find_element_by_xpath(
                        f'//*[@id="load_recent_release"]/div[2]/ul/li[{n}]/p[1]/a')
                        click.send_keys(Keys.RETURN)
                        break
                    else:
                        # if the episode isn't greater then 4 then it returns the following .
                        return print("no new episode of : FIRE FORCE ")


if chose == 1:
    main = BlackClover(title="Black Clover (TV) (Dub)")
    main.checker()

if chose == 2:
    main = BlackClover(title="Enen no Shouboutai: Ni no Shou (Dub)")
    main.checker()
\$\endgroup\$

1 Answer 1

2
\$\begingroup\$

It's looking good and it's an interesting project. I'm not familiar with selenium, but since you create a Class for each anime show sharing most of the code, you could implement a parent anime show Class and inherit the methods to each child Class. Or maybe have each anime show as an instance of the same Class, just changing the anime show title or the necessary attributes.

EDIT: You could use the same class for both anime shows as follows. Instead of two classes, you create a new class AnimeShow with the same attributes and methods. You add the parameter anime_show to the __init__ function so that you can initialize anime shows with different titles . You would also need to change your code to use the new attribute self.title where necessary.

class AnimeShow():
    
    # Adding anime_show parameter
    def __init__(self, anime_show):
        # Same attributes as you had before
        # ...
        self.title = anime_show

    # Rest of class methods
    # ...

if __name__ == '__main__':
    # Creating different anime shows with the same class
    clover = AnimeShow("Black Clover (TV) (Dub)")
    fire = AnimeShow("Enen no Shouboutai: Ni no Shou (Dub)")
    clover.checker()
    fire.checker()
```
\$\endgroup\$
4
  • \$\begingroup\$ i have a question about what you sad about " you could implement a parent anime show Class and inherit the methods to each child Class" . Do you mean that i should put other Classes inside the main Class that i started with ? \$\endgroup\$
    – bliboy
    Commented Aug 15, 2020 at 22:21
  • \$\begingroup\$ I edited my answer to show how to do it. \$\endgroup\$ Commented Aug 15, 2020 at 23:09
  • \$\begingroup\$ thanks for the tip . I have changed a few things in my code thanks to you . \$\endgroup\$
    – bliboy
    Commented Aug 16, 2020 at 0:29
  • \$\begingroup\$ You are welcome. Good luck. \$\endgroup\$ Commented Aug 16, 2020 at 1:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.