bingUpdateWallpaper 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/bin/python
  2. from time import sleep
  3. import argparse
  4. import os
  5. import shutil
  6. import certifi
  7. import urllib3
  8. import anyjson
  9. class BingWallpaperChanger:
  10. def __init__(self, saveDir, wallpaperCmd):
  11. self.saveDir = saveDir
  12. self.savePath = saveDir +"/wallpaper"
  13. self.wallpaperCmd = wallpaperCmd.replace("$PATH", self.savePath)
  14. self.lastUrl = None
  15. def setWallpaper(self):
  16. print("Setting new wallpaper")
  17. os.system(self.wallpaperCmd)
  18. def updateLatest(self):
  19. http = urllib3.PoolManager(
  20. cert_reqs='CERT_REQUIRED',
  21. ca_certs=certifi.where())
  22. jsonReq = http.request('GET', 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US')
  23. if jsonReq.status != 200:
  24. print("bing.com not responding")
  25. exit()
  26. json = anyjson.deserialize(jsonReq.data.decode("utf-8"))
  27. for img in json["images"]:
  28. if img["url"] != self.lastUrl:
  29. try:
  30. os.makedirs(self.savePath)
  31. except FileExistsError:
  32. pass
  33. with http.request('GET', "https://www.bing.com/" +img["url"], preload_content=False) as r, open(self.savePath, 'wb') as outFile:
  34. shutil.copyfileobj(r, outFile)
  35. self.lastUrl = img["url"]
  36. return True
  37. return False
  38. return False
  39. def run(self, delay):
  40. while True:
  41. if self.updateLatest():
  42. self.setWallpaper()
  43. sleep(delay)
  44. if __name__ == '__main__':
  45. parser = argparse.ArgumentParser()
  46. parser.add_argument("--delay", default=30)
  47. parser.add_argument("--saveDir", default=os.environ["HOME"] +"/.local/share/bing")
  48. parser.add_argument("--wallpaperCmd", default="gsettings set org.gnome.desktop.background picture-uri file://$PATH")
  49. args = parser.parse_args()
  50. wallpaperChanger = BingWallpaperChanger(args.saveDir, args.wallpaperCmd)
  51. wallpaperChanger.run(int(args.delay) * 60)