示例#1
0
def loadURL():
    response = {}
    url = request.GET.get("url", None)
    l = request.GET.get("license", None)
    #client_ip
    ip = request.environ.get('REMOTE_ADDR')
    if (url == None or l == None):
        msg = 'Both URL and license parameters are required'
        log.error("/loadURL: " + msg)
        return {"error": 1, "msg": msg}
    try:
        log.info("loadURL params: url:%s ip:%s" % (url, ip))
        media = mediafactory.MediaFactory()
        media.loadFromURL(ip, url)
    except ExifException:
        response["error"] = 1
        response[
            "msg"] = "Could not find any usable media file under %s." % url
        return response
    except Exception as e:
        return {"error": 1, "msg": str(e)}
    log.debug(logtool.pp(media.mediamd))
    media.saveconf()
    media.setlicense(l)
    response = {"uuid": media.uuid, "error": 0, "msg": "Success!"}
    return response
示例#2
0
文件: gtr.py 项目: aranguren/tagger
def loadURL():
    response = {}
    url = request.GET.get("url", None)
    l = request.GET.get("license", None)
    #client_ip
    ip = request.environ.get('REMOTE_ADDR')
    if ( url==None or l==None ):
        msg = 'Both URL and license parameters are required'
        log.error("/loadURL: " + msg)
        return { "error": 1, "msg" : msg }
    try:
        log.info("loadURL params: url:%s ip:%s" %  (url,ip) )
        media = mediafactory.MediaFactory()
        media.loadFromURL( ip, url)
    except ExifException:
        response["error"] = 1 
        response["msg"] = "Could not find any usable media file under %s." %  url
        return response
    except Exception as e:
        return {"error":1 , "msg": str(e)}
    log.debug( logtool.pp(media.mediamd) )
    media.saveconf()
    media.setlicense(l)
    response = { "uuid": media.uuid, "error": 0, "msg":"Success!" }
    return response    
示例#3
0
 def login(self,provider,userid=None):
     log.debug("URL: " + self.request.url)
     # Get optional "async", "oath_token" parameters otherwise assume None
     async = self.request.GET.get("async",None)
     # oauth_token is  only for "callback" i.e. when the request is coming from dropbox
     oauth_token = self.request.GET.get("oauth_token",None)
     callback = self.request.GET.get("callback",False)
     callback = self.request.url if async=="true" else callback
     log.debug("provider: %s, async: %s, oauth_token: %s, userid: %s, callback: %s" % \
         (provider,async,oauth_token, userid, `callback`) )
     log.debug("host: %s, port: %s" % \
         ( self.request.environ.get("SERVER_NAME", "NONE") , self.request.environ.get("SERVER_PORT") ) )
     self.response.headers['Access-Control-Allow-Origin'] = '*'
     if ( provider == "local" ):
         # Local provider has no login yet. It just generates uuids
         if (not userid):
             userid =  uuid.uuid4().hex
         provider = fs_provider.FsProvider(userid)
         res = provider.login()
         log.debug("fs_provider login response: ")
         log.debug( logtool.pp(res))            
     elif ( provider == "dropbox"):
         dbox = dbox_provider.DropboxProvider()
         if (userid):
             # Resume session or Poll
             if (async):
                 #Poll!
                 log.debug("got polling request for :" + userid)
                 return dbox.probe(userid)
             else:
                 #just resume:
                 log.debug("resuming session " + userid)
                 return dbox.login(req_key=userid)
         if (oauth_token):
             # it's a callback from dropbox and not from user. Try to revive session
             try:
                 msg = dbox.callback(oauth_token)
                 log.debug("Callback WORKED!: " + msg)
                 return "Logged in! Feel free to close your browser."
             except DBException as e:
                 return {"error":1 , "msg": str(e)}            
         res = dbox.login(req_key=None, callback=callback)
         log.debug("dropbox_login response: ")
         log.debug( logtool.pp(res))
     else:
         res = { "error": 1 , "msg": "Wrong or unsupported arguments" } 
     return res
