Skip to content

Instantly share code, notes, and snippets.

@tobaco
Forked from marco79cgn/wach-und-wichtig.js
Created March 3, 2021 08:38
Show Gist options
  • Save tobaco/267a379fe16b2310836a21007a0cfb61 to your computer and use it in GitHub Desktop.
Save tobaco/267a379fe16b2310836a21007a0cfb61 to your computer and use it in GitHub Desktop.
iOS widget, das die neueste Folge des radioeins Podcasts "Wach & Wichtig" anzeigt und abspielt (für die Scriptable.app)
// Wach und Wichtig Podcast Widget
//
// Copyright (C) 2020 by marco79 <[email protected]>
//
// Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
// IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
// OF THIS SOFTWARE.
let param = args.widgetParameter
let radioeinsOrange = new Color("#FF9300")
let latestEpisode = await getLatestEpisode(false)
let widget = await createWidget(latestEpisode)
Script.setWidget(widget)
Script.complete()
widget.presentSmall()
// Erzeugt das Widget Layout
async function createWidget(latestEpisode) {
let widget = new ListWidget()
widget.setPadding(0,6,6,6)
let logoStack = widget.addStack()
logoStack.layoutHorizontally()
logoStack.addSpacer()
let logoImg = logoStack.addImage(await getImage("radioeins-logo.png"))
logoImg.imageSize = new Size(70,20)
logoImg.centerAlignImage()
let coverStack = widget.addStack()
coverStack.layoutVertically()
let coverImage = coverStack.addImage(await getImage("wuw-logo.jpg"))
widget.addSpacer(2)
let day = new Date(latestEpisode.pubDate.replace(" ","T"))
let df = new DateFormatter()
df.dateFormat = "dd. MMMM"
let strDate = df.string(day)
let dayText = widget.addText(getWeekday(day) + ", " + strDate)
dayText.font = Font.boldSystemFont(11)
dayText.textColor = radioeinsOrange
dayText.lineLimit = 1
dayText.minimumScaleFactor = 0.8
let titleTxt = widget.addText(latestEpisode.title)
titleTxt.font = Font.semiboldSystemFont(11)
titleTxt.lineLimit = 4
titleTxt.minimumScaleFactor = 0.8
widget.addSpacer(2)
let playStack = widget.addStack()
playStack.layoutHorizontally()
let playImage = playStack.addImage(await getImage("play-button.png"))
playImage.imageSize = new Size(18,18)
playStack.addSpacer(3)
let playTextStack = playStack.addStack()
playTextStack.layoutVertically()
playTextStack.addSpacer(2)
let playText = playTextStack.addText("Podcast hören")
playText.font = Font.semiboldRoundedSystemFont(11)
playText.textColor = radioeinsOrange
if(param != null) {
switch(param.toString().toLowerCase()) {
case 'vlc':
widget.url = "vlc-x-callback://x-callback-url/stream?url=" + latestEpisode.link.toString()
break
case 'spotify':
widget.url = "https://open.spotify.com/show/4LsArcokwkKXmygKFASuka?si=eL2dXCYlTpaXjDH-sKpyHA"
break
case 'audiothek':
widget.url = "https://www.ardaudiothek.de/wach-wichtig/80923132"
break
case 'itunes':
widget.url = "https://podcasts.apple.com/us/podcast/wach-wichtig-radioeins/id171374241"
break
case 'apple':
widget.url = "https://podcasts.apple.com/us/podcast/wach-wichtig-radioeins/id171374241"
break
default:
widget.url = latestEpisode.link
}
} else {
widget.url = latestEpisode.link
}
return widget
}
// lädt die neueste Folge, wenn möglich aus dem Cache
async function getLatestEpisode(forceFetch) {
const url = "https://api.rss2json.com/v1/api.json?rss_url=https://www.radioeins.de/archiv/podcast/wachundwichtig.xml/feed=podcast.xml"
if(!forceFetch) {
const cachedEpisode = await loadCachedEpisode()
let todayYMD = new Date().toISOString().split("T")[0]
let today = new Date().getDay()
if (today > 0 && today < 6) {
// MO-FR → lade gecachet oder neu
if(cachedEpisode != null) {
const cachedYMD = cachedEpisode.pubDate.split(' ')[0]
if (todayYMD === cachedYMD) {
return cachedEpisode
} else {
let req = new Request(url)
let json = await req.loadJSON()
await saveLatestEpisode(JSON.stringify(json.items[0]))
return json.items[0]
}
} else {
forceFetch = true
}
} else {
// SA oder SO, lade gecachte Folge, falls vorhanden
if (cachedEpisode != null) {
return cachedEpisode
} else {
forceFetch = true
}
}
}
if(forceFetch) {
console.log("forced fetch")
let req = new Request(url)
let json = await req.loadJSON()
await saveLatestEpisode(JSON.stringify(json.items[0]))
return json.items[0]
}
}
// Ermittelt den Wochentag für einen übergebenen Tag
function getWeekday(date) {
var weekday = new Array(7);
weekday[0] = "Sonntag";
weekday[1] = "Montag";
weekday[2] = "Dienstag";
weekday[3] = "Mittwoch";
weekday[4] = "Donnerstag";
weekday[5] = "Freitag";
weekday[6] = "Samstag";
return weekday[date.getDay()];
}
// Lädt Metadaten der letzten gecachten Folge aus iCloud Drive
async function loadCachedEpisode() {
let fm = FileManager.iCloud()
let dir = fm.documentsDirectory()
let path = fm.joinPath(dir, "wuw-latest-episode.txt")
let latestEpisode = Data.fromFile(path)
if (latestEpisode != null) {
return JSON.parse(latestEpisode.toRawString())
} else {
return null
}
}
// Speichert Meta-Informationen der neuesten Folge in iCloud Drive
async function saveLatestEpisode(latestEpisode) {
let fm = FileManager.iCloud()
let dir = fm.documentsDirectory()
let path = fm.joinPath(dir, "wuw-latest-episode.txt")
fm.writeString(path, latestEpisode)
}
// Lädt Bilder einmalig aus dem Netz, ansonsten gecachet
async function getImage(image) {
let fm = FileManager.local()
let dir = fm.documentsDirectory()
let path = fm.joinPath(dir, image)
if (fm.fileExists(path)) {
return fm.readImage(path)
} else {
// download once
let imageUrl
switch (image) {
case 'radioeins-logo.png':
imageUrl = "https://i.imgur.com/qfmIT2S.png"
break
case 'wuw-logo.jpg':
imageUrl = "https://i.imgur.com/hLFaeIz.jpg"
break
case 'play-button.png':
imageUrl = "http://www.myiconfinder.com/uploads/iconsets/256-256-0424923e1bfdd129567c714224d38010.png"
break
default:
console.log(`Sorry, couldn't find ${image}.`);
}
let iconImage = await loadImage(imageUrl)
fm.writeImage(path, iconImage)
return iconImage
}
}
// Lädt ein Bild von einer übergebenen URL
async function loadImage(imgUrl) {
const req = new Request(imgUrl)
return await req.loadImage()
}
// Ende des Skripts
// Bitte alles bis zum Ende markieren
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment