Compare commits

...

11 Commits
v0.1 ... master

Author SHA1 Message Date
789c7e3d28 Title and thumbnail support 2022-07-14 16:18:49 +02:00
265dd88054 Add install links 2022-01-11 01:42:58 +01:00
92bb8c678b m.youtube.com now consider a valid youtube url 2022-01-06 14:19:03 +01:00
be689a9e1a Change the way users see Errors 2022-01-06 09:32:50 +01:00
e36b1bb7c4 Graddle key fix 2022-01-05 23:15:21 +01:00
20a45433b7 Gradle SHA256SUM? 2022-01-05 23:12:03 +01:00
706286ccfe Title 2022-01-05 16:21:18 +01:00
1ff462eb1f Fastline folder structure 2022-01-05 16:15:03 +01:00
968753f9a0 Metadata 2022-01-05 15:54:09 +01:00
69acab4582 * Made the interface more accesable
* Fixed bug for devices using light theme
* Made the app more tablet friendly
2022-01-04 12:33:53 +01:00
4240bf9a15 Remove Gemfile 2022-01-03 17:04:49 +01:00
19 changed files with 187 additions and 57 deletions

View File

@ -1,3 +0,0 @@
source "https://rubygems.org"
gem "fastlane"

View File

@ -1,4 +1,11 @@
# 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.

View File

@ -9,8 +9,8 @@ android {
applicationId "com.jesperh.showyoutubedislikes"
minSdk 21
targetSdk 32
versionCode 3
versionName "0.2"
versionCode 10
versionName "1.0.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -21,6 +21,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
@ -33,6 +34,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'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

View File

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

View File

@ -1,30 +1,43 @@
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.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.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;
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
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -71,10 +84,6 @@ 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",
@ -85,16 +94,12 @@ public class DisplayMessageActivity extends AppCompatActivity {
public void onClick(DialogInterface dialog,
int which) {
// When the user click yes button
// then app will close
// When the user click Okay button
// then app returns to the front page
finish();
}
});
// Set the Negative button with No name
// OnClickListener method is use
// of DialogInterface interface
// Create the Alert dialog
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_QUERY_URL = "votes?videoId=";
public static String API_GET_VOTES_QUERY = "votes?videoId=";
public String GetDataAPI(String YouTubeLink)
{
String result = "";
String VIDEO_ID = "";
if (YouTubeLink.contains("https://youtu.be"))
{
result = YouTubeLink.substring(17, 28);
VIDEO_ID = YouTubeLink.substring(17, 28);
}
else if (YouTubeLink.contains("youtube.com"))
{
String[] arrOfStr = YouTubeLink.split("=", 2);
result = arrOfStr[1];
VIDEO_ID = arrOfStr[1];
}
else
{
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 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,
response -> {
try{
@ -145,14 +156,54 @@ public class DisplayMessageActivity extends AppCompatActivity {
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.add(myRequest);
requestQueue.add(oEmbedRequest);
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);

View File

@ -23,14 +23,15 @@
<TextView
android:id="@+id/YTDislikes"
android:layout_width="199dp"
android:layout_height="60dp"
android:layout_width="201dp"
android:layout_height="61dp"
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.428"
app:layout_constraintHorizontal_bias="0.422"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -39,9 +40,10 @@
android:layout_width="201dp"
android:layout_height="60dp"
android:layout_marginStart="172dp"
android:layout_marginTop="128dp"
android:layout_marginTop="92dp"
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"
@ -52,9 +54,10 @@
android:layout_width="201dp"
android:layout_height="60dp"
android:layout_marginStart="172dp"
android:layout_marginTop="200dp"
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"
@ -65,9 +68,10 @@
android:layout_width="201dp"
android:layout_height="59dp"
android:layout_marginStart="172dp"
android:layout_marginTop="272dp"
android:layout_marginTop="228dp"
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"
@ -75,14 +79,15 @@
<TextView
android:id="@+id/YTVideoLink"
android:layout_width="300dp"
android:layout_height="61dp"
android:layout_width="286dp"
android:layout_height="65dp"
android:layout_marginStart="172dp"
android:layout_marginTop="356dp"
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.256"
app:layout_constraintHorizontal_bias="0.263"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@ -105,11 +110,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="85dp"
android:layout_marginEnd="48dp"
android:layout_marginTop="48dp"
android:layout_marginEnd="33dp"
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" />
@ -118,10 +124,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="156dp"
android:layout_marginEnd="48dp"
android:layout_marginTop="116dp"
android:layout_marginEnd="33dp"
android:text="Ratio:"
android:textColor="@android:color/white"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toStartOf="@+id/YTLikes"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
@ -132,10 +138,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="124dp"
android:layout_marginEnd="45dp"
android:layout_marginTop="116dp"
android:layout_marginEnd="33dp"
android:text="Views:"
android:textColor="@android:color/white"
android:textColor="@android:color/primary_text_dark"
app:layout_constraintEnd_toStartOf="@+id/YTViews"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
@ -146,12 +152,38 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="27dp"
android:layout_marginTop="208dp"
android:layout_marginEnd="45dp"
android:layout_marginTop="184dp"
android:layout_marginEnd="33dp"
android:text="Video Link:"
android:textColor="@android:color/white"
android:textColor="@android:color/primary_text_dark"
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,26 +4,30 @@
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="0dp"
android:layout_height="wrap_content"
android:layout_width="326dp"
android:layout_height="87dp"
android:layout_marginStart="101dp"
android:layout_marginTop="76dp"
android:layout_marginTop="100dp"
android:layout_marginEnd="100dp"
android:backgroundTint="@android:color/holo_red_dark"
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_constraintHorizontal_bias="0.508"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="YouTube Link:" />
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/sendYTQueryButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="136dp"
android:layout_height="71dp"
android:layout_marginStart="105dp"
android:layout_marginTop="27dp"
android:layout_marginEnd="105dp"
@ -32,4 +36,19 @@
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.0.2"
classpath 'com.android.tools.build:gradle:7.1.3'
// NOTE: Do not place your application dependencies here; they belong
// 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
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
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME