1
0
mirror of https://github.com/akaessens/NoFbEventScraper synced 2025-06-05 23:29:13 +02:00

27 Commits

Author SHA1 Message Date
01c221181e Update to gradle plugin 7.0.0 2021-08-10 21:13:46 +02:00
43458af11c update android CI workflow java version
enable on all branches
2021-08-10 21:02:41 +02:00
2a67c74f57 Update gson dependency 2021-08-10 20:56:54 +02:00
8f8d0d07a8 Upgrade gradle to 7.1.1
Repace jcenter with maven as jcenter is deprecated
update dependencies that are more up to date on maven

Gradle 7.1.1 working even though #14 didn't change.
Apparently incopatibility is now shifted to gradle 8, whatever.
2021-08-10 17:55:56 +02:00
7fdfd38cdc Allow input of arbitraty page name
Document receiver will check for 404 error if page is invalid.
If page is valid just scrape it as if it was the full uri.

closes #34
2021-08-10 14:49:06 +02:00
b4d37fbc3f Correctly exit if error in scraping instead of endless loop 2021-08-10 14:25:43 +02:00
2b035b6975 Update dependencies 2021-08-10 14:05:04 +02:00
32da94c275 More logging
Signed-off-by: akaessens <24660231+akaessens@users.noreply.github.com>
2021-08-10 14:04:28 +02:00
866889db27 Increase page max to 100 as it has turned out to be stable
Related #33
2021-08-10 12:48:17 +02:00
6248e79021 Replace asyncTasks execute with actual parallel async execution
Using executeOnExecutor(asyncTask.THREAD_POOL_EXECUTOR) all pages
are scraped in parallel. Related: #33

Note: with Android 11 the whole Aync Task is deprecated, therefore
needs to be replaced in the future.
2021-08-10 12:43:43 +02:00
e8893fd712 Add some logging 2021-08-10 12:33:46 +02:00
6c00e63d1f Update changelog 2021-04-27 18:13:36 +00:00
b37fa14d96 Prepare v0.4.4 2021-04-27 19:52:48 +02:00
c6e25fdcfb Update gradle build 2021-04-27 19:48:58 +02:00
1ec5c5ea41 Fix Android 11 intent handling
related https://developer.android.com/about/versions/11/privacy/package-visibility

closes #32
2021-04-27 19:43:49 +02:00
e051e66188 Update changelog 2021-04-19 10:09:41 +00:00
42882b7aa8 Prepare v0.4.3 2021-04-19 12:08:13 +02:00
62742fd1aa Update dependencies 2021-04-19 11:52:22 +02:00
3299001d9b Merge pull request #31 from sguinetti/master
Add Spanish translation
2021-03-22 08:07:49 +01:00
ad9bf21b68 Add Spanish translation 2021-03-21 17:27:09 -05:00
0a20102678 Update changelog 2021-03-14 19:38:00 +00:00
85f420e15d prepare v0.4.2 2021-03-14 20:35:25 +01:00
c119a163c0 Add touch prefix as backup solution 2021-03-14 20:20:24 +01:00
08c1040679 Fix bug where the cookies need to be accepted for mbasic scraping 2021-03-14 20:13:45 +01:00
2efaafa38b Update targetSdk to Android 11 and upgrade dependencies 2021-03-14 19:16:00 +01:00
262c1c4377 Update README.md 2020-10-04 12:10:58 +02:00
26021d540c Update changelog 2020-10-04 10:05:16 +00:00
23 changed files with 236 additions and 51 deletions

View File

@ -2,9 +2,7 @@ name: Android CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
@ -13,9 +11,9 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v1
- uses: actions/setup-java@v2
with:
java-version: 1.8
distribution: 'adopt'
java-version: '11'
- name: Build with Gradle
run: ./gradlew build

View File