示例#4
0
def editGeograph(id):
    """ imports geograph image as if it were uploaded. Creates a new copy of the image and the original image is left untouched """
    response = {}
    #client_ip
    ip = request.environ.get('REMOTE_ADDR')
    #geograph image
    rootdir = db.getGeographDir(id)
    imagename = str(id).zfill(6)
    imagefile = os.path.join(rootdir, imagename + ".jpg")
    log.debug("Downloading %s" % imagefile)
    try:
        media = mediafactory.MediaFactory()
        media.loadFromWeb(ip, imagename + ".jpg", open(imagefile))
        # update coords in exif from geograph database
        (lon, lat, tags) = db.geograph_byid(id)
        log.debug("geograph metadata for " + id)
        log.debug(logtool.pp((lon, lat, tags)))
        #create sessions.js
        media.saveconf()
        updatedata = {
            "GPSLatitude": ` lat `,
            "GPSLongitude": ` lon `,
            "GPSLatitudeRef": "S" if lat < 0 else "N",
            "GPSLongitudeRef": "W" if lon < 0 else "E"
        }
        media.update(updatedata)
        if tags != None:
            media.update({'Tags': tags}, group="Custom")
    except ExifException as e:
        msg = e.shortmsg
        response["error"] = 1
        log.debug("ExifException: " + msg)
        response = {"uuid": media.uuid, "error": 1, "msg": msg}
        return response
    except IOError:
        response["error"] = 1
        response["msg"] = "Could not find geograph file %s." % imagename
        return response
    log.debug(logtool.pp(media.mediamd))
    if media.mediamd != []:
        media.saveconf()
        response = {"uuid": media.uuid, "error": 0, "msg": "Success!"}
    else:
        response["error"] = 1
        response[
            "msg"] = "Could not find any supported format inside %s." % media.filename
    return response
示例#5
0
 def login(self, provider, userid=None):
     log.debug("URL: " + self.request.url)
     # Get optional "async", "oath_token" parameters otherwise assume None
     async = self.request.GET.get("async", None)
     # oauth_token is  only for "callback" i.e. when the request is coming from dropbox
     oauth_token = self.request.GET.get("oauth_token", None)
     callback = self.request.GET.get("callback", False)
     callback = self.request.url if async == "true" else callback
     log.debug("provider: %s, async: %s, oauth_token: %s, userid: %s, callback: %s" % \
         (provider,async,oauth_token, userid, `callback`) )
     log.debug("host: %s, port: %s" % \
         ( self.request.environ.get("SERVER_NAME", "NONE") , self.request.environ.get("SERVER_PORT") ) )
     self.response.headers['Access-Control-Allow-Origin'] = '*'
     if (provider == "local"):
         # Local provider has no login yet. It just generates uuids
         if (not userid):
             userid = uuid.uuid4().hex
         provider = fs_provider.FsProvider(userid)
         res = provider.login()
         log.debug("fs_provider login response: ")
         log.debug(logtool.pp(res))
     elif (provider == "dropbox"):
         dbox = dbox_provider.DropboxProvider()
         if (userid):
             # Resume session or Poll
             if (async):
                 #Poll!
                 log.debug("got polling request for :" + userid)
                 return dbox.probe(userid)
             else:
                 #just resume:
                 log.debug("resuming session " + userid)
                 return dbox.login(req_key=userid)
         if (oauth_token):
             # it's a callback from dropbox and not from user. Try to revive session
             try:
                 msg = dbox.callback(oauth_token)
                 log.debug("Callback WORKED!: " + msg)
                 return "Logged in! Feel free to close your browser."
             except DBException as e:
                 return {"error": 1, "msg": str(e)}
         res = dbox.login(req_key=None, callback=callback)
         log.debug("dropbox_login response: ")
         log.debug(logtool.pp(res))
     else:
         res = {"error": 1, "msg": "Wrong or unsupported arguments"}
     return res
