-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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