Example #1
0
File: tests.py Project: genba/yturl
def test_embed_restriction_raises(urlopen_mock):
    f = open(os.path.join(os.path.dirname(__file__), "api_output/embed_restricted"), "rb")
    urlopen_mock.return_value = f

    avail = yturl.itags_for_video("fake")
    assert_raises(LookupError, list, avail)

    f.close()
Example #2
0
def test_available_itags_parsing(urlopen_mock):
    good_f = open(os.path.join(os.path.dirname(__file__), "files/good"), "rb")
    urlopen_mock.return_value = good_f

    avail = yturl.itags_for_video("fake")
    eq(list(avail),
        [(43,
	  'http://r1---sn-uh-30as.googlevideo.com/videoplayback?itag=43&' +
          'ratebypass=yes&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C' +
          '913434%2C936910%2C936913%2C902907%2C934022&upn=7S8Or-4r_ts&key=yt' +
          '5&ip=175.143.73.193&signature=4674C661CDD8B4A7D75537DC360B30FE9A0' +
          '156C7.07375770BEA4BCC1BA7F99D1775D9DC5DD794CF0&mt=1394594747&expi' +
          're=1394617426&id=2b16823874f4a662&sver=3&ms=au&ipbits=0&mv=m&spar' +
          'ams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&' +
          'source=youtube'),
         (18,
          'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
          'tag=18&ratebypass=yes&fexp=935640%2C943900%2C932261%2C945508%2C93' +
          '7417%2C913434%2C936910%2C936913%2C902907%2C934022&upn=7S8Or-4r_ts' +
          '&key=yt5&ip=175.143.73.193&signature=46EB2808DCE945183ACF0EF8A6C4' +
          '073AC3F4C6E4.A2157CC9734898D5C70379152F9FD20B7DF9A8BE&mt=13945947' +
          '47&expire=1394617426&id=2b16823874f4a662&sver=3&ms=au&ipbits=0&mv' +
          '=m&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2C' +
          'expire&source=youtube'),
         (5,
          'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
          'tag=5&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C913434%2C' +
          '936910%2C936913%2C902907%2C934022&ipbits=0&upn=7S8Or-4r_ts&factor' +
          '=1.25&algorithm=throttle-factor&ip=175.143.73.193&key=yt5&mt=1394' +
          '594747&expire=1394617426&id=2b16823874f4a662&sver=3&sparams=algor' +
          'ithm%2Cburst%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2C' +
          'expire&ms=au&source=youtube&mv=m&signature=A8CA3254FD670B0C2DFE3A' +
          'F49741A287B63FCB40.3BC7D9A5E6CAFE0D95B1139BB6140DB9D3ED3C67&burst' +
          '=40'),
         (36,
          'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
          'tag=36&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C913434%2' +
          'C936910%2C936913%2C902907%2C934022&ipbits=0&upn=7S8Or-4r_ts&facto' +
          'r=1.25&algorithm=throttle-factor&ip=175.143.73.193&key=yt5&mt=139' +
          '4594747&expire=1394617426&id=2b16823874f4a662&sver=3&sparams=algo' +
          'rithm%2Cburst%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2' +
          'Cexpire&ms=au&source=youtube&mv=m&signature=0D85E1CBEC334944C7A1E' +
          'EFDEA68443797E6840E.67CB67ECDC3897D85DCD6E916018620CE77A6D74&burs' +
          't=40'),
         (17,
          'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
          'tag=17&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C913434%2' +
          'C936910%2C936913%2C902907%2C934022&ipbits=0&upn=7S8Or-4r_ts&facto' +
          'r=1.25&algorithm=throttle-factor&ip=175.143.73.193&key=yt5&mt=139' +
          '4594747&expire=1394617426&id=2b16823874f4a662&sver=3&sparams=algo' +
          'rithm%2Cburst%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2' +
          'Cexpire&ms=au&source=youtube&mv=m&signature=6346FE1E173305971800C' +
          '7C83AB4B91C85065FBA.E167ACFB63BCE0A20157527AFF21831DB1D28CE2&burs' +
          't=40')]
    )


    good_f.close()
