Skip to content

Instantly share code, notes, and snippets.

@masselmello
Last active September 24, 2025 09:49
Show Gist options
  • Select an option

  • Save masselmello/6d4f4c533b98b2550ee23a7a5e6c6cff to your computer and use it in GitHub Desktop.

Select an option

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://my.mcfit.com/nox/public/v1/studios/${id}/utilization/v2/today`
const req = new Request(url)
req.headers = {
'x-tenant': 'rsg-group'
}
const result = await req.loadJSON()
return result.find((item) => item.current)?.percentage ?? 0
}
//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'
}
@iToab

iToab commented Nov 1, 2020 •

Copy link
Copy Markdown

@masselmello
Hey,
Hat das jemand vielleicht schon für Jumpers Fitness angepasst?
https://www.jumpers-fitness.com/studios/
Wäre super 👍🏻

@masselmello

Copy link
Copy Markdown
Author

@ssibio17 Habs mir Mal kurz angeschaut, scheint mir auf den ersten Blick aber einfach eine HTML-Seite zu sein, die alle 30 Sekunden mit neuen Werten neu geladen wird. Der Source-Code ist aber auch katastrophal.

@iToab Scheint möglich, aber der Source-Code ist ebenfalls ziemlich unübersichtlich, also leider doch etwas sehr aufwendig.
Mal schauen vlt. wird was möglich, will aber nichts versprechen, hab nur ganz kurz nebenbei reingeschaut.

@matzepipo

matzepipo commented Nov 15, 2020 •

Copy link
Copy Markdown

Hätte das gern für Xtrafit Studios. Wäre das auch möglich ?

Ah gesehen, gibt es schon

Wie komme ich an die gym Id von Xtrafit köln buchheim ??

Gym ID Xtrafit (ein paar gefunden)
200 Köln Ehrenfeld
210 Essen-Volgelheim
220 Köln Buchheim
230 Krefeld-Cracau
240 Mainz-Bretzenheim
270 Köln Marsdorf
300 Offenbach Zentrum

@JDTm

JDTm commented May 21, 2021 •

Copy link
Copy Markdown

Hat jemand noch Zeit sich FitStar anzuschauen? Update: Ich arbeite grad an einem FitStar Widget.

@madnoize

madnoize commented Feb 4, 2023

Copy link
Copy Markdown

Hey is schon ne weile her aber bei mir funktionieren die high5 Studios nicht hat sich da was geändert ?

@clemone210

Copy link
Copy Markdown

Für die Leute, bei denen es nicht funktioniert.
Ich habe eine funktionierende Version, inkl. der Studios und deren Tags + URL zum anpassen.
https://gist.github.com/clemone210/8f1b150a2c4f1fac0c409e6d21d656e2

@lorenzlars

lorenzlars commented Nov 25, 2023 •

Copy link
Copy Markdown

If someone has issues with the widget because of the recent API change on McFit side. Just replace the fetchGymCapacity with this implementation:

async function fetchGymCapacity(id) {
  const url = `https://my.mcfit.com/nox/public/v1/studios/${id}/utilization/v2/today`
  const req = new Request(url)
  req.headers = {
     'x-tenant': 'rsg-group' 
  }
    
  const result = await req.loadJSON()
    
  return result.find((item) => item.current)?.percentage ?? 0
}

@bondskin

bondskin commented Dec 5, 2023

Copy link
Copy Markdown

thanks @lorenzlars , it works now again

@marvinjoa

Copy link
Copy Markdown

Sehr nice, dass ich nichtmal die gymID ändern musste, weil der OP wohl mal im gleichen Gym trainiert hat :D

@DerSchiman

Copy link
Copy Markdown

thanks @lorenzlars

@TimoReusch

Copy link
Copy Markdown

@iToab Die Studios von Jumpers Fitness findet man auf jeden Fall hier: https://bestfit.api.magicline.com/connect/v1/studio

Hier gibts die Daten: https://bestfit.api.magicline.com/connect/v1/studio/{studioId}/utilization - bin mir aber nicht sicher, ob die tatsächlich live sind oder einfach jeden Tag das gleiche angezeigt wird.

@erikspall FYI

@XCame

XCame commented Jul 1, 2025

Copy link
Copy Markdown

bump, damit @masselmello die funktion von @lorenzlars implementiert und zukünftigen Besuchern das scrollen durch die Kommentare erspart. ❤️

Thx by the way für das Script.

@masselmello

Copy link
Copy Markdown
Author

Done ;)

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