diff --git a/.github/workflows/retype_build.yml b/.github/workflows/retype_build.yml index 9aba542..658f355 100644 --- a/.github/workflows/retype_build.yml +++ b/.github/workflows/retype_build.yml @@ -36,9 +36,9 @@ jobs: cat .inject/code.js >> ${{ steps.retypebuild.outputs.retype-output-path }}/resources/js/retype.js - name: Upload artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v1.0.8 with: path: ${{ steps.retypebuild.outputs.retype-output-path }} - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v1 diff --git a/Integrations/Animetracking.md b/Integrations/Animetracking.md index 0cbd933..193f8a7 100644 --- a/Integrations/Animetracking.md +++ b/Integrations/Animetracking.md @@ -13,7 +13,7 @@ Anime tracking process works with **only anime extensions**. So, it'll not work ___ ## Login Process -[!badge variant="light" text="Step 1"] [!badge variant="dark" icon="gear" text="Settings"] → [!badge variant="dark" icon="" text="Accounts"] → **Choose AL, Kitsu or MAL**. For this guide we are choosing AL. +[!badge variant="light" text="Step 1"] [!badge variant="dark" icon="gear" text="Settings"] → [!badge variant="dark" icon="" text="Accounts"] → **Choose AL or MAL**. For this guide we are choosing AL. [!badge variant="light" text="Step 2"] The app will forward to the default browser to login. Now **Login and authorize** the app. The site will return you the cloudstream app. @@ -25,12 +25,11 @@ If the log in process is successful, you will see a pop text and there will be y ___ ## Tracking -- When you go to the eps page of an anime, you will see the tracker icon (Logo of AL, Kitsu or MAL) at the top right corner. Click on that and you will see the tracking menu. +- When you go to the eps page of an anime, you will see the tracker icon (Logo of AL or MAL) at the top right corner. Click on that and you will see the tracking menu. ![image](https://cdn.discordapp.com/attachments/1021835706680745994/1029982148838563840/unknown.png) - The tracker will **automatically** track your anime after finishing the eps. Or you can **manually** input the number of eps you have watched. ![](https://cdn.discordapp.com/attachments/1021835706680745994/1029982662699536384/unknown.png) ![](https://cdn.discordapp.com/attachments/1021835706680745994/1029982861371113512/unknown.png) - -- Also, the **status** of the anime and the **rating** can be set from the tracking menu +- Also, the **status** of the anime and the **rating** can be set from the tracking menu \ No newline at end of file diff --git a/Repositories.md b/Repositories.md index 502a0f7..70e3759 100644 --- a/Repositories.md +++ b/Repositories.md @@ -4,4 +4,26 @@ icon: repo order: 1000 --- -See the CloudStream Wiki page for an up to date [list of extensions](https://cloudstream.miraheze.org/wiki/List_of_extensions) +Repositories contain all the website extensions. These repositories are built by the community members. The flag beside the repository indicates the language of the websites that the repository has. + +Direct Install | Short Codes { class="compact" } +:---: | :---: +[!badge variant="secondary" icon="static/gb.png" text="English"](https://cutt.ly/6wyw1RnS) | `6wyw1RnS` +[!badge variant="secondary" icon="static/world.png" text="Multilingual"](https://cutt.ly/Bwyw1S3k) | `Bwyw1S3k` +[!badge variant="secondary" icon="static/jo.png" text="Arabic"](https://cutt.ly/Jwyw1ZiR) | `Jwyw1ZiR` +[!badge variant="secondary" icon="static/world.png" text="Hexated"](https://cutt.ly/mwyw140i) | `mwyw140i` +[!badge variant="secondary" icon="static/in.png" text="Likdev"](https://cutt.ly/bwyw0Mcv) | `bwyw0Mcv` +[!badge variant="secondary" icon="static/es.png" text="Storm"](https://cutt.ly/Swyw03Nc) | `Swyw03Nc` +[!badge variant="secondary" icon="static/cr.png" text="Crunchyroll"](https://cutt.ly/wwyw2e4x) | `wwyw2e4x` +[!badge variant="secondary" icon="static/fr.png" text="French"](https://cutt.ly/jwyw2fJc) | `jwyw2fJc` +[!badge variant="secondary" icon="static/cn.png" text="Horis"](https://cutt.ly/Owyw2lbO) | `Owyw2lbO` +[!badge variant="secondary" icon="static/18p.png" text="NSFW"](https://cutt.ly/Nwyw2nbE) | `Nwyw2nbE` +[!badge variant="secondary" icon="static/ua.png" text="CakesTwix"](https://cutt.ly/gwyw2YuE) | `gwyw2YuE` +[!badge variant="secondary" icon="static/fr.png" text="FStream"](https://cutt.ly/fstream) | `fstream` +[!badge variant="secondary" icon="static/world.png" text="Avocado"](https://cutt.ly/aguaco) | `aguaco` +[!badge variant="secondary" icon="static/tr.png" text="Turkish"](https://cutt.ly/KekikAkademi) | `KekikAkademi` +[!badge variant="secondary" icon="static/jo.png" text="Arabico"](https://cutt.ly/0wF96Vs1) | `0wF96Vs1` + +!!!info +if you don't understand the name of a repository, the repository was named after the developer of that repository. +!!!! diff --git a/devs/create-your-own-providers.md b/devs/create-your-own-providers.md index 2498588..e997a7f 100644 --- a/devs/create-your-own-providers.md +++ b/devs/create-your-own-providers.md @@ -8,10 +8,10 @@ icon: repo Providers in CloudStream consists primarily of 4 different parts: -- [Searching](https://recloudstream.github.io/dokka/library/com.lagradost.cloudstream3/-main-a-p-i/index.html#498495168%2FFunctions%2F-449184558) -- [Loading the home page](https://recloudstream.github.io/dokka/library/com.lagradost.cloudstream3/-main-a-p-i/index.html#1356482668%2FFunctions%2F-449184558) -- [Loading the result page](https://recloudstream.github.io/dokka/library/com.lagradost.cloudstream3/-main-a-p-i/index.html#1671784382%2FFunctions%2F-449184558) -- [Loading the video links](https://recloudstream.github.io/dokka/library/com.lagradost.cloudstream3/-main-a-p-i/index.html#-930139416%2FFunctions%2F-449184558) +- [Searching](https://recloudstream.github.io/dokka/-cloudstream/com.lagradost.cloudstream3/-main-a-p-i/index.html#498495168%2FFunctions%2F101969414) +- [Loading the home page](https://recloudstream.github.io/dokka/-cloudstream/com.lagradost.cloudstream3/-main-a-p-i/index.html#1356482668%2FFunctions%2F101969414) +- [Loading the show page](https://recloudstream.github.io/dokka/-cloudstream/com.lagradost.cloudstream3/-main-a-p-i/index.html#1671784382%2FFunctions%2F101969414) +- [Loading the video links](https://recloudstream.github.io/dokka/-cloudstream/com.lagradost.cloudstream3/-main-a-p-i/index.html#-930139416%2FFunctions%2F101969414) When making a provider it is important that you are confident you can scrape the video links first! Video links are often the most protected part of the website and if you cannot scrape them then the provider is useless. @@ -24,7 +24,7 @@ Looking at how some extensions work alongside reading this will likely help a lo ## 1. Searching -This one is probably the easiest, based on a query you should return a list of [SearchResponse](https://recloudstream.github.io/dokka/library/com.lagradost.cloudstream3/-search-response/index.html) +This one is probably the easiest, based on a query you should return a list of [SearchResponse](https://recloudstream.github.io/dokka/app/com.lagradost.cloudstream3/-search-response/index.html) Scraping the search results is essentially just finding the search item elements on the site (red box) and looking in them to find name, url and poster url and put the data in a SearchResponse. @@ -51,7 +51,7 @@ private fun Element.toSearchResponse(): LiveSearchResponse? { // If no link element then it's no a valid search response val link = this.select("div.alternative a").last() ?: return null // fixUrl is a built in function to convert urls like /watch?v=..... to https://www.youtube.com/watch?v=..... - val href = link.attr("href") + val href = fixUrl(link.attr("href")) val img = this.selectFirst("div.thumb img") // Optional parameter, scraping languages are not required but might be nice on some sites val lang = this.selectFirst(".card-title > a")?.attr("href")?.removePrefix("?country=") @@ -59,15 +59,15 @@ private fun Element.toSearchResponse(): LiveSearchResponse? { // There are many types of searchresponses but mostly you will be using AnimeSearchResponse, MovieSearchResponse // and TvSeriesSearchResponse, all with different parameters (like episode count) - return newLiveSearchResponse( + return LiveSearchResponse( // Kinda hack way to get the title img?.attr("alt")?.replaceFirst("Watch ", "") ?: return null, href, - TvType.Live - ) { - this.posterUrl = fixUrl(img.attr("src")) - this.lang = lang - } + this@EjaTv.name, + TvType.Live, + fixUrl(img.attr("src")), + lang = lang + ) } ``` @@ -87,7 +87,7 @@ override val mainPage = mainPageOf( ``` This dictates what the getMainPage function will be receiving as function arguments. -Basically when the recent dubbed media should be loaded the getMainPage gets called with a page number and the request you defined above. +Basically when the recent dubbed shows should be loaded the getMainPage gets called with a page number and the request you defined above. ```kotlin @@ -141,9 +141,9 @@ responses when the user has scrolled to the end. TLDR: Exactly like searching but you defined your own queries. -## 3. Loading the result page +## 3. Loading the show page -The media result page is a bit more complex than search results, but it uses the same logic used to get search results: using CSS selectors and regex to parse html into a kotlin object. With the amount of info being parsed this function can get quite big, but the fundamentals are still pretty simple. +The show page is a bit more complex than search results, but it uses the same logic used to get search results: using CSS selectors and regex to parse html into a kotlin object. With the amount of info being parsed this function can get quite big, but the fundamentals are still pretty simple. The only difficultuy is getting the episodes, they are not always not part of the html. Check if any extra requests are sent in your browser when visiting the episodes page. **NOTE**: Episodes in CloudStream are not paginated, meaning that if you have a show with 21 seasons, all on different website pages you will need to parse them all. @@ -224,14 +224,14 @@ A function can look something like this: val recUrl = fixUrlNull(titleHeader.attr("href")) ?: return@mapNotNull null val recTitle = titleHeader.text() ?: return@mapNotNull null val poster = element.select("div.film-poster > img").attr("data-src") - newMovieSearchResponse( + MovieSearchResponse( recTitle, recUrl, + this.name, if (recUrl.contains("/movie/")) TvType.Movie else TvType.TvSeries, - false - ) { - this.posterUrl = poster - } + poster, + year = null + ) } if (isMovie) { diff --git a/recsrc.md b/recsrc.md new file mode 100644 index 0000000..3881374 --- /dev/null +++ b/recsrc.md @@ -0,0 +1,40 @@ +--- +label: Recommended Sources +icon: star +order: 999 +--- + +## English + +### Movies & TV Series +1. Sorastream `Hexated` +2. Superstream `English` +3. Sflix bundle `English` +4. AllMoviesForYou `English` + +### Anime +1. Anichi `Hexated` +2. 9anime `Avocado` +3. KronchEN/Kwunchwoll `Avocado` +4. Aniwatch `English` +5. Kickassanime `Hexated` +6. Allanime `English` +7. Sorastream `Hexated` +8. Yugenanime `Hexated` +9. Animension `Storm` +10. Gogo `English` + +### Asian Contents +1. Sorastream `Hexated` +2. Kisskh `Hexated` +3. Kissasian `Hexated` +4. Dramacool `Horis` +5. Sflix bundle `English` +6. ShowFlix `Indian languages` + +### Livestreams +1. IPTV-org (TV) `Multilingual` +2. Time4TV (Sports) `Hexated` +3. TV247 `Hexated` +4. 123TV `Hexated` +5. Crichd `Darkdemon`