-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsoramai.py
More file actions
146 lines (119 loc) · 4.88 KB
/
soramai.py
File metadata and controls
146 lines (119 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import os
import subprocess
import sys
from providers.provider_base import AnimeProvider
from providers.allanime import AllAnime
from flask import Flask, render_template, request, jsonify, redirect
class Soramai:
def __init__(self, provider: AnimeProvider = AllAnime) -> None:
self.mode = "sub"
self.provider = provider()
self.results = []
if "ui" in sys.argv:
print("Launching web UI...")
self.start_web_ui()
elif "debug" in sys.argv:
print("Debug mode!")
self.debug()
else:
self.cli()
def cli(self):
query = ""
download = False
skip = False
ep = None
for i in range(len(sys.argv)):
arg = sys.argv[i]
if arg in ["-d", "--download", "--dl"]:
download = True
elif arg in ["-s", "--skip"]:
skip = True
elif arg in ["-e", "-ep", "--episode"]:
ep = sys.argv[i+1]
elif arg in ["-u", "--update"]:
self.update()
elif arg == "--dub":
self.mode = "dub"
else:
if i != 0 and "-" not in arg[i-1]:
query += arg + " "
os.system("clear")
query = query.strip()
print(query)
if query == "":
query = input("\33[2K\r\033[1;36mSearch anime: \033[0m")
anime_list = self.provider.get_search(1, query)
if len(anime_list) == 0:
self.die("No results found!")
os.system("clear")
print("Select anime:")
for i in range(1, len(anime_list) + 1):
print(f"{i}. {anime_list[i-1].title}")
result = input()
if not result:
exit(1)
result = int(result) - 1
anime = anime_list[result]
title = anime.title
ep_list = anime.episodes_count
os.system("clear")
print("Select episode:")
for ep in range(ep_list):
print(ep + 1)
result = input("\n-> ")
if not result:
exit(1)
episode = anime.get_episode(int(result))
for stream_data in episode.streams:
stream = stream_data.link
print("Trying stream URL:", stream)
cmd = ["mpv", stream, f'--title={title} {episode.title}']
try:
out = subprocess.run(cmd, capture_output=True, text=True) # Capture stderr for error checking
if out.returncode == 0: # If mpv exits successfully, stream is working
print("Stream is working!")
break
else:
print("Stream failed with error:", out.stderr)
except Exception as e:
print("Error while playing stream:", e)
print("No working stream found.") if out.returncode != 0 else print("Playback successful.")
def debug(self):
self.provider.get_search(1, "death note")
print("")
def start_web_ui(self):
app = Flask(__name__, template_folder='server/templates', static_folder='server/static')
anime_results = []
anime = None
@app.route('/')
def index():
return render_template('index.html')
@app.route('/search', methods=['GET'])
def search():
query = request.args.get('q', '')
self.results = self.provider.get_search(1, query)
results = [{'title': anime.title, 'url': f'/details/{anime.id}'} for anime in self.results]
return jsonify(results)
@app.route('/details/<anime_id>')
def details(anime_id):
print(self.results)
for anime_iter in self.results:
if anime_iter.id == anime_id:
eps = anime_iter.episodes_count
ep_list = [{'ep_number': ep+1, 'url': f"/watch/{anime_id}/{ep+1}"} for ep in range(eps)]
return render_template('details.html', anime_title=anime_iter.title, episodes=ep_list)
return
@app.route('/watch/<anime_id>/<episode_num>')
def watch(anime_id, episode_num):
for anime_iter in self.results:
if anime_iter.id == anime_id:
episode = anime_iter.get_episode(int(episode_num))
stream = episode.streams[0].link
return render_template('watch.html', hls=stream, anime_title=f"{anime_iter.title} - ep {episode_num}")
return "Episode not found", 404
app.run(debug=True)
def die(self, message):
print(message)
exit(1)
# Run the application
Soramai()