This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3d07a3e
There's something i guess
Kapilarny Apr 22, 2022
42b3cfb
commit
Kapilarny Apr 22, 2022
54a58df
Preparing for adding animepisode and desu-online
Kapilarny Apr 22, 2022
bef7935
Add requirements.txt
artrixdotdev Apr 22, 2022
1b4c583
Update requirements.txt
artrixdotdev Apr 22, 2022
188ec1b
Add Animepisode to main
artrixdotdev Apr 22, 2022
2b3231e
Add Animepisode scraper
artrixdotdev Apr 22, 2022
9b3f028
Added desu-online.pl support for ScrapperEngine
Kapilarny Apr 22, 2022
97573ac
Add new websites to WebsiteScraperService.cs
Kapilarny Apr 22, 2022
f398706
Fix anime matching on Animepisode since they use peculiar names for t…
artrixdotdev Apr 22, 2022
72dae7a
Added loop for all video qualities
Kapilarny Apr 23, 2022
a7a7384
Added search for desuonline
Kapilarny Apr 23, 2022
563b61b
Added Full Support for desu-online.pl :D
Kapilarny Apr 23, 2022
f373ffc
Add Animegg resource
artrixdotdev Apr 24, 2022
d08b16c
Optimalization for desuonline, and some bug fixes
Kapilarny Apr 25, 2022
25aaca5
Add animegg support
artrixdotdev Apr 28, 2022
775cc9c
Merge branch 'main' into animegg
artrixdotdev Apr 28, 2022
1088a31
Merge pull request #1 from Kapilarny/animegg
artrixdotdev Apr 28, 2022
d61c5de
AnimeGG fully scrapped
Kapilarny Apr 29, 2022
4c143ee
Added full support for AnimeGG
Kapilarny Apr 29, 2022
2e56535
Fix some merge conflicts
Kapilarny Apr 29, 2022
7d33986
Merge branch 'main'
Kapilarny Apr 29, 2022
87da999
Merge
Kapilarny Apr 29, 2022
7759c98
Merge branch 'AniAPI-Team-main'
Kapilarny Apr 29, 2022
41a04b7
Delete localizations.1.1.5.json
Kapilarny Apr 29, 2022
2e489a0
Some merge conflicts
Kapilarny Apr 29, 2022
3703d6b
Merge conflict stuff
Kapilarny Apr 29, 2022
87922e4
a lil fix
Kapilarny Apr 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion ScraperEngine/main.py
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
import falcon
import falcon.asgi
from resources.animegg import AnimeggResource
from resources.animeworld import AnimeworldResource

from resources.dreamsub import DreamsubResource
Expand All@@ -15,5 +16,6 @@
AnimeworldResource(app)
GogoanimeResource(app)
DesuonlineResource(app)
AnimeggResource(app)

AniplaylistResource(app)
AniplaylistResource(app)
63 changes: 63 additions & 0 deletions ScraperEngine/resources/animegg.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
from operator import is_
import falcon
import aiohttp
from utils.session import execute_proxied_request

from falcon import uri
from typing import List
from bs4 import BeautifulSoup
from interfaces.resource import ScraperResource
from models.episode import Episode
from models.matching import Matching


class AnimeggResource(ScraperResource):

def __init__(self, app: falcon.App) -> None:
# On this line, use the name you used inside MongoDB's websites collection
super().__init__(app, "animegg")

async def get_possible_matchings(self, res: falcon.Response, title: str) -> List[Matching]:
matchings = []
url = f"{self.base_url}/search/?q={uri.encode(title)}"
try:
page = await execute_proxied_request(self, url)
# Search results class is "mse"
results = page.find_all(class_="mse")
for result in results:
url = result.get("href")
title = result.select_one(".searchre > .media-body > .first > h2").text
matchings.append(Matching(title, url))
except Exception as e:
print(str(e))
raise
return matchings

async def get_episode(self, res: falcon.Response, path: str, number: int) -> List[Episode]:
episodes = []
series_name = uri.encode(path.split("/")[-1].replace(" ", "-").replace(",", ""))
video_url = f"{self.base_url}/{series_name}-episode-{number}"
try:
page = await execute_proxied_request(self, video_url)
links = page.find("ul", id="videos").find_next("li").find_all("a")
for video in links:
embed_id = video["data-id"]

is_dub = video["data-version"] == "dubbed"
vid_type = 'subbed'
if is_dub:
vid_type = "dubbed"

quality_text = video.select_one("span.btn-hd").text
quality = 1080 if quality_text == "HD" else 480
embed_url = f"{self.base_url}/embed/{embed_id}"
page = await execute_proxied_request(self, embed_url)
video_path = page.select_one("meta[property='og:video']")["content"]
video_url = f"{self.base_url}{video_path}"
episodes.append(Episode(f"Episode {number}", f"{embed_url}#{vid_type}", video_url, quality, "mp4"))

except Exception as e:
print(str(e))
raise

return episodes
3 changes: 1 addition & 2 deletions ScraperEngine/resources/desuonline.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -94,8 +94,7 @@ async def get_episode(self, res: falcon.Response, path: str, number: int) -> Lis
episodes = []

url = f"{self.base_url}{path}-odcinek-{number}"
print(url)


try:
# This here works, but theres a faster method
# But in case there are any bugs with current approach u you can use this
Expand Down
32 changes: 32 additions & 0 deletions SyncService/Models/Websites/AnimeggWebsite.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
using Commons;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SyncService.Models.Websites
{
public class AnimeggWebsite : IWebsite
{
public AnimeggWebsite(Website website) : base(website)
{
}

public override bool AnalyzeMatching(Anime anime, AnimeMatching matching, string sourceTitle)
{
if(matching.EpisodePath.Contains("#dubbed")) {
matching.isDub = true;
}
return base.AnalyzeMatching(anime, matching, sourceTitle);
}

public override Dictionary<string, string> GetVideoProxyHeaders(AnimeMatching matching, Dictionary<string, string> values = null)
{
return new Dictionary<string, string>
{
{ "referer", matching.EpisodePath.Replace("#dubbed", "").Replace("#subbed", "") }
};
}
}
}
3 changes: 3 additions & 0 deletions SyncService/Services/WebsiteScraperService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -84,6 +84,9 @@ public override async Task Start(CancellationToken cancellationToken)
case "gogoanime":
iWeb = new GogoanimeWebsite(website);
break;
case "animegg":
iWeb = new AnimeggWebsite(website);
break;
case "desuonline":
iWeb = new DesuonlineWebsite(website);
break;
Expand Down
30 changes: 15 additions & 15 deletions WebAPI/Resources/localizations.1_1_5.json
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
{
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
"localizations": [
{
"i18n": "en",
"label": "English"
},
{
"i18n": "it",
"label": "Italian"
},
{
"i18n": "pl",
"label": "Polish"
}
]
}
2 changes: 1 addition & 1 deletion WebAPI/WebAPI.csproj
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,8 +25,8 @@

<ItemGroup>
<EmbeddedResource Include="Resources\genres.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
<EmbeddedResource Include="Resources\localizations.1_0.json" />
<EmbeddedResource Include="Resources\localizations.1_1_5.json" />
</ItemGroup>

<ItemGroup>
Expand Down