@ -1,4 +1,16 @@
# Changelog
## v0.4.4 (14)
- Fix Android 11 intents (to open Calendar or Maps)
## v0.4.3 (13)
- Add spanish translation thanks to @sguinetti
- update dependencies
## v0.4.2 (12)
- Fix scraping not working when cookies need to be accepted
- Android 11 ready
## v0.4.1 (11)
- Fix events not displaying correctly after activity resume
- add share action on each event
- add URL shortener redirection for fb.me
## v0.4.0 (10)
- Support pages with upcoming events *beta*
- Display events in a scrollable card-based view

View File

@ -20,6 +20,10 @@ This source contains the information which is used to create a calendar entry.
<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" height="75">
</a>
# Changelog
[CHANGELOG](CHANGELOG.md)
# Building
This Android app is written in Java and is using the Gradle build system. To compile it, i recommend using Android Studio.
@ -34,4 +38,4 @@ This Android app is written in Java and is using the Gradle build system. To com
# Donations
I develop this application in my free time. If you like it, you can donate at <a href="https://www.paypal.me/andreaskaessens">PayPal</a>.
<a title="PayPal" href="https://www.paypal.me/andreaskaessens"><img src="https://raw.githubusercontent.com/stefan-niedermann/paypal-donate-button/master/paypal-donate-button.png" height="75" /></a>
<a title="PayPal" href="https://www.paypal.me/andreaskaessens"><img src="https://raw.githubusercontent.com/stefan-niedermann/paypal-donate-button/master/paypal-donate-button.png" height="75" /></a>

View File

@ -1,15 +1,14 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
compileSdkVersion 30
defaultConfig {
applicationId "com.akdev.nofbeventscraper"
minSdkVersion 23
targetSdkVersion 29
versionCode 11
versionName "0.4.1"
targetSdkVersion 30
versionCode 14
versionName "0.4.4"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -26,31 +25,31 @@ android {
dependencies {
// androidx
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.navigation:navigation-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.navigation:navigation-fragment:2.3.5'
implementation 'androidx.navigation:navigation-ui:2.3.5'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.preference:preference:1.1.1'
implementation "androidx.webkit:webkit:1.3.0"
implementation "androidx.webkit:webkit:1.4.0"
// JSON save/restore shared preference
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.google.code.gson:gson:2.8.6'
// Theme
implementation 'com.google.android.material:material:1.2.1'
implementation 'com.google.android.material:material:1.4.0'
// Scraping
implementation 'org.jsoup:jsoup:1.13.1'
implementation 'org.jsoup:jsoup:1.14.1'
// Image loading and transforming
implementation 'com.squareup.picasso:picasso:2.71828'
// animations and transformations
implementation 'jp.wasabeef:picasso-transformations:2.2.1'
implementation 'jp.wasabeef:recyclerview-animators:3.0.0'
implementation 'jp.wasabeef:picasso-transformations:2.4.0'
implementation 'jp.wasabeef:recyclerview-animators:4.0.2'
// tests
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

View File

@ -0,0 +1,59 @@
package com.akdev.nofbeventscraper;
import android.util.Log;
import org.jsoup.Connection;
import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DocumentReceiver {
public static org.jsoup.nodes.Document getDocument(String url) throws HttpStatusException, IOException {
org.jsoup.nodes.Document document;
// use default android user agent
String user_agent = "Mozilla/5.0 (X11; Linux x86_64)";
Log.d("scraperLog", "DocumentReceiver: " + url);
Connection connection = Jsoup.connect(url).userAgent(user_agent).followRedirects(true);
Connection.Response response = connection.execute();
document = response.parse();
Log.d("scraperLog", "Document title: " + document.title());
try {
// accept cookies needed?
Element form = document.select("form[method=post]").first();
String action = form.attr("action");
List<String> names = form.select("input").eachAttr("name");
List<String> values = form.select("input").eachAttr("value");
Map<String, String> data = new HashMap<String, String>();
for (int i = 0; i < names.size(); i++) {
data.put(names.get(i), values.get(i));
}
document = connection.url("https://mbasic.facebook.com" + action)
.cookies(response.cookies())
.method(Connection.Method.POST)
.data(data)
.post();
} catch (Exception ignore) {
}
return document;
}
}

View File

@ -2,6 +2,7 @@ package com.akdev.nofbeventscraper;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
@ -14,6 +15,7 @@ import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.RecyclerView;
@ -116,8 +118,12 @@ public class EventAdapter extends
Uri intent_uri = Uri.parse(map_search);
Intent map_intent = new Intent(Intent.ACTION_VIEW, intent_uri);
if (map_intent.resolveActivity(view.getContext().getPackageManager()) != null) {
try {
view.getContext().startActivity(map_intent);
} catch (ActivityNotFoundException e) {
Toast toast=Toast.makeText(view.getContext(),"no App installed", Toast.LENGTH_SHORT);
toast.show();
}
}
};
@ -145,8 +151,11 @@ public class EventAdapter extends
String desc = event.url + "\n\n" + event.description;
intent.putExtra(CalendarContract.Events.DESCRIPTION, desc);
if (intent.resolveActivity(view.getContext().getPackageManager()) != null) {
try {
view.getContext().startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast toast=Toast.makeText(view.getContext(),"no App installed", Toast.LENGTH_SHORT);
toast.show();
}
}
});
@ -213,7 +222,12 @@ public class EventAdapter extends
share_intent.setType("text/plain");
share_intent.putExtra(Intent.EXTRA_TEXT, event.url);
view.getContext().startActivity(Intent.createChooser(share_intent, null));
try {
view.getContext().startActivity(share_intent);
} catch (ActivityNotFoundException e) {
Toast toast=Toast.makeText(view.getContext(),"no App installed", Toast.LENGTH_SHORT);
toast.show();
}
}
});
}

