Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save masselmello/6d4f4c533b98b2550ee23a7a5e6c6cff to your computer and use it in GitHub Desktop.
Save masselmello/6d4f4c533b98b2550ee23a7a5e6c6cff to your computer and use it in GitHub Desktop.
iOS widget powered by the Scriptable app that shows the current capacity of your McFit gym (RSG group)
/**
* 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'
}
@DSchumacher2104
Copy link

Super Widget-Skript👍. Mehr davon, z. B. für FitX 🙏🏽😊

@eopo
Copy link

eopo commented Oct 23, 2020

Ich biete dann mal John Reed Fitness Alle McFit-angehörigen Ketten (McFit, John Reed, JOHN & JANE's, High5): eopo/mcfit_chain_capacity_widget.js

@masselmello
Copy link
Author

@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.

@masselmello
Copy link
Author

Bzw. @eopo Haha nice im selben Moment gepostet :D

@twobeer
Copy link

twobeer commented Oct 24, 2020

Moin!
Gibt es auch für das Fitnessstudio Elan eine solche Auslastungsgrenze? Kannst Du da mal nachschauen? https://elan-fitness.de/

Vielen Dank!

@martinbackes
Copy link

@eopo mega! thanks 💯

@masselmello
Copy link
Author

UPDATED VERSION 1.1

  • Added support for other rsg group gyms' names and added their ids to the list

@masselmello
Copy link
Author

Moin!
Gibt es auch für das Fitnessstudio Elan eine solche Auslastungsgrenze? Kannst Du da mal nachschauen? https://elan-fitness.de/

Vielen Dank!

@twobeer

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.

@Max82BLN
Copy link

Hallo, danke für Deine Arbeit. Was bei mir aber nicht funktioniert ist eine Aktualisierung der Werte, muss da noch etwas wo eingestellt werden?

@masselmello
Copy link
Author

@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.

@eopo
Copy link

eopo commented Oct 24, 2020

(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 ...

@masselmello
Copy link
Author

@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

@eopo
Copy link

eopo commented Oct 25, 2020

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.

@masselmello
Copy link
Author

masselmello commented Oct 26, 2020

Oh ja kenn ich. Hab grade bei der Arbeit auch so ne JSON, die eigenartig erstellt wurde und hock auch schon ewig dran.

@flodroid
Copy link

Wäre es denn möglich, das für FitStar anzupassen? https://www.fit-star.de/

@masselmello
Copy link
Author

masselmello commented Oct 26, 2020

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 ;)

@screamer3003
Copy link

Das ist mega wäre super wenn es auch für xtrafit umzusetzen wäre. Wenn ich dir irgendwie helfen kann gib gerne Bescheid

@eopo
Copy link

eopo commented Oct 26, 2020

@eopo
Copy link

eopo commented Oct 26, 2020

@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 ...

@masselmello
Copy link
Author

masselmello commented Oct 26, 2020

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. :/

@SmartHomeGuy
Copy link

(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!!

@eopo
Copy link

eopo commented Oct 27, 2020

@SmartHomeGuy Für CleverFit nicht, weil die API scheiße ist. Das ist mir zu viel Aufwand. Sorry :/

@martinbackes
Copy link

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

@eopo
Copy link

eopo commented Oct 27, 2020

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.

@masselmello
Copy link
Author

masselmello commented Oct 27, 2020

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?

@martinbackes
Copy link

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 :)

@masselmello
Copy link
Author

Genau das meinte ich ja. Nur ein hübscher Netzwerkfehler, aber ohne die misleading Anzeige des letzten Werts.

@martinbackes
Copy link

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 :)

@masselmello
Copy link
Author

masselmello commented Oct 28, 2020

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 😉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment