Exemple #1
0
def get_video_id(request):
    ip = ""
    userAgent = request.get_header('User-Agent')
    millisecond = int(round(time.time() * 1000))
    ip = request.get_remote_ip()
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    r = redis_connect()
    staff_list = r.hgetall('x100speed_hash_staff')
    if not staff_list:
        response.set_body('{"status":"failed", "message":"staff ip empty"}')
        return response

    idle_staff_list = {
        key: value
        for key, value in staff_list.items() if int(value) <= 0
    }
    if not idle_staff_list:
        response.set_body('{"status":"failed", "message":"staff is busying"}')
        return response

    staff = idle_staff_list.popitem()
    staff_ip = staff[0].decode()
    hash_string = ip + userAgent + str(millisecond)
    idgen = x100idgen.IdGen()
    video_id = idgen.gen_id(hash_string)
    infor = '{"video_id":"' + video_id + '","ip":"' + staff_ip + '"}'

    response.set_body(infor)

    return response
Exemple #2
0
def video_play(request):
    video_id = request.get_arg("play_url")
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")
    response.set_header("Content-Type", "application/vnd.apple.mpegurl")

    r = redis_connect()
    ret = r.hget('x100speed_hash_videoid', video_id)
    if not ret:
        response.set_body("")
        return response

    video_info = ret.decode()
    video_info_list = video_info.split('|')

    if video_info_list[0] == "failed":
        response.data = ""
        return response

    ip = video_info_list[2]
    bitrates = video_info_list[3]
    bitrates_list = bitrates.split(',')

    m3u8_value = '#EXTM3U\n'
    for bitrate in bitrates_list:
        total_bitrate = int(bitrate) * 1024
        m3u8_value += '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=' + str(
            total_bitrate) + '\n'
        m3u8_value += 'http://10.221.193.64/interface/' + video_id + '_' + bitrate + '.m3u8\n'

    response.set_body(m3u8_value)
    return response
Exemple #3
0
def add_video_segment(request):
    video_id = request.get_arg('video_id')
    bitrate = request.get_arg('bitrate')
    fragment_id = request.get_arg('fragment_id')
    hostname = request.get_arg('hostname')
    storage_path = request.get_arg('storage_path')
    create_time = request.get_arg('create_time')
    fps = request.get_arg('fps')
    frame_count = request.get_arg('frame_count')
    file_size = request.get_arg('file_size')
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not video_id or not fragment_id or not hostname or not storage_path \
       or not create_time or not fps or not frame_count or not file_size:
        response.set_body('{"status":"failed", "message":"params have error"}')
        return response

    sorted_set_key = 'x100speed_sortedset_' + video_id + '_' + bitrate
    sorted_set_score = create_time
    sorted_set_member = fragment_id + '|' + hostname + '|' + storage_path + '|' + create_time \
                        + '|' + fps + '|' + frame_count + '|' + file_size
    r = redis_connect()
    ret = r.zadd(sorted_set_key, sorted_set_score, sorted_set_member)

    response.set_body('{"status":"success", "message":""}')
    return response
Exemple #4
0
def get_video_info(request):
    video_id = request.get_arg('video_id')
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not video_id:
        response.set_body('{"status":"failed", "message":"video_id empty"}')
        return response

    r = redis_connect()
    ret = r.hget("x100speed_hash_videoid", video_id)
    if not ret:
        response.set_body(
            '{"status":"failed", "message":"redis not have video_id"}')
        return response

    infor = ret.decode()
    string_split = infor.split('|')
    value        = '{"status":"' + string_split[0] + '", "snap_img_count":"' + string_split[1]\
                    + '", "ip":"' + string_split[2] + '", "bitrates":"' + string_split[3] + '"}'

    response.set_body(value)
    return response
Exemple #5
0
def get_video_new_snap_image(request):
    video_id = request.get_arg('video_id')
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not video_id:
        response.set_body('{"status":"failed", "message":"video_id empty"}')
        return response

    r = redis_connect()
    ret = r.hget("x100speed_hash_videoid", video_id)
    if not ret:
        response.set_body(
            '{"status":"failed", "message":"redis not have video_id"}')
        return response

    infor = ret.decode()
    string_split = infor.split('|')
    snap_count = string_split[1]
    ip = string_split[2]
    source_string = video_id + '_' + snap_count + '.jpg'
    string_hash = hashlib.new("md5", source_string.encode()).hexdigest()
    dir_first = string_hash[:3]
    dir_second = string_hash[3:6]
    dir_third = string_hash[6:9]
    #image_url     = 'http://' + ip + '/' + dir_first + '/' + dir_second + '/' + dir_third + '/' +  video_id + '_' + snap_count + '.jpg'
    image_url = '/snap' + '/' + dir_first + '/' + dir_second + '/' + dir_third + '/' + video_id + '_' + snap_count + '.jpg'

    response.set_body('{"status":"success", "message":"", "image_url":"' +
                      image_url + '"}')
    return response
