Compare commits

..

No commits in common. "master" and "apk" have entirely different histories.
master ... apk

19 changed files with 83 additions and 268 deletions

View File

@ -1,31 +1,2 @@
# 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
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-youtube-dislike
Bring back Youtube Dislike for Android (View Only)

View File

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

Binary file not shown.

View File

@ -1,20 +0,0 @@
{
"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,43 +1,39 @@
package com.jesperh.showyoutubedislikes;
import static android.content.ContentValues.TAG;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
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.Volley;
import com.squareup.picasso.Picasso;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
public class DisplayMessageActivity extends AppCompatActivity {
Pattern YoutubeRegex = Pattern.compile("^(https?\\:\\/\\/)?((www\\.)?((m\\.))?youtube\\.com|youtu\\.be)\\/.+$", Pattern.CASE_INSENSITIVE);
// Simpler Regex: ^(https?\:\/\/)?((www\.)?youtube\.com|youtu\.be)\/.+$
// ^((?: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
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -84,6 +80,10 @@ public class DisplayMessageActivity extends AppCompatActivity {
// the Dialog Box then it will remain show
builder.setCancelable(false);
// Set the positive button with yes name
// OnClickListener method is use of
// DialogInterface interface.
AlertDialog.Builder Yes = builder
.setPositiveButton(
"Okay",
@ -94,12 +94,16 @@ public class DisplayMessageActivity extends AppCompatActivity {
public void onClick(DialogInterface dialog,
int which) {
// When the user click Okay button
// then app returns to the front page
// When the user click yes button
// then app will close
finish();
}
});
// Set the Negative button with No name
// OnClickListener method is use
// of DialogInterface interface
// Create the Alert dialog
AlertDialog alertDialog = builder.create();
@ -107,111 +111,72 @@ public class DisplayMessageActivity extends AppCompatActivity {
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_GET_VOTES_QUERY = "votes?videoId=";
public static String API_QUERY_URL = "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)
{
String VIDEO_ID = "";
String result = "";
if (YouTubeLink.contains("https://youtu.be"))
{
VIDEO_ID = YouTubeLink.substring(17, 28);
result = YouTubeLink.substring(17, 28);
}
else if (YouTubeLink.contains("youtube.com"))
{
String[] arrOfStr = YouTubeLink.split("=", 2);
VIDEO_ID = arrOfStr[1];
result = arrOfStr[1];
}
else
{
return "";
}
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
String Dislike_Count = "";
String view_count = "";
String like_count = "";
//TextView textView = findViewById(R.id.YTDislikes);
String FINAL_URL = API_BASE_URL + API_QUERY_URL + result;
final TextView textViewDislikes = (TextView) findViewById(R.id.YTDislikes);
final TextView textViewLikes = (TextView) findViewById(R.id.YTLikes);
final TextView textViewViews = (TextView) findViewById(R.id.YTViews);
final TextView textViewVideoLink = (TextView) findViewById(R.id.YTVideoLink);
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,
String myUrl = FINAL_URL;
StringRequest myRequest = new StringRequest(Request.Method.GET, myUrl,
response -> {
try{
//Create a JSON object containing information from the API.
JSONObject myJsonObject = new JSONObject(response);
textViewDislikes.setText(AddComma(myJsonObject.getString("dislikes")) + " \uD83D\uDC4E");
textViewLikes.setText(AddComma(myJsonObject.getString("likes")) + " \uD83D\uDC4D");
textViewRatio.setText(myJsonObject.getString("rating").substring(0, 3) + " / 5 ⭐");
textViewViews.setText(AddComma(myJsonObject.getString("viewCount")) + " \uD83D\uDC41");
textViewDislikes.setText(myJsonObject.getString("dislikes") + " \uD83D\uDC4E");
textViewLikes.setText(myJsonObject.getString("likes") + " \uD83D\uDC4D");
textViewViews.setText(myJsonObject.getString("viewCount") + " \uD83D\uDC41");
textViewVideoLink.setText(YouTubeLink + " \uD83D\uDD17");
} catch (JSONException e) {
e.printStackTrace();
}
},
volleyError -> ErrorDownloading()
// Toast.makeText(DisplayMessageActivity.this, volleyError.getMessage(), Toast.LENGTH_SHORT).show()
volleyError -> 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.add(myRequest);
requestQueue.add(oEmbedRequest);
//textView.setText("f");
//TextView textView = findViewById(R.id.YTViews);
//textView.setText(FINAL_URL);
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)
{
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://returnyoutubedislike.com/"));

View File

@ -11,7 +11,7 @@
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="336dp"
android:layout_marginTop="417dp"
android:minHeight="48dp"
android:onClick="ClickReturnYouTubeDislikeLink"
android:text="Thanks to returnyoutubedislike.com"
@ -23,15 +23,14 @@
<TextView
android:id="@+id/YTDislikes"
android:layout_width="201dp"
android:layout_height="61dp"
android:layout_width="199dp"
android:layout_height="60dp"
android:layout_marginStart="172dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="181dp"
android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.422"
app:layout_constraintHorizontal_bias="0.428"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -40,24 +39,9 @@
android:layout_width="201dp"
android:layout_height="60dp"
android:layout_marginStart="172dp"
android:layout_marginTop="92dp"
android:layout_marginTop="128dp"
android:layout_marginEnd="181dp"
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_constraintHorizontal_bias="0.419"
app:layout_constraintStart_toStartOf="parent"
@ -68,26 +52,24 @@
android:layout_width="201dp"
android:layout_height="59dp"
android:layout_marginStart="172dp"
android:layout_marginTop="228dp"
android:layout_marginTop="216dp"
android:layout_marginEnd="181dp"
android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.419"
app:layout_constraintHorizontal_bias="0.435"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/YTVideoLink"
android:layout_width="286dp"
android:layout_height="65dp"
android:layout_width="300dp"
android:layout_height="61dp"
android:layout_marginStart="172dp"
android:layout_marginTop="296dp"
android:layout_marginEnd="181dp"
android:text="Downloading Data"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.263"
app:layout_constraintHorizontal_bias="0.256"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -110,26 +92,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="48dp"
android:layout_marginEnd="33dp"
android:layout_marginTop="85dp"
android:layout_marginEnd="48dp"
android:text="Likes:"
android:textColor="@android:color/holo_green_dark"
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_constraintTop_toBottomOf="@+id/textView3" />
@ -138,10 +105,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="116dp"
android:layout_marginEnd="33dp"
android:text="Views:"
android:textColor="@android:color/primary_text_dark"
android:layout_marginTop="68dp"
android:layout_marginEnd="45dp"
android:text="Views"
android:textColor="@android:color/white"
app:layout_constraintEnd_toStartOf="@+id/YTViews"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
@ -152,38 +119,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="184dp"
android:layout_marginEnd="33dp"
android:layout_marginTop="148dp"
android:layout_marginEnd="45dp"
android:text="Video Link:"
android:textColor="@android:color/primary_text_dark"
android:textColor="@android:color/white"
app:layout_constraintEnd_toStartOf="@+id/YTViews"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
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>

View File

@ -4,30 +4,26 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#151515"
tools:context=".MainActivity">
<EditText
android:id="@+id/YTTextBox"
android:layout_width="326dp"
android:layout_height="87dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="101dp"
android:layout_marginTop="100dp"
android:layout_marginTop="76dp"
android:layout_marginEnd="100dp"
android:backgroundTint="@android:color/holo_red_dark"
android:ems="10"
android:inputType="textWebEditText"
android:textColor="@android:color/primary_text_dark"
android:textColorHint="@android:color/holo_green_dark"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.508"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toTopOf="parent"
tools:text="YouTube Link:" />
<Button
android:id="@+id/sendYTQueryButton"
android:layout_width="136dp"
android:layout_height="71dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="105dp"
android:layout_marginTop="27dp"
android:layout_marginEnd="105dp"
@ -36,19 +32,4 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
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>

View File

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

View File

@ -1,19 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 KiB

View File

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

View File

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

View File

@ -1 +0,0 @@
e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637

View File

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