Example #3
0
def test_api_error_raises(reason):
    '''
    Test that we raise YouTubeAPIError when the API status is "fail".

    "reason" can be None, in which case we don't pass it in the API output. In
    this case, we should fall back to our default API error message.
    '''
    api_output_dict = {
        'status': 'fail',
    }

    if reason is not None:
        api_output_dict['reason'] = reason

    fake_api_output = urlencode(api_output_dict)

    _test_utils.mock_get_video_info_api_response(fake_api_output)

    with assert_raises(yturl.YouTubeAPIError):
        yturl.itags_for_video(_test_utils.VIDEO_ID)
Example #4
0
def test_embed_restriction_raises(urlopen_mock):
    mock_filename = os.path.join(os.path.dirname(__file__),
                                 "files/embed_restricted")

    mock_f = open(mock_filename, "rb")
    urlopen_mock.return_value = mock_f

    avail = yturl.itags_for_video("fake")
    assert_raises(LookupError, list, avail)

    mock_f.close()
Example #5
0
def test_embed_restriction_raises(urlopen_mock):
    mock_filename = os.path.join(
        os.path.dirname(__file__), "files/embed_restricted"
    )

    mock_f = open(mock_filename, "rb")
    urlopen_mock.return_value = mock_f

    avail = yturl.itags_for_video("fake")
    assert_raises(LookupError, list, avail)

    mock_f.close()
Example #6
0
def test_embed_restriction_raises():
    mock_filename = os.path.join(SCRIPT_DIR, 'files/embed_restricted')

    with open(mock_filename, 'rb') as mock_f:
        fake_api_output = mock_f.read()

    httpretty.register_uri(
        httpretty.GET, yturl.GVI_BASE_URL + 'fake',
        body=fake_api_output, content_type='application/x-www-form-urlencoded',
    )

    avail = yturl.itags_for_video('fake')
    assert_raises(yturl.YouTubeAPIError, list, avail)
Example #7
0
def test_available_itags_parsing(urlopen_mock):
    good_f = open(os.path.join(os.path.dirname(__file__), "files/good"), "rb")
    urlopen_mock.return_value = good_f

    avail = yturl.itags_for_video("fake")
    eq(list(avail),
       [(43, 'http://r1---sn-uh-30as.googlevideo.com/videoplayback?itag=43&' +
         'ratebypass=yes&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C' +
         '913434%2C936910%2C936913%2C902907%2C934022&upn=7S8Or-4r_ts&key=yt' +
         '5&ip=175.143.73.193&signature=4674C661CDD8B4A7D75537DC360B30FE9A0' +
         '156C7.07375770BEA4BCC1BA7F99D1775D9DC5DD794CF0&mt=1394594747&expi' +
         're=1394617426&id=2b16823874f4a662&sver=3&ms=au&ipbits=0&mv=m&spar' +
         'ams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&' +
         'source=youtube'),
        (18, 'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
         'tag=18&ratebypass=yes&fexp=935640%2C943900%2C932261%2C945508%2C93' +
         '7417%2C913434%2C936910%2C936913%2C902907%2C934022&upn=7S8Or-4r_ts' +
         '&key=yt5&ip=175.143.73.193&signature=46EB2808DCE945183ACF0EF8A6C4' +
         '073AC3F4C6E4.A2157CC9734898D5C70379152F9FD20B7DF9A8BE&mt=13945947' +
         '47&expire=1394617426&id=2b16823874f4a662&sver=3&ms=au&ipbits=0&mv' +
         '=m&sparams=id%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2C' +
         'expire&source=youtube'),
        (5, 'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
         'tag=5&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C913434%2C' +
         '936910%2C936913%2C902907%2C934022&ipbits=0&upn=7S8Or-4r_ts&factor' +
         '=1.25&algorithm=throttle-factor&ip=175.143.73.193&key=yt5&mt=1394' +
         '594747&expire=1394617426&id=2b16823874f4a662&sver=3&sparams=algor' +
         'ithm%2Cburst%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2C' +
         'expire&ms=au&source=youtube&mv=m&signature=A8CA3254FD670B0C2DFE3A' +
         'F49741A287B63FCB40.3BC7D9A5E6CAFE0D95B1139BB6140DB9D3ED3C67&burst' +
         '=40'),
        (36, 'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
         'tag=36&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C913434%2' +
         'C936910%2C936913%2C902907%2C934022&ipbits=0&upn=7S8Or-4r_ts&facto' +
         'r=1.25&algorithm=throttle-factor&ip=175.143.73.193&key=yt5&mt=139' +
         '4594747&expire=1394617426&id=2b16823874f4a662&sver=3&sparams=algo' +
         'rithm%2Cburst%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2' +
         'Cexpire&ms=au&source=youtube&mv=m&signature=0D85E1CBEC334944C7A1E' +
         'EFDEA68443797E6840E.67CB67ECDC3897D85DCD6E916018620CE77A6D74&burs' +
         't=40'),
        (17, 'http://r1---sn-uh-30as.googlevideo.com/videoplayback?i' +
         'tag=17&fexp=935640%2C943900%2C932261%2C945508%2C937417%2C913434%2' +
         'C936910%2C936913%2C902907%2C934022&ipbits=0&upn=7S8Or-4r_ts&facto' +
         'r=1.25&algorithm=throttle-factor&ip=175.143.73.193&key=yt5&mt=139' +
         '4594747&expire=1394617426&id=2b16823874f4a662&sver=3&sparams=algo' +
         'rithm%2Cburst%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2' +
         'Cexpire&ms=au&source=youtube&mv=m&signature=6346FE1E173305971800C' +
         '7C83AB4B91C85065FBA.E167ACFB63BCE0A20157527AFF21831DB1D28CE2&burs' +
         't=40')])

    good_f.close()
