From da090d883e5d2786de373b0459a53bae5bfa6a7c Mon Sep 17 00:00:00 2001 From: Matthew Justin Bauer Date: Fri, 6 Mar 2015 20:00:44 -0600 Subject: [PATCH] Initial code posted. --- .gitignore | 2 + alien.png | Bin 0 -> 667 bytes detools/__init__.py | 0 detools/de.py | 46 +++++ detools/imagefinder.py | 57 ++++++ wallpaper.py => detools/wallpaper.py | 71 +++---- praw.ini | 98 ++++++++++ reddwall.py | 277 +++++++++++++++++++++++---- scheduler.py | 15 -- setup.py | 54 ++++-- 10 files changed, 507 insertions(+), 113 deletions(-) create mode 100644 alien.png create mode 100644 detools/__init__.py create mode 100644 detools/de.py create mode 100755 detools/imagefinder.py rename wallpaper.py => detools/wallpaper.py (63%) delete mode 100755 scheduler.py diff --git a/.gitignore b/.gitignore index c26b157..68e55cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ dist build *.pyc +*.egg +*.tar.gz diff --git a/alien.png b/alien.png new file mode 100644 index 0000000000000000000000000000000000000000..712693db635484b34949d506b4186e5ebfeeb201 GIT binary patch literal 667 zcmV;M0%ZM(P)WFU8GbZ8()Nlj2>E@cM*00I9=L_t(I%au}3h!Sxa zeY-7;5+aIw&^(wiPR%$MyGV;fm^GM!Ev zYv!>JU>CrF%jFt(yIo3>L;%=YBm5LV3BVTsZ|3v)d^Ve5u~@9z92x*&Nz7)mUlhdy zK@fH>3T**!0Z;%O0k{I-@_ELMbF}9G9w(E@ZADS+f*@?R+wEaCn>`s0ho1mEJoT9X zi~&IO`~4I}kxr-cIGs-OZzvXv^m@ItTCL+?Fi4xtwg-#F@@h7l(dYBAUa#|C7z_rC zMx*TYdQ2n|W7urA*QHX4wOVcEdbUHp&#d^5@8qLvWbK0?g~MT{QmHWjNUEx?%tsaS z7RdXqmG*X*yaRIYt|7(aaat^vmjD1slFrWg;`Z4Ies;(w*U7JkhLp)<2;j!DK%4)G zNF+i4+soD6t5hnBTCEy$WC7w{@MTl002ovPDHLkV1lGc BBTN7Q literal 0 HcmV?d00001 diff --git a/detools/__init__.py b/detools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/detools/de.py b/detools/de.py new file mode 100644 index 0000000..b8a4e57 --- /dev/null +++ b/detools/de.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +import os +import sys + +def get_desktop_environment(): + if sys.platform in ["win32", "cygwin"]: + return "windows" + elif sys.platform == "darwin": + return "mac" + else: #Most likely either a POSIX system or something not much common + desktop_session = os.environ.get("DESKTOP_SESSION") + if desktop_session is not None: #easier to match if we doesn't have to deal with caracter cases + desktop_session = desktop_session.lower() + if desktop_session in ["gnome","unity", "cinnamon", "mate", "xfce4", "lxde", "fluxbox", + "blackbox", "openbox", "icewm", "jwm", "afterstep","trinity", "kde"]: + return desktop_session + ## Special cases ## + # Canonical sets $DESKTOP_SESSION to Lubuntu rather than LXDE if using LXDE. + # There is no guarantee that they will not do the same with the other desktop environments. + elif "xfce" in desktop_session or desktop_session.startswith("xubuntu"): + return "xfce4" + elif desktop_session.startswith("ubuntu"): + return "unity" + elif desktop_session.startswith("lubuntu"): + return "lxde" + elif desktop_session.startswith("kubuntu"): + return "kde" + elif desktop_session.startswith("razor"): # e.g. razorkwin + return "razor-qt" + elif desktop_session.startswith("wmaker"): # e.g. wmaker-common + return "windowmaker" + if os.environ.get('KDE_FULL_SESSION') == 'true': + return "kde" + elif os.environ.get('GNOME_DESKTOP_SESSION_ID'): + if not "deprecated" in os.environ.get('GNOME_DESKTOP_SESSION_ID'): + return "gnome2" + #From http://ubuntuforums.org/showthread.php?t=652320 + elif self.is_running("xfce-mcs-manage"): + return "xfce4" + elif self.is_running("ksmserver"): + return "kde" + return "unknown" + +if __name__ == "__main__": + print(get_desktop_environment()) diff --git a/detools/imagefinder.py b/detools/imagefinder.py new file mode 100755 index 0000000..7eacb41 --- /dev/null +++ b/detools/imagefinder.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import requests +from bs4 import BeautifulSoup +import urlparse + +class NoImageFound(Exception): + def __init__(self, url): + self.url = url + def __str__(self): + return "Could not find an image for the url %s" % self.url + +def get_image_links(soup): + links = [] + links.extend(soup.select('.image a')) # imgur + links.extend(soup.select('a.js-download')) # pexels + links.extend(soup.select('#allsizes-photo img')) # flickr + links.extend(soup.select('a[imageanchor]')) # blogspot + links.extend(soup.select('.dev-view-deviation img')) # deviantart + links.extend(soup.select('img#wallpaper')) # wallhaven + links.extend(soup.select('.post a img')) # imgur + return links + +def get_image_request(url, follow=True): + url = urlparse.urlparse(url, 'http') + r = requests.get(url.geturl()) + content_type = r.headers['content-type'].split(';')[0] + if follow and 'location' in r.headers: + return get_image_request(r.headers['location'], False) + if follow and content_type == 'text/html': + soup = BeautifulSoup(r.text) + links = get_image_links(soup) + if len(links) == 0: + raise NoImageFound(url.geturl()) + link = links[0] + link_url = None + if link.has_attr('href'): + link_url = link['href'] + elif link.has_attr('src'): + link_url = link['src'] + if link_url is None: + raise NoImageFound(url.geturl()) + return get_image_request(link_url, False) + if not content_type.startswith('image/'): + raise NoImageFound(url.geturl()) + return r + +if __name__ == "__main__": + import praw + + r = praw.Reddit(user_agent='reddwall:v1.0.1 (by /u/mjbauer95)') + + for submission in r.get_subreddit('wallpaper').get_hot(limit=100): + try: + get_image_request(submission.url) + except NoImageFound: + print(submission.url) diff --git a/wallpaper.py b/detools/wallpaper.py similarity index 63% rename from wallpaper.py rename to detools/wallpaper.py index 90e244d..f981689 100755 --- a/wallpaper.py +++ b/detools/wallpaper.py @@ -1,10 +1,13 @@ #!/usr/bin/env python -import os import sys import subprocess +import tempfile +import de class WallpaperSetter: + def __init__(self, environment): + self.environment = environment def set_wallpaper(self, filename): pass @@ -90,60 +93,36 @@ def get_args(self, filename): class MacWallpaperSetter(PopenWallpaperSetter): def get_args(self, filename): return 'osascript -e "tell application \\"Finder\\" to set desktop picture to POSIX file \\"%s\\""' % filename - wallpaper_setters["mac"] = MacWallpaperSetter -def get_desktop_environment(): - if sys.platform in ["win32", "cygwin"]: - return "windows" - elif sys.platform == "darwin": - return "mac" - else: #Most likely either a POSIX system or something not much common - desktop_session = os.environ.get("DESKTOP_SESSION") - if desktop_session is not None: #easier to match if we doesn't have to deal with caracter cases - desktop_session = desktop_session.lower() - if desktop_session in ["gnome","unity", "cinnamon", "mate", "xfce4", "lxde", "fluxbox", - "blackbox", "openbox", "icewm", "jwm", "afterstep","trinity", "kde"]: - return desktop_session - ## Special cases ## - # Canonical sets $DESKTOP_SESSION to Lubuntu rather than LXDE if using LXDE. - # There is no guarantee that they will not do the same with the other desktop environments. - elif "xfce" in desktop_session or desktop_session.startswith("xubuntu"): - return "xfce4" - elif desktop_session.startswith("ubuntu"): - return "unity" - elif desktop_session.startswith("lubuntu"): - return "lxde" - elif desktop_session.startswith("kubuntu"): - return "kde" - elif desktop_session.startswith("razor"): # e.g. razorkwin - return "razor-qt" - elif desktop_session.startswith("wmaker"): # e.g. wmaker-common - return "windowmaker" - if os.environ.get('KDE_FULL_SESSION') == 'true': - return "kde" - elif os.environ.get('GNOME_DESKTOP_SESSION_ID'): - if not "deprecated" in os.environ.get('GNOME_DESKTOP_SESSION_ID'): - return "gnome2" - #From http://ubuntuforums.org/showthread.php?t=652320 - elif self.is_running("xfce-mcs-manage"): - return "xfce4" - elif self.is_running("ksmserver"): - return "kde" - return "unknown" - def get_wallpaper_setter(): - environment = get_desktop_environment() + environment = de.get_desktop_environment() if environment in wallpaper_setters: - return wallpaper_setters[environment]() - return None + return wallpaper_setters[environment](environment) + return WallpaperSetter(environment) + +class WallpaperSetterError(Exception): + def __init__(self, environment): + self.environment = environment + def __str__(self): + return "Cannot set wallpaper for %s" % self.environment def set_wallpaper(filename): wallpaper_setter = get_wallpaper_setter() if wallpaper_setter is not None: - wallpaper_setter.set_wallpaper(filename) + try: + wallpaper_setter.set_wallpaper(filename) + except: + raise WallpaperSetterError(wallpaper_setter.environment) else: - raise Exception("Wallpaper could not be set because you're desktop is not recognized.") + raise WallpaperSetterError(wallpaper_setter.environment) + +def set_wallpaper_request(request): + i, path = tempfile.mkstemp() + with open(path, 'wb') as fo: + for chunk in request.iter_content(4096): + fo.write(chunk) + set_wallpaper(path) if __name__ == "__main__": if len(sys.argv) > 1: diff --git a/praw.ini b/praw.ini index e69de29..1065dc1 100644 --- a/praw.ini +++ b/praw.ini @@ -0,0 +1,98 @@ +[DEFAULT] +# Time, a float, in seconds, required between calls. See: +# http://code.reddit.com/wiki/API +api_request_delay: 2.0 + +# A boolean to indicate whether or not to check for package updates. +check_for_updates: True + +# Time, a float, in seconds, to save the results of a get/post request. +cache_timeout: 30 + +# A boolean to indicate if html entities should be decoded +decode_html_entities: False + +# Whether or not to use HTTPS for oauth connections. This should only be +# changed for development environments. +oauth_https: True + +# The maximum length of unicode representations of Comment, Message and +# Submission objects. This is mainly used to fit them within a terminal window +# line. A negative value means no limit. +output_chars_limit: 80 + +# Maximum time, a float, in seconds, before a single HTTP request times +# out. urllib2.URLError is raised upon timeout. +timeout: 45 + +# Object to kind mappings +comment_kind: t1 +message_kind: t4 +redditor_kind: t2 +submission_kind: t3 +subreddit_kind: t5 + +# Log the API calls +# 0: no logging +# 1: log only the request URIs +# 2: log the request URIs as well as any POST data +log_requests: 0 + +# A boolean to indicate if json_dict, which contains the original API response, +# should be stored on every object in the json_dict attribute. Default is +# False as memory usage will double if enabled. +store_json_result: False + +[reddit] +domain: www.reddit.com +oauth_domain: oauth.reddit.com +short_domain: redd.it +ssl_domain: ssl.reddit.com + +[reddit_bypass_cdn] +domain: api.reddit.com +oauth_domain: oauth.reddit.com +short_domain: redd.it +ssl_domain: ssl.reddit.com + +[reddit_bypass_cdn_oauth_test] +domain: www.reddit.com +short_domain: redd.it +ssl_domain: ssl.reddit.com +oauth_domain: oauth.reddit.com +oauth_client_id: stJlUSUbPQe5lQ +oauth_client_secret: iU-LsOzyJH7BDVoq-qOWNEq2zuI +oauth_redirect_uri: https://127.0.0.1:65010/authorize_callback + +[reddit_oauth_test] +domain: www.reddit.com +short_domain: redd.it +ssl_domain: ssl.reddit.com +oauth_domain: oauth.reddit.com +oauth_client_id: stJlUSUbPQe5lQ +oauth_client_secret: iU-LsOzyJH7BDVoq-qOWNEq2zuI +oauth_redirect_uri: https://127.0.0.1:65010/authorize_callback + +[local] +domain: reddit.local +api_request_delay: 0 + +message_kind: t7 +submission_kind: t6 +subreddit_kind: t5 +log_requests: 0 + +[local_oauth_test] +domain: reddit.local +api_request_delay: 0 + +message_kind: t7 +submission_kind: t6 +subreddit_kind: t5 +log_requests: 0 + +oauth_https: False +oauth_domain: reddit.local +oauth_client_id: gXMPrZscuuUgaw +oauth_client_secret: JfmLYwwsP9Dj2z513JdTEOeXEaQ +oauth_redirect_uri: http://127.0.0.1:65010/authorize_callback diff --git a/reddwall.py b/reddwall.py index 060cc04..1a43a2f 100755 --- a/reddwall.py +++ b/reddwall.py @@ -1,39 +1,250 @@ #!/usr/bin/env python - -import wallpaper +from detools import imagefinder +from detools import wallpaper import praw -import tempfile -import requests import random -from bs4 import BeautifulSoup +import wx +import os.path +import json r = praw.Reddit(user_agent='mac:org.bauer.reddwall:v1.0.0 (by /u/mjbauer95)') -def download_image(source, dest): - response = requests.get(source) - if response.status_code == 200: - with open(dest, 'wb') as fo: - for chunk in response.iter_content(4096): - fo.write(chunk) - -def download_submission(source, dest): - if 'http://imgur.com/' in source: - html_source = requests.get(source).text - soup = BeautifulSoup(html_source) - source = soup.select('.image a')[0]['href'] - if source.startswith('//'): - source = 'http:' + source - download_image(source, dest) - -def new_wallpaper(): - f, path = tempfile.mkstemp() - choices = [] - #submission = r.get_random_submission('wallpapers') - #submission = next(r.get_subreddit('wallpapers').get_top(limit=1)) - for submission in r.get_subreddit('wallpapers').get_top(limit=100): - choices.append(submission.url) - download_submission(random.choice(choices), path) - wallpaper.set_wallpaper(path) - -if __name__ == "__main__": - new_wallpaper() +pasts = ['hour', 'week', 'day', 'month', 'year', 'all'] +suggested_subreddits = ['wallpapers', 'wallpaper', 'EarthPorn', 'BackgroundArt', 'TripleScreenPlus', 'quotepaper', 'BigWallpapers', 'MultiWall', 'DesktopLego', 'VideoGameWallpapers'] + +default_settings = dict( + interval = 1, + minVote = 100, + subreddit = 'wallpapers', + search = '', + past = 'year', + allowNSFW = False +) + +class PreferencesDialog(wx.Dialog): + def __init__(self, app): + wx.Dialog.__init__(self, None, wx.ID_ANY, 'ReddWall', size=(400, 400)) + self.app = app + vbox = wx.BoxSizer(wx.VERTICAL) + + vbox.Add(wx.StaticText(self, label='Find wallpapers...', style=wx.ALIGN_CENTRE)) + + vbox.Add((-1, 25)) + + subredditBox = wx.BoxSizer(wx.HORIZONTAL) + subredditBox.Add((25, -1)) + subredditBox.Add(wx.StaticText(self, label='From the ')) + self.subredditCombo = wx.ComboBox(self, value=self.app.settings['subreddit'], choices=suggested_subreddits) + self.subredditCombo.Bind(wx.EVT_TEXT, self.SetSubredditCombo) + self.subredditCombo.Bind(wx.EVT_COMBOBOX, self.SetSubredditCombo) + subredditBox.Add(self.subredditCombo) + subredditBox.Add(wx.StaticText(self, label=' subreddit')) + vbox.Add(subredditBox) + vbox.Add((-1, 25)) + + searchBox = wx.BoxSizer(wx.HORIZONTAL) + searchBox.Add((25, -1)) + searchBox.Add(wx.StaticText(self, label='Containing search terms ')) + self.searchText = wx.TextCtrl(self, value=self.app.settings['search']) + self.searchText.Bind(wx.EVT_TEXT, self.SetSearchText) + searchBox.Add(self.searchText) + vbox.Add(searchBox) + vbox.Add((-1, 25)) + + minVoteBox = wx.BoxSizer(wx.HORIZONTAL) + minVoteBox.Add((25, -1)) + minVoteBox.Add(wx.StaticText(self, label='With at least ')) + self.minVoteSpin = wx.SpinCtrl(self, value=str(self.app.settings['minVote']), min=0, max=10000) + self.minVoteSpin.Bind(wx.EVT_SPINCTRL, self.SetMinVoteSpin) + minVoteBox.Add(self.minVoteSpin) + minVoteBox.Add(wx.StaticText(self, label=' upvotes')) + vbox.Add(minVoteBox) + vbox.Add((-1, 25)) + + fromBox = wx.BoxSizer(wx.HORIZONTAL) + fromBox.Add((25, -1)) + fromBox.Add(wx.StaticText(self, label='From the past ')) + self.pastCombo = wx.ComboBox(self, choices=pasts, value=self.app.settings['past'], style=wx.CB_READONLY) + self.pastCombo.Bind(wx.EVT_TEXT, self.SetPastCombo) + self.pastCombo.Bind(wx.EVT_COMBOBOX, self.SetPastCombo) + fromBox.Add(self.pastCombo) + vbox.Add(fromBox) + vbox.Add((-1, 25)) + + nsfwBox = wx.BoxSizer(wx.HORIZONTAL) + nsfwBox.Add((25, -1)) + self.nsfwCheck = wx.CheckBox(self, label='Allow NSFW wallpapers?') + self.nsfwCheck.SetValue(self.app.settings['allowNSFW']) + self.nsfwCheck.Bind(wx.EVT_CHECKBOX, self.SetNSFWCheck) + nsfwBox.Add(self.nsfwCheck) + vbox.Add(nsfwBox) + vbox.Add((-1, 25)) + + intervalBox = wx.BoxSizer(wx.HORIZONTAL) + intervalBox.Add((25, -1)) + intervalBox.Add(wx.StaticText(self, label='Update the wallpaper every ')) + self.intervalSpin = wx.SpinCtrl(self, value=str(self.app.settings['interval']), min=1) + self.intervalSpin.Bind(wx.EVT_SPINCTRL, self.SetIntervalSpin) + intervalBox.Add(self.intervalSpin) + intervalBox.Add(wx.StaticText(self, label=' hours')) + vbox.Add(intervalBox) + + vbox.Add((-1, 10)) + vbox.Add(wx.StaticLine(self), 0, wx.EXPAND) + vbox.Add((-1, 10)) + + aboutBox = wx.BoxSizer(wx.HORIZONTAL) + aboutBox.Add((50, -1)) + aboutBox.Add(wx.StaticText(self, label="ReddWall\nby Matthew Bauer ")) + vbox.Add(aboutBox) + + self.SetSizer(vbox) + + def SetIntervalSpin(self, evt): + self.app.settings['interval'] = self.intervalSpin.GetValue() + self.app.OnUpdateInterval() + + def SetNSFWCheck(self, evt): + self.app.settings['allowNSFW'] = self.nsfwCheck.IsChecked() + self.app.OnFilterUpdate() + + def SetPastCombo(self, evt): + self.app.settings['past'] = self.pastCombo.GetValue() + self.app.OnFilterUpdate() + + def SetMinVoteSpin(self, evt): + self.app.settings['minVote'] = self.minVoteSpin.GetValue() + self.app.OnFilterUpdate() + + def SetSearchText(self, evt): + self.app.settings['search'] = self.searchText.GetValue() + self.app.OnFilterUpdate() + + def SetSubredditCombo(self, evt): + self.app.settings['subreddit'] = self.subredditCombo.GetValue() + self.app.OnFilterUpdate() + +class ReddWallIcon(wx.TaskBarIcon): + ID_NEW_OPTION = wx.NewId() + ID_PREF_OPTION = wx.NewId() + + def __init__(self, parent): + wx.TaskBarIcon.__init__(self) + self.SetIcon(wx.Icon("alien.png", wx.BITMAP_TYPE_PNG), "alien") + self.Bind(wx.EVT_MENU, parent.NextWallpaper, id=self.ID_NEW_OPTION) + self.Bind(wx.EVT_MENU, parent.CreatePrefWindow, id=self.ID_PREF_OPTION) + self.Bind(wx.EVT_MENU, parent.Quit, id=wx.ID_EXIT) + + def CreatePopupMenu(self): + menu = wx.Menu() + menu.Append(self.ID_NEW_OPTION, "&Next Wallpaper") + menu.Append(self.ID_PREF_OPTION, "&Preferences...") + menu.Append(wx.ID_EXIT, "&Quit") + return menu + +class ReddWall(wx.App): + SETTINGS_PATH = os.path.join(os.path.expanduser("~"), ".reddwall.json") + MIN_NUM = 10 + MAX_TRIES = 10 + submissions = [] + needSubmissionsUpdate = False + is_running = False + + def __init__(self): + wx.App.__init__(self) + + self.LoadSettings() + + self.icon = ReddWallIcon(self) + + self.GetSubmissions() + + self.NextWallpaper() + + self.timer = wx.Timer(self, -1) + self.Bind(wx.EVT_TIMER, self.NextWallpaper, self.timer) + self.StartTimer() + self.frame = wx.Frame(None, -1, style=wx.NO_BORDER|wx.FRAME_NO_TASKBAR) + self.MainLoop() + + self.SaveSettings() + + def OSXIsGUIApplication(self): + return False + + def SubmissionOkay(self, submission): + return submission.score > self.settings['minVote'] and (self.settings['allowNSFW'] or not submission.over_18) + + def GetSubmissions(self): + subreddit = r.get_subreddit(self.settings['subreddit']) + pasts = { + 'hour': subreddit.get_top_from_hour, + 'day': subreddit.get_top_from_day, + 'week': subreddit.get_top_from_week, + 'month': subreddit.get_top_from_month, + 'year': subreddit.get_top_from_week, + 'all': subreddit.get_top_from_all + } + self.submissions = [] + num_submissions = self.MIN_NUM + request = pasts[self.settings['past']](limit=100) + for submission in request: + if self.SubmissionOkay(submission): + self.submissions.append(submission) + num_submissions -= 1 + random.shuffle(self.submissions) + self.needSubmissionsUpdate = False + + def UntilValidImageUrl(self): + tries = self.MAX_TRIES + while tries > 0: + try: + if len(self.submissions) == 0: + self.GetSubmissions() + submission = self.submissions.pop() + return imagefinder.get_image_request(submission.url) + except imagefinder.NoImageFound: + tries -= 1 + continue + + def NextWallpaper(self, evt=None): + if self.is_running: + return + self.is_running = True + if self.needSubmissionsUpdate: + self.GetSubmissions() + wallpaper.set_wallpaper_request(self.UntilValidImageUrl()) + self.is_running = False + + def CreatePrefWindow(self, evt=None): + pref = PreferencesDialog(self) + pref.Show() + + def StartTimer(self): + self.timer.Start(self.settings['interval'] * 60 * 60 * 1000) + + def OnUpdateInterval(self): + self.timer.Stop() + self.StartTimer() + + def OnFilterUpdate(self): + self.needSubmissionsUpdate = True + + def SaveSettings(self): + with open(self.SETTINGS_PATH, 'w') as outfile: + json.dump(self.settings, outfile) + + def LoadSettings(self): + if not os.path.exists(self.SETTINGS_PATH): + self.settings = default_settings + else: + try: + with open(self.SETTINGS_PATH, 'r') as infile: + self.settings = json.load(infile) + except: + self.settings = default_settings + + def Quit(self, evt=None): + self.ExitMainLoop() + +ReddWall() diff --git a/scheduler.py b/scheduler.py deleted file mode 100755 index 9a0964f..0000000 --- a/scheduler.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python - -import sched -import time -import reddit - -def run_schedule(sc): - reddit.new_wallpaper() - sc.enter(60, 1, run_schedule, (sc,)) - -if __name__ == "__main__": - s = sched.scheduler(time.time, time.sleep) - s.enter(0, 1, run_schedule, (s,)) - s.run() - diff --git a/setup.py b/setup.py index 5714541..fe643e6 100644 --- a/setup.py +++ b/setup.py @@ -4,29 +4,45 @@ import sys from setuptools import setup -mainscript = 'schedule.py' +mainscript = 'reddwall.py' if sys.platform == 'darwin': - extra_options = dict( - setup_requires=['py2app'], - app=[mainscript], - # Cross-platform applications generally expect sys.argv to - # be used for opening files. - options=dict(py2app=dict(argv_emulation=True)), - ) + extra_options = dict( + setup_requires=['py2app'], + app=[mainscript], + # Cross-platform applications generally expect sys.argv to + # be used for opening files. + options=dict(py2app=dict( + plist={ + 'CFBundleName': 'ReddWall', + 'CFBundleShortVersionString':'1.0.0', # must be in X.X.X format + 'CFBundleVersion': '1.0.0', + 'CFBundleIdentifier': 'com.bauer.reddwall', #optional + 'NSHumanReadableCopyright': '@ Matthew Bauer 2015', #optional + 'CFBundleDevelopmentRegion': 'English', #optional - English is default +# 'LSBackgroundOnly': 'true', + }, + )), + ) elif sys.platform == 'win32': - extra_options = dict( - setup_requires=['py2exe'], - app=[mainscript], - ) + extra_options = dict( + setup_requires=['py2exe'], + app=[mainscript], + ) else: - extra_options = dict( - # Normally unix-like platforms will use "setup.py install" - # and install the main script as such - scripts=[mainscript], - ) + extra_options = dict( + # Normally unix-like platforms will use "setup.py install" + # and install the main script as such + scripts=[mainscript], + ) setup( -name="reddwall", -**extra_options + name="ReddWall", + version="1.0", + author="Matthew Bauer", + author_email="mjbauer95@gmail.com", + url="http://matthewbauer.us/reddwall", + install_requires=["wxpython", "praw", "beautifulsoup4"], + data_files=["praw.ini", "alien.png"], + **extra_options )