From ac20426689cd50718aa35689ad78cc7a8c27ba8d Mon Sep 17 00:00:00 2001
From: Sadwhy <99601717+Sadwhy@users.noreply.github.com>
Date: Fri, 9 Feb 2024 09:02:53 +0600
Subject: [PATCH 001/254] Added proper padding to offline text/buttons
---
.../main/res/layout/fragment_offline_page.xml | 66 ++++++++++---------
1 file changed, 35 insertions(+), 31 deletions(-)
diff --git a/app/src/main/res/layout/fragment_offline_page.xml b/app/src/main/res/layout/fragment_offline_page.xml
index 92ae097e..e9f7e843 100644
--- a/app/src/main/res/layout/fragment_offline_page.xml
+++ b/app/src/main/res/layout/fragment_offline_page.xml
@@ -82,42 +82,46 @@
-
+ android:gravity="center_vertical"
+ android:orientation="horizontal"
+ android:paddingRight="32dp"
+ android:paddingLeft="32dp">
-
+
-
+
-
+
From e319aeb342ea1066b57c2a419683452c7db677d8 Mon Sep 17 00:00:00 2001
From: aayush262
Date: Sat, 10 Feb 2024 23:08:13 +0530
Subject: [PATCH 002/254] feat: monet icon for alpha
---
app/src/main/res/mipmap-anydpi-v26/ic_launcher_alpha_round.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_alpha_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_alpha_round.xml
index c841f28b..2ef1656e 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_alpha_round.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_alpha_round.xml
@@ -2,4 +2,5 @@
+
\ No newline at end of file
From 915c6c1dfe9c4067c7936f45d9afb49d043e7dea Mon Sep 17 00:00:00 2001
From: aayush262
Date: Sat, 10 Feb 2024 23:11:20 +0530
Subject: [PATCH 003/254] feat: better format for change logs
---
.github/workflows/beta.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml
index 21e1f14b..21287826 100644
--- a/.github/workflows/beta.yml
+++ b/.github/workflows/beta.yml
@@ -39,7 +39,7 @@ jobs:
fi
echo "Commits since $LAST_SHA:"
# Accumulate commit logs in a shell variable
- COMMIT_LOGS=$(git log $LAST_SHA..HEAD --pretty=format:"%h - %s")
+ COMMIT_LOGS=$(git log $LAST_SHA..HEAD --pretty=format:"· %s")
# URL-encode the newline characters for GitHub Actions
COMMIT_LOGS="${COMMIT_LOGS//'%'/'%25'}"
COMMIT_LOGS="${COMMIT_LOGS//$'\n'/'%0A'}"
@@ -104,7 +104,7 @@ jobs:
#Telegram
curl -F "chat_id=${{ secrets.TELEGRAM_CHANNEL_ID }}" \
-F "document=@app/build/outputs/apk/google/alpha/app-google-alpha.apk" \
- -F "caption=[Alpha-Build: ${VERSION}] Change logs :${commit_messages}" \
+ -F "caption=Alpha-Build: **${VERSION}** Change logs :${commit_messages}" \
https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendDocument
env:
From 0afad1d9ae5c20174ea0f1bb7c234746a72ce2b6 Mon Sep 17 00:00:00 2001
From: rebelonion <87634197+rebelonion@users.noreply.github.com>
Date: Sun, 11 Feb 2024 04:16:22 -0600
Subject: [PATCH 004/254] feat: comment authorization
---
.gitignore | 3 +
app/build.gradle | 8 +-
.../dantotsu/connections/comments/Comments.kt | 116 ++++++++++++++++++
3 files changed, 126 insertions(+), 1 deletion(-)
create mode 100644 app/src/main/java/ani/dantotsu/connections/comments/Comments.kt
diff --git a/.gitignore b/.gitignore
index c81d22db..6cc9cdea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,9 @@ local.properties
# Log/OS Files
*.log
+# Secrets
+apikey.properties
+
# Android Studio generated files and folders
captures/
.externalNativeBuild/
diff --git a/app/build.gradle b/app/build.gradle
index 89eafa1b..39229933 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,6 +10,10 @@ def gitCommitHash = providers.exec {
commandLine("git", "rev-parse", "--verify", "--short", "HEAD")
}.standardOutput.asText.get().trim()
+def apikeyPropertiesFile = rootProject.file("apikey.properties")
+def apikeyProperties = new Properties()
+apikeyProperties.load(new FileInputStream(apikeyPropertiesFile))
+
android {
compileSdk 34
@@ -21,6 +25,8 @@ android {
versionName "2.2.0"
versionCode 220000000
signingConfig signingConfigs.debug
+ buildConfigField("String", "APP_SECRET", apikeyProperties['APP_SECRET'])
+ buildConfigField("String", "USER_ID_ENCRYPT_KEY", apikeyProperties['USER_ID_ENCRYPT_KEY'])
}
flavorDimensions "store"
@@ -49,7 +55,7 @@ android {
}
debug {
applicationIdSuffix ".beta"
- versionNameSuffix "-beta01"
+ versionNameSuffix "-beta02"
manifestPlaceholders = [icon_placeholder: "@mipmap/ic_launcher_beta", icon_placeholder_round: "@mipmap/ic_launcher_beta_round"]
debuggable false
}
diff --git a/app/src/main/java/ani/dantotsu/connections/comments/Comments.kt b/app/src/main/java/ani/dantotsu/connections/comments/Comments.kt
new file mode 100644
index 00000000..86e8b9ad
--- /dev/null
+++ b/app/src/main/java/ani/dantotsu/connections/comments/Comments.kt
@@ -0,0 +1,116 @@
+package ani.dantotsu.connections.comments
+
+import android.security.keystore.KeyProperties
+import android.util.Base64
+import ani.dantotsu.BuildConfig
+import ani.dantotsu.settings.saving.PrefManager
+import ani.dantotsu.settings.saving.PrefName
+import com.lagradost.nicehttp.Requests
+import eu.kanade.tachiyomi.network.NetworkHelper
+import kotlinx.coroutines.runBlocking
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.json.Json
+import okhttp3.FormBody
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import java.security.MessageDigest
+import javax.crypto.Cipher
+import javax.crypto.spec.SecretKeySpec
+
+class Comments {
+ val address: String = "http://10.0.2.2:8081"
+ val appSecret = BuildConfig.APP_SECRET
+ val requestClient = Injekt.get().client
+ var authToken: String? = null
+ fun run() {
+ runBlocking {
+ val request = Requests(
+ requestClient,
+ headerBuilder()
+ )
+ .get(address)
+ println("comments: $request")
+ }
+ }
+
+ fun getCommentsForId(id: Int) {
+ val url = "$address/comments/$id"
+ runBlocking {
+ val request = Requests(
+ requestClient,
+ headerBuilder()
+ )
+ .get(url)
+ println("comments: $request")
+ }
+ }
+
+ fun fetchAuthToken() {
+ val url = "$address/authenticate"
+ //test user id = asdf
+ //test username = test
+ val user = User(generateUserId() ?: return, "rebel onion")
+ val body: FormBody = FormBody.Builder()
+ .add("user_id", user.id)
+ .add("username", user.username)
+ .build()
+ runBlocking {
+ val request = Requests(
+ requestClient,
+ headerBuilder()
+ )
+ val json = request.post(url, requestBody = body)
+ if (!json.text.startsWith("{")) return@runBlocking
+ val parsed = try {
+ Json.decodeFromString(json.text)
+ } catch (e: Exception) {
+ return@runBlocking
+ }
+ authToken = parsed.authToken
+
+ println("comments: $json")
+ println("comments: $authToken")
+ }
+ }
+
+ private fun headerBuilder(): Map {
+ return if (authToken != null) {
+ mapOf(
+ "appauth" to appSecret,
+ "Authorization" to authToken!!
+ )
+ } else {
+ mapOf(
+ "appauth" to appSecret,
+ )
+ }
+ }
+
+ private fun generateUserId(): String? {
+ val anilistId = PrefManager.getVal(PrefName.AnilistToken, null as String?) ?: return null
+ val userIdEncryptKey = BuildConfig.USER_ID_ENCRYPT_KEY
+ val keySpec = SecretKeySpec(userIdEncryptKey.toByteArray(), KeyProperties.KEY_ALGORITHM_AES)
+ val cipher = Cipher.getInstance("${KeyProperties.KEY_ALGORITHM_AES}/${KeyProperties.BLOCK_MODE_CBC}/${KeyProperties.ENCRYPTION_PADDING_PKCS7}")
+ cipher.init(Cipher.ENCRYPT_MODE, keySpec)
+ val encrypted = cipher.doFinal(anilistId.toByteArray())
+ val base = Base64.encodeToString(encrypted, Base64.NO_WRAP)
+ val bytes = MessageDigest.getInstance("SHA-256").digest(base.toByteArray())
+ return bytes.joinToString("") { "%02x".format(it) }
+
+ }
+}
+
+@Serializable
+data class Auth(
+ @SerialName("authToken")
+ val authToken: String
+)
+
+@Serializable
+data class User(
+ @SerialName("user_id")
+ val id: String,
+ @SerialName("username")
+ val username: String
+)
\ No newline at end of file
From 7af71ba217dfef1fbdd31d63100b0db210e3a380 Mon Sep 17 00:00:00 2001
From: Sadwhy
Date: Sun, 11 Feb 2024 16:59:48 +0600
Subject: [PATCH 005/254] Faq Rewrite P.1
---
.../dantotsu/media/anime/AnimeWatchAdapter.kt | 16 ++++++++++--
.../dantotsu/media/manga/MangaReadAdapter.kt | 18 +++++++++++--
.../res/drawable/ic_round_help_outline.xml | 11 ++++++++
app/src/main/res/layout/item_anime_watch.xml | 26 +++++++++++++++++--
app/src/main/res/values/strings.xml | 25 +++++++++---------
5 files changed, 78 insertions(+), 18 deletions(-)
create mode 100644 app/src/main/res/drawable/ic_round_help_outline.xml
diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt
index 1d7a8497..5c81a2c3 100644
--- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt
@@ -5,6 +5,8 @@ import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
+import android.os.Bundle
+import ani.dantotsu.settings.FAQActivity
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageButton
@@ -68,6 +70,12 @@ class AnimeWatchAdapter(
}
}
+ //Fuck u launch
+ binding.faqbutton.setOnClickListener {
+ val intent = Intent(fragment.requireContext(), FAQActivity::class.java)
+ startActivity(fragment.requireContext(), intent, null)
+ }
+
binding.animeSourceDubbed.isChecked = media.selected!!.preferDub
binding.animeSourceDubbedText.text =
if (media.selected!!.preferDub) currActivity()!!.getString(R.string.dubbed) else currActivity()!!.getString(
@@ -421,13 +429,17 @@ class AnimeWatchAdapter(
}
binding.animeSourceProgressBar.visibility = View.GONE
- if (media.anime.episodes!!.isNotEmpty())
+ if (media.anime.episodes!!.isNotEmpty()) {
binding.animeSourceNotFound.visibility = View.GONE
- else
+ binding.faqbutton.visibility = View.GONE}
+ else {
binding.animeSourceNotFound.visibility = View.VISIBLE
+ binding.faqbutton.visibility = View.VISIBLE
+ }
} else {
binding.animeSourceContinue.visibility = View.GONE
binding.animeSourceNotFound.visibility = View.GONE
+ binding.faqbutton.visibility = View.GONE
clearChips()
binding.animeSourceProgressBar.visibility = View.VISIBLE
}
diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt
index e990f94e..4cc73ea4 100644
--- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt
+++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt
@@ -5,6 +5,9 @@ import android.app.AlertDialog
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
+import android.os.Bundle
+import ani.dantotsu.settings.FAQActivity
+import androidx.core.content.ContextCompat.startActivity
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.CheckBox
@@ -63,6 +66,12 @@ class MangaReadAdapter(
_binding = binding
binding.sourceTitle.setText(R.string.chaps)
+ //Fuck u launch
+ binding.faqbutton.setOnClickListener {
+ val intent = Intent(fragment.requireContext(), FAQActivity::class.java)
+ startActivity(fragment.requireContext(), intent, null)
+ }
+
//Wrong Title
binding.animeSourceSearch.setOnClickListener {
SourceSearchDialogFragment().show(
@@ -435,13 +444,18 @@ class MangaReadAdapter(
binding.animeSourceContinue.visibility = View.GONE
}
binding.animeSourceProgressBar.visibility = View.GONE
- if (media.manga.chapters!!.isNotEmpty())
+ if (media.manga.chapters!!.isNotEmpty()) {
binding.animeSourceNotFound.visibility = View.GONE
- else
+ binding.faqbutton.visibility = View.GONE
+ }
+ else {
binding.animeSourceNotFound.visibility = View.VISIBLE
+ binding.faqbutton.visibility = View.VISIBLE
+ }
} else {
binding.animeSourceContinue.visibility = View.GONE
binding.animeSourceNotFound.visibility = View.GONE
+ binding.faqbutton.visibility = View.GONE
clearChips()
binding.animeSourceProgressBar.visibility = View.VISIBLE
}
diff --git a/app/src/main/res/drawable/ic_round_help_outline.xml b/app/src/main/res/drawable/ic_round_help_outline.xml
new file mode 100644
index 00000000..7f116ea4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_round_help_outline.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/src/main/res/layout/item_anime_watch.xml b/app/src/main/res/layout/item_anime_watch.xml
index 14d42cfe..a401e363 100644
--- a/app/src/main/res/layout/item_anime_watch.xml
+++ b/app/src/main/res/layout/item_anime_watch.xml
@@ -338,7 +338,13 @@
android:layout_marginBottom="8dp"
tools:visibility="gone" />
-
+
+
+ android:visibility="gone"/>
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0bf5aad7..52f83211 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -544,34 +544,35 @@
MaleFemale
- What is Dantotsu?\n Why should you use Dantotsu?
+ What is Dantotsu?Dantotsu is crafted from the ashes of Saikou and based on simplistic yet state-of-the-art elegance. It is an Anilist only client, which also lets you stream & download Anime / Manga through extensions. \n>Dantotsu (断トツ; Dan-totsu) literally means the best of the best in Japanese. Well, we would like to say this is the best open source app for anime and manga on Android, but hey, Try it out yourself & judge!What are some features of Dantotsu?Some mentionable features of Dantotsu are\n\n- Easy and functional way to both, watch anime and read manga and light novels, Ad Free.\n- A completely open source app with a nice UI & Animations\n- 3rd party plugin support \n- Synchronize anime and manga real-time with AniList. Easily categorize anime and manga based on your current status. (Powered by AniList)\n- Find all shows using thoroughly and frequently updated list of all trending, popular and ongoing anime based on scores.\n- View extensive details about anime shows, movies and manga titles. It also features ability to countdown to the next episode of airing anime. (Powered by AniList & MyAnimeList)
- What are Artifacts?
- Whenever a developer commits or pull requests a feature or fix, GitHub automatically makes an APK file for you to use. This APK is called an Artifact. Artifacts through pull requests may or may not be added to the main release of the app. Artifacts have a higher chance of having bugs and glitches. To know if new artifacts are available, star the Dantotsu repository and turn on notifications\n\nTo download an Artifact:\n1) Sign In/Up in GitHub\n2) Go to Dantotsu\n3) Go to actions\n4) Press on the workflow run you want to download the artifact of.\n5) Press on artifact\n6) Extract the file using a zip extractor\n7) Install and enjoy.
+ Whats the difference between Stable, Beta & Alpha versions?
+ A Stable release is a version that has been tested as thoroughly as possible and is as reliable as we can make it.\n\nA Beta release is a version which is meant for testing new features or providing hot fixes.\n\nAn Alpha release is like a beta version but has many bugs and you can only find it on our [discord](https://discord.gg/dantotsu) server. It gets frequent updates and has a high chance to break.\n\nIf you want a reliable app then go for the Stable. If you want the latest and greatest features and bugs then go for Alpha.Is Dantotsu available for PC?Currently no (for both Windows and Linux). There isn\'t any estimation when it will be available. But you can download any Android emulator and run Dantotsu on it. For Windows 11 users, they can use the Windows Subsystem for Android (WSA) to run Dantotsu in Windows.Is Dantotsu available for iOS?
- No, and currently no plans to support iOS
+ No, best we can do is carve Dantotsu on an apple.Why are my stats not updating?This is because it updates every 48 hours automatically (by Anilist). If you really need to update your stats, you can force update your stats after going to this [link](https://anilist.co/settings/lists).
- How to download Episodes?
- 1. Download 1DM or ADM from Google Play Store.
+ How to download Anime?
+ There are two methods of downloading currently. One is internal and the other is external. If you download internally, then it can be viewed within the app but only the app can open that episode, you cannot move it or share it. The other option is to use external downloading. It requires a download manager to download and a separate video player to watch. External downloads can be shared but you cannot view it within the Dantotsu app.\n\n•To download internally:\n\n1. Tap the download button.\n2. Pick the server and the video quality.\n3. Profit.\n\n•To download externally:\n\n 1. Download 1DM or ADM from Google Play Store.
\n2. Enter the app, give storage access and set your preferences (downloading speed, downloading path etc(optional))
- \n3. Now go to Dantotsu > Settings > Common > Download Managers and choose the download manager you just set up.
+ \n3. Now go to \`Dantotsu > Settings > Common > Download Managers\` and choose the download manager you just set up.
\n4. Go to your desired episode and press on the download icon of any server. There may be a popup to set your preferences again, just press on "Download" and it will be saved in the directed path.
- \n\nNote: Direct downloads are also possible without a manager but it\'s not recommended.
+ \n\nNote: Direct downloads are also possible without a manager but it\'s not recommended.
+\n\nNerd Note: Internally downloaded episodes are stored in \`Android/data/ani.dantotsu.*/files/Anime_Downloads\`\nYou cannot play those files as they are in \`.exo\` format, split into hundreds of pieces and are encrypted.How to enable NSFW content?
- You can enable nsfw content by enabling 18+ contents from this [link](https://anilist.co/settings/media).
+ You can enable NSFW content by enabling 18+ contents from this [link](https://anilist.co/settings/media). You also have to enable NSFW extensions in \`Settings > Extensions > NSFW extensions\` How to import my MAL/Kitsu list to Anilist?Here is how you do it,\n\nExport:\n\n1. Go to this [link](https://malscraper.azurewebsites.net).\n2. Give your Kitsu/MAL username and download both anime and manga list. (They will be in XML format)\nNote: You have to write the username of the tracker you selected\n\nImport:\n\n1. After exporting your anime and manga list from Kitsu/MAL, now go [here](https://anilist.co/settings/import) \n2. Select/drop the anime XML file on the box above.\n|→Select/drop the manga XML file on the box below.
@@ -586,13 +587,13 @@
Dantotsu itself doesn\'t host anything but relies on other sources. When showing the episodes, it chooses the 1st result given by the source after searching for the title. Dantotsu has no way of detecting if that\'s legit or not. So, for this, we have the \'Wrong Title?\' just below the source name(above layouts). You can choose the correct result/title by pressing on it and enjoy its episodes.How to read coloured mangas?
- Are you in search of coloured manga? Sorry to break it to you but an extremely small amount of mangas have coloured version. Those which has a coloured version is also available in Dantotsu. Let\'s say you want to read the coloured version of chainsaw man. Then follow the below steps ↓\n\n1) Go to Chainsaw Man\n2) Press on \'Read\'\n3) Select any working source\n4) Press on \'Wrong Title\'\n5) Select the colored version chainsaw man\n6) Enjoy\n\nNote: Many sources don\'t have the coloured version available even if it\'s available somewhere on the internet. So try a different source. If none of the sources have it, then a coloured version of your desired manga simply doesn\'t exist. If you can find it on any manga site on the internet, you can suggest that site through the Discord server.
+ Are you in search of coloured manga? Sorry to break it to you but an extremely small amount of mangas have coloured version. Those which has a coloured version is also available in Dantotsu. Let\'s say you want to read the coloured version of chainsaw man. Then follow the below steps ↓\n\n1) Go to Chainsaw Man\n2) Press on \'Read\'\n3) Select any working source\n4) Press on \'Wrong Title\'\n5) Select the colored version chainsaw man\n6) Enjoy\n\nNote: Many sources don\'t have the coloured version available even if it\'s available somewhere on the internet. So try a different source. If none of the sources have it, then a coloured version of your desired manga simply doesn\'t exist.Handshake fails? Why are no timestamps not loading?You can fix this issue by enabling \'Proxy\' from \n\`Settings > Anime > Player Settings > Timestamps > Proxy\`.\nIf the timestamps are still not loading but the handshake failed popup is fixed, then the episode you are watching just doesn\'t have timestamps yet for it.
- Having trouble with a source?
- Some basic fixes would be :\n\n• Restart the app. \n• Use a different DNS from your settings, preferably, CloudFlare. \n• VPN might work as well. \n\nIf you refuse to try the above steps then just use a different source.\n\nNote: Allanime fixes itself most of the time.
+ Can\'t find anything on a source?
+ Some basic fixes would be : \n\n• Update your extensions if there are any. \n• Open Web View and wait for it to load. After loading has completed, go back. (If Web View shows error 404 or something similar, chances are that your source is down)\n• Use a different DNS from your settings, preferably, Libre. \n• Try a trustworthy VPN. (You\'ll have to repeat step 1 after this) \n\nIf none of the steps above work then use a different source or join our [discord](https://discord.gg/dantotsu) for help.Some useful tips and tricksThe following presents some tips and tricks you may or may not know about - \n \n \n - By hold pressing the Dantotsu logo in settings, you can check if there are any new updates manually. \n \n - Hold pressing an error message/tag/synonym or title will copy it. \n \n - You can open an episode with other apps by hold pressing any server for that episode. This helps in streaming the episode using other video players or download the episode using download managers. \n \n - You can set up custom lists using this [link](https://anilist.co/settings/lists). (you need to be signed in) \n \n - If your episode/chapter is not being progressed automatically after you finish watching/reading it, then hold press the status bar(planning/repeating/watching button) of that anime/manga. The next time you start a chapter/finish an episode, you will stumble upon a popup. Press yes there.
From a22083dfcdd5bc3b233cc77bb1ab0f8b2692f136 Mon Sep 17 00:00:00 2001
From: Sadwhy <99601717+Sadwhy@users.noreply.github.com>
Date: Sun, 11 Feb 2024 23:30:16 +0600
Subject: [PATCH 006/254] fix: Updated discord links
---
app/src/main/res/values/strings.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 52f83211..ce6b3a7c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -551,7 +551,7 @@
Some mentionable features of Dantotsu are\n\n- Easy and functional way to both, watch anime and read manga and light novels, Ad Free.\n- A completely open source app with a nice UI & Animations\n- 3rd party plugin support \n- Synchronize anime and manga real-time with AniList. Easily categorize anime and manga based on your current status. (Powered by AniList)\n- Find all shows using thoroughly and frequently updated list of all trending, popular and ongoing anime based on scores.\n- View extensive details about anime shows, movies and manga titles. It also features ability to countdown to the next episode of airing anime. (Powered by AniList & MyAnimeList)Whats the difference between Stable, Beta & Alpha versions?
- A Stable release is a version that has been tested as thoroughly as possible and is as reliable as we can make it.\n\nA Beta release is a version which is meant for testing new features or providing hot fixes.\n\nAn Alpha release is like a beta version but has many bugs and you can only find it on our [discord](https://discord.gg/dantotsu) server. It gets frequent updates and has a high chance to break.\n\nIf you want a reliable app then go for the Stable. If you want the latest and greatest features and bugs then go for Alpha.
+ A Stable release is a version that has been tested as thoroughly as possible and is as reliable as we can make it.\n\nA Beta release is a version which is meant for testing new features or providing hot fixes.\n\nAn Alpha release is like a beta version but has many bugs and you can only find it on our [discord](https://discord.gg/invite/4HPZ5nAWwM) server. It gets frequent updates and has a high chance to break.\n\nIf you want a reliable app then go for the Stable. If you want the latest and greatest features and bugs then go for Alpha.Is Dantotsu available for PC?Currently no (for both Windows and Linux). There isn\'t any estimation when it will be available. But you can download any Android emulator and run Dantotsu on it. For Windows 11 users, they can use the Windows Subsystem for Android (WSA) to run Dantotsu in Windows.
@@ -593,7 +593,7 @@
You can fix this issue by enabling \'Proxy\' from \n\`Settings > Anime > Player Settings > Timestamps > Proxy\`.\nIf the timestamps are still not loading but the handshake failed popup is fixed, then the episode you are watching just doesn\'t have timestamps yet for it.Can\'t find anything on a source?
- Some basic fixes would be : \n\n• Update your extensions if there are any. \n• Open Web View and wait for it to load. After loading has completed, go back. (If Web View shows error 404 or something similar, chances are that your source is down)\n• Use a different DNS from your settings, preferably, Libre. \n• Try a trustworthy VPN. (You\'ll have to repeat step 1 after this) \n\nIf none of the steps above work then use a different source or join our [discord](https://discord.gg/dantotsu) for help.
+ Some basic fixes would be : \n\n• Update your extensions if there are any. \n• Open Web View and wait for it to load. After loading has completed, go back. (If Web View shows error 404 or something similar, chances are that your source is down)\n• Use a different DNS from your settings, preferably, Libre. \n• Try a trustworthy VPN. (You\'ll have to repeat step 1 after this) \n\nIf none of the steps above work then use a different source or join our [discord](https://discord.gg/invite/4HPZ5nAWwM) for help.Some useful tips and tricksThe following presents some tips and tricks you may or may not know about - \n \n \n - By hold pressing the Dantotsu logo in settings, you can check if there are any new updates manually. \n \n - Hold pressing an error message/tag/synonym or title will copy it. \n \n - You can open an episode with other apps by hold pressing any server for that episode. This helps in streaming the episode using other video players or download the episode using download managers. \n \n - You can set up custom lists using this [link](https://anilist.co/settings/lists). (you need to be signed in) \n \n - If your episode/chapter is not being progressed automatically after you finish watching/reading it, then hold press the status bar(planning/repeating/watching button) of that anime/manga. The next time you start a chapter/finish an episode, you will stumble upon a popup. Press yes there.
From 97b957a0ab5a9651d4cb81dbec54bae3b1ca9f71 Mon Sep 17 00:00:00 2001
From: aayush262
Date: Mon, 12 Feb 2024 01:44:36 +0530
Subject: [PATCH 007/254] wip: UI for comments
---
.../ani/dantotsu/media/MediaInfoFragment.kt | 10 +++
.../main/res/drawable/ic_round_reply_24.xml | 10 +++
app/src/main/res/layout/fragment_comments.xml | 28 +++++++
app/src/main/res/layout/item_comments.xml | 77 +++++++++++++++++++
app/src/main/res/values/strings.xml | 2 +-
5 files changed, 126 insertions(+), 1 deletion(-)
create mode 100644 app/src/main/res/drawable/ic_round_reply_24.xml
create mode 100644 app/src/main/res/layout/fragment_comments.xml
create mode 100644 app/src/main/res/layout/item_comments.xml
diff --git a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt
index e3d4a363..82538c86 100644
--- a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt
+++ b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt
@@ -504,6 +504,16 @@ class MediaInfoFragment : Fragment() {
)
parent.addView(bind.root)
}
+ // Comments Section
+ if (!offline) {
+ val bind = FragmentCommentsBinding.inflate(
+ LayoutInflater.from(context),
+ parent,
+ false
+ )
+ bind.commentsList.adapter // rebel take over
+ parent.addView(bind.root)
+ }
}
}
diff --git a/app/src/main/res/drawable/ic_round_reply_24.xml b/app/src/main/res/drawable/ic_round_reply_24.xml
new file mode 100644
index 00000000..d7e5a744
--- /dev/null
+++ b/app/src/main/res/drawable/ic_round_reply_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml
new file mode 100644
index 00000000..fda80065
--- /dev/null
+++ b/app/src/main/res/layout/fragment_comments.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_comments.xml b/app/src/main/res/layout/item_comments.xml
new file mode 100644
index 00000000..463ca14a
--- /dev/null
+++ b/app/src/main/res/layout/item_comments.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 52f83211..1f77a4ab 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -657,5 +657,5 @@
Import/Export SettingsImport SettingsTry Internal Cast (Experimental)
-
+ Comments
From 0bec4f4d6138c972b89fcacabaa0b8725e07d74e Mon Sep 17 00:00:00 2001
From: Sadwhy
Date: Mon, 12 Feb 2024 14:38:27 +0600
Subject: [PATCH 008/254] Mojangles font
---
.../ani/dantotsu/media/anime/ExoplayerView.kt | 1 +
.../dantotsu/settings/PlayerSettingsActivity.kt | 3 ++-
app/src/main/res/font/mojangles.ttf | Bin 0 -> 71900 bytes
3 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 app/src/main/res/font/mojangles.ttf
diff --git a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt
index b8e78c61..0cdb6e9f 100644
--- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt
+++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt
@@ -312,6 +312,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL
3 -> ResourcesCompat.getFont(this, R.font.poppins_thin)
4 -> ResourcesCompat.getFont(this, R.font.century_gothic_regular)
5 -> ResourcesCompat.getFont(this, R.font.century_gothic_bold)
+ 6 -> ResourcesCompat.getFont(this, R.font.mojangles)
else -> ResourcesCompat.getFont(this, R.font.poppins_semi_bold)
}
playerView.subtitleView?.setStyle(
diff --git a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt
index b7a40da9..3a4cb60d 100644
--- a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt
+++ b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt
@@ -442,7 +442,8 @@ class PlayerSettingsActivity : AppCompatActivity() {
"Poppins",
"Poppins Thin",
"Century Gothic",
- "Century Gothic Bold"
+ "Century Gothic Bold",
+ "Mojangles"
)
val fontDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.subtitle_font))
diff --git a/app/src/main/res/font/mojangles.ttf b/app/src/main/res/font/mojangles.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..e7b87e9f56cf3459a0942a144142ba2556a15361
GIT binary patch
literal 71900
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