import os
# from log import Log
# log_ = Log()


class BaseConfig(object):
    # 产品标识
    APP_TYPE = {
        'VLOG': 0,  # vlog
        'LOVE_LIVE': 4,  # 票圈视频
        'LONG_VIDEO': 5,  # 内容精选
        'SHORT_VIDEO': 6,  # 票圈短视频
        'WAN_NENG_VIDEO': 17,  # 万能影视屋
        'LAO_HAO_KAN_VIDEO': 18,  # 老好看视频
        'ZUI_JING_QI': 19,  # 票圈最惊奇
        'APP': 13,  # 票圈视频APP
        'PIAO_QUAN_VIDEO_PLUS': 21,  # 票圈视频+
        'JOURNEY': 22,  # 票圈足迹
        'BLESSING_YEAR': 3,  # 票圈福年
    }

    REGION_CODE = {
        '北京': '110000', '天津': '120000', '河北省': '130000', '山西省': '140000', '内蒙古': '150000',
        '辽宁省': '210000', '吉林省': '220000', '黑龙江省': '230000',
        '上海': '310000', '江苏省': '320000', '浙江省': '330000', '安徽省': '340000', '福建省': '350000', '江西省': '360000',
        '山东省': '370000',
        '河南省': '410000', '湖北省': '420000', '湖南省': '430000', '广东省': '440000', '广西': '450000', '海南省': '460000',
        '重庆': '500000', '四川省': '510000', '贵州省': '520000', '云南省': '530000', '西藏': '540000',
        '陕西省': '610000', '甘肃省': '620000', '青海省': '630000', '宁夏': '640000', '新疆': '650000',
        '台湾省': '710000', '香港': '810000', '澳门': '820000',
    }
    CITY_CODE = {
        '广州': '440100', '深圳': '440300', '成都': '510100', '长沙': '430100',
    }

    # 本山祝福视频redis存储key
    BENSHAN_ZHUFU_KEY_NAME = 'benshanzf:videos'
    # 特殊地区屏蔽危险视频redis存储key
    SPECIAL_AREA_LIMIT_KEY_NAME = 'special:area:limit:videos'
    # 屏蔽视频配置 key:region_code, value:videos key list
    SHIELD_CONFIG = {}
    SHIELD_CONFIG2 = {
        '-1': [SPECIAL_AREA_LIMIT_KEY_NAME, ],
        CITY_CODE['广州']: [SPECIAL_AREA_LIMIT_KEY_NAME, ],
        CITY_CODE['深圳']: [SPECIAL_AREA_LIMIT_KEY_NAME, ],
        CITY_CODE['成都']: [SPECIAL_AREA_LIMIT_KEY_NAME, ],
        CITY_CODE['长沙']: [SPECIAL_AREA_LIMIT_KEY_NAME, ],
        REGION_CODE['北京']: [SPECIAL_AREA_LIMIT_KEY_NAME, ],
    }
    # 涉政视频可分发的端
    POLITICAL_RECOMMEND_APP_TYPE_LIST = [
        APP_TYPE['VLOG'],  # vlog
        APP_TYPE['LOVE_LIVE'],  # 票圈视频
        APP_TYPE['APP'],  # 票圈视频APP
    ]

    # abTest
    AB_TEST = {
        'w_h_rate': [APP_TYPE['LONG_VIDEO']],  # 视频宽高比实验(每组的前两个视频调整为横屏视频), 已下线
        'position_insert': [APP_TYPE['SHORT_VIDEO'], APP_TYPE['LOVE_LIVE']],
        'relevant_video_op': [APP_TYPE['LONG_VIDEO']],  # 相关推荐强插实验(运营对某些视频给定一些相关视频,调整为对应视频相关推荐的头部)
        'rank_by_h': [APP_TYPE['VLOG']],  # 小时级别更新rov列表
    }
    # abCode
    AB_CODE = {
        'initial': 10000,  # 初始
        'special_mid': 99999,  # 特殊mid
        'w_h_rate': 10001,  # 视频宽高比实验(每组的前两个视频调整为横屏视频),已下线
        'position_insert': 10002,  # 按位置插入
        'relevant_video_op': 10003,  # 运营对某些视频给定一些相关视频,调整为对应视频相关推荐的头部
        'rov_rank_appType_18_19': 30001,  # 老好看视频 / 票圈最惊奇 首页/相关推荐逻辑更新实验
        'rov_rank_appType_19': 30002,  # 票圈最惊奇 首页/相关推荐逻辑更新实验 (2:2)
        'rank_by_h': {
            'rule_rank1': 20001,
            'rule_rank2': 20002,
            'rule_rank3': 20003,
            'rule_rank4': 20004,
            'rule_rank5': 20005,
            'rule_rank6': 20006,
        },  # 小时级别更新rov列表实验

        'rank_by_day': {
            'day_rule_rank1': 40001,
            'day_rule_rank2': 40002,
        },  # 天级别规则更新rov列表实验

        'ab_initial': 20000,  # ab实验相对实验组(无人工调整)
        'old_video': 50001,  # 固定位置插入老视频

        'region_rank_by_h': {
            'region_rule_rank1': 60001,
            'region_rule_rank2': 60002,
            'region_rule_rank3': 60003,
            'region_rule_rank4': 60004,
            'region_rule_rank4_appType_5_data2': 60005,
            'region_rule_rank4_appType_5_data3': 60006,
            'region_rule_rank4_appType_5_data4': 60007,
            'region_rule_rank4_appType_0_data2': 60007,
            'region_rule_rank4_appType_19_data2': 60008,
            'region_rule_rank4_appType_19_data3': 60009,
            'region_rule_rank4_appType_4_data2': 60011,
            'region_rule_rank4_appType_4_data3': 60012,
            'region_rule_rank4_appType_6_data2': 60013,
            'region_rule_rank4_appType_6_data3': 60014,
            'region_rule_rank4_appType_18_data2': 60015,
            'region_rule_rank6_appType_0_data1': 60016,
            'region_rule_rank6_appType_13_data2': 60017,
            'abtest_095': 60010,
            'abtest_095-1': 60000,
            'abtest_112': 60018,
            'abtest_082': 60019,
            'abtest_117': 60020,
            'abtest_120': 60021,
            'abtest_121': 60022,
            'abtest_122': 60023,
            'abtest_130': 60024,
            'abtest_139': 60025,
            'app_abtest_110156': 60026,
            'abtest_136': 60027,
            'abtest_137': 60028,
            'abtest_142': 60029,
            'abtest_143': 60030,
            'abtest_144': 60031,
            'abtest_145': 60032,
            'abtest_146': 60033,
            'abtest_147': 60034,
            'abtest_153': 60035,
            'abtest_159': 60036,
            'abtest_161': 60037,
            'abtest_162': 60038,
            'abtest_167': 60039,
            'abtest_200': 60040,
            'abtest_214': 60041,
            'abtest_215': 60042,
            'abtest_224': 60043,
            'abtest_228': 60044,
            'abtest_229': 60045,
            'abtest_262': 60046,
        },  # 地域分组小时级规则实验

        'rank_by_24h': {
            '24h_rule_rank1': 70001,
            '24h_rule_rank2': 70002,
        },  # 小时级规则更新过去24h数据实验

        'top_video_relevant_appType_19': 80001,  # 最惊奇电影类视频分享页相关推荐相似视频实验
        'whole_movies': 90001,  # 最惊奇首页/相关推荐 完整影视资源实验
    }

    # AB实验配置
    AB_EXP_CODE = {
        # '068': {
        #     'data_key': 'data1', 'rule_key': 'rule4',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank5_appType_0_data1')
        # },  # 票圈内容精选:data-vlog, rule-rule4
        '069': {
            'data_key': 'data1', 'rule_key': 'rule4-1',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_095-1')
        },  # 最惊奇:data-vlog, rule-rule4
        # '072': {
        #     'data_key': 'data1', 'rule_key': 'rule4',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank5_appType_0_data1')
        # },  # 票圈视频:data-vlog, rule-rule4
        # '073': {
        #     'data_key': 'data1', 'rule_key': 'rule4',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank5_appType_0_data1')
        # },  # 票圈短视频:data-vlog, rule-rule4
        '074': {
            'data_key': 'data1', 'rule_key': 'rule4-1',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_095-1')
        },  # 老好看视频:data-vlog, rule-rule4
        # '082': {
        #     'data_key': 'data2', 'rule_key': 'rule4',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_082')
        # },  # 票圈内容精选:data-[内容精选,vlog], rule-rule4
        # '083': {
        #     'data_key': 'data6', 'rule_key': 'rule3',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank4_appType_5_data4')
        # },  # 票圈内容精选:data-[内容精选,vlog, 票圈视频,票圈短视频], rule-rule3
        '095': {
            'data_key': 'data1', 'rule_key': 'rule4',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_095')
        },  # vlog:data-vlog, rule-rule4
        '095-1': {
            'data_key': 'data1', 'rule_key': 'rule4-1',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_095-1')
        },
        # '096': {
        #     'data_key': 'data3', 'rule_key': 'rule3',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank4_appType_4_data2')
        # },  # 票圈视频:data-[票圈视频,vlog], rule-rule3
        # '097': {
        #     'data_key': 'data6', 'rule_key': 'rule3',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank4_appType_4_data3')
        # },  # 票圈视频:data-[内容精选,vlog, 票圈视频,票圈短视频], rule-rule3
        # '098': {
        #     'data_key': 'data4', 'rule_key': 'rule3',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank4_appType_6_data2')
        # },  # 票圈短视频:data-[票圈短视频,vlog], rule-rule3
        # '099': {
        #     'data_key': 'data6', 'rule_key': 'rule3',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('region_rule_rank4_appType_6_data3')
        # },  # 票圈短视频:data-[内容精选,vlog, 票圈视频,票圈短视频], rule-rule3
        # '112': {
        #     'data_key': 'data1', 'rule_key': 'rule4',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_112')
        # },  # 召回定位优化实验
        # '117': {
        #     'data_key': 'data6', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_117')
        # },  # vlog 全数据实验 data-[vlog: 0.25, 内容精选: 0.25, 票圈视频: 0.25, 票圈短视频: 0.25], rule-rule7
        # '120': {
        #     'data_key': 'data3', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_120')
        # },  # 票圈视频 分数据实验 data-[vlog: 0.5, 票圈视频: 0.5], rule-rule7
        '121': {
            'data_key': 'data2', 'rule_key': 'rule7-1',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_121')
        },  # 内容精选 分数据实验 data-[vlog: 0.5, 内容精选: 0.5], rule-rule7
        # '122': {
        #     'data_key': 'data4', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_122')
        # },  # 票圈短视频 分数据实验 data-[vlog: 0.5, 票圈短视频: 0.5], rule-rule7
        # '130': {
        #     'data_key': 'data1', 'rule_key': 'rule4',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_130')
        # },  # 095实验基础上去除大列表,进行兜底策略优化
        # '139': {
        #     'data_key': 'data1', 'rule_key': 'rule9', '30day_rule_key': 'rule1',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_139')
        # },
        # '136': {
        #     'data_key': 'data1', 'rule_key': 'rule10',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_136')
        # },
        # '137': {
        #     'data_key': 'data1', 'rule_key': 'rule11',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_137')
        # },
        # '142': {
        #     'data_key': 'data8', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_142')
        # },
        # '143': {
        #     'data_key': 'data9', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_143')
        # },
        '144': {
            'data_key': 'data10', 'rule_key': 'rule7',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_144')
        },
        # '145': {
        #     'data_key': 'data11', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_145')
        # },
        # '146': {
        #     'data_key': 'data12', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_146')
        # },
        # '147': {
        #     'data_key': 'data13', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_147')
        # },
        # '153': {
        #     'data_key': 'data1', 'rule_key': 'rule12',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_153')
        # },
        # '159': {
        #     'data_key': 'data14', 'rule_key': 'rule7',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_159')
        # },  # vlog 全数据实验 data-[vlog: 0.78, 票圈视频: 0.11, 票圈短视频: 0.08, 内容精选: 0.03], rule-rule7
        # '161': {
        #     'data_key': 'data1', 'rule_key': 'rule13',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_161')
        # },
        # '162': {
        #     'data_key': 'data1', 'rule_key': 'rule14',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_162')
        # },
        # '167': {
        #     'data_key': 'lhk_data', 'rule_key': 'lhk_rule',
        #     'ab_code': AB_CODE['region_rank_by_h'].get('abtest_167')
        # },
        '200': {
            'data_key': 'data1', 'rule_key': 'rule15',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_200')
        },
        '214': {
            'data_key': 'data1', 'rule_key': 'rule16',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_214')
        },
        '215': {
            'data_key': 'data1', 'rule_key': 'rule17',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_215')
        },
        '224': {
            'data_key': 'data1', 'rule_key': 'rule18',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_224')
        },
        '228': {
            'data_key': 'lhk_data', 'rule_key': 'lhk_rule1',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_228'),
            'religion_class_name': 'catholicism',
        },  # 老好看 天主教 - 2插1
        '229': {
            'data_key': 'lhk_data', 'rule_key': 'lhk_rule2',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_229'),
            'religion_class_name': 'christianity'
        },  # 老好看 基督教 - 2插1
        '262': {
            'data_key': 'data1', 'rule_key': 'rule4-2',
            'ab_code': AB_CODE['region_rank_by_h'].get('abtest_262'),
            'shield_config': SHIELD_CONFIG2,
        },  # vlog:data-vlog, rule-rule4-2
    }

    # APP ab实验配置
    APP_AB_CODE = {
        # 首页推荐
        '10003': {
            '110156': {
                'data_key': 'data7', 'rule_key': 'rule8',
                'ab_code': AB_CODE['region_rank_by_h'].get('app_abtest_110156')
            },  # 票圈视频APP 分数据实验 data-[vlog: 0.5, 票圈视频APP: 0.5], rule-rule8
        },
        # 相关推荐
        '10037': {},
    }

    # 默认全量配置
    INITIAL_CONFIG = {
        APP_TYPE['VLOG']: '095',  # vlog
        APP_TYPE['LOVE_LIVE']: '144',  # 票圈视频
        APP_TYPE['LONG_VIDEO']: '121',  # 内容精选
        APP_TYPE['LAO_HAO_KAN_VIDEO']: '074',  # 老好看视频
        APP_TYPE['ZUI_JING_QI']: '069',  # 最惊奇
        'other': '095-1',  # 其他端默认配置
    }

    # 小程序小时级列表key不同实验标识
    RULE_KEY = {
        'initial': '',
        'rule_rank1': 'rule1',
        'rule_rank2': 'rule2',
        'rule_rank3': 'rule3',
        'rule_rank4': 'rule4',
        'rule_rank5': 'rule5',
        'rule_rank6': 'rule6',
    }

    # 小程序地域分组小时级列表key不同实验标识
    DATA_KEY_REGION = {
        'initial': '',
        'region_rule_rank3': 'data1'
    }

    # 小时级规则更新过去24h数据列表key不同实验标识
    RULE_KEY_24H = {
        'initial': '',
        '24h_rule_rank1': 'rule1',
        '24h_rule_rank2': 'rule2',
    }

    # pushFrom
    PUSH_FROM = {
        'rov_recall': 'recall_pool',  # rov召回池
        'flow_recall': 'flow_pool',  # 流量池
        'top': 'op_manual',  # 置顶
        'bottom': 'bottom_strategy',  # 一层兜底
        'bottom_last': 'bottom_strategy_last',  # 二层兜底
        'bottom2': 'bottom_strategy2',  # 兜底策略2
        'position_insert': 'position_insert',  # 按位置插入
        'relevant_video_op': 'relevant_video_op',  # 相关推荐强插
        'rov_recall_h': 'recall_pool_h',  # 小时级更新列表
        'rov_recall_24h': 'recall_pool_24h',  # 小时级更新相对24h列表
        'rov_recall_day': 'recall_pool_day',  # 天级规则更新列表
        'old_video': 'old_video_recall',  # 老视频
        'rov_recall_region_h': 'recall_pool_region_h',  # 地域分组小时级更新列表
        'rov_recall_region_day': 'recall_pool_region_day',  # 地域分组天级更新列表
        'rov_recall_region_24h': 'recall_pool_region_24h',  # 地域分组小时级更新24h列表
        'rov_recall_24h_dup': 'rov_recall_24h_dup',  # 小时级更新24h筛选后剩余数据列表
        'rov_recall_48h': 'recall_pool_48h',  # 小时级更新相对48h列表
        'rov_recall_48h_dup': 'rov_recall_48h_dup',  # 小时级更新48h筛选后剩余数据列表
        'top_video_relevant_appType_19': 'relevant_video',  # 相似视频
        'whole_movies': 'whole_movies',  # 完整影视
        'talk_videos': 'talk_videos',  # 影视解说
        'special_mid': 'special_mid_videos',  # 特殊mid指定视频
        'rov_recall_30day': 'recall_pool_30day',  # 天级更新相对30天列表
    }

    # category id mapping
    CATEGORY = {
        'recommend': [55],  # 推荐
        'other': []  # 其他类别
    }
    # 前k个从ROV召回池中获取视频
    K = 3
    # 从流量池获取视频的概率设置
    P = 0.3
    P_18_19 = 1

    # 小程序离线ROV模型结果存放 redis key前缀,完整格式:recall:item:score:rov:applet:{date}
    RECALL_KEY_NAME_PREFIX = 'recall:item:score:rov:applet:'

    # # 小程序小时级更新结果存放 redis key前缀,完整格式:com.weiqu.video.recall.item.score.h.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_BY_H = 'com.weiqu.video.recall.item.score.h.'
    # # 小程序相对24h数据更新结果与 小程序小时级更新结果 去重后 存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.hot.item.score.dup.24h.h.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_DUP_24H_H = 'com.weiqu.video.recall.hot.item.score.dup.24h.h.'
    # # 小程序离线ROV模型结果与小程序小时级更新结果去重后 存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.hot.item.score.dup.h.{rule_key}{date}.{h}
    # RECALL_KEY_NAME_PREFIX_DUP_H = 'com.weiqu.video.recall.hot.item.score.dup.h.'

    # # 每个mid存储对应小时级更新结果 redis key前缀,完整格式:com.weiqu.video.recall.hot.item.score.h.mid.{appType}.{mid}
    # H_WITH_MID_RECALL_KEY_NAME_PREFIX = 'com.weiqu.video.recall.hot.item.score.h.mid.'
    # # 记录 mid-小时级key 中数据所属(date,h),完整格式:com.weiqu.video.h.record.mid.{appType}.{mid}
    # H_WITH_MID_RECORD_KEY_NAME_PREFIX = 'com.weiqu.video.h.record.mid.'
    #
    # # 每个mid存储对应小时级更新结果 redis key前缀,完整格式:com.weiqu.video.recall.hot.item.score.h.24h.mid.{appType}.{mid}
    # H_WITH_MID_RECALL_KEY_NAME_PREFIX_24H = 'com.weiqu.video.recall.hot.item.score.h.24h.mid.'
    # # 记录 mid-小时级key 中数据所属(date,h),完整格式:com.weiqu.video.h.24h.record.mid.{appType}.{mid}
    # H_WITH_MID_RECORD_KEY_NAME_PREFIX_24H = 'com.weiqu.video.h.24h.record.mid.'
    #
    # # 每个mid存储对应小时级更新结果 redis key前缀,完整格式:com.weiqu.video.recall.hot.item.score.h.region.24h.mid.{appType}.{mid}
    # H_WITH_MID_RECALL_KEY_NAME_PREFIX_REGION_24H = 'com.weiqu.video.recall.hot.item.score.h.region.24h.mid.'
    # # 记录 mid-小时级key 中数据所属(date,h),完整格式:com.weiqu.video.h.region.24h.record.mid.{appType}.{mid}
    # H_WITH_MID_RECORD_KEY_NAME_PREFIX_REGION_24H = 'com.weiqu.video.h.region.24h.record.mid.'

    # 用户上一次在 相对30天 天级更新列表中对应的位置 redis key前缀,完整key格式:recall:last:item:30day:{appType}:{mid}
    LAST_VIDEO_FROM_30DAY_PREFIX = 'recall:last:item:30day:'
    # 记录 mid-上一次在 地域分组小时级 更新列表中对应的位置key 中数据所属(date,h),完整格式:recall:last:record:30day:{appType}:{mid}
    RECORD_KEY_NAME_PREFIX_LAST_VIDEO_30DAY = 'recall:last:record:30day:'

    # 用户上一次在 地域分组小时级 更新列表中对应的位置 redis key前缀,完整key格式:recall:last:item:region:h:{appType}:{mid}
    LAST_VIDEO_FROM_REGION_H_PREFIX = 'recall:last:item:region:h:'
    # 记录 mid-上一次在 地域分组小时级 更新列表中对应的位置key 中数据所属(date,h),完整格式:recall:last:record:region:h:{appType}:{mid}
    RECORD_KEY_NAME_PREFIX_LAST_VIDEO_REGION_H = 'recall:last:record:region:h:'

    # 用户上一次在dup1 分地域24h更新列表中对应的位置 redis key前缀,完整key格式:recall:last:item:region:dup1:24h:{appType}:{mid}
    LAST_VIDEO_FROM_REGION_DUP1_24H_PREFIX = 'recall:last:item:region:dup1:24h:'
    # 记录 mid-上一次在dup1 分地域24h更新列表中对应的位置key 中数据所属(date,h),完整格式:recall:last:record:region:dup1:24h:{appType}:{mid}
    RECORD_KEY_NAME_PREFIX_LAST_VIDEO_REGION_DUP1_24H = 'recall:last:record:region:dup1:24h:'

    # 用户上一次在dup2 24h更新列表中对应的位置 redis key前缀,完整key格式:recall:last:item:region:dup2:24h:{appType}:{mid}
    LAST_VIDEO_FROM_REGION_DUP2_24H_PREFIX = 'recall:last:item:region:dup2:24h:'
    # 记录 mid-上一次在dup2 24h更新列表中对应的位置key 中数据所属(date,h),完整格式:recall:last:record:region:dup2:24h:{appType}:{mid}
    RECORD_KEY_NAME_PREFIX_LAST_VIDEO_REGION_DUP2_24H = 'recall:last:record:region:dup2:24h:'

    # 用户上一次在dup3 24h更新列表中对应的位置 redis key前缀,完整key格式:recall:last:item:region:dup3:24h:{appType}:{mid}
    LAST_VIDEO_FROM_REGION_DUP3_24H_PREFIX = 'recall:last:item:region:dup3:24h:'
    # 记录 mid-上一次在dup3 24h更新列表中对应的位置key 中数据所属(date,h),完整格式:recall:last:record:region:dup2:24h:{appType}:{mid}
    RECORD_KEY_NAME_PREFIX_LAST_VIDEO_REGION_DUP3_24H = 'recall:last:record:region:dup3:24h:'

    # 用户上一次在dup2 48h更新列表中对应的位置 redis key前缀,完整key格式:recall:last:item:region:dup2:48h:{appType}:{mid}
    LAST_VIDEO_FROM_REGION_DUP2_48H_PREFIX = 'recall:last:item:region:dup2:48h:'
    # 记录 mid-上一次在dup2 48h更新列表中对应的位置key 中数据所属(date,h),完整格式:recall:last:record:region:dup2:48h:{appType}:{mid}
    RECORD_KEY_NAME_PREFIX_LAST_VIDEO_REGION_DUP2_48H = 'recall:last:record:region:dup2:48h:'

    # 用户上一次在dup3 48h更新列表中对应的位置 redis key前缀,完整key格式:recall:last:item:region:dup3:48h:{appType}:{mid}
    LAST_VIDEO_FROM_REGION_DUP3_48H_PREFIX = 'recall:last:item:region:dup3:48h:'
    # 记录 mid-上一次在dup3 48h更新列表中对应的位置key 中数据所属(date,h),完整格式:recall:last:record:region:dup2:48h:{appType}:{mid}
    RECORD_KEY_NAME_PREFIX_LAST_VIDEO_REGION_DUP3_48H = 'recall:last:record:region:dup3:48h:'

    # # 小时级视频状态不符合推荐要求的列表 redis key,完整格式:com.weiqu.video.filter.h.item.{rule_key}
    # H_VIDEO_FILER = 'com.weiqu.video.filter.h.item.'

    # # 小程序天级更新结果存放 redis key前缀,完整格式:com.weiqu.video.recall.item.score.day.{rule_key}.{date}
    # RECALL_KEY_NAME_PREFIX_BY_DAY = 'com.weiqu.video.recall.item.score.day.'
    # # 小程序离线ROV模型结果与小程序天级更新结果去重后 存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.hot.item.score.dup.day.now.{rule_key}.{date}
    # RECALL_KEY_NAME_PREFIX_DUP_DAY_NOW = 'com.weiqu.video.recall.hot.item.score.dup.day.now.'
    # # 使用前一天小程序离线ROV模型结果与小程序天级更新结果去重后 存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.hot.item.score.dup.day.pre.{rule_key}.{date}
    # RECALL_KEY_NAME_PREFIX_DUP_DAY_PRE = 'com.weiqu.video.recall.hot.item.score.dup.day.pre.'

    # # 小程序小时级24h数据更新结果存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.item.score.apptype.24h.{appType}.{data_key}.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_BY_24H = 'com.weiqu.video.recall.item.score.apptype.24h.'
    # # 小程序离线ROV模型结果与小程序小时级24h更新结果去重后 存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.hot.item.score.dup.24h.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_DUP_24H = 'com.weiqu.video.recall.hot.item.score.dup.24h.'
    # # 小时级视频状态不符合推荐要求的列表 redis key,完整格式:com.weiqu.video.filter.apptype.h.item.24h.{appType}.{data_key}.{rule_key}
    # H_VIDEO_FILER_24H = 'com.weiqu.video.filter.apptype.h.item.24h.'

    # 小程序相对30天数据天级更新结果存放 redis key前缀,
    # 完整格式:recall:item:score:30day:{data_key}:{rule_key}:{date}
    RECALL_KEY_NAME_PREFIX_30DAY = 'recall:item:score:30day:'

    # 小程序地域分组小时级更新结果存放 redis key前缀,
    # 完整格式:recall:item:score:region:h:{region}:{data_key}:{rule_key}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_REGION_BY_H = 'recall:item:score:region:h:'

    # 小程序地域分组天级更新结果与小程序地域分组小时级更新结果去重后 存放 redis key前缀,
    # 完整格式:com.weiqu.video.recall.hot.item.score.dup1.region.day.h.{region}.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_DUP1_REGION_DAY_H = 'com.weiqu.video.recall.hot.item.score.dup1.region.day.h.'

    # 小程序地域分组小时级更新24h结果与小程序地域分组小时级更新结果去重后 存放 redis key前缀,
    # 完整格式:recall:item:score:region:dup1:region24h:{region}:{data_key}:{rule_key}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H = 'recall:item:score:region:dup1:region24h:'

    # 小程序天级更新结果与 小程序地域分组天级更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
    # 完整格式:com.weiqu.video.recall.hot.item.score.dup2.region.day.h.{region}.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_DUP2_REGION_DAY_H = 'com.weiqu.video.recall.hot.item.score.dup2.region.day.h.'

    # 小程序24h更新结果与 小程序地域分组24h更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
    # 完整格式:recall:item:score:region:dup2:24h:{region}:{data_key}:{rule_key}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_DUP2_REGION_24H_H = 'recall:item:score:region:dup2:24h:'
    # 小程序小时级24h数据 筛选后的剩余数据 更新结果 与 小程序24h更新结果/小程序地域分组24h更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
    # 完整格式:recall:item:score:region:dup3:24h:{region}:{data_key}:{rule_key}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_DUP3_REGION_24H_H = 'recall:item:score:region:dup3:24h:'
    # 小程序48h更新结果与 小程序地域分组24h更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
    # 完整格式:recall:item:score:region:dup2:48h:{region}:{data_key}:{rule_key}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_DUP2_REGION_48H_H = 'recall:item:score:region:dup2:48h:'
    # 小程序小时级48h数据 筛选后的剩余数据 更新结果 与 小程序48h更新结果/小程序地域分组24h更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
    # 完整格式:recall:item:score:region:dup3:48h:{region}:{data_key}:{rule_key}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_DUP3_REGION_48H_H = 'recall:item:score:region:dup3:48h:'
    # 小程序离线ROV模型结果与 小程序天级更新结果/小程序地域分组天级更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
    # 完整格式:recall:item:score:region:dup4:rov:{region}:{data_key}:{rule_key}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_DUP_REGION_H = 'recall:item:score:region:dup4:rov:'

    # 地域分组小时级视频状态不符合推荐要求的列表 redis key,
    # 完整格式:com.weiqu.video.filter.apptype.region.h.item.{region}.{appType}.{data_key}.{rule_key}
    # REGION_H_VIDEO_FILER = 'com.weiqu.video.filter.apptype.region.h.item.'

    # # 小程序地域分组小时级更新24h结果存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.item.score.apptype.region.24h.{region}.{appType}.{data_key}.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_REGION_BY_24H = 'com.weiqu.video.recall.item.score.apptype.region.24h.'
    # # 小程序天级更新结果与 小程序地域分组小时级更新24h结果 去重后 存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.hot.item.score.dup.region.day.24h.{region}.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_DUP_REGION_DAY_24H = 'com.weiqu.video.recall.hot.item.score.dup.region.day.24h.'
    # # 小程序离线ROV模型结果与 小程序天级更新结果/小程序地域分组小时级更新24h结果 去重后 存放 redis key前缀,
    # # 完整格式:com.weiqu.video.recall.hot.item.score.dup.region.24h.{region}.{rule_key}.{date}.{h}
    # RECALL_KEY_NAME_PREFIX_DUP_REGION_24H = 'com.weiqu.video.recall.hot.item.score.dup.region.24h.'
    # # 地域分组小时级更新24h视频状态不符合推荐要求的列表 redis key,
    # # 完整格式:com.weiqu.video.filter.apptype.region.h.item.24h.{region}.{appType}.{data_key}.{rule_key}
    # REGION_H_VIDEO_FILER_24H = 'com.weiqu.video.filter.apptype.region.h.item.24h.'

    # app应用 小程序离线ROV模型结果存放 redis key前缀,完整格式:recall:item:score:rov:app:{date}
    RECALL_KEY_NAME_PREFIX_APP = 'recall:item:score:rov:app:'

    # # app应用 小时级数据更新最终结果存放 redis key前缀,完整格式:com.weiqu.video.recall.hot.item.score.app.{date}.{h}
    # APP_FINAL_RECALL_KEY_NAME_PREFIX = 'com.weiqu.video.recall.hot.item.score.app.'

    # appType:[18, 19]小程序离线ROV模型结果存放 redis key前缀,完整格式:recall:item:score:{appType}:{date}:{h}
    RECALL_KEY_NAME_PREFIX_APP_TYPE = 'recall:item:score:'

    # # 小程序老视频更新结果存放 redis key 前缀,完整格式:'com.weiqu.video.recall.old.item.{date}'
    # RECALL_KEY_NAME_PREFIX_OLD_VIDEOS = 'com.weiqu.video.recall.old.item.'

    # appType = 6, ROV召回池redis key前缀,完整格式:com.weiqu.video.recall.hot.apptype.h.item.score.6.{h}
    # RECALL_KEY_NAME_PREFIX_APP_TYPE = 'com.weiqu.video.recall.hot.apptype.h.item.score.6.'

    # 流量池离线模型结果存放 redis key前缀,完整格式 flow:pool:item:score:{appType}
    FLOWPOOL_KEY_NAME_PREFIX = 'flow:pool:item:score:'
    # 快速曝光流量池数据存放 redis key前缀,完整格式 flow:pool:quick:item:score:{appType}:{flowPool_id}
    QUICK_FLOWPOOL_KEY_NAME_PREFIX = 'flow:pool:quick:item:score:'
    # 快速曝光流量池分发概率 redis key前缀,完整格式 flow:pool:quick:distribute:rate:{flowPool_id}
    QUICK_FLOWPOOL_DISTRIBUTE_RATE_KEY_NAME_PREFIX = 'flow:pool:quick:distribute:rate:'

    # 修改ROV的视频 redis key
    UPDATE_ROV_KEY_NAME = 'update:rov:item:score:applet'
    UPDATE_ROV_KEY_NAME_APP = 'update:rov:item:score:app'

    # 首页推荐预曝光列表redis key 前缀,完整key格式:previewed:videos:{appType}:{mid}
    PREVIEW_KEY_PREFIX = 'previewed:videos:'

    # 用户上一次在rov召回池对应的位置 redis key前缀,完整key格式:recall:pool:last:rov:{appType}:{mid}:{date}
    LAST_VIDEO_FROM_ROV_POOL_PREFIX = 'recall:last:rov:'

    # # 用户上一次在天级规则更新列表中对应的位置 redis key前缀,完整key格式:com.weiqu.video.rov.pool.last.{appType}.{mid}.{date}
    # LAST_VIDEO_FROM_RULE_DAY_POOL_PREFIX = 'com.weiqu.video.rule.day.pool.last.'
    # # 用户上一次在rov召回池对应的位置 redis key前缀,完整key格式:com.weiqu.video.rov.pool.last.pre.{appType}.{mid}.{date}
    # LAST_VIDEO_FROM_ROV_POOL_PRE_PREFIX = 'com.weiqu.video.rov.pool.last.pre.'
    # # 用户上一次在rov召回池对应的位置 redis key前缀,完整key格式:com.weiqu.video.rov.pool.last.now.{appType}.{mid}.{date}
    # LAST_VIDEO_FROM_ROV_POOL_NOW_PREFIX = 'com.weiqu.video.rov.pool.last.now.'
    # # 用户上一次在region dup更新列表中对应的位置 redis key前缀,完整key格式:com.weiqu.video.region.dup.last.{dup}.{appType}.{mid}.{date}
    # LAST_VIDEO_FROM_REGION_DUP_PREFIX = 'com.weiqu.video.region.dup.last.'
    # # 用户上一次在完整影视资源列表对应的位置 redis key前缀,完整key格式:com.weiqu.video.whole.movies.last.{appType}.{mid}.{date}
    # LAST_VIDEO_FROM_WHOLE_MOVIES_PREFIX = 'com.weiqu.video.whole.movies.last.'

    # 用户上一次在特殊视频列表对应的位置 redis key前缀,完整key格式:recall:pool:last:special:{appType}:{mid}:{date}
    LAST_VIDEO_FROM_SPECIAL_POOL_PREFIX = 'recall:last:special:'

    # 本地记录视频的可分发数,控制分发,完整key格式:flow:pool:local:distribute:count:{videoId}:{flowPool}
    LOCAL_DISTRIBUTE_COUNT_PREFIX = 'flow:pool:local:distribute:count:'

    # 从ROV召回池获取视频的最大频次,限制每次请求的获取次数
    MAX_FREQ_FROM_ROV_POOL = 2
    # 从流量池获取视频的最大频次,限制每次请求的获取次数
    MAX_FREQ_FROM_FLOW_POOL = 1
    # 从流量池获取视频的最大频次,限制每次请求的获取次数 appType:[18, 19]
    MAX_FREQ_FROM_FLOW_POOL_18_19 = 3

    # 兜底视频redis存储key
    BOTTOM_KEY_NAME = 'bottom:videos'
    # 兜底视频redis存储key-方案2:采用流量池视频作为兜底视频
    BOTTOM2_KEY_NAME = 'bottom2:videos'

    # 生效中的置顶视频列表 redis key
    TOP_VIDEO_LIST_KEY_NAME = 'top:item:score:area:applet'
    TOP_VIDEO_LIST_KEY_NAME_APP = 'top:item:score:area:app'

    # # 按位置排序redis存储key
    # RECALL_POSITION1_KEY_NAME = 'com.weiqu.video.recall.hot.apptype.h.item.score.position.1'
    # RECALL_POSITION2_KEY_NAME = 'com.weiqu.video.recall.hot.apptype.h.item.score.position.2'

    # # rov召回池更新时间
    # ROV_UPDATE_H = 6
    # ROV_UPDATE_MINUTE = 30
    #
    # # 小时级召回池更新时间 每个小时的15分更新成功
    # ROV_H_UPDATE_MINUTE = 25
    #
    # # 地域分组小时级召回池更新时间
    # REGION_H_UPDATE_MINUTE = 30
    #
    # # 天级规则更新列表更新时间 00:30更新成功
    # ROV_DAY_UPDATE_MINUTE = 0

    # 置顶视频区域 为 全部 的code
    ALL_AREA_CODE = '000000'

    # # width : height > 1 的视频列表 redis key, zset存储,value为videoId,score为w_h_rate
    # W_H_RATE_UP_1_VIDEO_LIST_KEY_NAME = {
    #     'rov_recall': 'com.weiqu.video.rov.w.h.rate.1.item',  # rov召回池视频
    #     'bottom_last': 'com.weiqu.video.bottom.last.w.h.rate.1.item'  # 二次兜底视频
    # }

    # 头部视频对应运营强插的相关视频 redis 存储 key 前缀, 完整key格式:com.weiqu.video.relevant.videos.item.{videoId}
    RELEVANT_VIDEOS_WITH_OP_KEY_NAME = 'com.weiqu.video.relevant.videos.item.'

    # 最惊奇电影类视频相关推荐列表存放 redis key前缀,完整格式: com.weiqu.movie.relevant.list.item.{videoId}
    MOVIE_RELEVANT_LIST_KEY_NAME_PREFIX = 'com.weiqu.movie.relevant.list.item.'

    # 完整影视资源更新结果存放 redis key 前缀,完整格式:'com.weiqu.video.recall.whole.movies.item.{date}.{h}'
    RECALL_KEY_NAME_PREFIX_WHOLE_MOVIES = 'com.weiqu.video.recall.whole.movies.item.'

    # 特殊mid更新结果存放 redis key ,完整格式:'special:mid'
    KEY_NAME_SPECIAL_MID = 'special:mid'
    # 特殊mid对应指定视频列表更新结果存放 redis key 前缀,完整格式:'special:videos:item:{date}'
    KEY_NAME_PREFIX_SPECIAL_VIDEOS = 'special:videos:item:'

    # 限流视频集合存放 redis key前缀,完整格式:'limit:videos:{date}'
    KEY_NAME_PREFIX_LIMIT_VIDEO_SET = 'limit:videos:'
    # 限流视频分发数记录 redis key前缀,完整格式:'limit:video:distribute:count:{videoId}'
    KEY_NAME_PREFIX_LIMIT_VIDEO_DISTRIBUTE_COUNT = 'limit:video:distribute:count:'

    # 用户近30天是否有回流状态 存放 redis key 前缀,完整格式:'user:has30day:return:{mid}'
    KEY_NAME_PREFIX_USER_HAS30DAY_RETURN = 'user:has30day:return:'

    # 宗教用户列表更新结果存放 redis key 前缀
    KEY_NAME_PREFIX_RELIGION_USER = {
        # 天主教,完整格式:'religion:catholicism:users:item:{hash_tag}:{date}'
        'catholicism': 'religion:catholicism:users:item:',
        # 基督教,完整格式:'religion:christianity:users:item:{hash_tag}:{date}'
        'christianity': 'religion:christianity:users:item:',
    }

    # 视频数据表类型 - 管理后台算法视频列表可视化
    VIDEO_DATA_LIST_MAPPING = {
        0: {
            "dataListDesc": "全部", "dataListCode": 0,
            "keyPrefixList": [
                {"dataListCode": 1, "keyPrefix": RECALL_KEY_NAME_PREFIX_30DAY},
                {"dataListCode": 2, "keyPrefix": RECALL_KEY_NAME_PREFIX_REGION_BY_H},
                {"dataListCode": 3, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H},
                {"dataListCode": 4, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP2_REGION_24H_H},
                {"dataListCode": 5, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP3_REGION_24H_H},
                # {"dataListCode": 5, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP2_REGION_48H_H},
                # {"dataListCode": 6, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP3_REGION_48H_H},
                # {"dataListCode": 7, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP_REGION_H},
            ]
        },
        1: {"dataListDesc": "相对30天数据列表", "dataListCode": 1, "keyPrefix": RECALL_KEY_NAME_PREFIX_30DAY},
        2: {"dataListDesc": "地域小时级", "dataListCode": 2, "keyPrefix": RECALL_KEY_NAME_PREFIX_REGION_BY_H},
        3: {"dataListDesc": "地域相对24小时级", "dataListCode": 3, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H},
        4: {"dataListDesc": "非地域相对24小时级", "dataListCode": 4, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP2_REGION_24H_H},
        5: {"dataListDesc": "非地域相对24小时级列表2", "dataListCode": 5, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP3_REGION_24H_H},
        # 5: {"dataListDesc": "非地域相对48小时级", "dataListCode": 5, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP2_REGION_48H_H},
        # 6: {"dataListDesc": "非地域相对48小时级列表2", "dataListCode": 6, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP3_REGION_48H_H},
        # 7: {"dataListDesc": "大列表", "dataListCode": 7, "keyPrefix": RECALL_KEY_NAME_PREFIX_DUP_REGION_H},

    }

    # 调用后端接口过滤参数配置 1-已观看 2-视频状态 3-是否进入老年人社区 4-话题状态 5-推荐状态 6-白名单过滤 7-涉政视频过滤
    FILTER_VIEWED_TYPES_CONFIG = {
        APP_TYPE['VLOG']: (1, 6,),  # vlog
        APP_TYPE['LOVE_LIVE']: (1, 6,),  # 票圈视频
        APP_TYPE['APP']: (1,),  # 票圈视频APP
        'other': (1, 6, 7,),  # 其他
    }

    # 召回池分发视频在流量池中存在,该视频是否进行本地分发数-1 开关,1-开/0-关
    IN_FLOW_POOL_COUNT_SWITCH_KEY_NAME = 'recall:videos:in:flow:pool:count:switch'

    # 流量池videoId redis key前缀,完整格式 flow:pool:video:ids:{appType}
    FLOWPOOL_VIDEO_ID_KEY_NAME_PREFIX = 'flow:pool:video:ids:'
    # 快速曝光流量池videoId redis key前缀,完整格式 flow:pool:quick:video:ids:{appType}:{flowPool_id}
    QUICK_FLOWPOOL_VIDEO_ID_KEY_NAME_PREFIX = 'flow:pool:quick:video:ids:'
    # 流量池视频标记flowPool redis key前缀,完整格式 flow:pool:video:{appType}:{videoId}
    FLOWPOOL_VIDEO_INFO_KEY_NAME_PREFIX = 'flow:pool:video:'
    # 快速曝光流量池视频标记flowPool redis key前缀,完整格式 flow:pool:quick:video:{appType}:{flowPool_id}:{videoId}
    QUICK_FLOWPOOL_VIDEO_INFO_KEY_NAME_PREFIX = 'flow:pool:quick:video:'

    # 免广告用户组列表
    NO_AD_MID_GROUP_LIST = {
        'class1': ['return25_nmids'],
        'class2': ['return30_nmids'],
    }

    # 广告模型abtest配置
    AD_ABTEST_CONFIG = {
        # 票圈vlog
        '173-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '173-b': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 调整未分组用户的阈值(去除不出广告的用户组)
        '173-c': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule3'},
            'group_class_key': 'class2',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
        },  # 细化分组 return25_29, return30+, 且return30+ 不出广告
        '173-d': {
            'video': {'data': 'data1:7days'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 视频使用7天内有曝光的
        '173-e': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
            'care_model_status_param': 2,
            'care_model_ab_mid_group': 'mean_group',
        },  # 开启关怀模式人群多出广告
        '173-f': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
            'care_model_status_param': 1,
            'care_model_ab_mid_group': 'mean_group',
        },  # 未开启关怀模式人群多出广告
        '173-g': {
            'video': {'data': 'data1:7days'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 调整未分组用户的阈值(去除不出广告的用户组) + 视频使用7天内有曝光的
        '173-h': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
        },  # else人群多出广告,阈值比例参数:0.8
        '173-i': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1'],
        },  # else人群多出广告,阈值比例参数:0.9

        # 票圈视频+
        '190-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '190-b': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '190-c': {
            'video': {'data': 'data21'},
            'user': {'data': 'data21', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '190-d': {
            'video': {'data': 'data21'},
            'user': {'data': 'data21', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },

        # 票圈视频
        '194-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '194-b': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 调整未分组用户的阈值(去除不出广告的用户组)
        '194-c': {
            'video': {'data': 'data2'},
            'user': {'data': 'data2', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据
        '194-d': {
            'video': {'data': 'data2'},
            'user': {'data': 'data2', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据 + 优化1

        # 内容精选
        '195-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '195-b': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 调整未分组用户的阈值(去除不出广告的用户组)
        '195-c': {
            'video': {'data': 'data3'},
            'user': {'data': 'data3', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据
        '195-d': {
            'video': {'data': 'data3'},
            'user': {'data': 'data3', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据 + 优化1

        # 票圈短视频
        '196-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '196-b': {
            'video': {'data': 'data4'},
            'user': {'data': 'data4', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '196-c': {
            'video': {'data': 'data4'},
            'user': {'data': 'data4', 'rule': 'rule3'},
            'group_class_key': 'class2',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
        },  # 本端数据 + 优化1 + 优化2
        '196-d': {
            'video': {'data': 'data4:7days'},
            'user': {'data': 'data4', 'rule': 'rule3'},
            'group_class_key': 'class2',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class2']
        },  # 本端数据 + 优化1 + 优化2 + 优化4

        # 老好看视频
        '197-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '197-b': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 优化1 调整未分组用户的阈值(去除不出广告的用户组)
        '197-c': {
            'video': {'data': 'data5'},
            'user': {'data': 'data5', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据 + 优化1
        '197-d': {
            'video': {'data': 'data5:7days'},
            'user': {'data': 'data5', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据 + 优化1 + 优化4

        # 票圈最惊奇
        '198-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },
        '198-b': {
            'video': {'data': 'data6'},
            'user': {'data': 'data6', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据
        '198-c': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 优化1
        '198-d': {
            'video': {'data': 'data6'},
            'user': {'data': 'data6', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # 本端数据 + 优化1

        # 票圈足迹
        '242-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # vlog数据
        '242-b': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # vlog数据 + 优化1

        # 票圈福年
        '243-a': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule1'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # vlog数据
        '243-b': {
            'video': {'data': 'data1'},
            'user': {'data': 'data1', 'rule': 'rule2'},
            'group_class_key': 'class1',
            'no_ad_mid_group_list': NO_AD_MID_GROUP_LIST['class1']
        },  # vlog数据 + 优化1
    }

    # 用户组有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:users:group:predict:share:rate:{user_data_key}:{date}
    KEY_NAME_PREFIX_AD_GROUP = 'ad:users:group:predict:share:rate:'
    # 视频有广告时的分享率预测结果存放 redis key 前缀,完整格式:ad:video:predict:share:rate:{video_data_key}:{date}
    KEY_NAME_PREFIX_AD_VIDEO = 'ad:video:predict:share:rate:'
    # 用户分组结果存放 redis key 前缀,完整格式:mid:group:{class_key}:{mid}
    KEY_NAME_PREFIX_MID_GROUP = 'mid:group:'
    # 广告推荐阈值结果存放 redis key 前缀,完整格式:ad:threshold:{abtestId}:{abtestConfigTag}:{abtestGroup}:{group}
    KEY_NAME_PREFIX_AD_THRESHOLD = 'ad:threshold:'
    # 广告推荐关怀模式实验阈值结果存放 redis key 前缀,完整格式:ad:threshold:care:{abtestId}:{abtestConfigTag}:{abtestGroup}:{group}
    KEY_NAME_PREFIX_AD_THRESHOLD_CARE_MODEL = 'ad:threshold:care:'


class DevelopmentConfig(BaseConfig):
    """开发环境配置"""
    # 报警内容 环境区分
    ENV_TEXT = "开发环境"
    # 测试环境redis地址
    REDIS_INFO = {
        'host': 'r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com',
        'port': 6379,
        'password': 'Wqsd@2019',
    }

    # Hologres连接参数,本地使用
    HOLOGRES_INFO = {
        'host': 'hgprecn-cn-7pp28y18c00c-cn-hangzhou.hologres.aliyuncs.com',
        'port': 80,
        'dbname': 'dssm',
        'user': 'LTAI5tMPqPy9yboQAf1mBCCN',
        'password': '4BEcOgxREOPq7t3A7EWkjciVULeQGj'
    }

    # 测试环境mysql地址
    MYSQL_INFO = {
        'host': 'rm-bp1k5853td1r25g3n690.mysql.rds.aliyuncs.com',
        'port': 3306,
        'user': 'wx2016_longvideo',
        'password': 'wx2016_longvideoP@assword1234',
        'db': 'longvideo',
        'charset': 'utf8'
    }

    # Hologres视频状态存储表名
    VIDEO_STATUS = 'longvideo_test.dwd_mdm_item_video_stat'

    # 用户已观看视频过滤 & 视频审核条件过滤 & 是否进入老年人社区过滤 & 话题状态过滤 接口地址
    # 参数types: 1-已观看 2-视频状态 3-是否进入老年人社区过滤 4-话题状态
    VIDEO_FILTER_URL = 'http://videotest-internal.yishihui.com/longvideoapi/openapi/recommend/filterVideos'

    # 获取视频在流量池中的剩余可分发数接口地址
    GET_REMAIN_VIEW_COUNT_URL = 'http://testapi-internal.piaoquantv.com/flowpool/video/remainViewCount'

    # 获取用户近30天是否有回流接口地址
    GET_USER_30DayReturnCnt_URL = 'http://videotest-internal.yishihui.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='

    # 日志服务配置
    ALIYUN_LOG = {
        'ENDPOINT': 'cn-hangzhou-intranet.log.aliyuncs.com',
        'ACCESSID': 'LTAIWYUujJAm7CbH',
        'ACCESSKEY': 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P',
        'PROJECT': 'rov-server-test',
    }

    # 快速曝光流量池ID
    QUICK_FLOW_POOL_ID = 3


class TestConfig(BaseConfig):
    """测试环境配置"""
    # 报警内容 环境区分
    ENV_TEXT = "测试环境"
    # 测试环境redis地址
    REDIS_INFO = {
        'host': 'r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com',
        'port': 6379,
        'password': 'Wqsd@2019',
    }

    # Hologres连接参数,服务器使用
    HOLOGRES_INFO = {
        'host': 'hgprecn-cn-7pp28y18c00c-cn-hangzhou-vpc.hologres.aliyuncs.com',
        'port': 80,
        'dbname': 'dssm',
        'user': 'LTAI5tMPqPy9yboQAf1mBCCN',
        'password': '4BEcOgxREOPq7t3A7EWkjciVULeQGj'
    }

    # 测试环境mysql地址
    MYSQL_INFO = {
        'host': 'rm-bp1k5853td1r25g3n690.mysql.rds.aliyuncs.com',
        'port': 3306,
        'user': 'wx2016_longvideo',
        'password': 'wx2016_longvideoP@assword1234',
        'db': 'longvideo',
        'charset': 'utf8'
    }

    # Hologres视频状态存储表名
    VIDEO_STATUS = 'longvideo_test.dwd_mdm_item_video_stat'

    # 用户已观看视频过滤 & 视频审核条件过滤 & 是否进入老年人社区过滤 & 话题状态过滤 接口地址
    # 参数types: 1-已观看 2-视频状态 3-是否进入老年人社区过滤 4-话题状态
    VIDEO_FILTER_URL = 'http://videotest-internal.yishihui.com/longvideoapi/openapi/recommend/filterVideos'

    # 获取视频在流量池中的剩余可分发数接口地址
    GET_REMAIN_VIEW_COUNT_URL = 'http://testapi-internal.piaoquantv.com/flowpool/video/remainViewCount'

    # 获取用户近30天是否有回流接口地址
    GET_USER_30DayReturnCnt_URL = 'http://videotest-internal.yishihui.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='

    # 日志服务配置
    ALIYUN_LOG = {
        'ENDPOINT': 'cn-hangzhou-intranet.log.aliyuncs.com',
        'ACCESSID': 'LTAIWYUujJAm7CbH',
        'ACCESSKEY': 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P',
        'PROJECT': 'rov-server-test',
    }

    # 快速曝光流量池ID
    QUICK_FLOW_POOL_ID = 3


class PreProductionConfig(BaseConfig):
    """预发布环境配置"""
    # 报警内容 环境区分
    ENV_TEXT = "预发布环境"
    # 线上环境redis地址
    REDIS_INFO = {
        'host': 'r-bp1fogs2mflr1ybfot.redis.rds.aliyuncs.com',
        'port': 6379,
        'password': 'Wqsd@2019',
    }

    # Hologres连接参数,服务器使用
    HOLOGRES_INFO = {
        'host': 'hgprecn-cn-7pp28y18c00c-cn-hangzhou-vpc.hologres.aliyuncs.com',
        'port': 80,
        'dbname': 'dssm',
        'user': 'LTAI5tMPqPy9yboQAf1mBCCN',
        'password': '4BEcOgxREOPq7t3A7EWkjciVULeQGj'
    }

    # 生产环境mysql地址
    MYSQL_INFO = {
        'host': 'rr-bp1x9785e8h5452bi157.mysql.rds.aliyuncs.com',
        'port': 3306,
        'user': 'wx2016_longvideo',
        'password': 'wx2016_longvideoP@assword1234',
        'db': 'longvideo',
        'charset': 'utf8'
    }

    # Hologres视频状态存储表名
    VIDEO_STATUS = 'longvideo.dwd_mdm_item_video_stat'

    # 用户已观看视频过滤 & 视频审核条件过滤 & 是否进入老年人社区过滤 & 话题状态过滤 接口地址
    # 参数types: 1-已观看 2-视频状态 3-是否进入老年人社区过滤 4-话题状态
    VIDEO_FILTER_URL = 'http://prespeed-internal.piaoquantv.com/longvideoapi/openapi/recommend/filterVideos'

    # 获取视频在流量池中的剩余可分发数接口地址
    GET_REMAIN_VIEW_COUNT_URL = 'http://preapi-internal.piaoquantv.com/flowpool/video/remainViewCount'

    # 获取用户近30天是否有回流接口地址
    GET_USER_30DayReturnCnt_URL = 'http://videopre-internal.piaoquantv.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='

    # 日志服务配置
    ALIYUN_LOG = {
        'ENDPOINT': 'cn-hangzhou-intranet.log.aliyuncs.com',
        'ACCESSID': 'LTAIWYUujJAm7CbH',
        'ACCESSKEY': 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P',
        'PROJECT': 'rov-server',
    }

    # 快速曝光流量池ID
    QUICK_FLOW_POOL_ID = 3


class ProductionConfig(BaseConfig):
    """生产环境配置"""
    # 报警内容 环境区分
    ENV_TEXT = "生产环境"
    # 线上环境redis地址
    REDIS_INFO = {
        'host': 'r-bp1fogs2mflr1ybfot.redis.rds.aliyuncs.com',
        'port': 6379,
        'password': 'Wqsd@2019',
    }

    # Hologres连接参数,服务器使用
    HOLOGRES_INFO = {
        'host': 'hgprecn-cn-7pp28y18c00c-cn-hangzhou-vpc.hologres.aliyuncs.com',
        'port': 80,
        'dbname': 'dssm',
        'user': 'LTAI5tMPqPy9yboQAf1mBCCN',
        'password': '4BEcOgxREOPq7t3A7EWkjciVULeQGj'
    }

    # 生产环境mysql地址
    MYSQL_INFO = {
        'host': 'rr-bp1x9785e8h5452bi157.mysql.rds.aliyuncs.com',
        'port': 3306,
        'user': 'wx2016_longvideo',
        'password': 'wx2016_longvideoP@assword1234',
        'db': 'longvideo',
        'charset': 'utf8'
    }

    # Hologres视频状态存储表名
    VIDEO_STATUS = 'longvideo.dwd_mdm_item_video_stat'

    # 用户已观看视频过滤 & 视频审核条件过滤 & 是否进入老年人社区过滤 & 话题状态过滤 接口地址
    # 参数types: 1-已观看 2-视频状态 3-是否进入老年人社区过滤 4-话题状态
    VIDEO_FILTER_URL = 'http://recommend-common-internal.piaoquantv.com/longvideoapi/openapi/recommend/filterVideos'

    # 获取视频在流量池中的剩余可分发数接口地址
    GET_REMAIN_VIEW_COUNT_URL = 'http://api-internal.piaoquantv.com/flowpool/video/remainViewCount'

    # 获取用户近30天是否有回流接口地址
    GET_USER_30DayReturnCnt_URL = 'http://longvideoapi-internal.piaoquantv.com/longvideoapi/openapi/user/has30DayReturnCnt?mid='

    # 日志服务配置
    ALIYUN_LOG = {
        'ENDPOINT': 'cn-hangzhou-intranet.log.aliyuncs.com',
        'ACCESSID': 'LTAIWYUujJAm7CbH',
        'ACCESSKEY': 'RfSjdiWwED1sGFlsjXv0DlfTnZTG1P',
        'PROJECT': 'rov-server',
    }

    # 快速曝光流量池ID
    QUICK_FLOW_POOL_ID = 3


def set_config():
    # 获取环境变量 ROV_SERVER_ENV
    env = os.environ.get('ROV_SERVER_ENV')
    # env = 'dev'
    if env is None:
        # log_.error('ENV ERROR: is None!')
        return
    if env == 'dev':
        return DevelopmentConfig()
    elif env == 'test':
        return TestConfig()
    elif env == 'pre':
        return PreProductionConfig()
    elif env == 'pro':
        return ProductionConfig()
    else:
        # log_.error('ENV ERROR: is {}'.format(env))
        return