Compare commits

..

17 Commits
apk ... master

19 changed files with 268 additions and 83 deletions

View File

@ -1,2 +1,31 @@
# view-youtube-dislike # Show Youtube Dislikes
Bring back Youtube Dislike for Android (View Only)
## Installation
[F-Droid](https://f-droid.org/en/packages/com.jesperh.showyoutubedislikes/)
[APK](https://github.com/jesperbakhandskemager/view-youtube-dislike/releases/latest)
## Description
Bring back Youtube Dislikes for Android
This is a simple application, that parses the data from the "returnyoutubedislike.com" API, and shows you their estimate dislike count on videos.
When you open the app you are presented with a text box, where you can enter a youtube url and you will be presented with the given videos stats.
You can also click the 'Share' button inside the official youtube app, and choose 'Show Youtube Dislikes' which will open the app on the information site for that video.
If possible use the desktop browser extension, as you will be contributing to the project with your dislike data, and not just leeching it, helping everyone get more accurate results.
I want to thank returnyoutubedislike.com for making an awesome tool, i just wanted to make it available for mobile as well.
This app is free and open source (it is licenced under the GNU GPLv3).
If you want to donate, please redirect all donations to https://returnyoutubedislike.com/donate as they are more deserving than i.
But if you really want to, you can donate some Monero:
```88cPx6Gzv5RWRRJLstUt6hACF1BRKPp1RMka1ukyu2iuHT7iqzkNfMogYq3YdDAC8AAYRqmqQMkCgBXiwdD5Dvqw3LsPGLU```
* This is in no way affilliated with the official project
## TODO
- [ ] View over other apps (Optional)

View File

@ -9,8 +9,8 @@ android {
applicationId "com.jesperh.showyoutubedislikes" applicationId "com.jesperh.showyoutubedislikes"
minSdk 21 minSdk 21
targetSdk 32 targetSdk 32
versionCode 1 versionCode 10
versionName "1.0" versionName "1.0.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@ -21,6 +21,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
} }
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
@ -33,7 +34,7 @@ dependencies {
implementation 'com.google.android.material:material:1.4.0' implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2' implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
implementation 'com.android.volley:volley:1.2.0' implementation 'com.android.volley:volley:1.2.0'
implementation files('/home/jesper/AndroidStudioProjects/ShowYoutubeDislikes/app/libs/json-simple-1.1.1.jar') implementation 'com.squareup.picasso:picasso:2.8'
testImplementation 'junit:junit:4.+' testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

Binary file not shown.

View File

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.jesperh.showyoutubedislikes",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 10,
"versionName": "1.0.0",
"outputFile": "app-release.apk"
}
],
"elementType": "File"
}

View File