示例#6
0
文件: gtr.py 项目: aranguren/tagger
def editGeograph(id):
    """ imports geograph image as if it were uploaded. Creates a new copy of the image and the original image is left untouched """
    response = {}
    #client_ip
    ip = request.environ.get('REMOTE_ADDR')
    #geograph image
    rootdir = db.getGeographDir(id)
    imagename = str(id).zfill(6)
    imagefile = os.path.join(rootdir, imagename + ".jpg" )
    log.debug("Downloading %s" % imagefile )
    try:
        media = mediafactory.MediaFactory()
        media.loadFromWeb( ip, imagename + ".jpg", open(imagefile) )
        # update coords in exif from geograph database
        (lon,lat,tags) = db.geograph_byid(id)
        log.debug("geograph metadata for " + id )
        log.debug( logtool.pp( (lon,lat,tags) ) )
        #create sessions.js
        media.saveconf()
        updatedata = {
            "GPSLatitude" : `lat`,
            "GPSLongitude" : `lon`,
            "GPSLatitudeRef" : "S" if lat<0 else "N",
            "GPSLongitudeRef" : "W" if lon<0 else "E"
        }
        media.update(updatedata)
        if tags != None:
            media.update( { 'Tags' : tags }, group="Custom" )
    except ExifException as e:
        msg = e.shortmsg
        response["error"] = 1 
        log.debug("ExifException: " + msg )
        response = { "uuid":media.uuid, "error":1, "msg": msg }
        return response
    except IOError:
        response["error"] = 1 
        response["msg"] = "Could not find geograph file %s." %  imagename
        return response    
    log.debug( logtool.pp(media.mediamd))
    if media.mediamd != []:
         media.saveconf()
         response = { "uuid": media.uuid, "error": 0, "msg":"Success!" }
    else:
         response["error"] = 1 
         response["msg"] = "Could not find any supported format inside %s." %  media.filename
    return response    
示例#7
0
文件: gtr.py 项目: aranguren/tagger
def getNearest():
    lon = float(request.GET.get("lon"))
    lat = float(request.GET.get("lat"))
    log.debug('Got AJAX NEAREST request for: %f , %f' % (lon,lat))
    res = db.nearest_dist( lon, lat, 2500.0 )
    # build response tree:
    log.debug( logtool.pp(res))
    return json.dumps(res)
示例#8
0
def getNearest():
    lon = float(request.GET.get("lon"))
    lat = float(request.GET.get("lat"))
    log.debug('Got AJAX NEAREST request for: %f , %f' % (lon, lat))
    res = db.nearest_dist(lon, lat, 2500.0)
    # build response tree:
    log.debug(logtool.pp(res))
    return json.dumps(res)
示例#9
0
文件: gtr.py 项目: aranguren/tagger
def dropbox_login():
    # Get optional req_key and callback URL parameters otherwise assume None
    req_key = request.GET.get("req_key",None)
    callback = request.GET.get("callback", None)
    log.debug("dropbox_login:"******" params callback: " + `callback` + " req_key :" + `req_key`);
    dbox = gtr_dropbox.GTRDropbox()
    response = dbox.login(req_key, callback)
    log.debug("dropbox_login response: ")
    log.debug( logtool.pp(response))
    return response
示例#10
0
def dropbox_login():
    # Get optional req_key and callback URL parameters otherwise assume None
    req_key = request.GET.get("req_key", None)
    callback = request.GET.get("callback", None)
    log.debug("dropbox_login:"******" params callback: " + ` callback ` +
              " req_key :" + ` req_key `)
    dbox = gtr_dropbox.GTRDropbox()
    response = dbox.login(req_key, callback)
    log.debug("dropbox_login response: ")
    log.debug(logtool.pp(response))
    return response
