-
-
Save masselmello/6d4f4c533b98b2550ee23a7a5e6c6cff to your computer and use it in GitHub Desktop.
/** | |
* Script for scriptable to get the current capacity of McFit Gyms | |
*/ | |
let gymId = 1731068920 | |
let param = args.widgetParameter | |
if (param != null && param.length > 0) { | |
gymId = param | |
} | |
const currentGymCapacity = await fetchGymCapacity(gymId) | |
const storeInfo = await fetchGymInfo(gymId) | |
const gymName = await fetchGymInfo(gymId) | |
const widget = new ListWidget() | |
await createWidget() | |
if (!config.runsInWidget) { | |
await widget.presentSmall() | |
} | |
Script.setWidget(widget) | |
Script.complete() | |
//Create the widget | |
async function createWidget() { | |
const headlineText = widget.addText("🏋️ Capacity") | |
headlineText.font = Font.mediumRoundedSystemFont(19) | |
widget.addSpacer(30) | |
const capacityText = widget.addText(currentGymCapacity.toString() + "%") | |
capacityText.font = Font.mediumRoundedSystemFont(50) | |
if (currentGymCapacity < 20) { | |
capacityText.textColor = new Color("#33cc33") | |
} else if (currentGymCapacity < 30){ | |
capacityText.textColor = new Color("#ff9900") | |
}else{ | |
capacityText.textColor = new Color("#ff3300") | |
} | |
widget.addSpacer(1) | |
const gymNameText = widget.addText(gymName) | |
gymNameText.font = Font.regularSystemFont(12) | |
} | |
//Fetches the current capacity of the McFit gym | |
async function fetchGymCapacity(id) { | |
const url = 'https://www.mcfit.com/de/auslastung/antwort/request.json?tx_brastudioprofilesmcfitcom_brastudioprofiles%5BstudioId%5D=' + id | |
const req = new Request(url) | |
const result = await req.loadJSON() | |
var counter = 0 | |
for (var i in result.items) { | |
if(result.items[i].isCurrent){ | |
counter = result.items[i].percentage | |
} | |
} | |
return counter | |
} | |
//Fetches the name of the gym | |
async function fetchGymInfo(id) { | |
const url = 'https://rsg-group.api.magicline.com/connect/v1/studio?studioTags=AKTIV-391B8025C1714FB9B15BB02F2F8AC0B2' | |
const req = new Request(url) | |
const apiResult = await req.loadJSON() | |
for(var i in apiResult){ | |
if(apiResult[i].id == id){ | |
return apiResult[i].studioName | |
} | |
} | |
return 'Your McFit' | |
} | |
@martinbackes Die Links hab ich reverse-engineered aus deren Website. Hab den Datenverkehr und den Quellcode angeschaut. Müsstest für John Reed nochmal extra machen. Ich hab grad viel Uni-Stuff am Hut, aber werd mir FitX und John Reed auch Mal bei Gelegenheit anschauen.
Bzw. @eopo Haha nice im selben Moment gepostet :D
FitnessFirst: https://gist.github.com/eopo/9344584035f487db0e229d655bdb39c4
FitX: https://gist.github.com/eopo/aedaf03f1f27a0c9c02f4974f3f4c9ba
McFit, John Reed, JOHN & JANE's, High5: https://gist.github.com/eopo/b0df56edbfc0df816adbf4a54047adbf
Moin!
Gibt es auch für das Fitnessstudio Elan eine solche Auslastungsgrenze? Kannst Du da mal nachschauen? https://elan-fitness.de/
Vielen Dank!
@eopo mega! thanks 💯
UPDATED VERSION 1.1
- Added support for other rsg group gyms' names and added their ids to the list
Moin!
Gibt es auch für das Fitnessstudio Elan eine solche Auslastungsgrenze? Kannst Du da mal nachschauen? https://elan-fitness.de/Vielen Dank!
Ich habs mir kurz Mal angeschaut, aber nichts gefunden. Die bieten ja scheinbar auch keine Auslastung-Anzeige auf ihrer Website an.
Bei den großen Ketten wie RSG, FitX und FitnessFirst wars relativ einfach an deren API zu kommen, weil sie es auf der Website selbst nutzen. (FitX hat da IMHO die am einfachsten auszulesende xD)
Oder hab ich so ne Unterseite einfach übersehen, wenn ja schick gerne hier den Link rein und ich schaus mir nochmal genauer an.
Hallo, danke für Deine Arbeit. Was bei mir aber nicht funktioniert ist eine Aktualisierung der Werte, muss da noch etwas wo eingestellt werden?
@Max82BLN Eigentlich nicht, das Widget wird immer von Scriptable getriggered, sobald es zu sehen ist. Du müsstest eventuell aber Scriptable die Erlaubnis für Hintergrundaktualisierungen geben.
Ansonsten einfach Mal das iPhone neu starten.
(FitX hat da IMHO die am einfachsten auszulesende xD)
Das soll wohl ein Witz sein? xD Am schönsten bleibt eigentlich Clever Fit, deren API liefert JSON, wobei der eigentliche content als HTML drin ist ...
@eopo hahaha xD Ne is mein ernst, bevor ich gesehen hatte, dass du FitX schon fertig hast, hab ich mir das angeschaut und es iwie innerhalb von 30 Sekunden gefunden. CleverFit is aber dann echt king, hab ich mir aber auch ned angeguckt! :D
Problem bei der FitX-API ist imo dass das JSON relativ seltsam escaped ist und dann nochmal in ein Array gepackt ist. Hat mich eine längere Zeit und Hilfe von anderen gekostet, das zu Parsen.
Oh ja kenn ich. Hab grade bei der Arbeit auch so ne JSON, die eigenartig erstellt wurde und hock auch schon ewig dran.
Wäre es denn möglich, das für FitStar anzupassen? https://www.fit-star.de/
Ich schaus mir nach der Arbeit heute Mal an. Denke aber auf den ersten Blick, dass es machbar ist.
Edit: Direkt gefunden, die ganzen Auslastungen stehen im HTML, solte also ähnlich wie bei FitX auch gehen. Ich mach mich später Mal dran ;)
Das ist mega wäre super wenn es auch für xtrafit umzusetzen wäre. Wenn ich dir irgendwie helfen kann gib gerne Bescheid
@screamer3003 Got you covered - Einmal XTRAFIT für dich https://gist.github.com/eopo/f0dc692f23e2373000df6134b7b4e4e0
@masselmello warst du mit FitStar schon weitergekommen? So wie es scheint liefert der Server das JSON für die Auslastung im HTML festgebacken als Script-Element ...
Ja genau so hab ich das auch gesehen. Ich komm heute aber nicht mehr dazu. Saß bis eben an nem Unreal Engine Projekt für die Uni. Morgen dann. :/
(FitX hat da IMHO die am einfachsten auszulesende xD)
Das soll wohl ein Witz sein? xD Am schönsten bleibt eigentlich Clever Fit, deren API liefert JSON, wobei der eigentliche content als HTML drin ist ...
Gibt es hierfür ein fertiges Script für Scriptable? Optimalerweise mit der Bestimmung des Ortes als „Parameter“ im Widget 😬
Danke euch vorab, mega Arbeit!!
@SmartHomeGuy Für CleverFit nicht, weil die API scheiße ist. Das ist mir zu viel Aufwand. Sorry :/
ich hätte noch einen Vorschlag :) Ohne Netz zeigt das Widget nur eine rote Error Warnung. Kann man nicht den letzten Stand stehenlassen und dafür die gesamte Gestaltung in weiß oder grau darstellen, quasi als Indikator dass der Zustand eingeforen ist. Hab so etwas ähnliches bei einem Telekom Datenverbrauch Skript gesehen. Thanks
Möglich ja, bläht aber das ganze Skript auf. Für das Datenvolumen-Skript ist das auch noch eine halbwegs wertvolle Information, da sich aber bei den Studios die Auslastung innerhalb von zwei Minuten teilweise um 10% oder mehr ändert, ... Ich weiss ja nicht.
Da stimme ich zu, da würde eine Anzeige, dass kein Netzwerk da ist mehr Sinn machen. Aber mir fehlt dafür gerade leider die Zeit. 😪
Mir gehts mit CleverFit und FitStar aber da genauso, fehlt mir aktuell die Zeit das umzusetzen. Ist beides leider mehr Aufwand als ich am Ende dachte. Aber vielleicht findet sich ja jemand, der die Zeit (und Lust😅) dafür hat?
ja klar würde das Sinn machen mit der aktuellen "kein Netzwerk" Anzeige, aber es sieht einfach nicht gut aus so wie es über die Widgets standardmäßig dargestellt wird und ist gegenüber allem Anderen nicht gestaltet, deswegen würde ich meine Variante bzw Vorschlag vorziehen, weil es ja dann eine Indikation bzw eine Visualisierung gibt, dass kein Netzwerk vorherrscht :)
Genau das meinte ich ja. Nur ein hübscher Netzwerkfehler, aber ohne die misleading Anzeige des letzten Werts.
Hey, wir müssen da jetzt auch keine riesen Diskussion daraus machen :) aber das Netz ist ja in den meisten Fällen da, und wenn nicht, bin ich wahrscheinlich im Bett, Flieger, Meeting oder ähnliches und entscheide mich mit Sicherheit nicht, ob ich jetzt ins Gmy gehe oder nicht. Was aber da ist, ist diese Anzeige, die den halben Screen so aussehen lässt, als hätte jemand die Gestaltung vergessen und das hat für mich nichts mit Aufhübschung zu tun. Deswegen ist das für mich nicht misleading, sondern ein eingefrorener Zustand der visualisiert wird. Und ich weiß ja, dass der Wert eingefroren ist :)
Genau die Diskussion is unnötig. Kannst es dir ja so anpassen, dass es deinen Wünschen entspricht. :) Dafür hab ichs ja Open Source gemacht 😉
ja, weiß ich doch, und war ja nicht doof gemeint :) Danke noch einmal dafür 🙏😀
Ich biete dann mal
John Reed FitnessAlle McFit-angehörigen Ketten (McFit, John Reed, JOHN & JANE's, High5): eopo/mcfit_chain_capacity_widget.js