mirror of
https://github.com/jesperh1/view-youtube-dislike.git
synced 2025-05-17 09:48:14 +01:00
Compare commits
No commits in common. "master" and "v0.4" have entirely different histories.
@ -1,11 +1,4 @@
|
|||||||
# 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.
|
||||||
|
@ -9,8 +9,8 @@ android {
|
|||||||
applicationId "com.jesperh.showyoutubedislikes"
|
applicationId "com.jesperh.showyoutubedislikes"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 32
|
targetSdk 32
|
||||||
versionCode 10
|
versionCode 5
|
||||||
versionName "1.0.0"
|
versionName "0.4"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
@ -21,7 +21,6 @@ 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
|
||||||
@ -34,7 +33,6 @@ 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'
|
||||||
|
@ -11,8 +11,8 @@
|
|||||||
"type": "SINGLE",
|
"type": "SINGLE",
|
||||||
"filters": [],
|
"filters": [],
|
||||||
"attributes": [],
|
"attributes": [],
|
||||||
"versionCode": 10,
|
"versionCode": 5,
|
||||||
"versionName": "1.0.0",
|
"versionName": "0.4",
|
||||||
"outputFile": "app-release.apk"
|
"outputFile": "app-release.apk"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -1,43 +1,30 @@
|
|||||||
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\\.)?((m\\.))?youtube\\.com|youtu\\.be)\\/.+$", Pattern.CASE_INSENSITIVE);
|
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);
|
||||||
@ -84,6 +71,10 @@ 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,12 +85,16 @@ public class DisplayMessageActivity extends AppCompatActivity {
|
|||||||
public void onClick(DialogInterface dialog,
|
public void onClick(DialogInterface dialog,
|
||||||
int which) {
|
int which) {
|
||||||
|
|
||||||
// When the user click Okay button
|
// When the user click yes button
|
||||||
// then app returns to the front page
|
// then app will close
|
||||||
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();
|
||||||
|
|
||||||
@ -109,39 +104,33 @@ 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_GET_VOTES_QUERY = "votes?videoId=";
|
public static String API_QUERY_URL = "votes?videoId=";
|
||||||
|
|
||||||
|
|
||||||
public String GetDataAPI(String YouTubeLink)
|
public String GetDataAPI(String YouTubeLink)
|
||||||
{
|
{
|
||||||
String VIDEO_ID = "";
|
String result = "";
|
||||||
if (YouTubeLink.contains("https://youtu.be"))
|
if (YouTubeLink.contains("https://youtu.be"))
|
||||||
{
|
{
|
||||||
VIDEO_ID = YouTubeLink.substring(17, 28);
|
result = 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);
|
||||||
VIDEO_ID = arrOfStr[1];
|
result = arrOfStr[1];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
String FINAL_URL = API_BASE_URL + API_GET_VOTES_QUERY + VIDEO_ID;
|
String FINAL_URL = API_BASE_URL + API_QUERY_URL + result;
|
||||||
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{
|
||||||
@ -156,54 +145,14 @@ public class DisplayMessageActivity extends AppCompatActivity {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
volleyError -> ErrorDownloading()
|
volleyError -> Toast.makeText(DisplayMessageActivity.this, volleyError.getMessage(), Toast.LENGTH_SHORT).show()
|
||||||
// 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);
|
||||||
|
@ -160,30 +160,4 @@
|
|||||||
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>
|
@ -5,7 +5,7 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
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
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
@ -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 |
@ -1 +0,0 @@
|
|||||||
Bring back Youtube Dislikes for Android
|
|
@ -1 +0,0 @@
|
|||||||
Show Youtube Dislikes
|
|
1
gradle/wrapper/gradle-wrapper.jar.sha256
vendored
1
gradle/wrapper/gradle-wrapper.jar.sha256
vendored
@ -1 +0,0 @@
|
|||||||
e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -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.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
Loading…
Reference in New Issue
Block a user