示例#11
0
 def update( self, new_md, group="ALL" ):
     """
       Updated an existing media object + media metadata on the file 
       using externally provided json metadata,
       
       Before updating you must load the old media file to update e.g.:
       
       old = mediafactory.loadFromFile( '4214131214f2' )
       old.update( newmetadata )
       
       Before updating a check is beformed for writability of media file. If 
       file is not writable then only custom tags are used (i.e. tags stored
       in a separate file and exported as a sidecar XMP)
     """
     self.mtime = time.strftime('%d%m%y-%H:%M:%S')
     
     if ( not self.is_writable()):
         log.debug('WARNING: Requested write to group ' + group + \
         ' but filetype is not writable. Switching to group "Custom"')
         group = "Custom"
     
     if group=="Custom":
         #custom tags are saved separately in sessions.js
         self.customtags.update(new_md)
         #delete empty tags from the whole after applying the diff (this is also done by exiftool backend)
         for k in self.customtags.keys():
             if self.customtags[k] == "":
                 del (self.customtags[k])
                 log.debug("deleted: " + k)
         # save keywords in database
         if self.customtags.has_key("keywords"):
             log.debug("saving keywords: " + self.customtags["keywords"] )
             for key in self.customtags["keywords"].split(','):
                 db.insert_key(key)
                 db.connect_key(self.uuid, key)
         self.saveconf() #update mtime and customtags
     else:
         #save mediamd
         self._savedata(new_md)
         #if customtags has coordinates then update db
         if ( new_md.has_key("GPSLatitude") and new_md.has_key('GPSLongitude')  ):
             # anonymise function sets these to '' so ignore!
             if (new_md['GPSLongitude']==""  or new_md["GPSLatitude"]==""):
                 return
             # invariant: uuid MUST EXIST in sessions table
             log.debug("geocoding in DB! Newmd is: " + logtool.pp(new_md))
             res = db.geotag_uuid(self.uuid, new_md['GPSLongitude'],new_md["GPSLatitude"])
             log.debug(`res`)
         self.saveconf() #update mtime only
示例#12
0
文件: gtr.py 项目: aranguren/tagger
def saveMetadata( uuid ):
    log.debug('saveMetadata request for: ' + uuid)
    media = mediafactory.MediaFactory()
    media.loadFromFile(uuid)
    group = request.forms.get('group')
    new_md_json = request.forms.get('metadata')
    new_md = json.loads(new_md_json)
    try:
        media.update( new_md, group )
    except ExifException as e:
        msg = e.shortmsg
        log.debug("ExifException: " + msg )
        return { "uuid":uuid, "error":1, "msg": msg }
    log.debug("got new " + `group` + " metadata: ")
    log.debug( logtool.pp(new_md))
    return { "uuid":uuid, "error":0, "msg": "Metadata saved!" }
示例#13
0
def saveMetadata(uuid):
    log.debug('saveMetadata request for: ' + uuid)
    media = mediafactory.MediaFactory()
    media.loadFromFile(uuid)
    group = request.forms.get('group')
    new_md_json = request.forms.get('metadata')
    new_md = json.loads(new_md_json)
    try:
        media.update(new_md, group)
    except ExifException as e:
        msg = e.shortmsg
        log.debug("ExifException: " + msg)
        return {"uuid": uuid, "error": 1, "msg": msg}
    log.debug("got new " + ` group ` + " metadata: ")
    log.debug(logtool.pp(new_md))
    return {"uuid": uuid, "error": 0, "msg": "Metadata saved!"}
示例#14
0
            el.append (inject)
            #log.debug("DUMP")
            #log.debug(ETree.tostring(el))
            etr.write(xmpfile,encoding="utf-8")
        else:
            shutil.copy(tmpfile, xmpfile)
        return True    

if __name__ == "__main__":
    ip = '127.0.0.1'
    uploadData = open ( configuration.getTest1() )
    mf = MediaFactory()
    mf.loadFromWeb(ip, "MyMedia.jpg" , uploadData)
    mf.saveconf()
    print "First Media Instance session:\n"
    log.debug( logtool.pp(mf.datasetname) )
    #### now close and reopen ##
    uuid = mf.uuid
    del(mf)
    mf2 = MediaFactory()
    mf2.loadFromFile(uuid)
    print "================================"
    print "Second Media Instance session:"
    print mf2.datasetname
    print "================================"
    print "Second Media Metadata:"
    log.debug( logtool.pp(mf2.mediamd))
    print "old BaseISO value: " + `mf2.mediamd["BaseISO"]`
    updatedict = { 'BaseISO' : 666 }
    log.debug( logtool.pp('using update vector: ' + `updatedict`))
    #save inside media file