Exemple #6
0
def update_video_snap_image_count(request):
    video_id = request.get_arg('video_id')
    snap_image_count = request.get_arg('snap_image_count')
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not video_id or not snap_image_count:
        response.set_body(
            '{"status":"failed", "message":"video_id or snap_image_count empty"}'
        )
        return response

    value = ''
    r = redis_connect()
    ret = r.hget("x100speed_hash_videoid", video_id)
    if not ret:
        response.set_body(
            '{"status":"failed", "message":"redis not have video_id"}')
        return response

    index = 1
    data_object = DataStructuresSerialized(ret, "|")
    data_object.update(index, snap_image_count)
    value = data_object.getSerializedString()

    r.hset('x100speed_hash_videoid', video_id, value)

    response.set_body('{"status":"success", "message":""}')
    return response
Exemple #7
0
def get_video_multirate_info(request):
    ip = request.get_remote_ip()
    count = request.get_arg('count')
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not count:
        count = 1

    r = redis_connect()
    ret = r.lrange("x100speed_" + ip + "_list", 0, int(count) - 1)
    length = len(ret)
    info = ""

    for item in ret:
        video_id = item.decode()
        video_id_info = r.hget("x100speed_hash_videoid", video_id)
        video_id_info = video_id_info.decode()
        info_array = video_id_info.split('|')

        info += '{"video_id":"' + video_id + '","bitrates":[' + info_array[
            3] + ']}'
        length -= 1
        if length > 0:
            info += ','

    video_id_json = '[' + info + ']'

    response.set_body(video_id_json)
    return response
Exemple #8
0
def add_staff_ip(request):
    ip = request.get_arg('ip')
    process_count = 100
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not ip:
        response.set_body('{"status":"failed", "message":"ip empty"}')
        return response

    r = redis_connect()
    r.hset('x100speed_hash_staff', ip, process_count)

    response.set_body('{"status":"success", "message":""}')
    return response
Exemple #9
0
def delete_video_id_multirate(request):
    video_id = request.get_arg('video_id')
    ip = request.get_remote_ip()
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not video_id:
        response.set_body('{"status":"failed", "message":"video_id empty"}')
        return response

    r = redis_connect()
    ret = r.lrem("x100speed_" + ip + "_list", 1, video_id)

    response.set_body('{"status":"success", "message":""}')
    return response
Exemple #10
0
def add_video_id_transcode_bitrate(request):
    video_id = request.get_arg("video_id")
    bitrates = request.get_arg("bitrates")
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not video_id or not bitrates:
        response.set_body(
            '{"status":"failed", "message":"video_id or bitrates empty"}')
        return response

    add_bitrates_list = bitrates.split(",")

    r = redis_connect()
    ret = r.hget("x100speed_hash_videoid", video_id)
    if not ret:
        response.set_body(
            '{"status":"failed", "message":"video_id redis not found"}')
        return response

    data_object = DataStructuresSerialized(ret, "|")
    data_list = data_object.getDeserializationStruct()
    bitrate_list = DataStructuresSerialized(data_list[3],
                                            ',').getDeserializationStruct()
    bitrate_list.extend(add_bitrates_list)
    bitrate_list = list(set(bitrate_list))
    bitrate_list.sort(key=int)
    bitrate_string = DataStructuresSerialized(bitrate_list,
                                              ',').getSerializedString()
    bitrate_of_list_index = 3
    data_object.update(bitrate_of_list_index, bitrate_string)

    ret = r.hset("x100speed_hash_videoid", video_id,
                 data_object.getDeserializationStruct())

    response.set_body('{"status":"success", "message":""}')
    return response
