Exemple #1
0
def title_text_search():
    query = request.args.get('query')
    not_listed = request.args.get('more') if request.args.get('more') else None
    titles = None

    if not not_listed:
        titles = Title.find_by_title(query)

    if titles:
        response = []
        for title in titles:
            response.append({
                "uid":
                title.uid,
                "title":
                title.title,
                "released":
                title.released,
                "title_type":
                title.title_type,
                "children_known":
                title.children_known if title.children_known else False
            })
        return {"known": True, "results": response, "query": query}

    response = API.retrieve('/search/multi', {'query': query})
    titles = parse_search_results(response, "titles")
    return {"known": False, "results": titles}
Exemple #2
0
    def add_titles(self, titles_info):
        try:
            from titles import Title
        except ImportError:
            from coactors.titles import Title

        query = """MERGE (a:Actor {uid: $uid}) 
                ON CREATE SET a += {name: $name} 
                SET a += {children_known: True} 

                WITH a 
                CALL {
                WITH a 
                UNWIND $batch as row 
                MERGE (_:Title {uid: row.uid}) 
                ON CREATE SET _ += {title: row.title, released: row.released, title_type: row.title_type} 
                MERGE (a)-[:ACTED_IN]->(_) 
                RETURN _ 
                }"""
            
        params = {"name": self.name, "uid": self.uid}
        batch = []

        for i in range(0,len(titles_info)):

            batch.append( {"uid": titles_info[i]["uid"], "title":titles_info[i]["title"],
            "released":titles_info[i]["released"],"title_type":titles_info[i]["title_type"]} )

        params['batch'] = batch
        return Title.match(graph ).raw_query(query, params)
Exemple #3
0
def get_titles_data(titles_attr):
    new_titles = []

    for title in titles_attr:

        uid = None
        if type(title) == dict:
            uid = title['uid']
            title_type = title['title_type']

        elif type(title) == Title and (title.children_known is None
                                       or not title.children_known):
            uid = title.uid[2:]
            title_type = title.title_type

        if uid:

            if title_type == "movie":
                response = API.retrieve(f'/{title_type}/{uid}',
                                        {'append_to_response': "credits"})
            else:
                response = API.retrieve(
                    f'/{title_type}/{uid}',
                    {'append_to_response': "aggregate_credits"})

            cast = Title.parse_cast(response, title_type)

            new_titles.append(cast)

    return new_titles
Exemple #4
0
def find_title(uid):
    title = Title.find_by_uid(uid)
    if title:
        cast = title.get_cast()

        return title.serialize2(cast)
    else:
        return {}
Exemple #5
0
def get_titles():
    titles = Title.get_all()

    title_list = []
    for title in titles:
        title_list.append(title.serialize())

    from flask import jsonify
    return jsonify(title_list)
Exemple #6
0
def create_title():
    uid = request.args.get('uid')
    title_type = request.args.get('title_type')
    if uid.isnumeric():

        if title_type == "movie" or title_type == "tv":
            prefix = title_type[0:2]
        else:
            return {}

    elif uid[2:].isnumeric():
        prefix = uid[0:2]
        uid = uid[2:]
        if prefix == "mo":
            title_type = "movie"
        elif prefix == "tv":
            title_type = "tv"

    else:
        return {}

    title = find_title(prefix + uid)
    if title and 'children_known' in title:
        return title

    title_data = get_titles_data([{'uid': uid, "title_type": title_type}])
    t = Title(title_data[0]['uid'], title_data[0]['title'],
              title_data[0]['released'], title_data[0]['title_type'])
    actors_added = t.add_cast(title_data[0]['cast'])

    actors = get_actors_data(actors_added)

    for actor in actors:

        a = Actor(actor['uid'], actor['name'])

        a.add_titles(actor['titles'])

    return redirect(url_for('find_title', uid=title_data[0]['uid']))
Exemple #7
0
    def get_groups_titles(self, actor_uids):

        try:
            from titles import Title
        except ImportError:
            from coactors.titles import Title

        actor_uids.append(self.uid)

        return Title.match(graph ).raw_query("""MATCH(a:Actor)-[r1:ACTED_IN]->(_:Title) 
        WHERE a.uid IN $actor_uids 
        WITH count(r1) as rels, _ 
        WHERE rels = $rels 
        WITH distinct _ """, {"actor_uids":actor_uids, "rels": len(actor_uids)})
Exemple #8
0
def get_multi():
    actors = Actor.get_all(limit=10)

    actor_list = []
    for actor in actors:
        actor_list.append(actor.serialize())

    titles = Title.get_all(limit=10)

    title_list = []
    for title in titles:
        title_list.append(title.serialize())

    return {'titles': title_list, "actors": actor_list}
Exemple #9
0
def create_actor():
    uid = request.args.get('uid')
    uid = uid if uid.isnumeric() else uid[2:]

    if not uid.isnumeric():
        return {}
    actor = find_actor("na" + uid)
    if actor and 'children_known' in actor:
        return actor

    actor_data = get_actors_data([{'uid': uid}])
    a = Actor(actor_data[0]['uid'], actor_data[0]['name'])
    titles_added = a.add_titles(actor_data[0]['titles'])

    casts = get_titles_data(titles_added)

    for cast in casts:
        t = Title(cast['uid'], cast['title'], cast['released'],
                  cast['title_type'])

        t.add_cast(cast['cast'])

    return redirect(url_for('find_actor', uid=actor_data[0]['uid']))
Exemple #10
0
    def parse_filmography(actor_data):
        import json
        try:
            from titles import Title
        except ImportError:
            from coactors.titles import Title

        actor_data = json.loads(actor_data)

        titles = actor_data['combined_credits']['cast']

        result = []
        for title in titles:
            title_type = title['media_type']

            result.append( Title.parse_properties(title, title_type) )

        return {"titles": result, "uid": "na" + str(actor_data['id']),
            "name": actor_data['name']}
Exemple #11
0
def parse_search_results(response, search_type):
    import json
    response = json.loads(response)
    response = response['results']

    result = []

    if search_type == "titles":
        for el in response:
            if el['media_type'] == "tv" or el['media_type'] == "movie":
                result.append(Title.parse_properties(el, None, False))

    #people search
    else:
        for el in response:
            if el['known_for_department'] == "Acting" or el[
                    'known_for_department'] == "acting":
                result.append({'uid': str(el['id']), 'name': el['name']})

    return result
Exemple #12
0
    def parse_cast(title_data, title_type):
        import json
        try:
            from titles import Title
        except ImportError:
            from coactors.titles import Title

        title_data = json.loads(title_data)
        cast = title_data['credits'][
            'cast'] if 'credits' in title_data else title_data[
                'aggregate_credits']['cast']

        properties = Title.parse_properties(title_data, title_type)

        result = []
        min_episodes = int(
            title_data['number_of_episodes'] *
            0.05) if 'number_of_episodes' in title_data else None
        min_episodes = 0 if min_episodes and cast[0][
            'total_episode_count'] < min_episodes else min_episodes
        for actor in cast:
            if 'total_episode_count' in actor and actor[
                    'total_episode_count'] < min_episodes:
                continue
            result.append({
                "uid": "na" + str(actor['id']),
                "name": actor['name']
            })

        return {
            'cast': result,
            'uid': properties['uid'],
            'released': properties['released'],
            "title_type": title_type,
            'title': properties['title']
        }
Exemple #13
0
 def get_titles(self):
     try:
         from titles import Title
     except ImportError:
         from coactors.titles import Title
     return Title.match(graph ).raw_query("MATCH(a:Actor {uid: $uid})-[:ACTED_IN]->(_:Title) ", {"uid":self.uid})