Compare commits

...

9 Commits
v0.4 ... master

17 changed files with 133 additions and 25 deletions

View File

@ -1,4 +1,11 @@
# Show Youtube Dislikes # Show Youtube Dislikes
## 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 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. This is a simple application, that parses the data from the "returnyoutubedislike.com" API, and shows you their estimate dislike count on videos.

View File

@ -9,8 +9,8 @@ android {
applicationId "com.jesperh.showyoutubedislikes" applicationId "com.jesperh.showyoutubedislikes"
minSdk 21 minSdk 21
targetSdk 32 targetSdk 32
versionCode 5 versionCode 10
versionName "0.4" 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,6 +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 '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'

View File

@ -11,8 +11,8 @@
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"attributes": [], "attributes": [],
"versionCode": 5, "versionCode": 10,
"versionName": "0.4", "versionName": "1.0.0",
"outputFile": "app-release.apk" "outputFile": "app-release.apk"
} }
], ],

View File

@ -1,30 +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.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.InputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat; 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 {
Pattern YoutubeRegex = Pattern.compile("^(https?\\:\\/\\/)?((www\\.)?youtube\\.com|youtu\\.be)\\/.+$", Pattern.CASE_INSENSITIVE); Pattern YoutubeRegex = Pattern.compile("^(https?\\:\\/\\/)?((www\\.)?((m\\.))?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);
@ -71,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",
@ -85,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();
@ -104,33 +109,39 @@ public class DisplayMessageActivity extends AppCompatActivity {
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=";
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 FINAL_URL = API_BASE_URL + API_QUERY_URL + result; String FINAL_URL = API_BASE_URL + API_GET_VOTES_QUERY + VIDEO_ID;
String oEmbedURL = "https://youtube.com/oembed?format=json&url=" + YouTubeLink;
// 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); final TextView textViewRatio = (TextView) findViewById(R.id.YTRatio);
final TextView videoTitle = (TextView) findViewById(R.id.videoTitle);
final ImageView ThumbnailView = (ImageView)findViewById(R.id.thumbnail_View);
StringRequest myRequest = new StringRequest(Request.Method.GET, FINAL_URL, StringRequest myRequest = new StringRequest(Request.Method.GET, FINAL_URL,
response -> { response -> {
try{ try{
@ -145,14 +156,54 @@ public class DisplayMessageActivity extends AppCompatActivity {
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);
requestQueue.add(oEmbedRequest);
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) public String AddComma(String number)
{ {
double parsedNumber = Double.parseDouble(number); double parsedNumber = Double.parseDouble(number);

View File

@ -160,4 +160,30 @@
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

@ -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