View File

@ -1,10 +1,11 @@
package com.akdev.nofbeventscraper;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.HttpStatusException;
import org.jsoup.nodes.Document;
import java.io.IOException;
@ -144,11 +145,10 @@ public class FbEventScraper extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
// use default android user agent
String user_agent = "Mozilla/5.0 (X11; Linux x86_64)";
Document document = Jsoup.connect(url).userAgent(user_agent).get();
Log.d("scraperLog", "doInBackground: "+url);
try {
Document document = DocumentReceiver.getDocument(url);
if (document == null) {
throw new IOException();
}
@ -191,7 +191,10 @@ public class FbEventScraper extends AsyncTask<Void, Void, Void> {
this.event = new FbEvent(url, name, start_date, end_date, description, location, image_url);
} catch (IOException e) {
} catch (HttpStatusException e) {
this.error = R.string.error_url;
}
catch (IOException e) {
e.printStackTrace();
this.error = R.string.error_connection;
} catch (Exception e) {

View File

@ -5,7 +5,7 @@ import android.os.AsyncTask;
import androidx.preference.PreferenceManager;
import org.jsoup.Jsoup;
import org.jsoup.HttpStatusException;
import org.jsoup.nodes.Document;
import java.io.IOException;
@ -51,8 +51,8 @@ public class FbPageScraper extends AsyncTask<Void, Void, Void> {
do {
try {
// use default android user agent
String user_agent = "Mozilla/5.0 (X11; Linux x86_64)";
Document document = Jsoup.connect(url).userAgent(user_agent).get();
Document document = DocumentReceiver.getDocument(url);
if (document == null) {
throw new IOException();
@ -80,7 +80,7 @@ public class FbPageScraper extends AsyncTask<Void, Void, Void> {
int max = shared_prefs.getInt("page_event_max", 5);
if (event_links.size() < max) {
// find "next page
// find next page
try {
String next_url = document
.getElementsByAttributeValueMatching("href", "has_more=1")
@ -96,13 +96,17 @@ public class FbPageScraper extends AsyncTask<Void, Void, Void> {
url = null;
event_links = event_links.subList(0, max);
}
} catch (HttpStatusException e) {
this.error = R.string.error_url;
return null;
} catch (IOException e) {
e.printStackTrace();
this.error = R.string.error_connection;
return null;
} catch (Exception e) {
e.printStackTrace();
this.error = R.string.error_unknown;
return null;
}
} while (url != null);

View File

@ -2,6 +2,7 @@ package com.akdev.nofbeventscraper;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.util.Log;
import androidx.preference.PreferenceManager;
@ -152,8 +153,10 @@ public class FbScraper {
*/
void scrapeEvent(String event_url) {
FbEventScraper scraper = new FbEventScraper(this, event_url);
Log.d("scraperLog", "scrapeEvent: "+event_url);
tasks.add(scraper);
scraper.execute();
scraper.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
/**
@ -165,6 +168,7 @@ public class FbScraper {
void scrapeEventResultCallback(FbEvent event, int error) {
if (event != null) {
Log.d("scraperLog", "scrapeEventResultCallback: "+event.url);
main.get().addEvent(event);
main.get().input_helper(main.get().getString(R.string.done), false);
} else if (url_type == url_type_enum.EVENT) {
@ -180,8 +184,10 @@ public class FbScraper {
void scrapePage(String page_url) {
FbPageScraper scraper = new FbPageScraper(this, page_url);
Log.d("scraperLog", "scrapePage: "+page_url);
tasks.add(scraper);
scraper.execute();
scraper.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
/**
@ -193,10 +199,11 @@ public class FbScraper {
protected void scrapePageResultCallback(List<String> event_urls, int error) {
if (event_urls.size() > 0) {
Log.d("scraperLog", "scrapePageResultCallback: "+event_urls.toString());
for (String event_url : event_urls) {
try {
String url = getEventUrl(event_url);
Log.d("scraperLog", "scrapePageResultCallback: "+url);
scrapeEvent(url);
} catch (URISyntaxException | MalformedURLException e) {
// ignore this event
@ -210,11 +217,15 @@ public class FbScraper {
protected void redirectUrl (String url) {
FbRedirectionResolver resolver = new FbRedirectionResolver(this, url);
resolver.execute();
Log.d("scraperLog", "redirectUrl: "+url);
resolver.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
protected void redirectionResultCallback(String url) {
this.input_url = url;
Log.d("scraperLog", "redirectUrlCb: "+url);
// now try again with expanded url
this.run();
}
@ -253,6 +264,17 @@ public class FbScraper {
url_type = url_type_enum.PAGE;
scrapePage(page_url);
return;
} catch (URISyntaxException | MalformedURLException e) {
url_type = url_type_enum.INVALID;
}
// check if only page name without prefix
try {
String page_url = getPageUrl("https://mbasic.facebook.com/"+input_url);
url_type = url_type_enum.PAGE;
scrapePage(page_url);
} catch (URISyntaxException | MalformedURLException e) {
url_type = url_type_enum.INVALID;
main.get().input_helper(main.get().getString(R.string.error_url), true);

View File

@ -0,0 +1,12 @@
<!doctype html>
<h3>Código abierto</h3>.
<p>El código fuente de esta aplicación está disponible en <a href=" https://github.com/akaessens/NoFbEventScraper">GitHub</a>.<strong><br /></strong></p>
<p>Si encuentras un problema, por favor, infórmame de forma anónima a través del <a href="https://gitreports.com/issue/akaessens/NoFbEventScraper">bug tracker</a> o directamente en <a href="https://github.com/akaessens/NoFbEventScraper/issues">GitHub</a>.</p>
<h3>Actualizaciones</h3>.
<p>Esta aplicación está disponible para su descarga en <a href="https://f-droid.org/de/packages/com.akdev.nofbeventscraper">F-Droid</a>. El registro de cambios está disponible en <a href="https://github.com/akaessens/NoFbEventScraper/blob/master/CHANGELOG.md">GitHub</a>.</p>.
<p><a href="https://f-droid.org/en/packages/com.akdev.nofbeventscraper"> <img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" height="75" /> </a></p>
<h3>Aviso legal</h3>.
<p>Esta aplicación está pensada para almacenar eventos individuales y públicos en un calendario personal. No lo utilices para la recopilación automática de datos y respeta las <a href="http://www.facebook.com/apps/site_scraping_tos_terms.php">Condiciones de recopilación automática de datos</a> de Facebook.
<h3>Donación</h3>
<p>Estoy desarrollando esta aplicación en mi tiempo libre. Si te gusta, puedes donar en <a href="https://www.paypal.me/andreaskaessens">PayPal</a>.</p>
<p><a title="PayPal" href="https://www.paypal.me/andreaskaessens"><img src="https://raw.githubusercontent.com/stefan-niedermann/paypal-donate-button/master/paypal-donate-button.png" height="75" /></a></p>

View File

@ -0,0 +1,14 @@
<!doctype html>
<h3>¿Qué enlaces se pueden utilizar con esta aplicación?</h3>
<p>Se admiten todos los subdominios de facebook, ya sean móviles (m.facebook.com) o específicos del idioma (de-de.facebook.com). El enlace debe contener un ID de evento.</p>
<h3>¿Cómo utilizar esta aplicación?</h3>
<ul>
<li><strong>Botón pegar</strong>: Basta con pegar un enlace copiado desde el portapapeles en la barra de URL.</li>
<li><strong>Compartir vía</strong>: La función de compartir incorporada en Android, por ejemplo, desde un navegador.</li>
<li><strong>Abrir con</strong>: La función integrada de Android de abrir con, por ejemplo, al hacer clic desde un servicio de mensajería.</li>
</ul>
<h3>¿Por qué no funciona el evento X?</h3>
<p>Esta app se basa en la información del evento que está disponible públicamente. Si el evento no ofrece, por ejemplo, la ubicación sin necesidad de iniciar sesión, no se encontrará disponible en esta aplicación. Además, algunos eventos simplemente no proporcionan la información en un formato legible por la máquina. Los eventos con múltiples instancias son problemáticos porque no proporcionan la fecha correcta de inicio y fin cuando se extraen de m.facebook.com.</p>
<p>Si encuentras problemas con un evento específico, por favor, házmelo saber a través de <a href="https://gitreports.com/issue/akaessens/NoFbEventScraper">bugtracker anónimo</a> o en la <a href="https://github.com/akaessens/NoFbEventScraper/issues/">página de incidentes de GitHub</a>.</p>
<h3>¿Esta app se integra con mi aplicación de calendario?</h3>
<p>Sí. Esta aplicación hace uso de funciones de calendario independientes de la aplicación, lo que la hace compatible con cualquier app de calendario. Sin embargo, en lo personal recomiendo <a href="https://play.google.com/store/apps/details?id=ws.xsoh.etar">Calendario de Etar</a> porque es Open Source.</p>

View File

@ -9,7 +9,7 @@
<string name="button_add">Zum Kalender hinzufügen</string>
<string name="tooltip_paste">Einfügen von Inhalten aus der Zwischenablage in das URL-Eingabefeld</string>
<string name="preferences_url_setting">Welcher URL-Präfix ist zu verwenden?</string>
<string name="preferences_url_setting_summary">Die Nutzung von mbasic.facebook.com ist stabiler und schneller. Die Verwendung von www.facebook.com funktioniert besser bei Ereignissen mit mehreren Instanzen und zeigt eine hochauflösende Vorschau an, geht aber irgendwann kaputt, wenn Facebook das klassische Design deaktiviert.</string>
<string name="preferences_url_setting_summary">mbasic is am schnellsten, www lädt eine hochauflösende Vorschau und touch dient als zusätzliches Backup</string>
<string name="error_clipboard_empty">Fehler: Zwischenablage leer</string>
<string name="error_scraping">Fehler: Veranstaltungsdaten nicht gefunden</string>
<string name="error_url">Fehler: URL ungültig</string>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">NoFb Event Scraper</string>
<string name="action_about">Acerca de</string>
<string name="action_help">Ayuda</string>
<string name="action_settings">Ajustes</string>
<string name="hint_add_link">Enlace del evento</string>
<string name="helper_add_link">Pegue el enlace del evento en Facebook</string>
<string name="button_add">Añadir al calendario</string>
<string name="tooltip_paste">Pegue el contenido del portapapeles en el cuadro de entrada de la URL</string>
<string name="preferences_url_setting">Prefijo de URL que debe utilizarse</string>
<string name="preferences_url_setting_summary">mbasic es el más rápida, www carga la vista previa de la imagen en alta resolución, touch es una herramienta de respaldo</string>
<string name="error_clipboard_empty">Error: Portapapeles vacío</string>
<string name="error_scraping">Error: No se han encontrado los datos del evento</string>
<string name="error_url">Error: URL no válida</string>
<string name="error_connection">Error: No es posible la conexión</string>
<string name="error_unknown">Error: Error desconocido</string>
<string name="preferences_events_header">Eventos</string>
<string name="preferences_event_setting">Limpiar lista de eventos</string>
<string name="preferences_event_snackbar">"Lista de eventos limpiada "</string>
<string name="done">Aceptar</string>
<string name="undo">Deshacer</string>
<string name="preferences_page_event_max_summary">Número máximo de eventos a cargar en una sola página.</string>
<string name="preferences_page_event_max">Límite de eventos por página</string>
<string name="error_no_events">Error: no hay próximos eventos</string>
</resources>

View File

@ -2,11 +2,13 @@
<!-- Reply Preference -->
<string-array name="url_to_scrape">
<item>mbasic.facebook.com</item>
<item>touch.facebook.com</item>
<item>www.facebook.com</item>
</string-array>
<string-array name="url_prefix">
<item>https://mbasic.</item>
<item>https://touch.</item>
<item>https://www.</item>
</string-array>

View File

@ -24,7 +24,7 @@
<!-- Preferences -->
<string name="preferences_scraper_header" translatable="false">Scraper</string>
<string name="preferences_url_setting">Which URL prefix to use</string>
<string name="preferences_url_setting_summary">"Using mbasic.facebook.com is more stable and faster. Using www.facebook.com works better with multiple instance events and will display a high resolution preview but will eventually break when Facebook disables the classic design."</string>
<string name="preferences_url_setting_summary">"mbasic is the fastest, www loads high-res image preview, touch is an additional backup."</string>
<string name="preferences_events_header">Events</string>
<string name="preferences_event_setting">Clear event list</string>

View File

@ -20,7 +20,7 @@
android:defaultValue="5"
app:showSeekBarValue="true"
app:min="1"
android:max="30"
android:max="100"
android:summary="@string/preferences_page_event_max_summary"
android:key="page_event_max"
android:title="@string/preferences_page_event_max" />

View File

@ -4,11 +4,10 @@ buildscript {
repositories {
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
classpath 'com.android.tools.build:gradle:7.0.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@ -18,8 +17,7 @@ buildscript {
allprojects {
repositories {
google()
jcenter()
mavenCentral()
}
}

View File

@ -0,0 +1,2 @@
- Fix scraping not working when cookies need to be accepted
- Android 11 ready

View File

@ -0,0 +1,2 @@
- Add spanish translation thanks to @sguinetti
- update dependencies

View File

@ -0,0 +1 @@
- Fix Android 11 intents (to open Calendar or Maps)

View File

@ -0,0 +1,12 @@
El propósito de esta aplicación es obtener acceso a los eventos de Facebook sin necesidad de una cuenta.
Por lo tanto, no recurre a la API de Facebook.
Como alternativa, abre el URI del evento de Facebook y descarga el código HTML del sitio web.
Esta fuente debe contener la información del evento en forma de datos estructurados.
Esos datos al extraerse se crean eventos en Android.
Características:
* No recurre a la API de Facebook
* Soporta "abrir con" y "compartir via"
* Funciona con todas las URLs de los subdominios regionales de Facebook
* Guarda el historial de eventos extraídos
* Maneja los próximos eventos de las páginas

View File

@ -0,0 +1 @@
Importa los eventos de Facebook al calendario

View File

@ -3,5 +3,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
distributionSha256Sum=23e7d37e9bb4f8dabb8a3ea7fdee9dd0428b9b1a71d298aefd65b11dccea220f
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
distributionSha256Sum=bf8b869948901d422e9bb7d1fa61da6a6e19411baa7ad6ee929073df85d6365d