Example #8
0
def test_available_itags_parsing(input_itags):
    '''
    Test that the itag -> url map is successfully parsed from an API response.
    '''
    # The YouTube get_video_info API provides its output as a urlencoded
    # string. Individual keys and values inside a urlencoded string are always
    # strings.
    #
    # As such, if we didn't convert these to strings, we'd still get strings
    # back from parse_qsl (which is called inside yturl.itags_for_video). This
    # means that the return value of itags_for_video is always a string to
    # string OrderedDict, so we must convert to strings to be able to do the
    # final equality test.
    input_itags = list(map(str, input_itags))

    # In real life, the URL will obviously not be the itag as a string, but the
    # actual URL we retrieve is inconsequential to this test. We just want to
    # check that they are parsed and linked together properly as tuples.
    itag_to_url_map = collections.OrderedDict(
        (itag, itag) for itag in input_itags
    )

    # This is missing a lot of "real" keys that are returned by the YouTube API
    # inside url_encoded_fmt_stream_map, but we don't check those keys inside
    # itags_for_video, so we don't need them here.
    api_itag_map = ','.join([
        urlencode({
            'itag': itag,
            'url': itag_to_url_map[itag],
        }) for itag in input_itags
    ])

    # This is also missing a lot of keys which are, in reality, returned by the
    # YouTube API. If key references are added inside itags_for_video, the
    # relevant keys will need to be added here.
    fake_api_output = urlencode({
        'url_encoded_fmt_stream_map': api_itag_map,
        'status': 'ok',
    })

    _test_utils.mock_get_video_info_api_response(fake_api_output)
    got_itags_for_video = yturl.itags_for_video(_test_utils.VIDEO_ID)

    # dict to OrderedDict comparisons don't care about order, so if we
    # accidentally started returning a dict from itags_for_video, it's going to
    # return True even though the order actually isn't respected. As such, we
    # need to make sure the return type of itags_for_video is OrderedDict.
    assert_true(isinstance(got_itags_for_video, collections.OrderedDict))
    eq(got_itags_for_video, itag_to_url_map)
Example #9
0
def test_available_itags_parsing():
    with open(os.path.join(SCRIPT_DIR, 'files/success_output')) as output_f:
        expected_raw = json.load(output_f)
        # JSON has no tuple type, and we return tuples from itags_for_video, so
        # we need to coerce them.
        expected = map(tuple, expected_raw)

    with open(os.path.join(SCRIPT_DIR, 'files/success_input'), 'rb') as mock_f:
        fake_api_output = mock_f.read()

    httpretty.register_uri(
        httpretty.GET, yturl.GVI_BASE_URL + 'fake',
        body=fake_api_output, content_type='application/x-www-form-urlencoded',
    )

    eq(list(yturl.itags_for_video('fake')), list(expected))