@ -1,39 +1,43 @@
package com.jesperh.showyoutubedislikes; package com.jesperh.showyoutubedislikes;
import static android.content.ContentValues.TAG;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request; import com.android.volley.Request;
import com.android.volley.RequestQueue; import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley; import com.android.volley.toolbox.Volley;
import com.squareup.picasso.Picasso;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.IOException; import java.io.IOException;
import java.net.HttpURLConnection; import java.io.InputStream;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.ProtocolException; import java.net.URI;
import java.net.URL; import java.net.URL;
import java.util.List; import java.net.URLConnection;
import java.util.Scanner; import java.text.DecimalFormat;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class DisplayMessageActivity extends AppCompatActivity { public class DisplayMessageActivity extends AppCompatActivity {
// Simpler Regex: ^(https?\:\/\/)?((www\.)?youtube\.com|youtu\.be)\/.+$ Pattern YoutubeRegex = Pattern.compile("^(https?\\:\\/\\/)?((www\\.)?((m\\.))?youtube\\.com|youtu\\.be)\\/.+$", Pattern.CASE_INSENSITIVE);
// ^((?:https?:)?\/\/)?((?:www|m)\.)?((?:youtube\.com|youtu.be))(\/(?:[\w\-]+\?v=|embed\/|v\/)?)([\w\-]+)(\S+)?$
Pattern YoutubeRegex = Pattern.compile("^(https?\\:\\/\\/)?((www\\.)?youtube\\.com|youtu\\.be)\\/.+$", Pattern.CASE_INSENSITIVE);
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -80,10 +84,6 @@ public class DisplayMessageActivity extends AppCompatActivity {
// the Dialog Box then it will remain show // the Dialog Box then it will remain show
builder.setCancelable(false); builder.setCancelable(false);
// Set the positive button with yes name
// OnClickListener method is use of
// DialogInterface interface.
AlertDialog.Builder Yes = builder AlertDialog.Builder Yes = builder
.setPositiveButton( .setPositiveButton(
"Okay", "Okay",
@ -94,16 +94,12 @@ public class DisplayMessageActivity extends AppCompatActivity {
public void onClick(DialogInterface dialog, public void onClick(DialogInterface dialog,
int which) { int which) {
// When the user click yes button // When the user click Okay button
// then app will close // then app returns to the front page
finish(); finish();
} }
}); });
// Set the Negative button with No name
// OnClickListener method is use
// of DialogInterface interface
// Create the Alert dialog // Create the Alert dialog
AlertDialog alertDialog = builder.create(); AlertDialog alertDialog = builder.create();
@ -111,72 +107,111 @@ public class DisplayMessageActivity extends AppCompatActivity {
alertDialog.show(); alertDialog.show();
} }
// Capture the layout's TextView and set the string as its text
public static String API_BASE_URL = "https://returnyoutubedislikeapi.com/"; public static String API_BASE_URL = "https://returnyoutubedislikeapi.com/";
public static String API_QUERY_URL = "votes?videoId="; public static String API_GET_VOTES_QUERY = "votes?videoId=";
//kxOuG8jMIgI
// Youtube Example:
// https://www.youtube.com/watch?v=Nz9b0oJw69I
//youtu.be Example:
// https://youtu.be/Nz9b0oJw69I
// API: Example
// https://returnyoutubedislikeapi.com/votes?videoId=kxOuG8jMIgI
public String GetDataAPI(String YouTubeLink) public String GetDataAPI(String YouTubeLink)
{ {
String result = ""; String VIDEO_ID = "";
if (YouTubeLink.contains("https://youtu.be")) if (YouTubeLink.contains("https://youtu.be"))
{ {
result = YouTubeLink.substring(17, 28); VIDEO_ID = YouTubeLink.substring(17, 28);
} }
else if (YouTubeLink.contains("youtube.com")) else if (YouTubeLink.contains("youtube.com"))
{ {
String[] arrOfStr = YouTubeLink.split("=", 2); String[] arrOfStr = YouTubeLink.split("=", 2);
result = arrOfStr[1]; VIDEO_ID = arrOfStr[1];
} }
else else
{ {
return ""; return "";
} }
String Dislike_Count = "";
String view_count = ""; String FINAL_URL = API_BASE_URL + API_GET_VOTES_QUERY + VIDEO_ID;
String like_count = ""; String oEmbedURL = "https://youtube.com/oembed?format=json&url=" + YouTubeLink;
//TextView textView = findViewById(R.id.YTDislikes);
String FINAL_URL = API_BASE_URL + API_QUERY_URL + result; // Define the text boxes
final TextView textViewDislikes = (TextView) findViewById(R.id.YTDislikes); final TextView textViewDislikes = (TextView) findViewById(R.id.YTDislikes);
final TextView textViewLikes = (TextView) findViewById(R.id.YTLikes); final TextView textViewLikes = (TextView) findViewById(R.id.YTLikes);
final TextView textViewViews = (TextView) findViewById(R.id.YTViews); final TextView textViewViews = (TextView) findViewById(R.id.YTViews);
final TextView textViewVideoLink = (TextView) findViewById(R.id.YTVideoLink); final TextView textViewVideoLink = (TextView) findViewById(R.id.YTVideoLink);
final TextView textViewRatio = (TextView) findViewById(R.id.YTRatio);
String myUrl = FINAL_URL; final TextView videoTitle = (TextView) findViewById(R.id.videoTitle);
StringRequest myRequest = new StringRequest(Request.Method.GET, myUrl, final ImageView ThumbnailView = (ImageView)findViewById(R.id.thumbnail_View);
StringRequest myRequest = new StringRequest(Request.Method.GET, FINAL_URL,
response -> { response -> {
try{ try{
//Create a JSON object containing information from the API. //Create a JSON object containing information from the API.
JSONObject myJsonObject = new JSONObject(response); JSONObject myJsonObject = new JSONObject(response);
textViewDislikes.setText(myJsonObject.getString("dislikes") + " \uD83D\uDC4E"); textViewDislikes.setText(AddComma(myJsonObject.getString("dislikes")) + " \uD83D\uDC4E");
textViewLikes.setText(myJsonObject.getString("likes") + " \uD83D\uDC4D"); textViewLikes.setText(AddComma(myJsonObject.getString("likes")) + " \uD83D\uDC4D");
textViewViews.setText(myJsonObject.getString("viewCount") + " \uD83D\uDC41"); textViewRatio.setText(myJsonObject.getString("rating").substring(0, 3) + " / 5 ⭐");
textViewViews.setText(AddComma(myJsonObject.getString("viewCount")) + " \uD83D\uDC41");
textViewVideoLink.setText(YouTubeLink + " \uD83D\uDD17"); textViewVideoLink.setText(YouTubeLink + " \uD83D\uDD17");
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
} }
}, },
volleyError -> Toast.makeText(DisplayMessageActivity.this, volleyError.getMessage(), Toast.LENGTH_SHORT).show() volleyError -> ErrorDownloading()
// Toast.makeText(DisplayMessageActivity.this, volleyError.getMessage(), Toast.LENGTH_SHORT).show()
); );
StringRequest oEmbedRequest = new StringRequest(Request.Method.GET, oEmbedURL,
response -> {
try{
//Create a JSON object containing information from the API.
JSONObject myJsonObject = new JSONObject(response);
// Set video title
videoTitle.setText(myJsonObject.getString("title"));
// Set video thumbnail
String thumbnailUrl = myJsonObject.getString("thumbnail_url");
Picasso.get().load(thumbnailUrl).into(ThumbnailView);
} catch (JSONException e) {
e.printStackTrace();
}
},
volleyError -> ErrorDownloading()
// Toast.makeText(DisplayMessageActivity.this, volleyError.getMessage(), Toast.LENGTH_SHORT).show()
);
RequestQueue requestQueue = Volley.newRequestQueue(this); RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(myRequest); requestQueue.add(myRequest);
//textView.setText("f"); requestQueue.add(oEmbedRequest);
//TextView textView = findViewById(R.id.YTViews);
//textView.setText(FINAL_URL);
return ""; return "";
} }
public void ErrorDownloading()
{
final TextView textViewDislikes = findViewById(R.id.YTDislikes);
final TextView textViewLikes = findViewById(R.id.YTLikes);
final TextView textViewViews = findViewById(R.id.YTViews);
final TextView textViewVideoLink = findViewById(R.id.YTVideoLink);
final TextView textViewRatio = findViewById(R.id.YTRatio);
final TextView videoTitle = findViewById(R.id.videoTitle);
textViewDislikes.setText("Error Downloading!");
textViewLikes.setText("Error Downloading!");
textViewRatio.setText("Error Downloading!");
textViewViews.setText("Error Downloading!");
textViewVideoLink.setText("Error Downloading!");
textViewVideoLink.setText("Unknown Title");
}
public String AddComma(String number)
{
double parsedNumber = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###");
number = formatter.format(parsedNumber);
return number;
}
public void ClickReturnYouTubeDislikeLink(View view) public void ClickReturnYouTubeDislikeLink(View view)
{ {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://returnyoutubedislike.com/")); Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://returnyoutubedislike.com/"));

View File

@ -11,7 +11,7 @@
android:id="@+id/textView" android:id="@+id/textView"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="417dp" android:layout_marginTop="336dp"
android:minHeight="48dp" android:minHeight="48dp"
android:onClick="ClickReturnYouTubeDislikeLink" android:onClick="ClickReturnYouTubeDislikeLink"
android:text="Thanks to returnyoutubedislike.com" android:text="Thanks to returnyoutubedislike.com"
@ -23,14 +23,15 @@
<TextView <TextView
android:id="@+id/YTDislikes" android:id="@+id/YTDislikes"
android:layout_width="199dp" android:layout_width="201dp"
android:layout_height="60dp" android:layout_height="61dp"
android:layout_marginStart="172dp" android:layout_marginStart="172dp"
android:layout_marginTop="24dp" android:layout_marginTop="24dp"
android:layout_marginEnd="181dp" android:layout_marginEnd="181dp"
android:text="Downloading Data" android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.428" app:layout_constraintHorizontal_bias="0.422"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
@ -39,9 +40,24 @@
android:layout_width="201dp" android:layout_width="201dp"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_marginStart="172dp" android:layout_marginStart="172dp"
android:layout_marginTop="128dp" android:layout_marginTop="92dp"
android:layout_marginEnd="181dp" android:layout_marginEnd="181dp"
android:text="Downloading Data" android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.419"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/YTRatio"
android:layout_width="201dp"
android:layout_height="60dp"
android:layout_marginStart="172dp"
android:layout_marginTop="160dp"
android:layout_marginEnd="181dp"
android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.419" app:layout_constraintHorizontal_bias="0.419"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -52,24 +68,26 @@
android:layout_width="201dp" android:layout_width="201dp"
android:layout_height="59dp" android:layout_height="59dp"
android:layout_marginStart="172dp" android:layout_marginStart="172dp"
android:layout_marginTop="216dp" android:layout_marginTop="228dp"
android:layout_marginEnd="181dp" android:layout_marginEnd="181dp"
android:text="Downloading Data" android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.435" app:layout_constraintHorizontal_bias="0.419"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/YTVideoLink" android:id="@+id/YTVideoLink"
android:layout_width="300dp" android:layout_width="286dp"
android:layout_height="61dp" android:layout_height="65dp"
android:layout_marginStart="172dp" android:layout_marginStart="172dp"
android:layout_marginTop="296dp" android:layout_marginTop="296dp"
android:layout_marginEnd="181dp" android:layout_marginEnd="181dp"
android:text="Downloading Data" android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.256" app:layout_constraintHorizontal_bias="0.263"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
@ -92,11 +110,26 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="27dp" android:layout_marginStart="27dp"
android:layout_marginTop="85dp" android:layout_marginTop="48dp"
android:layout_marginEnd="48dp" android:layout_marginEnd="33dp"
android:text="Likes:" android:text="Likes:"
android:textColor="@android:color/holo_green_dark" android:textColor="@android:color/holo_green_dark"
app:layout_constraintEnd_toStartOf="@+id/YTLikes" app:layout_constraintEnd_toStartOf="@+id/YTLikes"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="116dp"
android:layout_marginEnd="33dp"
android:text="Ratio:"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toStartOf="@+id/YTLikes"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3" /> app:layout_constraintTop_toBottomOf="@+id/textView3" />
@ -105,10 +138,10 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="27dp" android:layout_marginStart="27dp"
android:layout_marginTop="68dp" android:layout_marginTop="116dp"
android:layout_marginEnd="45dp" android:layout_marginEnd="33dp"
android:text="Views" android:text="Views:"
android:textColor="@android:color/white" android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toStartOf="@+id/YTViews" app:layout_constraintEnd_toStartOf="@+id/YTViews"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -119,12 +152,38 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="27dp" android:layout_marginStart="27dp"
android:layout_marginTop="148dp" android:layout_marginTop="184dp"
android:layout_marginEnd="45dp" android:layout_marginEnd="33dp"
android:text="Video Link:" android:text="Video Link:"
android:textColor="@android:color/white" android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toStartOf="@+id/YTViews" app:layout_constraintEnd_toStartOf="@+id/YTViews"
app:layout_constraintHorizontal_bias="0.0" app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView4" /> app:layout_constraintTop_toBottomOf="@+id/textView4" />
<TextView
android:id="@+id/videoTitle"
android:layout_width="294dp"
android:layout_height="47dp"
android:layout_marginStart="112dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="78dp"
android:text="Title"
android:textColor="@android:color/primary_text_dark"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/YTVideoLink" />
<ImageView
android:id="@+id/thumbnail_View"
android:layout_width="411dp"
android:layout_height="166dp"
android:layout_marginTop="13dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/textView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/videoTitle"
app:srcCompat="@mipmap/rydblogo" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -4,26 +4,30 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#151515"
tools:context=".MainActivity"> tools:context=".MainActivity">
<EditText <EditText
android:id="@+id/YTTextBox" android:id="@+id/YTTextBox"
android:layout_width="0dp" android:layout_width="326dp"
android:layout_height="wrap_content" android:layout_height="87dp"
android:layout_marginStart="101dp" android:layout_marginStart="101dp"
android:layout_marginTop="76dp" android:layout_marginTop="100dp"
android:layout_marginEnd="100dp" android:layout_marginEnd="100dp"
android:backgroundTint="@android:color/holo_red_dark"
android:ems="10" android:ems="10"
android:inputType="textPersonName" android:inputType="textWebEditText"
android:textColor="@android:color/primary_text_dark"
android:textColorHint="@android:color/holo_green_dark"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.508"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent" />
tools:text="YouTube Link:" />
<Button <Button
android:id="@+id/sendYTQueryButton" android:id="@+id/sendYTQueryButton"
android:layout_width="wrap_content" android:layout_width="136dp"
android:layout_height="wrap_content" android:layout_height="71dp"
android:layout_marginStart="105dp" android:layout_marginStart="105dp"
android:layout_marginTop="27dp" android:layout_marginTop="27dp"
android:layout_marginEnd="105dp" android:layout_marginEnd="105dp"
@ -32,4 +36,19 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/YTTextBox" /> app:layout_constraintTop_toBottomOf="@+id/YTTextBox" />
<TextView
android:id="@+id/textView6"
android:layout_width="245dp"
android:layout_height="57dp"
android:layout_marginStart="42dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="124dp"
android:fontFamily="sans-serif-medium"
android:text="Youtube Link"
android:textColor="@android:color/primary_text_dark"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -5,7 +5,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath "com.android.tools.build:gradle:7.0.2" classpath 'com.android.tools.build:gradle:7.1.3'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files

View File

@ -0,0 +1,19 @@
Bring back Youtube Dislikes for Android
This is a simple application, that parses the data from the "returnyoutubedislike.com" API, and shows you their estimate dislike count on videos.
When you open the app you are presented with a text box, where you can enter a youtube url and you will be presented with the given videos stats.
You can also click the 'Share' button inside the official youtube app, and choose 'Show Youtube Dislikes' which will open the app on the information site for that video.
If possible use the desktop browser extension, as you will be contributing to the project with your dislike data, and not just leeching it, helping everyone get more accurate results.
I want to thank returnyoutubedislike.com for making an awesome tool, i just wanted to make it available for mobile as well.
This app is free and open source (it is licenced under the GNU GPLv3).
If you want to donate, please redirect all donations to https://returnyoutubedislike.com/donate as they are more deserving than i.
But if you really want to, you can donate some Monero: 88cPx6Gzv5RWRRJLstUt6hACF1BRKPp1RMka1ukyu2iuHT7iqzkNfMogYq3YdDAC8AAYRqmqQMkCgBXiwdD5Dvqw3LsPGLU
This is in no way affilliated with the official project

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

View File

@ -0,0 +1 @@
Bring back Youtube Dislikes for Android

View File

@ -0,0 +1 @@
Show Youtube Dislikes

View File

@ -0,0 +1 @@
e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637

View File

@ -1,6 +1,6 @@
#Sat Jan 01 22:38:49 CET 2022 #Sat Jan 01 22:38:49 CET 2022
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME