Changeset 16524


Ignore:
Timestamp:
Aug 11, 2016, 1:19:05 PM (3 years ago)
Author:
dferreira
Message:

Changes made to synchronous and asynchronous requests. Bug fixed in database between app id and md5.

Location:
internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector/aptoide_mature_app_detector/explicit_content_detector/API/Explicit_detector/analyse_app.py

    r16518 r16524  
    5151        # If exists, just return the value.
    5252        # Otherwise, create a new record in the table
    53         c.execute(''' SELECT ID FROM app WHERE app_id=? ''',(int(app_id),))
     53
     54        c.execute(''' SELECT ID FROM app WHERE app_md5=? ''',(app_md5,))
    5455        res = c.fetchone()
    5556
     
    6364                        tb_id = res[0]
    6465        else:
    65                 c.execute(''' INSERT INTO app (app_id, app_md5) VALUES (?,?) ''',(app_id,app_md5,))
     66                c.execute(''' INSERT INTO app(app_md5) VALUES (?) ''',(app_md5,))
    6667                db.commit()
    67                 c.execute(''' SELECT ID FROM app WHERE app_id=? ''',(app_id,))
     68                c.execute(''' SELECT ID FROM app WHERE app_md5=? ''',(app_md5,))
    6869                tb_id = c.fetchone()[0]
    6970
  • internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector/aptoide_mature_app_detector/explicit_content_detector/API/urls.py

    r16487 r16524  
    77    url(r'^md5sum=(?P<app_md5>[0-9a-zA-Z]+)/$', views.getbyMD5, name='md5'),
    88    url(r'^id=(?P<app_id>[0-9]+)/$', views.getbyId, name='id'),
    9     url(r'^(?P<app_id>[0-9]+)/true/$', views.true, name='true'),
    10     url(r'^(?P<app_id>[0-9]+)/false/$', views.false, name='false'),
    11     url(r'^error/$', views.error, name='error'),
    129]
  • internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector/aptoide_mature_app_detector/explicit_content_detector/API/views.py

    r16518 r16524  
    1010
    1111# If you don't have acess to local images, change the config.json "local_or_web_images" to "web" instead of "local"
    12 
     12from threading import Thread
    1313import os
    1414from django.http import HttpResponse
     
    2626class Model(ModelBase):
    2727        _model = analyse_app.get_model()
    28         _time = datetime.now()
    2928        _local = True
    3029
     30
     31def postpone(function):
     32  def decorator(*args, **kwargs):
     33    t = Thread(target = function, args=args, kwargs=kwargs)
     34    t.daemon = True
     35    t.start()
     36  return decorator
    3137
    3238
     
    4046        return final_path
    4147
    42 
    4348# Function that analyses the information of an app and returns if it is explicit or not
    44 def get_data(page):
     49@postpone
     50def get_data_async(page, url_async):
    4551        illust2vec = Model._model
    4652        exp = False
     
    120126                if dist>0.5:
    121127                        exp = True
     128        try:
     129                print "Opening "+str(url_async)+str(exp)
     130                return urllib2.urlopen(str(url_async)+str(exp))
     131        except:
     132                print "Could not open the webpage"
     133
     134# Function that analyses the information of an app and returns if it is explicit or not
     135def get_data_sync(page):
     136        illust2vec = Model._model
     137        exp = False
     138
     139        p = os.path.abspath(os.path.join("../", os.pardir))
     140
     141        with open(p+"/config.json") as json_data:
     142                config = json.load(json_data)
     143
     144        if config['directories']['local_or_web_images']=='web':
     145                        Model._local = False
     146
     147
     148        print "Fetching data..."
     149        title = page['meta']['title']
     150
     151        description = page['meta']['description']
     152
     153        categories = []
     154
     155        for cat in page['meta']['categories']['standard']:
     156                categories.append(cat['name'])
     157
     158        for cat in page['meta']['categories']['custom']:
     159                categories.append(cat['name'])
     160
     161        scr = []
     162        scr_hd = []
     163        # Relative path to our images. To use on outer machine, uncomment the following code and comment the next line after that code.
     164        if 'sshots' in page['media']:
     165                for s in page['media']['sshots']:
     166                        if Model._local:
     167                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
     168                        else:
     169                                try:
     170                                        scr.append(s['path'])
     171                                except:
     172                                        scr.append(s)
     173
     174        if 'sshots_hd' in page['media']:
     175                for s in page['media']['sshots_hd']:
     176                        if Model._local:
     177                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
     178                        else:
     179                                try:                           
     180                                        scr_hd.append(s['path'])
     181                                except:
     182                                        scr_hd.append(s)
     183
     184        min_age = page['meta']['min_age']
     185
     186        icon = page['apk']['icon']
     187
     188        if Model._local:
     189                icon = local_url(config['directories']['local_image_path_prefix'], icon)
     190
     191        icon_hd = []
     192        if 'icon_hd' in page['apk']:
     193                icon_hd = page['apk']['icon_hd']
     194                if Model._local:
     195                        icon_hd = local_url(config['directories']['local_image_path_prefix'],icon_hd)
     196
     197        icons = []
     198        icons.append(icon)
     199        if icon_hd:
     200                icons.append(icon_hd)
     201
     202        screenshots = scr+scr_hd
     203        size = len(description)
     204        print "Analysing app..."
     205        # Gets the percentage for safe and explicit content
     206        dist = analyse_app.analyse_app(page['apk']['id'], page['apk']['md5sum'], illust2vec, icons, screenshots, description,''.join(categories), min_age, size, title)
     207        try:
     208                if dist.prob('exp')>0.5:
     209                        exp = True
     210        except:
     211                if dist>0.5:
     212                        exp = True
    122213        print "Done"
    123214        return exp
    124215
     216
     217
    125218# View for get by id
     219# For more detailed error logs comment the try... except and indentate correctly its content
     220
    126221def getbyId(request, app_id):
    127222        now = datetime.now()
    128223        url = "http://webservices.aptoide.com/webservices/3/getApkInfo/id:"
    129 
    130         Model._time = now
     224        p = os.path.abspath(os.path.join("../", os.pardir))
     225        with open(p+"/config.json") as json_data:
     226                config = json.load(json_data)
    131227        exp = False
    132228        try:
     
    138234                page = json.loads(text)
    139235                if page['status']!='FAIL':
    140 
    141                         exp = get_data(page)
     236                        if config["synchronous_or_asynchronous"]=="asynchronous":
     237                                get_data_async(page, config["directories"]["asynchronous_dir"])
     238                                return HttpResponse("Waiting")
     239                        exp = get_data_sync(page)
    142240
    143241                else:
    144242                        status = 'Failed'
    145243                        print "App does not exist"
    146                         return redirect('error')
     244                        return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
    147245        except:
    148246                status = 'Failed'
    149247                print "Error during parsing"
    150                 return redirect('error')
     248                return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
    151249
    152250        # If it's explicit content, redirects to true page. Otherwise, redirects to false page.
    153251        if exp:
    154                 return redirect('true', app_id=app_id)
    155         return redirect('false', app_id=app_id)
     252                return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'yes', 'time':str(datetime.now()-now)}, sort_keys=True))
     253        return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'no', 'time':str(datetime.now()-now)}, sort_keys=True))
     254
     255
    156256
    157257# View for get by md5
     258# For more detailed error logs comment the try... except and indentate correctly its content
    158259def getbyMD5(request, app_md5):
    159260        now = datetime.now()
    160261        url = "http://webservices.aptoide.com/webservices/3/getApkInfo/md5sum:"
     262        p = os.path.abspath(os.path.join("../", os.pardir))
     263        with open(p+"/config.json") as json_data:
     264                config = json.load(json_data)
     265
    161266        app_id = 0
    162         Model._time = now
    163267        exp = False
    164268        try:
     
    171275                if page['status']!='FAIL':
    172276
    173                         app_id = page['apk']['id']
    174                         exp = get_data(page)
     277                        if config["synchronous_or_asynchronous"]=="asynchronous":
     278                                get_data_async(page, config["directories"]["asynchronous_dir"])
     279                                return HttpResponse("Waiting")
     280                        exp = get_data_sync(page)
    175281
    176282                else:
    177283                        status = 'Failed'
    178284                        print "App does not exist"
    179                         return redirect('error')
     285                        return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
    180286        except:
    181287                status = 'Failed'
    182288                print "Error during parsing"
    183                 return redirect('error')
     289                return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
    184290
    185291        # If it's explicit content, redirects to true page. Otherwise, redirects to false page.
    186292        if exp:
    187                 return redirect('true', app_id=app_id)
    188         return redirect('false', app_id=app_id)
    189 
    190 def true(request, app_id):
    191         return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'yes', 'time':str(datetime.now()-Model._time)}, sort_keys=True))
    192 
    193 def false(request, app_id):
    194         return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'no', 'time':str(datetime.now()-Model._time)}, sort_keys=True))
    195 
    196 def error(request):
    197         return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-Model._time)}, sort_keys=True))
     293                return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'yes', 'time':str(datetime.now()-now)}, sort_keys=True))
     294        return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'no', 'time':str(datetime.now()-now)}, sort_keys=True))
  • internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector/config.json

    r16516 r16524  
    11{
     2        "synchronous_or_asynchronous": "synchronous",
    23        "directories": {
    34                "_Comments":"paths should always be relative to django project (where you run manage.py runserver)",
     
    910                "ill2vec_tag_list": "API/Explicit_detector/Illustration2Vector/illustration2vec-master/tag_list.json",
    1011                "text_cat_model": "API/Explicit_detector/model_apps_info.pickle",
    11                 "final_database": "API/Explicit_detector/Final_results.db"
     12                "final_database": "API/Explicit_detector/Final_results.db",
     13                "asynchronous_dir": "google.pt/"
    1214        }
     15       
    1316}
Note: See TracChangeset for help on using the changeset viewer.