Exemple #11
0
def update_video_status(request):
    video_id = request.get_arg('video_id')
    status = request.get_arg('status')
    ip = request.get_remote_ip()
    response = X100Response()
    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")

    if not video_id or not status:
        response.set_body(
            '{"status":"failed", "message":"video_id or status empty"}')
        return response

    value = ''
    r = redis_connect()
    ret = r.hget("x100speed_hash_videoid", video_id)
    if not ret:
        if status == "proceed":
            bitrate = request.get_arg('bitrate')
            if not bitrate:
                response.set_body(
                    '{"status":"failed", "message":"proceed first bitrate empty"}'
                )
                return response

            value = status + '|' + '|' + ip + '|' + bitrate
            r.hset('x100speed_hash_videoid', video_id, value)
            response.set_body('{"status":"success", "message":""}')
        else:
            response.set_body(
                '{"status":"failed", "message":"redis not have video_id"}')
        return response

    data_object = DataStructuresSerialized(ret, "|")

    if status == "proceed":
        bitrate = request.get_arg('bitrate')
        if not bitrate:
            response.set_body(
                '{"status":"failed", "message":"bitrate params is empty"}')
            return response

        data_list = data_object.getDeserializationStruct()
        bitrate_list = DataStructuresSerialized(
            data_list[3], ',').getDeserializationStruct()
        bitrate_list.append(bitrate)
        bitrate_list = list(set(bitrate_list))
        bitrate_list.sort(key=int)
        bitrate_string = DataStructuresSerialized(bitrate_list,
                                                  ',').getSerializedString()
        bitrate_of_list_index = 3
        data_object.update(bitrate_of_list_index, bitrate_string)

    status_of_list_index = 0
    ip_of_list_index = 2

    data_object.update(status_of_list_index, status)
    data_object.update(ip_of_list_index, ip)

    value = data_object.getSerializedString()

    r.hset('x100speed_hash_videoid', video_id, value)

    if status == "success":
        r.rpush("x100speed_" + ip + "_list", video_id)

    response.set_body('{"status":"success", "message":""}')
    return response
Exemple #12
0
def video_play_child(request):
    video_id = request.get_arg("play_url")
    bitrate = request.get_arg("play_bitrate")
    response = X100Response()

    response.set_header("Access-Control-Allow-Origin", "*")
    response.set_header("Access-Control-Allow-Methods", "GET")
    #response.set_header("Content-Type", "application/vnd.apple.mpegurl")
    response.set_header("Content-Type", "application/x-mpegurl")

    r = redis_connect()
    ret = r.hget('x100speed_hash_videoid', video_id)
    if not ret:
        response.set_body("")
        return response

    video_info = ret.decode()
    video_info_list = video_info.split('|')
    play_type = "live"
    if video_info_list[0] == "success":
        play_type = "vod"
    elif video_info_list[0] == "failed":
        response.data = ""
        return response

    video_sortedset = 'x100speed_sortedset_' + video_id + '_' + str(bitrate)
    fragment_list = ""

    if play_type == "live":
        fragment_list = r.zrange(video_sortedset, -3, -1)
    elif play_type == "vod":
        fragment_list = r.zrange(video_sortedset, 0, -1)

    if not fragment_list:
        response.set_body("")
        return response

    video_m3u8 = ""
    video_m3u8_tmp = ""
    video_m3u8_sequence = ""
    max_fragment_duration = 0.000

    for fragment in fragment_list:
        fragment_string = fragment.decode()
        fragment_array = fragment_string.split('|')

        if not video_m3u8_sequence:
            video_m3u8_sequence = str(fragment_array[0])

        fragment_duration = round(
            int(fragment_array[5]) / int(fragment_array[4]), 3)
        if fragment_duration > max_fragment_duration:
            max_fragment_duration = fragment_duration

        fragment_url = fragment_array[1] + fragment_array[2]
        video_m3u8_tmp += '#EXTINF:' + str(fragment_duration)
        video_m3u8_tmp += "\n"
        video_m3u8_tmp += fragment_url
        video_m3u8_tmp += "\n"

    video_m3u8 += "#EXTM3U\n"
    video_m3u8 += "#EXT-X-VERSION:3\n"
    video_m3u8 += "#EXT-X-TARGETDURATION:" + str(
        int(max_fragment_duration)) + "\n"
    video_m3u8 += "#EXT-X-ALLOW-CACHE:YES\n"
    video_m3u8 += "#EXT-X-MEDIA-SEQUENCE:" + video_m3u8_sequence + "\n"
    video_m3u8 += video_m3u8_tmp

    if play_type == "vod":
        video_m3u8 += "#EXT-X-ENDLIST\n"

    response.set_body(video_m3u8)
    return response