from Foundation import * from AppKit import * from PyObjCTools import AppHelper import objc import traceback import urllib import urllib2 def serviceSelector(fn): # this is the signature of service selectors return objc.selector(fn, signature="v@:@@o^@") def ERROR(s): #NSLog(u"ERROR: %s" % (s,)) return s NAME = 'TinyURLService-0.0' TINYURL_API = 'http://tinyurl.com/api-create.php' def getTinyURL(url): data = urllib.urlencode(dict(url=url, source=NAME)) return urllib2.urlopen(TINYURL_API, data).read().decode('utf-8') class TinyURLService(NSObject): @serviceSelector def doTinyURLService_userData_error_(self, pboard, data, error): # Mail.app in 10.4.1 doesn't do NSURLPboardType correctly! # Probably elsewhere too, so we just use strings. try: #NSLog(u'doTinyURLService: %r' % (pboard,)) types = pboard.types() url = None if NSStringPboardType in types: #NSLog(u'getting NSStringPboardType') urlString = pboard.stringForType_(NSStringPboardType) #NSLog(u'NSStringPboardType: %r' % (urlString,)) url = NSURL.URLWithString_(urlString.strip()) if url is None: #NSLog(u'urlString was %r' % (urlString,)) return ERROR(NSLocalizedString( "Error: Given URL was not well-formed.", "Given URL not well-formed." )) if url is None: return ERROR(NSLocalizedString( "Error: Pasteboard doesn't contain a valid URL.", "Pasteboard doesn't contain a valid URL.", )) urlString = url.absoluteString() #NSLog(u'urlString = %r' % (urlString,)) res = getTinyURL(urlString.UTF8String()) #NSLog(u'res = %r' % (res,)) resURL = NSURL.URLWithString_(res) #NSLog(u'resURL = %r' % (resURL,)) if resURL is None: NSLog(u'res was %r' % (res,)) return ERROR(NSLocalizedString( "Error: Resultant URL was not well-formed.", "Resultant URL not well-formed." )) pboard.declareTypes_owner_([NSStringPboardType], None) pboard.setString_forType_(resURL.absoluteString(), NSStringPboardType) return ERROR(None) except: traceback.print_exc() return ERROR(u'Exception, see traceback') def main(): serviceProvider = TinyURLService.alloc().init() NSRegisterServicesProvider(serviceProvider, u'TinyURLService') AppHelper.runConsoleEventLoop() if __name__ == '__main__': main()