# HG changeset patch
# User Paulo Chiliguano
# Date 1439286636 -3600
# Node ID e68dbee1f6db55893a5e98ec1b7b9552545f530a
# Parent 1dbd24575d4425cb66bc9ba753fbd869eb92841a
Modified code
New datasets
Updated report
diff -r 1dbd24575d44 -r e68dbee1f6db Code/convolutional_mlp.py
--- a/Code/convolutional_mlp.py Tue Aug 04 12:13:47 2015 +0100
+++ b/Code/convolutional_mlp.py Tue Aug 11 10:50:36 2015 +0100
@@ -114,7 +114,7 @@
# Paulo: dropout
# Source: https://github.com/Newmu/Theano-Tutorials/blob/master/5_convolutional_net.py
- retain_prob = 1 - 0.25
+ retain_prob = 1 - 0.20
pooled_out *= srng.binomial(
pooled_out.shape,
p=retain_prob,
@@ -135,9 +135,9 @@
self.input = input
-def evaluate_lenet5(learning_rate=0.1, n_epochs=200,
+def evaluate_lenet5(learning_rate=0.01, n_epochs=200,
dataset='mnist.pkl.gz',
- nkerns=[10, 10], batch_size=20):
+ nkerns=[32, 32], batch_size=10):
""" Demonstrates lenet on MNIST dataset
:type learning_rate: float
@@ -188,7 +188,7 @@
# to a 4D tensor, compatible with our LeNetConvPoolLayer
# (28, 28) is the size of MNIST images.
#layer0_input = x.reshape((batch_size, 1, 28, 28))
- layer0_input = x.reshape((batch_size, 1, 128, 513))
+ layer0_input = x.reshape((batch_size, 1, 130, 128))
# Construct the first convolutional pooling layer:
# filtering reduces the image size to (28-5+1 , 28-5+1) = (24, 24)
# maxpooling reduces this further to (24/2, 24/2) = (12, 12)
@@ -197,9 +197,9 @@
rng,
input=layer0_input,
#image_shape=(batch_size, 1, 28, 28),
- image_shape=(batch_size, 1, 128, 513),
+ image_shape=(batch_size, 1, 130, 128),
#filter_shape=(nkerns[0], 1, 5, 5),
- filter_shape=(nkerns[0], 1, 4, 513),
+ filter_shape=(nkerns[0], 1, 8, 1),
#poolsize=(2, 2)
poolsize=(4, 1)
)
@@ -212,34 +212,13 @@
rng,
input=layer0.output,
#image_shape=(batch_size, nkerns[0], 12, 12),
- image_shape=(batch_size, nkerns[0], 31, 1),
+ image_shape=(batch_size, nkerns[0], 30, 128),
#filter_shape=(nkerns[1], nkerns[0], 5, 5),
- filter_shape=(nkerns[1], nkerns[0], 4, 1),
+ filter_shape=(nkerns[1], nkerns[0], 8, 1),
#poolsize=(2, 2)
- poolsize=(2, 1)
+ poolsize=(4, 1)
)
- # Construct the third convolutional pooling layer
- '''
- layer2 = LeNetConvPoolLayer(
- rng,
- input=layer1.output,
- image_shape=(batch_size, nkerns[1], 296, 123),
- filter_shape=(nkerns[2], nkerns[1], 5, 5),
- poolsize=(1, 1)
- )
- '''
-
- # Construct the third convolutional pooling layer
- '''
- layer3 = LeNetConvPoolLayer(
- rng,
- input=layer2.output,
- image_shape=(batch_size, nkerns[2], 296, 123),
- filter_shape=(nkerns[3], nkerns[2], 5, 5),
- poolsize=(1, 1)
- )
- '''
# the HiddenLayer being fully-connected, it operates on 2D matrices of
# shape (batch_size, num_pixels) (i.e matrix of rasterized images).
# This will generate a matrix of shape (batch_size, nkerns[1] * 4 * 4),
@@ -251,16 +230,16 @@
rng,
input=layer2_input,
#n_in=nkerns[1] * 4 * 4,
- n_in=nkerns[1] * 14 * 1,
- #n_out=500,
- n_out=513,
+ n_in=nkerns[1] * 5 * 128,
+ n_out=500,
+ #n_out=100,
#activation=T.tanh
activation=relu
)
# classify the values of the fully-connected sigmoidal layer
- #layer3 = LogisticRegression(input=layer2.output, n_in=500, n_out=10)
- layer3 = LogisticRegression(input=layer2.output, n_in=513, n_out=10)
+ layer3 = LogisticRegression(input=layer2.output, n_in=500, n_out=10)
+ #layer4 = LogisticRegression(input=layer3.output, n_in=50, n_out=10)
# the cost we minimize during training is the NLL of the model
cost = layer3.negative_log_likelihood(y)
@@ -286,7 +265,6 @@
'''
# Paulo: Set best param for MLP pre-training
f = file('/homes/pchilguano/deep_learning/best_params.pkl', 'rb')
- #params3 = cPickle.load(f)
params0, params1, params2, params3 = cPickle.load(f)
f.close()
layer0.W.set_value(params0[0])
@@ -297,9 +275,10 @@
layer2.b.set_value(params2[1])
layer3.W.set_value(params3[0])
layer3.b.set_value(params3[1])
- '''
+ '''
# create a list of all model parameters to be fit by gradient descent
params = layer3.params + layer2.params + layer1.params + layer0.params
+ #params = layer4.params + layer3.params + layer2.params + layer1.params + layer0.params
# create a list of gradients for all model parameters
grads = T.grad(cost, params)
@@ -330,7 +309,7 @@
###############
print '... training'
# early-stopping parameters
- patience = 10000 # look as this many examples regardless
+ patience = 1000 # look as this many examples regardless
patience_increase = 2 # wait this much longer when a new best is
# found
improvement_threshold = 0.995 # a relative improvement of this much is
@@ -396,6 +375,7 @@
best_params1 = [param.get_value().copy() for param in layer1.params]
best_params2 = [param.get_value().copy() for param in layer2.params]
best_params3 = [param.get_value().copy() for param in layer3.params]
+ #best_params4 = [param.get_value().copy() for param in layer4.params]
if patience <= iter:
done_looping = True
diff -r 1dbd24575d44 -r e68dbee1f6db Code/eda.py
--- a/Code/eda.py Tue Aug 04 12:13:47 2015 +0100
+++ b/Code/eda.py Tue Aug 11 10:50:36 2015 +0100
@@ -48,16 +48,6 @@
"SOAKNZI12A58A79CAC": [1, 5, 3.5, 3, 4, 5, 1, 5, 4, 1],
"SOAJZEP12A8C14379B": [5, 5, 4, 2, 1, 1, 1, 5, 4, 1],
"SOAHQFM12A8C134B65": [2.5, 4, 4, 1, 1, 1, 1, 5, 4, 1]}
-'''
-profile = {"Profile0": [2.5, 4, 3.5, 3, 5, 4, 1],
- "Profile1": [2.5, 4, 3.5, 3, 5, 4, 1],
- "Profile2": [2.5, 4, 3.5, 3, 5, 4, 1],
- "Profile3": [2.5, 4, 3.5, 3, 5, 4, 1],
- "Profile4": [2.5, 4, 3.5, 3, 5, 4, 1],
- "Profile5": [2.5, 4, 3.5, 3, 5, 4, 1],
- "Profile6": [2.5, 4, 3.5, 3, 5, 4, 1],
- "Profile7": [2.5, 4, 3.5, 3, 5, 4, 1]}
-'''
'''
Functions to compute similarity between items or between profiles
@@ -141,14 +131,13 @@
#sum_log += log10(rating * sim)
return sim
-
'''
Generation of M individuals uniformly
'''
population_size = len(users)
fraction_of_population = 0.5
np.random.seed(len(users))
-M = np.random.uniform(1, 5, population_size * len(items.values()[0]))
+M = np.random.uniform(size=population_size * len(items.values()[0]))
M.shape = (-1, len(items.values()[0]))
profile = {}
i = 0
@@ -161,6 +150,11 @@
'''
Fitness(profile, 0)
+
+
+
+
+
np.random.seed(1)
g = mixture.GMM(n_components=7)
# Generate random observations with two modes centered on 0
diff -r 1dbd24575d44 -r e68dbee1f6db Code/latent_vectors.py
--- a/Code/latent_vectors.py Tue Aug 04 12:13:47 2015 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-Created on Mon Jul 20 13:37:43 2015
-
-@author: Paulo
-"""
-
-
-import pandas as pd
-import csv
-import itertools
-import numpy as np
-import wmf
-
-# Read songID of downloaded audio clips
-with open('/homes/pchilguano/dataset/ten_songs.txt', 'rb') as input1:
- available = list(csv.reader(input1))
- chain1 = list(itertools.chain(*available))
-
-# Sparse user-item matrix
-result = pd.DataFrame()
-for chunk in pd.read_csv('/homes/pchilguano/dataset/train_triplets_wo_mismatches.csv', low_memory = False, delim_whitespace=False, chunksize=10000, names=['user','song','plays'], header=None):
- chunk = chunk[chunk.song.isin(chain1)]
- result = result.append(chunk, ignore_index=True)
- #result = result.append(chunk.pivot(index='user', columns='song', values='plays'))
- print (result.shape)
-
-
-cnames = result.set_index('user').T.to_dict().keys()
-final = {}
-for a in cnames:
- final[a] ={result.set_index('user').T.to_dict()[a]["song"]: result.set_index('user').T.to_dict()[a]["plays"]}
-
-dict((k, v.dropna().to_dict()) for k, v in pd.compat.iteritems(result))
-
-sresult = result.to_sparse()
-sresult.to_pickle('/homes/pchilguano/dataset/taste_profile_sparse.pkl')
-
-# Weight Matrix Factorization
-B = np.load("test_matrix.pkl")
-S = wmf.log_surplus_confidence_matrix(B, alpha=2.0, epsilon=1e-6)
-U, V = wmf.factorize(S, num_factors=40, lambda_reg=1e-5, num_iterations=2, init_std=0.01, verbose=True, dtype='float32', recompute_factors=wmf.recompute_factors_bias)
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/logistic_sgd.py
--- a/Code/logistic_sgd.py Tue Aug 04 12:13:47 2015 +0100
+++ b/Code/logistic_sgd.py Tue Aug 11 10:50:36 2015 +0100
@@ -208,7 +208,7 @@
f = gzip.open(dataset, 'rb')
train_set, valid_set, test_set = cPickle.load(f)
f.close()'''
- f = file('/homes/pchilguano/deep_learning/gtzan_3sec.pkl', 'rb')
+ f = file('/homes/pchilguano/deep_learning/features/gtzan_3sec_1.pkl', 'rb')
train_set, valid_set, test_set = cPickle.load(f)
f.close()
#train_set, valid_set, test_set format: tuple(input, target)
diff -r 1dbd24575d44 -r e68dbee1f6db Code/prepare_dataset.py
--- a/Code/prepare_dataset.py Tue Aug 04 12:13:47 2015 +0100
+++ b/Code/prepare_dataset.py Tue Aug 11 10:50:36 2015 +0100
@@ -11,11 +11,17 @@
import cPickle
import sklearn.preprocessing as preprocessing
-filename = '/homes/pchilguano/deep_learning/features/feats_3sec.h5'
+'''
+Read HDF5 file that contains log-mel spectrograms
+'''
+filename = '/homes/pchilguano/deep_learning/features/feats.h5'
with tables.openFile(filename, 'r') as f:
features = f.root.x.read()
#filenames = f.root.filenames.read()
+'''
+Pre-processing of spectrograms mean=0 and std=1
+'''
#initial_shape = features.shape[1:]
n_per_example = np.prod(features.shape[1:-1])
number_of_features = features.shape[-1]
@@ -28,13 +34,18 @@
#genre = np.asarray([line.strip().split('\t')[1] for line in open(filename,'r').readlines()])
+'''
+Read labels from ground truth
+'''
filename = '/homes/pchilguano/deep_learning/lists/ground_truth.txt'
with open(filename, 'r') as f:
tag_set = set()
for line in f:
tag = line.strip().split('\t')[1]
tag_set.add(tag)
-
+'''
+Assign label to a discrete number
+'''
tag_dict = dict([(item, index) for index, item in enumerate(sorted(tag_set))])
with open(filename, 'r') as f:
target = np.asarray([], dtype='int32')
@@ -43,13 +54,13 @@
tag = line.strip().split('\t')[1]
target = np.append(target, tag_dict[tag])
-train_input, valid_input, test_input = np.array_split(flat_data, [flat_data.shape[0]*4/5, flat_data.shape[0]*9/10])
-train_target, valid_target, test_target = np.array_split(target, [target.shape[0]*4/5, target.shape[0]*9/10])
+train_input, valid_input, test_input = np.array_split(flat_data, [flat_data.shape[0]*1/2, flat_data.shape[0]*3/4])
+train_target, valid_target, test_target = np.array_split(target, [target.shape[0]*1/2, target.shape[0]*3/4])
-f = file('/homes/pchilguano/deep_learning/gtzan_3sec.pkl', 'wb')
+f = file('/homes/pchilguano/deep_learning/gtzan.pkl', 'wb')
cPickle.dump(((train_input, train_target), (valid_input, valid_target), (test_input, test_target)), f, protocol=cPickle.HIGHEST_PROTOCOL)
f.close()
-
+'''
flat_target = target.repeat(n_per_example)
train_input, valid_input, test_input = np.array_split(flat_data, [flat_data.shape[0]*4/5, flat_data.shape[0]*9/10])
@@ -58,3 +69,4 @@
f = file('/homes/pchilguano/deep_learning/gtzan_logistic.pkl', 'wb')
cPickle.dump(((train_input, train_target), (valid_input, valid_target), (test_input, test_target)), f, protocol=cPickle.HIGHEST_PROTOCOL)
f.close()
+'''
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/preview_clip.py
--- a/Code/preview_clip.py Tue Aug 04 12:13:47 2015 +0100
+++ b/Code/preview_clip.py Tue Aug 11 10:50:36 2015 +0100
@@ -5,42 +5,60 @@
@author: paulochiliguano
"""
+
import csv
import time
-from pyechonest import song, config
-import oauth2 as oauth
+from pyechonest import song, config #http://echonest.github.io/pyechonest/
+import oauth2 as oauth #https://github.com/jasonrubenstein/python_oauth2
import urllib2
+import os
+# 7digital keys
consumer_key = '7ds28qendsk9'
consumer_secret = 'm5nsktn3hu6x45cy'
consumer = oauth.Consumer(consumer_key, consumer_secret)
-config.ECHO_NEST_API_KEY="LINDFDUTQZQ781IE8"
-with open('/homes/pchilguano/dataset/echonest_songID.txt', 'rb') as input, open('/homes/pchilguano/dataset/7digital_url.txt', 'wb') as output:
- writer = csv.writer(output, delimiter=',')
- #for i in xrange(21):
- #input.readline()
- next = input.readline()
+# EchoNest key
+config.ECHO_NEST_API_KEY="LINDFDUTQZQ781IE8"
+
+# Retrieve audio clips
+mp3_folder = '/Users/paulochiliguano/Documents/msc-project/Dataset/clips/'
+filename_echonest = '/Users/paulochiliguano/Documents/msc-project/Dataset/\
+CF_dataset_songID.txt'
+filename_7digital = '/Users/paulochiliguano/Documents/msc-project/Dataset/\
+CF_dataset_metadata.txt'
+with open(filename_echonest, 'rb') as f, open(filename_7digital, 'wb') as out:
+ writer = csv.writer(out, delimiter='\t')
+ for i in xrange(289):
+ f.readline()
+ next = f.readline()
while next != "":
try:
- s = song.Song(next[:-2])
+ s = song.Song(next)
+ #s = song.Song('SOPEXHZ12873FD2AC7')
+ #except:
except IndexError:
time.sleep(3)
- next = input.readline()
+ next = f.readline()
else:
time.sleep(3)
try:
ss_tracks = s.get_tracks('7digital-UK')
except:
time.sleep(3)
- next = input.readline()
+ next = f.readline()
else:
#print(len(ss_tracks))
if len(ss_tracks) != 0:
- ss_track = ss_tracks[0]
+ ss_track = ss_tracks[0]
preview_url = ss_track.get('preview_url')
+ track_id = ss_track.get('id')
- req = oauth.Request(method="GET", url=preview_url, is_form_encoded=True)
+ req = oauth.Request(
+ method="GET",
+ url=preview_url,
+ is_form_encoded=True
+ )
req['oauth_timestamp'] = oauth.Request.make_timestamp()
req['oauth_nonce'] = oauth.Request.make_nonce()
req['country'] = "GB"
@@ -51,13 +69,26 @@
response = urllib2.urlopen(req.to_url())
except:
#time.sleep(16)
- print([next[:-2], 'NA'])
+ print([next[:-2], 'Preview Not Available'])
#writer.writerow([next[:-2], 'NA', s.artist_name.encode("utf-8"), s.title.encode("utf-8")])
else:
- print([next[:-2], preview_url, s.artist_name, s.title])
- writer.writerow([next[:-2], preview_url, s.artist_name.encode("utf-8"), s.title.encode("utf-8")])
- with open(next[:-2]+'.mp3', 'wb') as songfile:
+ print([
+ next,
+ track_id,
+ s.artist_name,
+ s.title,
+ preview_url
+ ])
+ writer.writerow([
+ next,
+ track_id,
+ s.artist_name.encode("utf-8"),
+ s.title.encode("utf-8"),
+ preview_url
+ ])
+ mp3_file = os.path.join(mp3_folder, next[:-1]+'.mp3')
+ with open(mp3_file, 'wb') as songfile:
songfile.write(response.read())
time.sleep(16)
- next = input.readline()
+ next = f.readline()
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/.gitignore
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/.gitignore Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,3 @@
+*.py?
+*.egg-info
+*.swp
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/LICENSE.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/LICENSE.txt Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2007 Leah Culver
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/Makefile Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,155 @@
+PYTHON = $(shell test -x bin/python && echo bin/python || \
+ echo `which python`)
+PYVERS = $(shell $(PYTHON) -c 'import sys; print "%s.%s" % sys.version_info[0:2]')
+VIRTUALENV = $(shell /bin/echo -n `which virtualenv || \
+ which virtualenv-$(PYVERS) || \
+ which virtualenv$(PYVERS)`)
+VIRTUALENV += --no-site-packages
+PAGER ?= less
+DEPS := $(shell find $(PWD)/deps -type f -printf "file://%p ")
+COVERAGE = $(shell test -x bin/coverage && echo bin/coverage || echo true)
+SETUP = $(PYTHON) ./setup.py
+EZ_INSTALL = $(SETUP) easy_install -f "$(DEPS)"
+PYLINT = bin/pylint
+PLATFORM = $(shell $(PYTHON) -c "from pkg_resources import get_build_platform; print get_build_platform()")
+OS := $(shell uname)
+EGG := $(shell $(SETUP) --fullname)-py$(PYVERS).egg
+SDIST := $(shell $(SETUP) --fullname).tar.gs
+SRCDIR := oauth2
+SOURCES := $(shell find $(SRCDIR) -type f -name \*.py -not -name 'test_*')
+TESTS := $(shell find $(SRCDIR) -type f -name test_\*.py)
+COVERED := $(SOURCES)
+ROOT = $(shell pwd)
+ROOTCMD = fakeroot
+SIGN_KEY ?= nerds@simplegeo.com
+BUILD_NUMBER ?= 1
+
+
+.PHONY: test dev clean extraclean debian/changelog
+
+all: egg
+egg: dist/$(EGG)
+
+dist/$(EGG):
+ $(SETUP) bdist_egg
+
+sdist:
+ $(SETUP) sdist
+
+debian/changelog:
+ -git branch -D changelog
+ git checkout -b changelog
+ git-dch -a -N $(shell $(SETUP) --version) --debian-branch changelog \
+ --snapshot --snapshot-number=$(BUILD_NUMBER)
+
+deb: debian/changelog
+ test -d dist/deb || mkdir -p dist/deb
+ dpkg-buildpackage -r$(ROOTCMD) -k$(SIGN_KEY)
+ mv ../python-oauth2_* dist/deb
+
+test:
+ $(SETUP) test --with-coverage --cover-package=oauth2
+
+sdist:
+ python setup.py sdist
+
+xunit.xml: bin/nosetests $(SOURCES) $(TESTS)
+ $(SETUP) test --with-xunit --xunit-file=$@
+
+bin/nosetests: bin/easy_install
+ @$(EZ_INSTALL) nose
+
+coverage: .coverage
+ @$(COVERAGE) html -d $@ $(COVERED)
+
+coverage.xml: .coverage
+ @$(COVERAGE) xml $(COVERED)
+
+.coverage: $(SOURCES) $(TESTS) bin/coverage bin/nosetests
+ -@$(COVERAGE) run $(SETUP) test
+
+bin/coverage: bin/easy_install
+ @$(EZ_INSTALL) coverage
+
+profile: .profile bin/pyprof2html
+ bin/pyprof2html -o $@ $<
+
+.profile: $(SOURCES) bin/nosetests
+ -$(SETUP) test -q --with-profile --profile-stats-file=$@
+
+bin/pyprof2html: bin/easy_install bin/
+ @$(EZ_INSTALL) pyprof2html
+
+docs: $(SOURCES) bin/epydoc
+ @echo bin/epydoc -q --html --no-frames -o $@ ...
+ @bin/epydoc -q --html --no-frames -o $@ $(SOURCES)
+
+bin/epydoc: bin/easy_install
+ @$(EZ_INSTALL) epydoc
+
+bin/pep8: bin/easy_install
+ @$(EZ_INSTALL) pep8
+
+pep8: bin/pep8
+ @bin/pep8 --repeat --ignore E225 $(SRCDIR)
+
+pep8.txt: bin/pep8
+ @bin/pep8 --repeat --ignore E225 $(SRCDIR) > $@
+
+lint: bin/pylint
+ -$(PYLINT) -f colorized $(SRCDIR)
+
+lint.html: bin/pylint
+ -$(PYLINT) -f html $(SRCDIR) > $@
+
+lint.txt: bin/pylint
+ -$(PYLINT) -f parseable $(SRCDIR) > $@
+
+bin/pylint: bin/easy_install
+ @$(EZ_INSTALL) pylint
+
+README.html: README.mkd | bin/markdown
+ bin/markdown -e utf-8 $^ -f $@
+
+bin/markdown: bin/easy_install
+ @$(EZ_INSTALL) Markdown
+
+
+# Development setup
+rtfm:
+ $(PAGER) README.mkd
+
+tags: TAGS.gz
+
+TAGS.gz: TAGS
+ gzip $^
+
+TAGS: $(SOURCES)
+ ctags -eR .
+
+env: bin/easy_install
+
+bin/easy_install:
+ $(VIRTUALENV) .
+ -test -f deps/setuptools* && $@ -U deps/setuptools*
+
+dev: develop
+develop: env
+ nice -n 20 $(SETUP) develop
+ @echo " ---------------------------------------------"
+ @echo " To activate the development environment, run:"
+ @echo " . bin/activate"
+ @echo " ---------------------------------------------"
+
+clean:
+clean:
+ find . -type f -name \*.pyc -exec rm {} \;
+ rm -rf build dist TAGS TAGS.gz digg.egg-info tmp .coverage \
+ coverage coverage.xml docs lint.html lint.txt profile \
+ .profile *.egg xunit.xml
+ @if test "$(OS)" = "Linux"; then $(ROOTCMD) debian/rules clean; fi
+
+
+xclean: extraclean
+extraclean: clean
+ rm -rf bin lib .Python include
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/README.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/README.md Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,357 @@
+# Overview
+
+This code was originally forked from [Leah Culver and Andy Smith's oauth.py code](http://github.com/leah/python-oauth/). Some of the tests come from a [fork by Vic Fryzel](http://github.com/shellsage/python-oauth), while a revamped Request class and more tests were merged in from [Mark Paschal's fork](http://github.com/markpasc/python-oauth). A number of notable differences exist between this code and its forefathers:
+
+* 100% unit test coverage.
+* The DataStore
object has been completely ripped out. While creating unit tests for the library I found several substantial bugs with the implementation and confirmed with Andy Smith that it was never fully baked.
+* Classes are no longer prefixed with OAuth
.
+* The Request
class now extends from dict
.
+* The library is likely no longer compatible with Python 2.3.
+* The Client
class works and extends from httplib2
. It's a thin wrapper that handles automatically signing any normal HTTP request you might wish to make.
+
+# Signing a Request
+
+ import oauth2 as oauth
+ import time
+
+ # Set the API endpoint
+ url = "http://example.com/photos"
+
+ # Set the base oauth_* parameters along with any other parameters required
+ # for the API call.
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': oauth.generate_nonce(),
+ 'oauth_timestamp': int(time.time())
+ 'user': 'joestump',
+ 'photoid': 555555555555
+ }
+
+ # Set up instances of our Token and Consumer. The Consumer.key and
+ # Consumer.secret are given to you by the API provider. The Token.key and
+ # Token.secret is given to you after a three-legged authentication.
+ token = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ consumer = oauth.Consumer(key="con-test-key", secret="con-test-secret")
+
+ # Set our token/key parameters
+ params['oauth_token'] = token.key
+ params['oauth_consumer_key'] = consumer.key
+
+ # Create our request. Change method, etc. accordingly.
+ req = oauth.Request(method="GET", url=url, parameters=params)
+
+ # Sign the request.
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ req.sign_request(signature_method, consumer, token)
+
+# Using the Client
+
+The oauth2.Client
is based on httplib2
and works just as you'd expect it to. The only difference is the first two arguments to the constructor are an instance of oauth2.Consumer
and oauth2.Token
(oauth2.Token
is only needed for three-legged requests).
+
+ import oauth2 as oauth
+
+ # Create your consumer with the proper key/secret.
+ consumer = oauth.Consumer(key="your-twitter-consumer-key",
+ secret="your-twitter-consumer-secret")
+
+ # Request token URL for Twitter.
+ request_token_url = "http://twitter.com/oauth/request_token"
+
+ # Create our client.
+ client = oauth.Client(consumer)
+
+ # The OAuth Client request works just like httplib2 for the most part.
+ resp, content = client.request(request_token_url, "GET")
+ print resp
+ print content
+
+# Twitter Three-legged OAuth Example
+
+Below is an example of how one would go through a three-legged OAuth flow to
+gain access to protected resources on Twitter. This is a simple CLI script, but
+can be easily translated to a web application.
+
+ import urlparse
+ import oauth2 as oauth
+
+ consumer_key = 'my_key_from_twitter'
+ consumer_secret = 'my_secret_from_twitter'
+
+ request_token_url = 'http://twitter.com/oauth/request_token'
+ access_token_url = 'http://twitter.com/oauth/access_token'
+ authorize_url = 'http://twitter.com/oauth/authorize'
+
+ consumer = oauth.Consumer(consumer_key, consumer_secret)
+ client = oauth.Client(consumer)
+
+ # Step 1: Get a request token. This is a temporary token that is used for
+ # having the user authorize an access token and to sign the request to obtain
+ # said access token.
+
+ resp, content = client.request(request_token_url, "GET")
+ if resp['status'] != '200':
+ raise Exception("Invalid response %s." % resp['status'])
+
+ request_token = dict(urlparse.parse_qsl(content))
+
+ print "Request Token:"
+ print " - oauth_token = %s" % request_token['oauth_token']
+ print " - oauth_token_secret = %s" % request_token['oauth_token_secret']
+ print
+
+ # Step 2: Redirect to the provider. Since this is a CLI script we do not
+ # redirect. In a web application you would redirect the user to the URL
+ # below.
+
+ print "Go to the following link in your browser:"
+ print "%s?oauth_token=%s" % (authorize_url, request_token['oauth_token'])
+ print
+
+ # After the user has granted access to you, the consumer, the provider will
+ # redirect you to whatever URL you have told them to redirect to. You can
+ # usually define this in the oauth_callback argument as well.
+ accepted = 'n'
+ while accepted.lower() == 'n':
+ accepted = raw_input('Have you authorized me? (y/n) ')
+ oauth_verifier = raw_input('What is the PIN? ')
+
+ # Step 3: Once the consumer has redirected the user back to the oauth_callback
+ # URL you can request the access token the user has approved. You use the
+ # request token to sign this request. After this is done you throw away the
+ # request token and use the access token returned. You should store this
+ # access token somewhere safe, like a database, for future use.
+ token = oauth.Token(request_token['oauth_token'],
+ request_token['oauth_token_secret'])
+ token.set_verifier(oauth_verifier)
+ client = oauth.Client(consumer, token)
+
+ resp, content = client.request(access_token_url, "POST")
+ access_token = dict(urlparse.parse_qsl(content))
+
+ print "Access Token:"
+ print " - oauth_token = %s" % access_token['oauth_token']
+ print " - oauth_token_secret = %s" % access_token['oauth_token_secret']
+ print
+ print "You may now access protected resources using the access tokens above."
+ print
+
+# Logging into Django w/ Twitter
+
+Twitter also has the ability to authenticate a user [via an OAuth flow](http://apiwiki.twitter.com/Sign-in-with-Twitter). This
+flow is exactly like the three-legged OAuth flow, except you send them to a
+slightly different URL to authorize them.
+
+In this example we'll look at how you can implement this login flow using
+Django and python-oauth2.
+
+## Set up a Profile model
+
+You'll need a place to store all of your Twitter OAuth credentials after the
+user has logged in. In your app's `models.py` file you should add something
+that resembles the following model.
+
+ class Profile(models.Model):
+ user = models.ForeignKey(User)
+ oauth_token = models.CharField(max_length=200)
+ oauth_secret = models.CharField(max_length=200)
+
+## Set up your Django views
+
+### `urls.py`
+
+Your `urls.py` should look something like the following. Basically, you need to
+have a login URL, a callback URL that Twitter will redirect your users back to,
+and a logout URL.
+
+In this example `^login/` and `twitter_login` will send the user to Twitter to
+be logged in, `^login/authenticated/` and `twitter_authenticated` will confirm
+the login, create the account if necessary, and log the user into the
+application, and `^logout`/ logs the user out in the `twitter_logout` view.
+
+
+ from django.conf.urls.defaults import *
+ from django.contrib import admin
+ from mytwitterapp.views import twitter_login, twitter_logout, \
+ twitter_authenticated
+
+ admin.autodiscover()
+
+ urlpatterns = patterns('',
+ url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+ url(r'^admin/', include(admin.site.urls)),
+ url(r'^login/?$', twitter_login),
+ url(r'^logout/?$', twitter_logout),
+ url(r'^login/authenticated/?$', twitter_authenticated),
+ )
+
+### `views.py`
+
+*NOTE:* The following code was coded for Python 2.4 so some of the libraries
+and code here might need to be updated if you are using Python 2.6+.
+
+ # Python
+ import oauth2 as oauth
+ import cgi
+
+ # Django
+ from django.shortcuts import render_to_response
+ from django.http import HttpResponseRedirect
+ from django.conf import settings
+ from django.contrib.auth import authenticate, login, logout
+ from django.contrib.auth.models import User
+ from django.contrib.auth.decorators import login_required
+
+ # Project
+ from mytwitterapp.models import Profile
+
+ # It's probably a good idea to put your consumer's OAuth token and
+ # OAuth secret into your project's settings.
+ consumer = oauth.Consumer(settings.TWITTER_TOKEN, settings.TWITTER_SECRET)
+ client = oauth.Client(consumer)
+
+ request_token_url = 'http://twitter.com/oauth/request_token'
+ access_token_url = 'http://twitter.com/oauth/access_token'
+
+ # This is the slightly different URL used to authenticate/authorize.
+ authenticate_url = 'http://twitter.com/oauth/authenticate'
+
+ def twitter_login(request):
+ # Step 1. Get a request token from Twitter.
+ resp, content = client.request(request_token_url, "GET")
+ if resp['status'] != '200':
+ raise Exception("Invalid response from Twitter.")
+
+ # Step 2. Store the request token in a session for later use.
+ request.session['request_token'] = dict(cgi.parse_qsl(content))
+
+ # Step 3. Redirect the user to the authentication URL.
+ url = "%s?oauth_token=%s" % (authenticate_url,
+ request.session['request_token']['oauth_token'])
+
+ return HttpResponseRedirect(url)
+
+
+ @login_required
+ def twitter_logout(request):
+ # Log a user out using Django's logout function and redirect them
+ # back to the homepage.
+ logout(request)
+ return HttpResponseRedirect('/')
+
+ def twitter_authenticated(request):
+ # Step 1. Use the request token in the session to build a new client.
+ token = oauth.Token(request.session['request_token']['oauth_token'],
+ request.session['request_token']['oauth_token_secret'])
+ client = oauth.Client(consumer, token)
+
+ # Step 2. Request the authorized access token from Twitter.
+ resp, content = client.request(access_token_url, "GET")
+ if resp['status'] != '200':
+ print content
+ raise Exception("Invalid response from Twitter.")
+
+ """
+ This is what you'll get back from Twitter. Note that it includes the
+ user's user_id and screen_name.
+ {
+ 'oauth_token_secret': 'IcJXPiJh8be3BjDWW50uCY31chyhsMHEhqJVsphC3M',
+ 'user_id': '120889797',
+ 'oauth_token': '120889797-H5zNnM3qE0iFoTTpNEHIz3noL9FKzXiOxwtnyVOD',
+ 'screen_name': 'heyismysiteup'
+ }
+ """
+ access_token = dict(cgi.parse_qsl(content))
+
+ # Step 3. Lookup the user or create them if they don't exist.
+ try:
+ user = User.objects.get(username=access_token['screen_name'])
+ except User.DoesNotExist:
+ # When creating the user I just use their screen_name@twitter.com
+ # for their email and the oauth_token_secret for their password.
+ # These two things will likely never be used. Alternatively, you
+ # can prompt them for their email here. Either way, the password
+ # should never be used.
+ user = User.objects.create_user(access_token['screen_name'],
+ '%s@twitter.com' % access_token['screen_name'],
+ access_token['oauth_token_secret'])
+
+ # Save our permanent token and secret for later.
+ profile = Profile()
+ profile.user = user
+ profile.oauth_token = access_token['oauth_token']
+ profile.oauth_secret = access_token['oauth_token_secret']
+ profile.save()
+
+ # Authenticate the user and log them in using Django's pre-built
+ # functions for these things.
+ user = authenticate(username=access_token['screen_name'],
+ password=access_token['oauth_token_secret'])
+ login(request, user)
+
+ return HttpResponseRedirect('/')
+
+
+### `settings.py`
+
+* You'll likely want to set `LOGIN_URL` to `/login/` so that users are properly redirected to your Twitter login handler when you use `@login_required` in other parts of your Django app.
+* You can also set `AUTH_PROFILE_MODULE = 'mytwitterapp.Profile'` so that you can easily access the Twitter OAuth token/secret for that user using the `User.get_profile()` method in Django.
+
+# XOAUTH for IMAP and SMTP
+
+Gmail supports OAuth over IMAP and SMTP via a standard they call XOAUTH. This allows you to authenticate against Gmail's IMAP and SMTP servers using an OAuth token and secret. It also has the added benefit of allowing you to use vanilla SMTP and IMAP libraries. The `python-oauth2` package provides both IMAP and SMTP libraries that implement XOAUTH and wrap `imaplib.IMAP4_SSL` and `smtplib.SMTP`. This allows you to connect to Gmail with OAuth credentials using standard Python libraries.
+
+## IMAP
+
+ import oauth2 as oauth
+ import oauth2.clients.imap as imaplib
+
+ # Set up your Consumer and Token as per usual. Just like any other
+ # three-legged OAuth request.
+ consumer = oauth.Consumer('your_consumer_key', 'your_consumer_secret')
+ token = oauth.Token('your_users_3_legged_token',
+ 'your_users_3_legged_token_secret')
+
+ # Setup the URL according to Google's XOAUTH implementation. Be sure
+ # to replace the email here with the appropriate email address that
+ # you wish to access.
+ url = "https://mail.google.com/mail/b/your_users_email@gmail.com/imap/"
+
+ conn = imaplib.IMAP4_SSL('imap.googlemail.com')
+ conn.debug = 4
+
+ # This is the only thing in the API for impaplib.IMAP4_SSL that has
+ # changed. You now authenticate with the URL, consumer, and token.
+ conn.authenticate(url, consumer, token)
+
+ # Once authenticated everything from the impalib.IMAP4_SSL class will
+ # work as per usual without any modification to your code.
+ conn.select('INBOX')
+ print conn.list()
+
+
+## SMTP
+
+ import oauth2 as oauth
+ import oauth2.clients.smtp as smtplib
+
+ # Set up your Consumer and Token as per usual. Just like any other
+ # three-legged OAuth request.
+ consumer = oauth.Consumer('your_consumer_key', 'your_consumer_secret')
+ token = oauth.Token('your_users_3_legged_token',
+ 'your_users_3_legged_token_secret')
+
+ # Setup the URL according to Google's XOAUTH implementation. Be sure
+ # to replace the email here with the appropriate email address that
+ # you wish to access.
+ url = "https://mail.google.com/mail/b/your_users_email@gmail.com/smtp/"
+
+ conn = smtplib.SMTP('smtp.googlemail.com', 587)
+ conn.set_debuglevel(True)
+ conn.ehlo('test')
+ conn.starttls()
+
+ # Again the only thing modified from smtplib.SMTP is the authenticate
+ # method, which works identically to the imaplib.IMAP4_SSL method.
+ conn.authenticate(url, consumer, token)
+
+
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/build/lib/oauth2/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/build/lib/oauth2/__init__.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,860 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import base64
+import urllib
+import time
+import random
+import urlparse
+import hmac
+import binascii
+import httplib2
+
+try:
+ from urlparse import parse_qs
+ parse_qs # placate pyflakes
+except ImportError:
+ # fall back for Python 2.5
+ from cgi import parse_qs
+
+try:
+ from hashlib import sha1
+ sha = sha1
+except ImportError:
+ # hashlib was added in Python 2.5
+ import sha
+
+import _version
+
+__version__ = _version.__version__
+
+OAUTH_VERSION = '1.0' # Hi Blaine!
+HTTP_METHOD = 'GET'
+SIGNATURE_METHOD = 'PLAINTEXT'
+
+
+class Error(RuntimeError):
+ """Generic exception class."""
+
+ def __init__(self, message='OAuth error occurred.'):
+ self._message = message
+
+ @property
+ def message(self):
+ """A hack to get around the deprecation errors in 2.6."""
+ return self._message
+
+ def __str__(self):
+ return self._message
+
+
+class MissingSignature(Error):
+ pass
+
+
+def build_authenticate_header(realm=''):
+ """Optional WWW-Authenticate header (401 error)"""
+ return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
+
+
+def build_xoauth_string(url, consumer, token=None):
+ """Build an XOAUTH string for use in SMTP/IMPA authentication."""
+ request = Request.from_consumer_and_token(consumer, token,
+ "GET", url)
+
+ signing_method = SignatureMethod_HMAC_SHA1()
+ request.sign_request(signing_method, consumer, token)
+
+ params = []
+ for k, v in sorted(request.iteritems()):
+ if v is not None:
+ params.append('%s="%s"' % (k, escape(v)))
+
+ return "%s %s %s" % ("GET", url, ','.join(params))
+
+
+def to_unicode(s):
+ """ Convert to unicode, raise exception with instructive error
+ message if s is not unicode, ascii, or utf-8. """
+ if not isinstance(s, unicode):
+ if not isinstance(s, str):
+ raise TypeError('You are required to pass either unicode or string here, not: %r (%s)' % (type(s), s))
+ try:
+ s = s.decode('utf-8')
+ except UnicodeDecodeError, le:
+ raise TypeError('You are required to pass either a unicode object or a utf-8 string here. You passed a Python string object which contained non-utf-8: %r. The UnicodeDecodeError that resulted from attempting to interpret it as utf-8 was: %s' % (s, le,))
+ return s
+
+def to_utf8(s):
+ return to_unicode(s).encode('utf-8')
+
+def to_unicode_if_string(s):
+ if isinstance(s, basestring):
+ return to_unicode(s)
+ else:
+ return s
+
+def to_utf8_if_string(s):
+ if isinstance(s, basestring):
+ return to_utf8(s)
+ else:
+ return s
+
+def to_unicode_optional_iterator(x):
+ """
+ Raise TypeError if x is a str containing non-utf8 bytes or if x is
+ an iterable which contains such a str.
+ """
+ if isinstance(x, basestring):
+ return to_unicode(x)
+
+ try:
+ l = list(x)
+ except TypeError, e:
+ assert 'is not iterable' in str(e)
+ return x
+ else:
+ return [ to_unicode(e) for e in l ]
+
+def to_utf8_optional_iterator(x):
+ """
+ Raise TypeError if x is a str or if x is an iterable which
+ contains a str.
+ """
+ if isinstance(x, basestring):
+ return to_utf8(x)
+
+ try:
+ l = list(x)
+ except TypeError, e:
+ assert 'is not iterable' in str(e)
+ return x
+ else:
+ return [ to_utf8_if_string(e) for e in l ]
+
+def escape(s):
+ """Escape a URL including any /."""
+ return urllib.quote(s.encode('utf-8'), safe='~')
+
+def generate_timestamp():
+ """Get seconds since epoch (UTC)."""
+ return int(time.time())
+
+
+def generate_nonce(length=8):
+ """Generate pseudorandom number."""
+ return ''.join([str(random.randint(0, 9)) for i in range(length)])
+
+
+def generate_verifier(length=8):
+ """Generate pseudorandom number."""
+ return ''.join([str(random.randint(0, 9)) for i in range(length)])
+
+
+class Consumer(object):
+ """A consumer of OAuth-protected services.
+
+ The OAuth consumer is a "third-party" service that wants to access
+ protected resources from an OAuth service provider on behalf of an end
+ user. It's kind of the OAuth client.
+
+ Usually a consumer must be registered with the service provider by the
+ developer of the consumer software. As part of that process, the service
+ provider gives the consumer a *key* and a *secret* with which the consumer
+ software can identify itself to the service. The consumer will include its
+ key in each request to identify itself, but will use its secret only when
+ signing requests, to prove that the request is from that particular
+ registered consumer.
+
+ Once registered, the consumer can then use its consumer credentials to ask
+ the service provider for a request token, kicking off the OAuth
+ authorization process.
+ """
+
+ key = None
+ secret = None
+
+ def __init__(self, key, secret):
+ self.key = key
+ self.secret = secret
+
+ if self.key is None or self.secret is None:
+ raise ValueError("Key and secret must be set.")
+
+ def __str__(self):
+ data = {'oauth_consumer_key': self.key,
+ 'oauth_consumer_secret': self.secret}
+
+ return urllib.urlencode(data)
+
+
+class Token(object):
+ """An OAuth credential used to request authorization or a protected
+ resource.
+
+ Tokens in OAuth comprise a *key* and a *secret*. The key is included in
+ requests to identify the token being used, but the secret is used only in
+ the signature, to prove that the requester is who the server gave the
+ token to.
+
+ When first negotiating the authorization, the consumer asks for a *request
+ token* that the live user authorizes with the service provider. The
+ consumer then exchanges the request token for an *access token* that can
+ be used to access protected resources.
+ """
+
+ key = None
+ secret = None
+ callback = None
+ callback_confirmed = None
+ verifier = None
+
+ def __init__(self, key, secret):
+ self.key = key
+ self.secret = secret
+
+ if self.key is None or self.secret is None:
+ raise ValueError("Key and secret must be set.")
+
+ def set_callback(self, callback):
+ self.callback = callback
+ self.callback_confirmed = 'true'
+
+ def set_verifier(self, verifier=None):
+ if verifier is not None:
+ self.verifier = verifier
+ else:
+ self.verifier = generate_verifier()
+
+ def get_callback_url(self):
+ if self.callback and self.verifier:
+ # Append the oauth_verifier.
+ parts = urlparse.urlparse(self.callback)
+ scheme, netloc, path, params, query, fragment = parts[:6]
+ if query:
+ query = '%s&oauth_verifier=%s' % (query, self.verifier)
+ else:
+ query = 'oauth_verifier=%s' % self.verifier
+ return urlparse.urlunparse((scheme, netloc, path, params,
+ query, fragment))
+ return self.callback
+
+ def to_string(self):
+ """Returns this token as a plain string, suitable for storage.
+
+ The resulting string includes the token's secret, so you should never
+ send or store this string where a third party can read it.
+ """
+
+ data = {
+ 'oauth_token': self.key,
+ 'oauth_token_secret': self.secret,
+ }
+
+ if self.callback_confirmed is not None:
+ data['oauth_callback_confirmed'] = self.callback_confirmed
+ return urllib.urlencode(data)
+
+ @staticmethod
+ def from_string(s):
+ """Deserializes a token from a string like one returned by
+ `to_string()`."""
+
+ if not len(s):
+ raise ValueError("Invalid parameter string.")
+
+ params = parse_qs(s, keep_blank_values=False)
+ if not len(params):
+ raise ValueError("Invalid parameter string.")
+
+ try:
+ key = params['oauth_token'][0]
+ except Exception:
+ raise ValueError("'oauth_token' not found in OAuth request.")
+
+ try:
+ secret = params['oauth_token_secret'][0]
+ except Exception:
+ raise ValueError("'oauth_token_secret' not found in "
+ "OAuth request.")
+
+ token = Token(key, secret)
+ try:
+ token.callback_confirmed = params['oauth_callback_confirmed'][0]
+ except KeyError:
+ pass # 1.0, no callback confirmed.
+ return token
+
+ def __str__(self):
+ return self.to_string()
+
+
+def setter(attr):
+ name = attr.__name__
+
+ def getter(self):
+ try:
+ return self.__dict__[name]
+ except KeyError:
+ raise AttributeError(name)
+
+ def deleter(self):
+ del self.__dict__[name]
+
+ return property(getter, attr, deleter)
+
+
+class Request(dict):
+
+ """The parameters and information for an HTTP request, suitable for
+ authorizing with OAuth credentials.
+
+ When a consumer wants to access a service's protected resources, it does
+ so using a signed HTTP request identifying itself (the consumer) with its
+ key, and providing an access token authorized by the end user to access
+ those resources.
+
+ """
+
+ version = OAUTH_VERSION
+
+ def __init__(self, method=HTTP_METHOD, url=None, parameters=None,
+ body='', is_form_encoded=False):
+ if url is not None:
+ self.url = to_unicode(url)
+ self.method = method
+ if parameters is not None:
+ for k, v in parameters.iteritems():
+ k = to_unicode(k)
+ v = to_unicode_optional_iterator(v)
+ self[k] = v
+ self.body = body
+ self.is_form_encoded = is_form_encoded
+
+
+ @setter
+ def url(self, value):
+ self.__dict__['url'] = value
+ if value is not None:
+ scheme, netloc, path, params, query, fragment = urlparse.urlparse(value)
+
+ # Exclude default port numbers.
+ if scheme == 'http' and netloc[-3:] == ':80':
+ netloc = netloc[:-3]
+ elif scheme == 'https' and netloc[-4:] == ':443':
+ netloc = netloc[:-4]
+ if scheme not in ('http', 'https'):
+ raise ValueError("Unsupported URL %s (%s)." % (value, scheme))
+
+ # Normalized URL excludes params, query, and fragment.
+ self.normalized_url = urlparse.urlunparse((scheme, netloc, path, None, None, None))
+ else:
+ self.normalized_url = None
+ self.__dict__['url'] = None
+
+ @setter
+ def method(self, value):
+ self.__dict__['method'] = value.upper()
+
+ def _get_timestamp_nonce(self):
+ return self['oauth_timestamp'], self['oauth_nonce']
+
+ def get_nonoauth_parameters(self):
+ """Get any non-OAuth parameters."""
+ return dict([(k, v) for k, v in self.iteritems()
+ if not k.startswith('oauth_')])
+
+ def to_header(self, realm=''):
+ """Serialize as a header for an HTTPAuth request."""
+ oauth_params = ((k, v) for k, v in self.items()
+ if k.startswith('oauth_'))
+ stringy_params = ((k, escape(str(v))) for k, v in oauth_params)
+ header_params = ('%s="%s"' % (k, v) for k, v in stringy_params)
+ params_header = ', '.join(header_params)
+
+ auth_header = 'OAuth realm="%s"' % realm
+ if params_header:
+ auth_header = "%s, %s" % (auth_header, params_header)
+
+ return {'Authorization': auth_header}
+
+ def to_postdata(self):
+ """Serialize as post data for a POST request."""
+ d = {}
+ for k, v in self.iteritems():
+ d[k.encode('utf-8')] = to_utf8_optional_iterator(v)
+
+ # tell urlencode to deal with sequence values and map them correctly
+ # to resulting querystring. for example self["k"] = ["v1", "v2"] will
+ # result in 'k=v1&k=v2' and not k=%5B%27v1%27%2C+%27v2%27%5D
+ return urllib.urlencode(d, True).replace('+', '%20')
+
+ def to_url(self):
+ """Serialize as a URL for a GET request."""
+ base_url = urlparse.urlparse(self.url)
+ try:
+ query = base_url.query
+ except AttributeError:
+ # must be python <2.5
+ query = base_url[4]
+ query = parse_qs(query)
+ for k, v in self.items():
+ query.setdefault(k, []).append(v)
+
+ try:
+ scheme = base_url.scheme
+ netloc = base_url.netloc
+ path = base_url.path
+ params = base_url.params
+ fragment = base_url.fragment
+ except AttributeError:
+ # must be python <2.5
+ scheme = base_url[0]
+ netloc = base_url[1]
+ path = base_url[2]
+ params = base_url[3]
+ fragment = base_url[5]
+
+ url = (scheme, netloc, path, params,
+ urllib.urlencode(query, True), fragment)
+ return urlparse.urlunparse(url)
+
+ def get_parameter(self, parameter):
+ ret = self.get(parameter)
+ if ret is None:
+ raise Error('Parameter not found: %s' % parameter)
+
+ return ret
+
+ def get_normalized_parameters(self):
+ """Return a string that contains the parameters that must be signed."""
+ items = []
+ for key, value in self.iteritems():
+ if key == 'oauth_signature':
+ continue
+ # 1.0a/9.1.1 states that kvp must be sorted by key, then by value,
+ # so we unpack sequence values into multiple items for sorting.
+ if isinstance(value, basestring):
+ items.append((to_utf8_if_string(key), to_utf8(value)))
+ else:
+ try:
+ value = list(value)
+ except TypeError, e:
+ assert 'is not iterable' in str(e)
+ items.append((to_utf8_if_string(key), to_utf8_if_string(value)))
+ else:
+ items.extend((to_utf8_if_string(key), to_utf8_if_string(item)) for item in value)
+
+ # Include any query string parameters from the provided URL
+ query = urlparse.urlparse(self.url)[4]
+
+ url_items = self._split_url_string(query).items()
+ url_items = [(to_utf8(k), to_utf8(v)) for k, v in url_items if k != 'oauth_signature' ]
+ items.extend(url_items)
+
+ items.sort()
+ encoded_str = urllib.urlencode(items)
+ # Encode signature parameters per Oauth Core 1.0 protocol
+ # spec draft 7, section 3.6
+ # (http://tools.ietf.org/html/draft-hammer-oauth-07#section-3.6)
+ # Spaces must be encoded with "%20" instead of "+"
+ return encoded_str.replace('+', '%20').replace('%7E', '~')
+
+ def sign_request(self, signature_method, consumer, token):
+ """Set the signature parameter to the result of sign."""
+
+ if not self.is_form_encoded:
+ # according to
+ # http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html
+ # section 4.1.1 "OAuth Consumers MUST NOT include an
+ # oauth_body_hash parameter on requests with form-encoded
+ # request bodies."
+ self['oauth_body_hash'] = base64.b64encode(sha(self.body).digest())
+
+ if 'oauth_consumer_key' not in self:
+ self['oauth_consumer_key'] = consumer.key
+
+ if token and 'oauth_token' not in self:
+ self['oauth_token'] = token.key
+
+ self['oauth_signature_method'] = signature_method.name
+ self['oauth_signature'] = signature_method.sign(self, consumer, token)
+
+ @classmethod
+ def make_timestamp(cls):
+ """Get seconds since epoch (UTC)."""
+ return str(int(time.time()))
+
+ @classmethod
+ def make_nonce(cls):
+ """Generate pseudorandom number."""
+ return str(random.randint(0, 100000000))
+
+ @classmethod
+ def from_request(cls, http_method, http_url, headers=None, parameters=None,
+ query_string=None):
+ """Combines multiple parameter sources."""
+ if parameters is None:
+ parameters = {}
+
+ # Headers
+ if headers and 'Authorization' in headers:
+ auth_header = headers['Authorization']
+ # Check that the authorization header is OAuth.
+ if auth_header[:6] == 'OAuth ':
+ auth_header = auth_header[6:]
+ try:
+ # Get the parameters from the header.
+ header_params = cls._split_header(auth_header)
+ parameters.update(header_params)
+ except:
+ raise Error('Unable to parse OAuth parameters from '
+ 'Authorization header.')
+
+ # GET or POST query string.
+ if query_string:
+ query_params = cls._split_url_string(query_string)
+ parameters.update(query_params)
+
+ # URL parameters.
+ param_str = urlparse.urlparse(http_url)[4] # query
+ url_params = cls._split_url_string(param_str)
+ parameters.update(url_params)
+
+ if parameters:
+ return cls(http_method, http_url, parameters)
+
+ return None
+
+ @classmethod
+ def from_consumer_and_token(cls, consumer, token=None,
+ http_method=HTTP_METHOD, http_url=None, parameters=None,
+ body='', is_form_encoded=False):
+ if not parameters:
+ parameters = {}
+
+ defaults = {
+ 'oauth_consumer_key': consumer.key,
+ 'oauth_timestamp': cls.make_timestamp(),
+ 'oauth_nonce': cls.make_nonce(),
+ 'oauth_version': cls.version,
+ }
+
+ defaults.update(parameters)
+ parameters = defaults
+
+ if token:
+ parameters['oauth_token'] = token.key
+ if token.verifier:
+ parameters['oauth_verifier'] = token.verifier
+
+ return Request(http_method, http_url, parameters, body=body,
+ is_form_encoded=is_form_encoded)
+
+ @classmethod
+ def from_token_and_callback(cls, token, callback=None,
+ http_method=HTTP_METHOD, http_url=None, parameters=None):
+
+ if not parameters:
+ parameters = {}
+
+ parameters['oauth_token'] = token.key
+
+ if callback:
+ parameters['oauth_callback'] = callback
+
+ return cls(http_method, http_url, parameters)
+
+ @staticmethod
+ def _split_header(header):
+ """Turn Authorization: header into parameters."""
+ params = {}
+ parts = header.split(',')
+ for param in parts:
+ # Ignore realm parameter.
+ if param.find('realm') > -1:
+ continue
+ # Remove whitespace.
+ param = param.strip()
+ # Split key-value.
+ param_parts = param.split('=', 1)
+ # Remove quotes and unescape the value.
+ params[param_parts[0]] = urllib.unquote(param_parts[1].strip('\"'))
+ return params
+
+ @staticmethod
+ def _split_url_string(param_str):
+ """Turn URL string into parameters."""
+ parameters = parse_qs(param_str.encode('utf-8'), keep_blank_values=True)
+ for k, v in parameters.iteritems():
+ parameters[k] = urllib.unquote(v[0])
+ return parameters
+
+
+class Client(httplib2.Http):
+ """OAuthClient is a worker to attempt to execute a request."""
+
+ def __init__(self, consumer, token=None, cache=None, timeout=None,
+ proxy_info=None):
+
+ if consumer is not None and not isinstance(consumer, Consumer):
+ raise ValueError("Invalid consumer.")
+
+ if token is not None and not isinstance(token, Token):
+ raise ValueError("Invalid token.")
+
+ self.consumer = consumer
+ self.token = token
+ self.method = SignatureMethod_HMAC_SHA1()
+
+ httplib2.Http.__init__(self, cache=cache, timeout=timeout, proxy_info=proxy_info)
+
+ def set_signature_method(self, method):
+ if not isinstance(method, SignatureMethod):
+ raise ValueError("Invalid signature method.")
+
+ self.method = method
+
+ def request(self, uri, method="GET", body='', headers=None,
+ redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
+ DEFAULT_POST_CONTENT_TYPE = 'application/x-www-form-urlencoded'
+
+ if not isinstance(headers, dict):
+ headers = {}
+
+ if method == "POST":
+ headers['Content-Type'] = headers.get('Content-Type',
+ DEFAULT_POST_CONTENT_TYPE)
+
+ is_form_encoded = \
+ headers.get('Content-Type') == 'application/x-www-form-urlencoded'
+
+ if is_form_encoded and body:
+ parameters = dict([(k,v[0]) for k,v in parse_qs(body).items()])
+ else:
+ parameters = None
+
+ req = Request.from_consumer_and_token(self.consumer,
+ token=self.token, http_method=method, http_url=uri,
+ parameters=parameters, body=body, is_form_encoded=is_form_encoded)
+
+ req.sign_request(self.method, self.consumer, self.token)
+
+ schema, rest = urllib.splittype(uri)
+ if rest.startswith('//'):
+ hierpart = '//'
+ else:
+ hierpart = ''
+ host, rest = urllib.splithost(rest)
+
+ realm = schema + ':' + hierpart + host
+
+ if method == "POST" and is_form_encoded:
+ body = req.to_postdata()
+ elif method == "GET":
+ uri = req.to_url()
+ else:
+ headers.update(req.to_header(realm=realm))
+
+ return httplib2.Http.request(self, uri, method=method, body=body,
+ headers=headers, redirections=redirections,
+ connection_type=connection_type)
+
+
+class Server(object):
+ """A skeletal implementation of a service provider, providing protected
+ resources to requests from authorized consumers.
+
+ This class implements the logic to check requests for authorization. You
+ can use it with your web server or web framework to protect certain
+ resources with OAuth.
+ """
+
+ timestamp_threshold = 300 # In seconds, five minutes.
+ version = OAUTH_VERSION
+ signature_methods = None
+
+ def __init__(self, signature_methods=None):
+ self.signature_methods = signature_methods or {}
+
+ def add_signature_method(self, signature_method):
+ self.signature_methods[signature_method.name] = signature_method
+ return self.signature_methods
+
+ def verify_request(self, request, consumer, token):
+ """Verifies an api call and checks all the parameters."""
+
+ self._check_version(request)
+ self._check_signature(request, consumer, token)
+ parameters = request.get_nonoauth_parameters()
+ return parameters
+
+ def build_authenticate_header(self, realm=''):
+ """Optional support for the authenticate header."""
+ return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
+
+ def _check_version(self, request):
+ """Verify the correct version of the request for this server."""
+ version = self._get_version(request)
+ if version and version != self.version:
+ raise Error('OAuth version %s not supported.' % str(version))
+
+ def _get_version(self, request):
+ """Return the version of the request for this server."""
+ try:
+ version = request.get_parameter('oauth_version')
+ except:
+ version = OAUTH_VERSION
+
+ return version
+
+ def _get_signature_method(self, request):
+ """Figure out the signature with some defaults."""
+ try:
+ signature_method = request.get_parameter('oauth_signature_method')
+ except:
+ signature_method = SIGNATURE_METHOD
+
+ try:
+ # Get the signature method object.
+ signature_method = self.signature_methods[signature_method]
+ except:
+ signature_method_names = ', '.join(self.signature_methods.keys())
+ raise Error('Signature method %s not supported try one of the following: %s' % (signature_method, signature_method_names))
+
+ return signature_method
+
+ def _get_verifier(self, request):
+ return request.get_parameter('oauth_verifier')
+
+ def _check_signature(self, request, consumer, token):
+ timestamp, nonce = request._get_timestamp_nonce()
+ self._check_timestamp(timestamp)
+ signature_method = self._get_signature_method(request)
+
+ try:
+ signature = request.get_parameter('oauth_signature')
+ except:
+ raise MissingSignature('Missing oauth_signature.')
+
+ # Validate the signature.
+ valid = signature_method.check(request, consumer, token, signature)
+
+ if not valid:
+ key, base = signature_method.signing_base(request, consumer, token)
+
+ raise Error('Invalid signature. Expected signature base '
+ 'string: %s' % base)
+
+ def _check_timestamp(self, timestamp):
+ """Verify that timestamp is recentish."""
+ timestamp = int(timestamp)
+ now = int(time.time())
+ lapsed = now - timestamp
+ if lapsed > self.timestamp_threshold:
+ raise Error('Expired timestamp: given %d and now %s has a '
+ 'greater difference than threshold %d' % (timestamp, now,
+ self.timestamp_threshold))
+
+
+class SignatureMethod(object):
+ """A way of signing requests.
+
+ The OAuth protocol lets consumers and service providers pick a way to sign
+ requests. This interface shows the methods expected by the other `oauth`
+ modules for signing requests. Subclass it and implement its methods to
+ provide a new way to sign requests.
+ """
+
+ def signing_base(self, request, consumer, token):
+ """Calculates the string that needs to be signed.
+
+ This method returns a 2-tuple containing the starting key for the
+ signing and the message to be signed. The latter may be used in error
+ messages to help clients debug their software.
+
+ """
+ raise NotImplementedError
+
+ def sign(self, request, consumer, token):
+ """Returns the signature for the given request, based on the consumer
+ and token also provided.
+
+ You should use your implementation of `signing_base()` to build the
+ message to sign. Otherwise it may be less useful for debugging.
+
+ """
+ raise NotImplementedError
+
+ def check(self, request, consumer, token, signature):
+ """Returns whether the given signature is the correct signature for
+ the given consumer and token signing the given request."""
+ built = self.sign(request, consumer, token)
+ return built == signature
+
+
+class SignatureMethod_HMAC_SHA1(SignatureMethod):
+ name = 'HMAC-SHA1'
+
+ def signing_base(self, request, consumer, token):
+ if not hasattr(request, 'normalized_url') or request.normalized_url is None:
+ raise ValueError("Base URL for request is not set.")
+
+ sig = (
+ escape(request.method),
+ escape(request.normalized_url),
+ escape(request.get_normalized_parameters()),
+ )
+
+ key = '%s&' % escape(consumer.secret)
+ if token:
+ key += escape(token.secret)
+ raw = '&'.join(sig)
+ return key, raw
+
+ def sign(self, request, consumer, token):
+ """Builds the base signature string."""
+ key, raw = self.signing_base(request, consumer, token)
+
+ hashed = hmac.new(key, raw, sha)
+
+ # Calculate the digest base 64.
+ return binascii.b2a_base64(hashed.digest())[:-1]
+
+
+class SignatureMethod_PLAINTEXT(SignatureMethod):
+
+ name = 'PLAINTEXT'
+
+ def signing_base(self, request, consumer, token):
+ """Concatenates the consumer key and secret with the token's
+ secret."""
+ sig = '%s&' % escape(consumer.secret)
+ if token:
+ sig = sig + escape(token.secret)
+ return sig, sig
+
+ def sign(self, request, consumer, token):
+ key, raw = self.signing_base(request, consumer, token)
+ return raw
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/build/lib/oauth2/_version.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/build/lib/oauth2/_version.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,18 @@
+# This is the version of this source code.
+
+manual_verstr = "1.5.1"
+
+
+
+auto_build_num = "212"
+
+
+
+verstr = manual_verstr + "." + auto_build_num
+try:
+ from pyutil.version_class import Version as pyutil_Version
+ __version__ = pyutil_Version(verstr)
+except (ImportError, ValueError):
+ # Maybe there is no pyutil installed.
+ from distutils.version import LooseVersion as distutils_Version
+ __version__ = distutils_Version(verstr)
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/build/lib/oauth2/clients/imap.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/build/lib/oauth2/clients/imap.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,40 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import oauth2
+import imaplib
+
+
+class IMAP4_SSL(imaplib.IMAP4_SSL):
+ """IMAP wrapper for imaplib.IMAP4_SSL that implements XOAUTH."""
+
+ def authenticate(self, url, consumer, token):
+ if consumer is not None and not isinstance(consumer, oauth2.Consumer):
+ raise ValueError("Invalid consumer.")
+
+ if token is not None and not isinstance(token, oauth2.Token):
+ raise ValueError("Invalid token.")
+
+ imaplib.IMAP4_SSL.authenticate(self, 'XOAUTH',
+ lambda x: oauth2.build_xoauth_string(url, consumer, token))
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/build/lib/oauth2/clients/smtp.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/build/lib/oauth2/clients/smtp.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,41 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import oauth2
+import smtplib
+import base64
+
+
+class SMTP(smtplib.SMTP):
+ """SMTP wrapper for smtplib.SMTP that implements XOAUTH."""
+
+ def authenticate(self, url, consumer, token):
+ if consumer is not None and not isinstance(consumer, oauth2.Consumer):
+ raise ValueError("Invalid consumer.")
+
+ if token is not None and not isinstance(token, oauth2.Token):
+ raise ValueError("Invalid token.")
+
+ self.docmd('AUTH', 'XOAUTH %s' % \
+ base64.b64encode(oauth2.build_xoauth_string(url, consumer, token)))
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/build/lib/tests/test_oauth.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/build/lib/tests/test_oauth.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1309 @@
+# -*- coding: utf-8 -*-
+
+"""
+The MIT License
+
+Copyright (c) 2009 Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+import sys
+import os
+import unittest
+import oauth2 as oauth
+import random
+import time
+import urllib
+import urlparse
+from types import ListType
+import mock
+import httplib2
+
+# Fix for python2.5 compatibility
+try:
+ from urlparse import parse_qs, parse_qsl
+except ImportError:
+ from cgi import parse_qs, parse_qsl
+
+
+sys.path[0:0] = [os.path.join(os.path.dirname(__file__), ".."),]
+
+
+class TestError(unittest.TestCase):
+ def test_message(self):
+ try:
+ raise oauth.Error
+ except oauth.Error, e:
+ self.assertEqual(e.message, 'OAuth error occurred.')
+
+ msg = 'OMG THINGS BROKE!!!!'
+ try:
+ raise oauth.Error(msg)
+ except oauth.Error, e:
+ self.assertEqual(e.message, msg)
+
+ def test_str(self):
+ try:
+ raise oauth.Error
+ except oauth.Error, e:
+ self.assertEquals(str(e), 'OAuth error occurred.')
+
+class TestGenerateFunctions(unittest.TestCase):
+ def test_build_auth_header(self):
+ header = oauth.build_authenticate_header()
+ self.assertEqual(header['WWW-Authenticate'], 'OAuth realm=""')
+ self.assertEqual(len(header), 1)
+ realm = 'http://example.myrealm.com/'
+ header = oauth.build_authenticate_header(realm)
+ self.assertEqual(header['WWW-Authenticate'], 'OAuth realm="%s"' %
+ realm)
+ self.assertEqual(len(header), 1)
+
+ def test_build_xoauth_string(self):
+ consumer = oauth.Consumer('consumer_token', 'consumer_secret')
+ token = oauth.Token('user_token', 'user_secret')
+ url = "https://mail.google.com/mail/b/joe@example.com/imap/"
+ xoauth_string = oauth.build_xoauth_string(url, consumer, token)
+
+ method, oauth_url, oauth_string = xoauth_string.split(' ')
+
+ self.assertEqual("GET", method)
+ self.assertEqual(url, oauth_url)
+
+ returned = {}
+ parts = oauth_string.split(',')
+ for part in parts:
+ var, val = part.split('=')
+ returned[var] = val.strip('"')
+
+ self.assertEquals('HMAC-SHA1', returned['oauth_signature_method'])
+ self.assertEquals('user_token', returned['oauth_token'])
+ self.assertEquals('consumer_token', returned['oauth_consumer_key'])
+ self.assertTrue('oauth_signature' in returned, 'oauth_signature')
+
+ def test_escape(self):
+ string = 'http://whatever.com/~someuser/?test=test&other=other'
+ self.assert_('~' in oauth.escape(string))
+ string = '../../../../../../../etc/passwd'
+ self.assert_('../' not in oauth.escape(string))
+
+ def test_gen_nonce(self):
+ nonce = oauth.generate_nonce()
+ self.assertEqual(len(nonce), 8)
+ nonce = oauth.generate_nonce(20)
+ self.assertEqual(len(nonce), 20)
+
+ def test_gen_verifier(self):
+ verifier = oauth.generate_verifier()
+ self.assertEqual(len(verifier), 8)
+ verifier = oauth.generate_verifier(16)
+ self.assertEqual(len(verifier), 16)
+
+ def test_gen_timestamp(self):
+ exp = int(time.time())
+ now = oauth.generate_timestamp()
+ self.assertEqual(exp, now)
+
+class TestConsumer(unittest.TestCase):
+ def setUp(self):
+ self.key = 'my-key'
+ self.secret = 'my-secret'
+ self.consumer = oauth.Consumer(key=self.key, secret=self.secret)
+
+ def test_init(self):
+ self.assertEqual(self.consumer.key, self.key)
+ self.assertEqual(self.consumer.secret, self.secret)
+
+ def test_basic(self):
+ self.assertRaises(ValueError, lambda: oauth.Consumer(None, None))
+ self.assertRaises(ValueError, lambda: oauth.Consumer('asf', None))
+ self.assertRaises(ValueError, lambda: oauth.Consumer(None, 'dasf'))
+
+ def test_str(self):
+ res = dict(parse_qsl(str(self.consumer)))
+ self.assertTrue('oauth_consumer_key' in res)
+ self.assertTrue('oauth_consumer_secret' in res)
+ self.assertEquals(res['oauth_consumer_key'], self.consumer.key)
+ self.assertEquals(res['oauth_consumer_secret'], self.consumer.secret)
+
+class TestToken(unittest.TestCase):
+ def setUp(self):
+ self.key = 'my-key'
+ self.secret = 'my-secret'
+ self.token = oauth.Token(self.key, self.secret)
+
+ def test_basic(self):
+ self.assertRaises(ValueError, lambda: oauth.Token(None, None))
+ self.assertRaises(ValueError, lambda: oauth.Token('asf', None))
+ self.assertRaises(ValueError, lambda: oauth.Token(None, 'dasf'))
+
+ def test_init(self):
+ self.assertEqual(self.token.key, self.key)
+ self.assertEqual(self.token.secret, self.secret)
+ self.assertEqual(self.token.callback, None)
+ self.assertEqual(self.token.callback_confirmed, None)
+ self.assertEqual(self.token.verifier, None)
+
+ def test_set_callback(self):
+ self.assertEqual(self.token.callback, None)
+ self.assertEqual(self.token.callback_confirmed, None)
+ cb = 'http://www.example.com/my-callback'
+ self.token.set_callback(cb)
+ self.assertEqual(self.token.callback, cb)
+ self.assertEqual(self.token.callback_confirmed, 'true')
+ self.token.set_callback(None)
+ self.assertEqual(self.token.callback, None)
+ # TODO: The following test should probably not pass, but it does
+ # To fix this, check for None and unset 'true' in set_callback
+ # Additionally, should a confirmation truly be done of the callback?
+ self.assertEqual(self.token.callback_confirmed, 'true')
+
+ def test_set_verifier(self):
+ self.assertEqual(self.token.verifier, None)
+ v = oauth.generate_verifier()
+ self.token.set_verifier(v)
+ self.assertEqual(self.token.verifier, v)
+ self.token.set_verifier()
+ self.assertNotEqual(self.token.verifier, v)
+ self.token.set_verifier('')
+ self.assertEqual(self.token.verifier, '')
+
+ def test_get_callback_url(self):
+ self.assertEqual(self.token.get_callback_url(), None)
+
+ self.token.set_verifier()
+ self.assertEqual(self.token.get_callback_url(), None)
+
+ cb = 'http://www.example.com/my-callback?save=1&return=true'
+ v = oauth.generate_verifier()
+ self.token.set_callback(cb)
+ self.token.set_verifier(v)
+ url = self.token.get_callback_url()
+ verifier_str = '&oauth_verifier=%s' % v
+ self.assertEqual(url, '%s%s' % (cb, verifier_str))
+
+ cb = 'http://www.example.com/my-callback-no-query'
+ v = oauth.generate_verifier()
+ self.token.set_callback(cb)
+ self.token.set_verifier(v)
+ url = self.token.get_callback_url()
+ verifier_str = '?oauth_verifier=%s' % v
+ self.assertEqual(url, '%s%s' % (cb, verifier_str))
+
+ def test_to_string(self):
+ string = 'oauth_token_secret=%s&oauth_token=%s' % (self.secret,
+ self.key)
+ self.assertEqual(self.token.to_string(), string)
+
+ self.token.set_callback('http://www.example.com/my-callback')
+ string += '&oauth_callback_confirmed=true'
+ self.assertEqual(self.token.to_string(), string)
+
+ def _compare_tokens(self, new):
+ self.assertEqual(self.token.key, new.key)
+ self.assertEqual(self.token.secret, new.secret)
+ # TODO: What about copying the callback to the new token?
+ # self.assertEqual(self.token.callback, new.callback)
+ self.assertEqual(self.token.callback_confirmed,
+ new.callback_confirmed)
+ # TODO: What about copying the verifier to the new token?
+ # self.assertEqual(self.token.verifier, new.verifier)
+
+ def test_to_string(self):
+ tok = oauth.Token('tooken', 'seecret')
+ self.assertEqual(str(tok), 'oauth_token_secret=seecret&oauth_token=tooken')
+
+ def test_from_string(self):
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string(''))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('blahblahblah'))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('blah=blah'))
+
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token_secret=asfdasf'))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token_secret='))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token=asfdasf'))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token='))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token=&oauth_token_secret='))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token=tooken%26oauth_token_secret=seecret'))
+
+ string = self.token.to_string()
+ new = oauth.Token.from_string(string)
+ self._compare_tokens(new)
+
+ self.token.set_callback('http://www.example.com/my-callback')
+ string = self.token.to_string()
+ new = oauth.Token.from_string(string)
+ self._compare_tokens(new)
+
+class ReallyEqualMixin:
+ def failUnlessReallyEqual(self, a, b, msg=None):
+ self.failUnlessEqual(a, b, msg=msg)
+ self.failUnlessEqual(type(a), type(b), msg="a :: %r, b :: %r, %r" % (a, b, msg))
+
+class TestFuncs(unittest.TestCase):
+ def test_to_unicode(self):
+ self.failUnlessRaises(TypeError, oauth.to_unicode, '\xae')
+ self.failUnlessRaises(TypeError, oauth.to_unicode_optional_iterator, '\xae')
+ self.failUnlessRaises(TypeError, oauth.to_unicode_optional_iterator, ['\xae'])
+
+ self.failUnlessEqual(oauth.to_unicode(':-)'), u':-)')
+ self.failUnlessEqual(oauth.to_unicode(u'\u00ae'), u'\u00ae')
+ self.failUnlessEqual(oauth.to_unicode('\xc2\xae'), u'\u00ae')
+ self.failUnlessEqual(oauth.to_unicode_optional_iterator([':-)']), [u':-)'])
+ self.failUnlessEqual(oauth.to_unicode_optional_iterator([u'\u00ae']), [u'\u00ae'])
+
+class TestRequest(unittest.TestCase, ReallyEqualMixin):
+ def test_setter(self):
+ url = "http://example.com"
+ method = "GET"
+ req = oauth.Request(method)
+ self.assertTrue(not hasattr(req, 'url') or req.url is None)
+ self.assertTrue(not hasattr(req, 'normalized_url') or req.normalized_url is None)
+
+ def test_deleter(self):
+ url = "http://example.com"
+ method = "GET"
+ req = oauth.Request(method, url)
+
+ try:
+ del req.url
+ url = req.url
+ self.fail("AttributeError should have been raised on empty url.")
+ except AttributeError:
+ pass
+ except Exception, e:
+ self.fail(str(e))
+
+ def test_url(self):
+ url1 = "http://example.com:80/foo.php"
+ url2 = "https://example.com:443/foo.php"
+ exp1 = "http://example.com/foo.php"
+ exp2 = "https://example.com/foo.php"
+ method = "GET"
+
+ req = oauth.Request(method, url1)
+ self.assertEquals(req.normalized_url, exp1)
+ self.assertEquals(req.url, url1)
+
+ req = oauth.Request(method, url2)
+ self.assertEquals(req.normalized_url, exp2)
+ self.assertEquals(req.url, url2)
+
+ def test_bad_url(self):
+ request = oauth.Request()
+ try:
+ request.url = "ftp://example.com"
+ self.fail("Invalid URL scheme was accepted.")
+ except ValueError:
+ pass
+
+ def test_unset_consumer_and_token(self):
+ consumer = oauth.Consumer('my_consumer_key', 'my_consumer_secret')
+ token = oauth.Token('my_key', 'my_secret')
+ request = oauth.Request("GET", "http://example.com/fetch.php")
+ request.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer,
+ token)
+
+ self.assertEquals(consumer.key, request['oauth_consumer_key'])
+ self.assertEquals(token.key, request['oauth_token'])
+
+ def test_no_url_set(self):
+ consumer = oauth.Consumer('my_consumer_key', 'my_consumer_secret')
+ token = oauth.Token('my_key', 'my_secret')
+ request = oauth.Request()
+
+ try:
+ try:
+ request.sign_request(oauth.SignatureMethod_HMAC_SHA1(),
+ consumer, token)
+ except TypeError:
+ self.fail("Signature method didn't check for a normalized URL.")
+ except ValueError:
+ pass
+
+ def test_url_query(self):
+ url = "https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10"
+ normalized_url = urlparse.urlunparse(urlparse.urlparse(url)[:3] + (None, None, None))
+ method = "GET"
+
+ req = oauth.Request(method, url)
+ self.assertEquals(req.url, url)
+ self.assertEquals(req.normalized_url, normalized_url)
+
+ def test_get_parameter(self):
+ url = "http://example.com"
+ method = "GET"
+ params = {'oauth_consumer' : 'asdf'}
+ req = oauth.Request(method, url, parameters=params)
+
+ self.assertEquals(req.get_parameter('oauth_consumer'), 'asdf')
+ self.assertRaises(oauth.Error, req.get_parameter, 'blah')
+
+ def test_get_nonoauth_parameters(self):
+
+ oauth_params = {
+ 'oauth_consumer': 'asdfasdfasdf'
+ }
+
+ other_params = {
+ u'foo': u'baz',
+ u'bar': u'foo',
+ u'multi': [u'FOO',u'BAR'],
+ u'uni_utf8': u'\xae',
+ u'uni_unicode': u'\u00ae',
+ u'uni_unicode_2': u'åÅøØ',
+ }
+
+ params = oauth_params
+ params.update(other_params)
+
+ req = oauth.Request("GET", "http://example.com", params)
+ self.assertEquals(other_params, req.get_nonoauth_parameters())
+
+ def test_to_header(self):
+ realm = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", realm, params)
+ header, value = req.to_header(realm).items()[0]
+
+ parts = value.split('OAuth ')
+ vars = parts[1].split(', ')
+ self.assertTrue(len(vars), (len(params) + 1))
+
+ res = {}
+ for v in vars:
+ var, val = v.split('=')
+ res[var] = urllib.unquote(val.strip('"'))
+
+ self.assertEquals(realm, res['realm'])
+ del res['realm']
+
+ self.assertTrue(len(res), len(params))
+
+ for key, val in res.items():
+ self.assertEquals(val, params.get(key))
+
+ def test_to_postdata_nonascii(self):
+ realm = "http://sp.example.com/"
+
+ params = {
+ 'nonasciithing': u'q\xbfu\xe9 ,aasp u?..a.s',
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", realm, params)
+
+ self.failUnlessReallyEqual(req.to_postdata(), 'nonasciithing=q%C2%BFu%C3%A9%20%2Caasp%20u%3F..a.s&oauth_nonce=4572616e48616d6d65724c61686176&oauth_timestamp=137131200&oauth_consumer_key=0685bd9184jfhq22&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=ad180jjd733klru7&oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%252FPY%253D')
+
+ def test_to_postdata(self):
+ realm = "http://sp.example.com/"
+
+ params = {
+ 'multi': ['FOO','BAR'],
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", realm, params)
+
+ flat = [('multi','FOO'),('multi','BAR')]
+ del params['multi']
+ flat.extend(params.items())
+ kf = lambda x: x[0]
+ self.assertEquals(sorted(flat, key=kf), sorted(parse_qsl(req.to_postdata()), key=kf))
+
+ def test_to_url(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", url, params)
+ exp = urlparse.urlparse("%s?%s" % (url, urllib.urlencode(params)))
+ res = urlparse.urlparse(req.to_url())
+ self.assertEquals(exp.scheme, res.scheme)
+ self.assertEquals(exp.netloc, res.netloc)
+ self.assertEquals(exp.path, res.path)
+
+ a = parse_qs(exp.query)
+ b = parse_qs(res.query)
+ self.assertEquals(a, b)
+
+ def test_to_url_with_query(self):
+ url = "https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", url, params)
+ # Note: the url above already has query parameters, so append new ones with &
+ exp = urlparse.urlparse("%s&%s" % (url, urllib.urlencode(params)))
+ res = urlparse.urlparse(req.to_url())
+ self.assertEquals(exp.scheme, res.scheme)
+ self.assertEquals(exp.netloc, res.netloc)
+ self.assertEquals(exp.path, res.path)
+
+ a = parse_qs(exp.query)
+ b = parse_qs(res.query)
+ self.assertTrue('alt' in b)
+ self.assertTrue('max-contacts' in b)
+ self.assertEquals(b['alt'], ['json'])
+ self.assertEquals(b['max-contacts'], ['10'])
+ self.assertEquals(a, b)
+
+ def test_signature_base_string_nonascii_nonutf8(self):
+ consumer = oauth.Consumer('consumer_token', 'consumer_secret')
+
+ url = u'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc\u2766,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ url = 'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc\xe2\x9d\xa6,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ url = 'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc%E2%9D%A6,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ url = u'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc%E2%9D%A6,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ def test_signature_base_string_with_query(self):
+ url = "https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10"
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+ req = oauth.Request("GET", url, params)
+ self.assertEquals(req.normalized_url, 'https://www.google.com/m8/feeds/contacts/default/full/')
+ self.assertEquals(req.url, 'https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10')
+ normalized_params = parse_qsl(req.get_normalized_parameters())
+ self.assertTrue(len(normalized_params), len(params) + 2)
+ normalized_params = dict(normalized_params)
+ for key, value in params.iteritems():
+ if key == 'oauth_signature':
+ continue
+ self.assertEquals(value, normalized_params[key])
+ self.assertEquals(normalized_params['alt'], 'json')
+ self.assertEquals(normalized_params['max-contacts'], '10')
+
+ def test_get_normalized_parameters_empty(self):
+ url = "http://sp.example.com/?empty="
+
+ req = oauth.Request("GET", url)
+
+ res = req.get_normalized_parameters()
+
+ expected='empty='
+
+ self.assertEquals(expected, res)
+
+ def test_get_normalized_parameters_duplicate(self):
+ url = "http://example.com/v2/search/videos?oauth_nonce=79815175&oauth_timestamp=1295397962&oauth_consumer_key=mykey&oauth_signature_method=HMAC-SHA1&q=car&oauth_version=1.0&offset=10&oauth_signature=spWLI%2FGQjid7sQVd5%2FarahRxzJg%3D"
+
+ req = oauth.Request("GET", url)
+
+ res = req.get_normalized_parameters()
+
+ expected='oauth_consumer_key=mykey&oauth_nonce=79815175&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1295397962&oauth_version=1.0&offset=10&q=car'
+
+ self.assertEquals(expected, res)
+
+ def test_get_normalized_parameters_from_url(self):
+ # example copied from
+ # https://github.com/ciaranj/node-oauth/blob/master/tests/oauth.js
+ # which in turns says that it was copied from
+ # http://oauth.net/core/1.0/#sig_base_example .
+ url = "http://photos.example.net/photos?file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=original"
+
+ req = oauth.Request("GET", url)
+
+ res = req.get_normalized_parameters()
+
+ expected = 'file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=original'
+
+ self.assertEquals(expected, res)
+
+ def test_signing_base(self):
+ # example copied from
+ # https://github.com/ciaranj/node-oauth/blob/master/tests/oauth.js
+ # which in turns says that it was copied from
+ # http://oauth.net/core/1.0/#sig_base_example .
+ url = "http://photos.example.net/photos?file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=original"
+
+ req = oauth.Request("GET", url)
+
+ sm = oauth.SignatureMethod_HMAC_SHA1()
+
+ consumer = oauth.Consumer('dpf43f3p2l4k3l03', 'foo')
+ key, raw = sm.signing_base(req, consumer, None)
+
+ expected = 'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal'
+ self.assertEquals(expected, raw)
+
+ def test_get_normalized_parameters(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'multi': ['FOO','BAR', u'\u00ae', '\xc2\xae'],
+ 'multi_same': ['FOO','FOO'],
+ 'uni_utf8_bytes': '\xc2\xae',
+ 'uni_unicode_object': u'\u00ae'
+ }
+
+ req = oauth.Request("GET", url, params)
+
+ res = req.get_normalized_parameters()
+
+ expected='multi=BAR&multi=FOO&multi=%C2%AE&multi=%C2%AE&multi_same=FOO&multi_same=FOO&oauth_consumer_key=0685bd9184jfhq22&oauth_nonce=4572616e48616d6d65724c61686176&oauth_signature_method=HMAC-SHA1&oauth_timestamp=137131200&oauth_token=ad180jjd733klru7&oauth_version=1.0&uni_unicode_object=%C2%AE&uni_utf8_bytes=%C2%AE'
+
+ self.assertEquals(expected, res)
+
+ def test_get_normalized_parameters_ignores_auth_signature(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_signature': "some-random-signature-%d" % random.randint(1000, 2000),
+ 'oauth_token': "ad180jjd733klru7",
+ }
+
+ req = oauth.Request("GET", url, params)
+
+ res = req.get_normalized_parameters()
+
+ self.assertNotEquals(urllib.urlencode(sorted(params.items())), res)
+
+ foo = params.copy()
+ del foo["oauth_signature"]
+ self.assertEqual(urllib.urlencode(sorted(foo.items())), res)
+
+ def test_set_signature_method(self):
+ consumer = oauth.Consumer('key', 'secret')
+ client = oauth.Client(consumer)
+
+ class Blah:
+ pass
+
+ try:
+ client.set_signature_method(Blah())
+ self.fail("Client.set_signature_method() accepted invalid method.")
+ except ValueError:
+ pass
+
+ m = oauth.SignatureMethod_HMAC_SHA1()
+ client.set_signature_method(m)
+ self.assertEquals(m, client.method)
+
+ def test_get_normalized_string_escapes_spaces_properly(self):
+ url = "http://sp.example.com/"
+ params = {
+ "some_random_data": random.randint(100, 1000),
+ "data": "This data with a random number (%d) has spaces!" % random.randint(1000, 2000),
+ }
+
+ req = oauth.Request("GET", url, params)
+ res = req.get_normalized_parameters()
+ expected = urllib.urlencode(sorted(params.items())).replace('+', '%20')
+ self.assertEqual(expected, res)
+
+ @mock.patch('oauth2.Request.make_timestamp')
+ @mock.patch('oauth2.Request.make_nonce')
+ def test_request_nonutf8_bytes(self, mock_make_nonce, mock_make_timestamp):
+ mock_make_nonce.return_value = 5
+ mock_make_timestamp.return_value = 6
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ con = oauth.Consumer(key="con-test-key", secret="con-test-secret")
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_token': tok.key,
+ 'oauth_consumer_key': con.key
+ }
+
+ # If someone passes a sequence of bytes which is not ascii for
+ # url, we'll raise an exception as early as possible.
+ url = "http://sp.example.com/\x92" # It's actually cp1252-encoding...
+ self.assertRaises(TypeError, oauth.Request, method="GET", url=url, parameters=params)
+
+ # And if they pass an unicode, then we'll use it.
+ url = u'http://sp.example.com/\u2019'
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'cMzvCkhvLL57+sTIxLITTHfkqZk=')
+
+ # And if it is a utf-8-encoded-then-percent-encoded non-ascii
+ # thing, we'll decode it and use it.
+ url = "http://sp.example.com/%E2%80%99"
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'yMLKOyNKC/DkyhUOb8DLSvceEWE=')
+
+ # Same thing with the params.
+ url = "http://sp.example.com/"
+
+ # If someone passes a sequence of bytes which is not ascii in
+ # params, we'll raise an exception as early as possible.
+ params['non_oauth_thing'] = '\xae', # It's actually cp1252-encoding...
+ self.assertRaises(TypeError, oauth.Request, method="GET", url=url, parameters=params)
+
+ # And if they pass a unicode, then we'll use it.
+ params['non_oauth_thing'] = u'\u2019'
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], '0GU50m0v60CVDB5JnoBXnvvvKx4=')
+
+ # And if it is a utf-8-encoded non-ascii thing, we'll decode
+ # it and use it.
+ params['non_oauth_thing'] = '\xc2\xae'
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'pqOCu4qvRTiGiXB8Z61Jsey0pMM=')
+
+
+ # Also if there are non-utf8 bytes in the query args.
+ url = "http://sp.example.com/?q=\x92" # cp1252
+ self.assertRaises(TypeError, oauth.Request, method="GET", url=url, parameters=params)
+
+ def test_request_hash_of_body(self):
+ tok = oauth.Token(key="token", secret="tok-test-secret")
+ con = oauth.Consumer(key="consumer", secret="con-test-secret")
+
+ # Example 1a from Appendix A.1 of
+ # http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html
+ # Except that we get a differetn result than they do.
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_token': tok.key,
+ 'oauth_nonce': 10288510250934,
+ 'oauth_timestamp': 1236874155,
+ 'oauth_consumer_key': con.key
+ }
+
+ url = u"http://www.example.com/resource"
+ req = oauth.Request(method="PUT", url=url, parameters=params, body="Hello World!", is_form_encoded=False)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_body_hash'], 'Lve95gjOVATpfV8EL5X4nxwjKHE=')
+ self.failUnlessReallyEqual(req['oauth_signature'], 't+MX8l/0S8hdbVQL99nD0X1fPnM=')
+ # oauth-bodyhash.html A.1 has
+ # '08bUFF%2Fjmp59mWB7cSgCYBUpJ0U%3D', but I don't see how that
+ # is possible.
+
+ # Example 1b
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_token': tok.key,
+ 'oauth_nonce': 10369470270925,
+ 'oauth_timestamp': 1236874236,
+ 'oauth_consumer_key': con.key
+ }
+
+ req = oauth.Request(method="PUT", url=url, parameters=params, body="Hello World!", is_form_encoded=False)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_body_hash'], 'Lve95gjOVATpfV8EL5X4nxwjKHE=')
+ self.failUnlessReallyEqual(req['oauth_signature'], 'CTFmrqJIGT7NsWJ42OrujahTtTc=')
+
+ # Appendix A.2
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_token': tok.key,
+ 'oauth_nonce': 8628868109991,
+ 'oauth_timestamp': 1238395022,
+ 'oauth_consumer_key': con.key
+ }
+
+ req = oauth.Request(method="GET", url=url, parameters=params, is_form_encoded=False)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_body_hash'], '2jmj7l5rSw0yVb/vlWAYkK/YBwk=')
+ self.failUnlessReallyEqual(req['oauth_signature'], 'Zhl++aWSP0O3/hYQ0CuBc7jv38I=')
+
+
+ def test_sign_request(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200"
+ }
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ con = oauth.Consumer(key="con-test-key", secret="con-test-secret")
+
+ params['oauth_token'] = tok.key
+ params['oauth_consumer_key'] = con.key
+ req = oauth.Request(method="GET", url=url, parameters=params)
+
+ methods = {
+ 'DX01TdHws7OninCLK9VztNTH1M4=': oauth.SignatureMethod_HMAC_SHA1(),
+ 'con-test-secret&tok-test-secret': oauth.SignatureMethod_PLAINTEXT()
+ }
+
+ for exp, method in methods.items():
+ req.sign_request(method, con, tok)
+ self.assertEquals(req['oauth_signature_method'], method.name)
+ self.assertEquals(req['oauth_signature'], exp)
+
+ # Also if there are non-ascii chars in the URL.
+ url = "http://sp.example.com/\xe2\x80\x99" # utf-8 bytes
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'loFvp5xC7YbOgd9exIO6TxB7H4s=')
+
+ url = u'http://sp.example.com/\u2019' # Python unicode object
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'loFvp5xC7YbOgd9exIO6TxB7H4s=')
+
+ # Also if there are non-ascii chars in the query args.
+ url = "http://sp.example.com/?q=\xe2\x80\x99" # utf-8 bytes
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'IBw5mfvoCsDjgpcsVKbyvsDqQaU=')
+
+ url = u'http://sp.example.com/?q=\u2019' # Python unicode object
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'IBw5mfvoCsDjgpcsVKbyvsDqQaU=')
+
+ def test_from_request(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", url, params)
+ headers = req.to_header()
+
+ # Test from the headers
+ req = oauth.Request.from_request("GET", url, headers)
+ self.assertEquals(req.method, "GET")
+ self.assertEquals(req.url, url)
+
+ self.assertEquals(params, req.copy())
+
+ # Test with bad OAuth headers
+ bad_headers = {
+ 'Authorization' : 'OAuth this is a bad header'
+ }
+
+ self.assertRaises(oauth.Error, oauth.Request.from_request, "GET",
+ url, bad_headers)
+
+ # Test getting from query string
+ qs = urllib.urlencode(params)
+ req = oauth.Request.from_request("GET", url, query_string=qs)
+
+ exp = parse_qs(qs, keep_blank_values=False)
+ for k, v in exp.iteritems():
+ exp[k] = urllib.unquote(v[0])
+
+ self.assertEquals(exp, req.copy())
+
+ # Test that a boned from_request() call returns None
+ req = oauth.Request.from_request("GET", url)
+ self.assertEquals(None, req)
+
+ def test_from_token_and_callback(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ req = oauth.Request.from_token_and_callback(tok)
+ self.assertFalse('oauth_callback' in req)
+ self.assertEquals(req['oauth_token'], tok.key)
+
+ req = oauth.Request.from_token_and_callback(tok, callback=url)
+ self.assertTrue('oauth_callback' in req)
+ self.assertEquals(req['oauth_callback'], url)
+
+ def test_from_consumer_and_token(self):
+ url = "http://sp.example.com/"
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ tok.set_verifier('this_is_a_test_verifier')
+ con = oauth.Consumer(key="con-test-key", secret="con-test-secret")
+ req = oauth.Request.from_consumer_and_token(con, token=tok,
+ http_method="GET", http_url=url)
+
+ self.assertEquals(req['oauth_token'], tok.key)
+ self.assertEquals(req['oauth_consumer_key'], con.key)
+ self.assertEquals(tok.verifier, req['oauth_verifier'])
+
+class SignatureMethod_Bad(oauth.SignatureMethod):
+ name = "BAD"
+
+ def signing_base(self, request, consumer, token):
+ return ""
+
+ def sign(self, request, consumer, token):
+ return "invalid-signature"
+
+
+class TestServer(unittest.TestCase):
+ def setUp(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ self.consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ self.token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = self.token.key
+ params['oauth_consumer_key'] = self.consumer.key
+ self.request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ self.request.sign_request(signature_method, self.consumer, self.token)
+
+ def test_init(self):
+ server = oauth.Server(signature_methods={'HMAC-SHA1' : oauth.SignatureMethod_HMAC_SHA1()})
+ self.assertTrue('HMAC-SHA1' in server.signature_methods)
+ self.assertTrue(isinstance(server.signature_methods['HMAC-SHA1'],
+ oauth.SignatureMethod_HMAC_SHA1))
+
+ server = oauth.Server()
+ self.assertEquals(server.signature_methods, {})
+
+ def test_add_signature_method(self):
+ server = oauth.Server()
+ res = server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+ self.assertTrue(len(res) == 1)
+ self.assertTrue('HMAC-SHA1' in res)
+ self.assertTrue(isinstance(res['HMAC-SHA1'],
+ oauth.SignatureMethod_HMAC_SHA1))
+
+ res = server.add_signature_method(oauth.SignatureMethod_PLAINTEXT())
+ self.assertTrue(len(res) == 2)
+ self.assertTrue('PLAINTEXT' in res)
+ self.assertTrue(isinstance(res['PLAINTEXT'],
+ oauth.SignatureMethod_PLAINTEXT))
+
+ def test_verify_request(self):
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ parameters = server.verify_request(self.request, self.consumer,
+ self.token)
+
+ self.assertTrue('bar' in parameters)
+ self.assertTrue('foo' in parameters)
+ self.assertTrue('multi' in parameters)
+ self.assertEquals(parameters['bar'], 'blerg')
+ self.assertEquals(parameters['foo'], 59)
+ self.assertEquals(parameters['multi'], ['FOO','BAR'])
+
+ def test_build_authenticate_header(self):
+ server = oauth.Server()
+ headers = server.build_authenticate_header('example.com')
+ self.assertTrue('WWW-Authenticate' in headers)
+ self.assertEquals('OAuth realm="example.com"',
+ headers['WWW-Authenticate'])
+
+ def test_no_version(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ self.consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ self.token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = self.token.key
+ params['oauth_consumer_key'] = self.consumer.key
+ self.request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ self.request.sign_request(signature_method, self.consumer, self.token)
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ parameters = server.verify_request(self.request, self.consumer,
+ self.token)
+
+ def test_invalid_version(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': '222.9922',
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['foo','bar'],
+ 'foo': 59
+ }
+
+ consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = token.key
+ params['oauth_consumer_key'] = consumer.key
+ request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ request.sign_request(signature_method, consumer, token)
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ self.assertRaises(oauth.Error, server.verify_request, request, consumer, token)
+
+ def test_invalid_signature_method(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': '1.0',
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = token.key
+ params['oauth_consumer_key'] = consumer.key
+ request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = SignatureMethod_Bad()
+ request.sign_request(signature_method, consumer, token)
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ self.assertRaises(oauth.Error, server.verify_request, request,
+ consumer, token)
+
+ def test_missing_signature(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': '1.0',
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = token.key
+ params['oauth_consumer_key'] = consumer.key
+ request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ request.sign_request(signature_method, consumer, token)
+ del request['oauth_signature']
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ self.assertRaises(oauth.MissingSignature, server.verify_request,
+ request, consumer, token)
+
+
+# Request Token: http://oauth-sandbox.sevengoslings.net/request_token
+# Auth: http://oauth-sandbox.sevengoslings.net/authorize
+# Access Token: http://oauth-sandbox.sevengoslings.net/access_token
+# Two-legged: http://oauth-sandbox.sevengoslings.net/two_legged
+# Three-legged: http://oauth-sandbox.sevengoslings.net/three_legged
+# Key: bd37aed57e15df53
+# Secret: 0e9e6413a9ef49510a4f68ed02cd
+class TestClient(unittest.TestCase):
+# oauth_uris = {
+# 'request_token': '/request_token.php',
+# 'access_token': '/access_token.php'
+# }
+
+ oauth_uris = {
+ 'request_token': '/request_token',
+ 'authorize': '/authorize',
+ 'access_token': '/access_token',
+ 'two_legged': '/two_legged',
+ 'three_legged': '/three_legged'
+ }
+
+ consumer_key = 'bd37aed57e15df53'
+ consumer_secret = '0e9e6413a9ef49510a4f68ed02cd'
+ host = 'http://oauth-sandbox.sevengoslings.net'
+
+ def setUp(self):
+ self.consumer = oauth.Consumer(key=self.consumer_key,
+ secret=self.consumer_secret)
+
+ self.body = {
+ 'foo': 'bar',
+ 'bar': 'foo',
+ 'multi': ['FOO','BAR'],
+ 'blah': 599999
+ }
+
+ def _uri(self, type):
+ uri = self.oauth_uris.get(type)
+ if uri is None:
+ raise KeyError("%s is not a valid OAuth URI type." % type)
+
+ return "%s%s" % (self.host, uri)
+
+ def create_simple_multipart_data(self, data):
+ boundary = '---Boundary-%d' % random.randint(1,1000)
+ crlf = '\r\n'
+ items = []
+ for key, value in data.iteritems():
+ items += [
+ '--'+boundary,
+ 'Content-Disposition: form-data; name="%s"'%str(key),
+ '',
+ str(value),
+ ]
+ items += ['', '--'+boundary+'--', '']
+ content_type = 'multipart/form-data; boundary=%s' % boundary
+ return content_type, crlf.join(items)
+
+ def test_init(self):
+ class Blah():
+ pass
+
+ try:
+ client = oauth.Client(Blah())
+ self.fail("Client.__init__() accepted invalid Consumer.")
+ except ValueError:
+ pass
+
+ consumer = oauth.Consumer('token', 'secret')
+ try:
+ client = oauth.Client(consumer, Blah())
+ self.fail("Client.__init__() accepted invalid Token.")
+ except ValueError:
+ pass
+
+ def test_access_token_get(self):
+ """Test getting an access token via GET."""
+ client = oauth.Client(self.consumer, None)
+ resp, content = client.request(self._uri('request_token'), "GET")
+
+ self.assertEquals(int(resp['status']), 200)
+
+ def test_access_token_post(self):
+ """Test getting an access token via POST."""
+ client = oauth.Client(self.consumer, None)
+ resp, content = client.request(self._uri('request_token'), "POST")
+
+ self.assertEquals(int(resp['status']), 200)
+
+ res = dict(parse_qsl(content))
+ self.assertTrue('oauth_token' in res)
+ self.assertTrue('oauth_token_secret' in res)
+
+ def _two_legged(self, method):
+ client = oauth.Client(self.consumer, None)
+
+ return client.request(self._uri('two_legged'), method,
+ body=urllib.urlencode(self.body))
+
+ def test_two_legged_post(self):
+ """A test of a two-legged OAuth POST request."""
+ resp, content = self._two_legged("POST")
+
+ self.assertEquals(int(resp['status']), 200)
+
+ def test_two_legged_get(self):
+ """A test of a two-legged OAuth GET request."""
+ resp, content = self._two_legged("GET")
+ self.assertEquals(int(resp['status']), 200)
+
+ @mock.patch('httplib2.Http.request')
+ def test_multipart_post_does_not_alter_body(self, mockHttpRequest):
+ random_result = random.randint(1,100)
+
+ data = {
+ 'rand-%d'%random.randint(1,100):random.randint(1,100),
+ }
+ content_type, body = self.create_simple_multipart_data(data)
+
+ client = oauth.Client(self.consumer, None)
+ uri = self._uri('two_legged')
+
+ def mockrequest(cl, ur, **kw):
+ self.failUnless(cl is client)
+ self.failUnless(ur is uri)
+ self.failUnlessEqual(frozenset(kw.keys()), frozenset(['method', 'body', 'redirections', 'connection_type', 'headers']))
+ self.failUnlessEqual(kw['body'], body)
+ self.failUnlessEqual(kw['connection_type'], None)
+ self.failUnlessEqual(kw['method'], 'POST')
+ self.failUnlessEqual(kw['redirections'], httplib2.DEFAULT_MAX_REDIRECTS)
+ self.failUnless(isinstance(kw['headers'], dict))
+
+ return random_result
+
+ mockHttpRequest.side_effect = mockrequest
+
+ result = client.request(uri, 'POST', headers={'Content-Type':content_type}, body=body)
+ self.assertEqual(result, random_result)
+
+ @mock.patch('httplib2.Http.request')
+ def test_url_with_query_string(self, mockHttpRequest):
+ uri = 'http://example.com/foo/bar/?show=thundercats&character=snarf'
+ client = oauth.Client(self.consumer, None)
+ random_result = random.randint(1,100)
+
+ def mockrequest(cl, ur, **kw):
+ self.failUnless(cl is client)
+ self.failUnlessEqual(frozenset(kw.keys()), frozenset(['method', 'body', 'redirections', 'connection_type', 'headers']))
+ self.failUnlessEqual(kw['body'], '')
+ self.failUnlessEqual(kw['connection_type'], None)
+ self.failUnlessEqual(kw['method'], 'GET')
+ self.failUnlessEqual(kw['redirections'], httplib2.DEFAULT_MAX_REDIRECTS)
+ self.failUnless(isinstance(kw['headers'], dict))
+
+ req = oauth.Request.from_consumer_and_token(self.consumer, None,
+ http_method='GET', http_url=uri, parameters={})
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), self.consumer, None)
+ expected = parse_qsl(urlparse.urlparse(req.to_url()).query)
+ actual = parse_qsl(urlparse.urlparse(ur).query)
+ self.failUnlessEqual(len(expected), len(actual))
+ actual = dict(actual)
+ for key, value in expected:
+ if key not in ('oauth_signature', 'oauth_nonce', 'oauth_timestamp'):
+ self.failUnlessEqual(actual[key], value)
+
+ return random_result
+
+ mockHttpRequest.side_effect = mockrequest
+
+ client.request(uri, 'GET')
+
+ @mock.patch('httplib2.Http.request')
+ @mock.patch('oauth2.Request.from_consumer_and_token')
+ def test_multiple_values_for_a_key(self, mockReqConstructor, mockHttpRequest):
+ client = oauth.Client(self.consumer, None)
+
+ request = oauth.Request("GET", "http://example.com/fetch.php", parameters={'multi': ['1', '2']})
+ mockReqConstructor.return_value = request
+
+ client.request('http://whatever', 'POST', body='multi=1&multi=2')
+
+ self.failUnlessEqual(mockReqConstructor.call_count, 1)
+ self.failUnlessEqual(mockReqConstructor.call_args[1]['parameters'], {'multi': ['1', '2']})
+
+ self.failUnless('multi=1' in mockHttpRequest.call_args[1]['body'])
+ self.failUnless('multi=2' in mockHttpRequest.call_args[1]['body'])
+
+if __name__ == "__main__":
+ unittest.main()
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/debian/changelog
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/debian/changelog Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,408 @@
+python-oauth2 (1.5.211) maverick; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Tue, 13 Dec 2011 17:39:07 +0000
+
+python-oauth2 (1.5.210) maverick; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Fri, 09 Dec 2011 01:17:31 +0000
+
+python-oauth2 (1.5.170) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Mon, 02 May 2011 23:48:16 +0000
+
+python-oauth2 (1.5.169) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Fri, 15 Apr 2011 21:29:41 +0000
+
+python-oauth2 (1.5.168) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Tue, 05 Apr 2011 23:13:18 +0000
+
+python-oauth2 (1.5.167) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Thu, 17 Feb 2011 21:56:49 +0000
+
+python-oauth2 (1.5.166) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * fix encoding of non-ascii data into postdata, really fixes #48 this
+ time (comes with test)
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Tue, 15 Feb 2011 17:23:00 +0000
+
+python-oauth2 (1.5.165) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * get_normalized_parameters() is required to exclude any
+ oauth_signature that was already there, and it is required to
+ preserve duplicate keys, even with identical values ref #46, fixes
+ pull/49, thanks @zyegfryed
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Mon, 07 Feb 2011 19:24:56 +0000
+
+python-oauth2 (1.5.164) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * make it actually inspect the request, and fix the test to require
+ the right things of the request ref #46, ref pull/49, thanks
+ @zyegfryed
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Mon, 07 Feb 2011 18:53:56 +0000
+
+python-oauth2 (1.5.163) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * add test of #46; fixes #46
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Fri, 04 Feb 2011 18:14:56 +0000
+
+python-oauth2 (1.5.162) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * import parse_qs from cgi if it can't be imported from urlparse, thus
+ regaining compatibility with Python 2.5 fixes #47 thanks to @vtsao,
+ @subsume, @worksology
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Fri, 04 Feb 2011 17:50:56 +0000
+
+python-oauth2 (1.5.161) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * Include all parameters from URL, even ones that begin with "oauth_",
+ in signature base. effectively reverts
+ https://github.com/simplegeo/python-
+ oauth2/commit/50ca9578f598faff5427e58814e2f45d01d3261c fixes #27
+ Thanks to @robhudson for the bug report and help debugging.
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Thu, 03 Feb 2011 18:03:59 +0000
+
+python-oauth2 (1.5.160) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * add another unicode test case to the tests just to show to user
+ saevarom on github
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Thu, 03 Feb 2011 00:01:55 +0000
+
+python-oauth2 (1.5.159) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Thu, 03 Feb 2011 00:00:04 +0000
+
+python-oauth2 (1.5.158) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * keep empty params parsed from the URL (fixes #22)
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Wed, 02 Feb 2011 19:34:25 +0000
+
+python-oauth2 (1.5.155) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * use multiple values under the same key from the body (fixes #23)
+ Thanks to rogerm, ideasculptor, jiivan, timgraham.
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Tue, 01 Feb 2011 23:43:56 +0000
+
+python-oauth2 (1.5.154) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Tue, 01 Feb 2011 18:03:58 +0000
+
+python-oauth2 (1.5.153) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * add work-around for bug unicode-handling in urlparse in Python <
+ 2.7, including tests
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Tue, 01 Feb 2011 16:31:56 +0000
+
+python-oauth2 (1.5.152) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * another test for handling of non-ascii, non-utf-8 urls
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Fri, 28 Jan 2011 18:14:34 +0000
+
+python-oauth2 (1.5.151) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Thu, 27 Jan 2011 05:31:55 +0000
+
+python-oauth2 (1.5.150) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Wed, 26 Jan 2011 17:15:25 +0000
+
+python-oauth2 (1.5.149) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * add the body-hash header as specified in
+ http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-
+ bodyhash.html
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Wed, 26 Jan 2011 17:11:34 +0000
+
+python-oauth2 (1.5.148) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * default body is the empty string rather than None; add the Realm
+ header
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Wed, 26 Jan 2011 17:02:34 +0000
+
+python-oauth2 (1.5.147) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * pass the body and the is_form_encoding flag in to the Request object
+ (for future use in implementing the hash-of-body extension)
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Tue, 25 Jan 2011 17:39:34 +0000
+
+python-oauth2 (1.5.146) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * refactor internals of the way Client.request() decides whether this
+ is a x-www-form-urlencoded request or not
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Tue, 25 Jan 2011 17:30:38 +0000
+
+python-oauth2 (1.5.145) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * update version number from 1.4 to 1.5
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 22:08:36 +0000
+
+python-oauth2 (1.4.144) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * more thorough unit tests for non-ascii urls, params, and query-args-
+ in-url
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 22:02:34 +0000
+
+python-oauth2 (1.4.143) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * use two-part version number -- version is manually modified, build-
+ number is automatically modified
+
+ [ Simple Geebus ]
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 20:21:20 +0000
+
+python-oauth2 (1.4.134) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 18:30:58 +0000
+
+python-oauth2 (1.4.133) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * handle unicode objects and utf-8 strings in url and params and
+ encode them to utf-8 when serializing
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 18:25:54 +0000
+
+python-oauth2 (1.4.132) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 17:39:52 +0000
+
+python-oauth2 (1.4.131) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 17:32:18 +0000
+
+python-oauth2 (1.4.130) lucid; urgency=low
+
+ * UNRELEASED
+
+ -- SimpleGeo Nerds Mon, 24 Jan 2011 17:22:46 +0000
+
+python-oauth2 (1.4.129) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * change manually-managed version number from 1.3 to 1.4
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Fri, 21 Jan 2011 19:52:32 +0000
+
+python-oauth2 (1.3.128) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * raise an exception if the URL passed in is not a unicode object nor
+ ascii We can't submit a correct URL with arbitrary bytes -- we have
+ to submit a utf-8 encoded unicode string. (Otherwise we'll cause
+ either a rejection or a signature mismatch in the server, which is
+ what has happened at SimpleGeo.) If the caller passes in non-ascii
+ things in a str then it would be better for them to change their
+ code to decode it to unicode before passing it in than for us to
+ decode it, since they have a better chance of knowing what encoding
+ it is in -- if we did it we would be guessing.
+ * fix flaws pointed out by ieure, plus test failures I'm not entirely
+ sure it is appropriate to allow .url and .normalized_url to be non-
+ existent in addition to allowing them to be None, but I don't really
+ understand the intent of the url setter.
+ * Oh, after we've made sure it can be converted to unicode, just leave
+ it as a unicode object after that.
+ * raise more specific error message if argument to to_unicode() is
+ neither unicode nor str
+ * a couple of cleanups suggested by ieure in code review
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Mon, 10 Jan 2011 22:42:35 +0000
+
+python-oauth2 (1.3.127) lucid; urgency=low
+
+ [ Zooko Ofsimplegeo ]
+ * run tests when building
+ * raise exception from a test just to see if hudson is *really*
+ running these tests. I don't see the test results.
+ * put version number in a file where it can be read and written by
+ various things (including hudson)
+ * make oauth2.__version__ exist, rename VERSION to OAUTH_VERSION for
+ clarity
+ * debian/control -- build-dep pyflakes
+ * fix pyflakes
+ * build-dep requires python-coverage
+ * switch from nosetests to the builtin test runner Just because it
+ doesn't seem to currently use any feature of nosetest and this way
+ we can reduce the dependencies by one. We'll feel free to switch it
+ back to using nosetests (and add the dep to debian/control this
+ time) if we want to use some extra feature of nose.
+ * remove test failure which was inserted just to see if hudson was
+ running the tests properly
+ * Fix bug inserted by pyflakes inspired cleanup earlier -- it turns
+ out that _get_version() wasn't dead code but was having a necessary
+ side-effect. Add new method named _check_version() to be clearer
+ about what it does compared to _get_version()
+ * port tests from mox to mock because they were failing and I don't
+ understand mox. now they are working. add mock to the python and
+ debian deps. remove apparently left-over line of code that runs
+ "sign()" at the end of checking a signature
+
+ [ SimpleGeo Nerds ]
+
+ -- SimpleGeo Nerds Tue, 04 Jan 2011 19:39:34 +0000
+
+python-oauth2 (1.2.1) lucid; urgency=low
+
+ [ Joe Stump ]
+ * Fixed a minor spelling error, added tests for
+ oauth2.Error.__str__(), and added a test for build_xoauth_string().
+ * Added a 'make test' command to the Makefile.
+ * Added a bunch of new tests. 100% coverage has lapsed a bit. Fixing
+ now.
+
+ [ Ian Eure ]
+ * Update deb rule in makefile to sign packages and move them to
+ dist/deb.
+
+ [ Joe Stump ]
+ * Implemented a 'fix' for a bug in certain OAuth providers.
+ http://bit.ly/aUrH43
+
+ [ Ian Eure ]
+ * Update packaging.
+ * Fix version disparity.
+
+ [ coulix ]
+ * get normalised parameters should not take into account oauth_ params
+
+ [ Mathias Herberts ]
+ * Modified get_normalized_parameters so it does not encode '~' for
+ full conformance with RFC 5849 section 3.6
+
+ [ Peter Bengtsson ]
+ * made it python 2.4 compatible
+
+ [ Roderic Campbell ]
+ * tok != token. con != consumer. May be confusing for people not
+ actually reading the code.
+
+ [ Ian Eure ]
+
+ -- Ian Eure Mon, 28 Jun 2010 12:02:02 -0700
+
+python-oauth2 (1.2.1pre2) unstable; urgency=low
+
+ * Fix version disparity between setup.py & debian/changelog.
+
+ -- Ian Eure Fri, 11 Jun 2010 16:11:41 -0700
+
+python-oauth2 (1.2.1pre1) unstable; urgency=low
+
+ * Make a native package.
+ * Increment version.
+ * Make debian/rules executable.
+ * Update standards-version, maintainers.
+ * Remvoe unneeded python-central build dependency.
+
+ -- Ian Eure Fri, 11 Jun 2010 16:09:01 -0700
+
+python-oauth2 (1.0.0-1simplegeo01) karmic; urgency=low
+
+ * Initial build for SimpleGeo
+
+ -- SimpleGeo Nerds Wed, 21 Oct 2009 23:24:00 -0700
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/debian/compat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/debian/compat Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1 @@
+5
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/debian/control
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/debian/control Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,24 @@
+Source: python-oauth2
+Section: python
+Priority: optional
+Maintainer: SimpleGeo Nerds
+Uploaders: Chris Lea , Ian Eure
+Standards-Version: 3.8.4
+XS-Python-Version: all
+Build-Depends: debhelper (>= 4.1.13), cdbs (>= 0.4.49), python, python-setuptools, python-support, pyflakes, python-coverage (>= 2.85), python-mock
+Homepage: http://github.com/simplegeo/python-oauth2
+
+Package: python-oauth2
+Architecture: all
+XB-Python-Version: ${python:Versions}
+Depends: ${python:Depends}, python-httplib2
+Provides: ${python:Provides}
+Suggests:
+Description: A Python OAuth class with several useful
+ features.
+ .
+ * 100% unit test coverage.
+ * The Request class now extends from dict.
+ * The Client class works and extends from httplib2.
+ It's a thin wrapper that handles automatically signing
+ any normal HTTP request you might wish to make.
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/debian/copyright
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/debian/copyright Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2007 Leah Culver
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/debian/pycompat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/debian/pycompat Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1 @@
+2
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/debian/pyversions
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/debian/pyversions Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1 @@
+2.5-
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/debian/rules
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/debian/rules Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,12 @@
+#!/usr/bin/make -f
+# -*- mode: makefile; coding: utf-8 -*-
+
+DEB_PYTHON_SYSTEM = pysupport
+
+include /usr/share/cdbs/1/rules/debhelper.mk
+include /usr/share/cdbs/1/class/python-distutils.mk
+
+build/python-oauth2::
+ pyflakes oauth2
+ python-coverage run --branch --include=oauth2/* setup.py test
+ python-coverage html -d $(ARTIFACTS)/htmlcov
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/dist/oauth2-1.5.1.212-py2.7.egg
Binary file Code/python_oauth2-master/dist/oauth2-1.5.1.212-py2.7.egg has changed
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/example/.DS_Store
Binary file Code/python_oauth2-master/example/.DS_Store has changed
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/example/appengine_oauth.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/example/appengine_oauth.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,108 @@
+"""
+The MIT License
+
+Copyright (c) 2010 Justin Plock
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import os
+
+from google.appengine.ext import webapp
+from google.appengine.ext import db
+from google.appengine.ext.webapp import util
+import oauth2 as oauth # httplib2 is required for this to work on AppEngine
+
+class Client(db.Model):
+ # oauth_key is the Model's key_name field
+ oauth_secret = db.StringProperty() # str(uuid.uuid4()) works well for this
+ first_name = db.StringProperty()
+ last_name = db.StringProperty()
+ email_address = db.EmailProperty(required=True)
+ password = db.StringProperty(required=True)
+
+ @property
+ def secret(self):
+ return self.oauth_secret
+
+class OAuthHandler(webapp.RequestHandler):
+
+ def __init__(self):
+ self._server = oauth.Server()
+ self._server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+ self._server.add_signature_method(oauth.SignatureMethod_PLAINTEXT())
+
+ def get_oauth_request(self):
+ """Return an OAuth Request object for the current request."""
+
+ try:
+ method = os.environ['REQUEST_METHOD']
+ except:
+ method = 'GET'
+
+ postdata = None
+ if method in ('POST', 'PUT'):
+ postdata = self.request.body
+
+ return oauth.Request.from_request(method, self.request.uri,
+ headers=self.request.headers, query_string=postdata)
+
+ def get_client(self, request=None):
+ """Return the client from the OAuth parameters."""
+
+ if not isinstance(request, oauth.Request):
+ request = self.get_oauth_request()
+ client_key = request.get_parameter('oauth_consumer_key')
+ if not client_key:
+ raise Exception('Missing "oauth_consumer_key" parameter in ' \
+ 'OAuth "Authorization" header')
+
+ client = models.Client.get_by_key_name(client_key)
+ if not client:
+ raise Exception('Client "%s" not found.' % client_key)
+
+ return client
+
+ def is_valid(self):
+ """Returns a Client object if this is a valid OAuth request."""
+
+ try:
+ request = self.get_oauth_request()
+ client = self.get_client(request)
+ params = self._server.verify_request(request, client, None)
+ except Exception, e:
+ raise e
+
+ return client
+
+class SampleHandler(OAuthHandler):
+ def get(self):
+ try:
+ client = self.is_valid()
+ except Exception, e:
+ self.error(500)
+ self.response.out.write(e)
+
+def main():
+ application = webapp.WSGIApplication([(r'/sample', SampleHandler)],
+ debug=False)
+ util.run_wsgi_app(application)
+
+if __name__ == '__main__':
+ main()
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/example/client.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/example/client.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,165 @@
+"""
+The MIT License
+
+Copyright (c) 2007 Leah Culver
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Example consumer. This is not recommended for production.
+Instead, you'll want to create your own subclass of OAuthClient
+or find one that works with your web framework.
+"""
+
+import httplib
+import time
+import oauth.oauth as oauth
+
+# settings for the local test consumer
+SERVER = 'localhost'
+PORT = 8080
+
+# fake urls for the test server (matches ones in server.py)
+REQUEST_TOKEN_URL = 'https://photos.example.net/request_token'
+ACCESS_TOKEN_URL = 'https://photos.example.net/access_token'
+AUTHORIZATION_URL = 'https://photos.example.net/authorize'
+CALLBACK_URL = 'http://printer.example.com/request_token_ready'
+RESOURCE_URL = 'http://photos.example.net/photos'
+
+# key and secret granted by the service provider for this consumer application - same as the MockOAuthDataStore
+CONSUMER_KEY = 'key'
+CONSUMER_SECRET = 'secret'
+
+# example client using httplib with headers
+class SimpleOAuthClient(oauth.OAuthClient):
+
+ def __init__(self, server, port=httplib.HTTP_PORT, request_token_url='', access_token_url='', authorization_url=''):
+ self.server = server
+ self.port = port
+ self.request_token_url = request_token_url
+ self.access_token_url = access_token_url
+ self.authorization_url = authorization_url
+ self.connection = httplib.HTTPConnection("%s:%d" % (self.server, self.port))
+
+ def fetch_request_token(self, oauth_request):
+ # via headers
+ # -> OAuthToken
+ self.connection.request(oauth_request.http_method, self.request_token_url, headers=oauth_request.to_header())
+ response = self.connection.getresponse()
+ return oauth.OAuthToken.from_string(response.read())
+
+ def fetch_access_token(self, oauth_request):
+ # via headers
+ # -> OAuthToken
+ self.connection.request(oauth_request.http_method, self.access_token_url, headers=oauth_request.to_header())
+ response = self.connection.getresponse()
+ return oauth.OAuthToken.from_string(response.read())
+
+ def authorize_token(self, oauth_request):
+ # via url
+ # -> typically just some okay response
+ self.connection.request(oauth_request.http_method, oauth_request.to_url())
+ response = self.connection.getresponse()
+ return response.read()
+
+ def access_resource(self, oauth_request):
+ # via post body
+ # -> some protected resources
+ headers = {'Content-Type' :'application/x-www-form-urlencoded'}
+ self.connection.request('POST', RESOURCE_URL, body=oauth_request.to_postdata(), headers=headers)
+ response = self.connection.getresponse()
+ return response.read()
+
+def run_example():
+
+ # setup
+ print '** OAuth Python Library Example **'
+ client = SimpleOAuthClient(SERVER, PORT, REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, AUTHORIZATION_URL)
+ consumer = oauth.OAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET)
+ signature_method_plaintext = oauth.OAuthSignatureMethod_PLAINTEXT()
+ signature_method_hmac_sha1 = oauth.OAuthSignatureMethod_HMAC_SHA1()
+ pause()
+
+ # get request token
+ print '* Obtain a request token ...'
+ pause()
+ oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer, callback=CALLBACK_URL, http_url=client.request_token_url)
+ oauth_request.sign_request(signature_method_plaintext, consumer, None)
+ print 'REQUEST (via headers)'
+ print 'parameters: %s' % str(oauth_request.parameters)
+ pause()
+ token = client.fetch_request_token(oauth_request)
+ print 'GOT'
+ print 'key: %s' % str(token.key)
+ print 'secret: %s' % str(token.secret)
+ print 'callback confirmed? %s' % str(token.callback_confirmed)
+ pause()
+
+ print '* Authorize the request token ...'
+ pause()
+ oauth_request = oauth.OAuthRequest.from_token_and_callback(token=token, http_url=client.authorization_url)
+ print 'REQUEST (via url query string)'
+ print 'parameters: %s' % str(oauth_request.parameters)
+ pause()
+ # this will actually occur only on some callback
+ response = client.authorize_token(oauth_request)
+ print 'GOT'
+ print response
+ # sad way to get the verifier
+ import urlparse, cgi
+ query = urlparse.urlparse(response)[4]
+ params = cgi.parse_qs(query, keep_blank_values=False)
+ verifier = params['oauth_verifier'][0]
+ print 'verifier: %s' % verifier
+ pause()
+
+ # get access token
+ print '* Obtain an access token ...'
+ pause()
+ oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer, token=token, verifier=verifier, http_url=client.access_token_url)
+ oauth_request.sign_request(signature_method_plaintext, consumer, token)
+ print 'REQUEST (via headers)'
+ print 'parameters: %s' % str(oauth_request.parameters)
+ pause()
+ token = client.fetch_access_token(oauth_request)
+ print 'GOT'
+ print 'key: %s' % str(token.key)
+ print 'secret: %s' % str(token.secret)
+ pause()
+
+ # access some protected resources
+ print '* Access protected resources ...'
+ pause()
+ parameters = {'file': 'vacation.jpg', 'size': 'original'} # resource specific params
+ oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer, token=token, http_method='POST', http_url=RESOURCE_URL, parameters=parameters)
+ oauth_request.sign_request(signature_method_hmac_sha1, consumer, token)
+ print 'REQUEST (via post body)'
+ print 'parameters: %s' % str(oauth_request.parameters)
+ pause()
+ params = client.access_resource(oauth_request)
+ print 'GOT'
+ print 'non-oauth parameters: %s' % params
+ pause()
+
+def pause():
+ print ''
+ time.sleep(1)
+
+if __name__ == '__main__':
+ run_example()
+ print 'Done.'
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/example/server.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/example/server.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,195 @@
+"""
+The MIT License
+
+Copyright (c) 2007 Leah Culver
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+import urllib
+
+import oauth.oauth as oauth
+
+# fake urls for the test server
+REQUEST_TOKEN_URL = 'https://photos.example.net/request_token'
+ACCESS_TOKEN_URL = 'https://photos.example.net/access_token'
+AUTHORIZATION_URL = 'https://photos.example.net/authorize'
+CALLBACK_URL = 'http://printer.example.com/request_token_ready'
+RESOURCE_URL = 'http://photos.example.net/photos'
+REALM = 'http://photos.example.net/'
+VERIFIER = 'verifier'
+
+# example store for one of each thing
+class MockOAuthDataStore(oauth.OAuthDataStore):
+
+ def __init__(self):
+ self.consumer = oauth.OAuthConsumer('key', 'secret')
+ self.request_token = oauth.OAuthToken('requestkey', 'requestsecret')
+ self.access_token = oauth.OAuthToken('accesskey', 'accesssecret')
+ self.nonce = 'nonce'
+ self.verifier = VERIFIER
+
+ def lookup_consumer(self, key):
+ if key == self.consumer.key:
+ return self.consumer
+ return None
+
+ def lookup_token(self, token_type, token):
+ token_attrib = getattr(self, '%s_token' % token_type)
+ if token == token_attrib.key:
+ ## HACK
+ token_attrib.set_callback(CALLBACK_URL)
+ return token_attrib
+ return None
+
+ def lookup_nonce(self, oauth_consumer, oauth_token, nonce):
+ if oauth_token and oauth_consumer.key == self.consumer.key and (oauth_token.key == self.request_token.key or oauth_token.key == self.access_token.key) and nonce == self.nonce:
+ return self.nonce
+ return None
+
+ def fetch_request_token(self, oauth_consumer, oauth_callback):
+ if oauth_consumer.key == self.consumer.key:
+ if oauth_callback:
+ # want to check here if callback is sensible
+ # for mock store, we assume it is
+ self.request_token.set_callback(oauth_callback)
+ return self.request_token
+ return None
+
+ def fetch_access_token(self, oauth_consumer, oauth_token, oauth_verifier):
+ if oauth_consumer.key == self.consumer.key and oauth_token.key == self.request_token.key and oauth_verifier == self.verifier:
+ # want to check here if token is authorized
+ # for mock store, we assume it is
+ return self.access_token
+ return None
+
+ def authorize_request_token(self, oauth_token, user):
+ if oauth_token.key == self.request_token.key:
+ # authorize the request token in the store
+ # for mock store, do nothing
+ return self.request_token
+ return None
+
+class RequestHandler(BaseHTTPRequestHandler):
+
+ def __init__(self, *args, **kwargs):
+ self.oauth_server = oauth.OAuthServer(MockOAuthDataStore())
+ self.oauth_server.add_signature_method(oauth.OAuthSignatureMethod_PLAINTEXT())
+ self.oauth_server.add_signature_method(oauth.OAuthSignatureMethod_HMAC_SHA1())
+ BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
+
+ # example way to send an oauth error
+ def send_oauth_error(self, err=None):
+ # send a 401 error
+ self.send_error(401, str(err.message))
+ # return the authenticate header
+ header = oauth.build_authenticate_header(realm=REALM)
+ for k, v in header.iteritems():
+ self.send_header(k, v)
+
+ def do_GET(self):
+
+ # debug info
+ #print self.command, self.path, self.headers
+
+ # get the post data (if any)
+ postdata = None
+ if self.command == 'POST':
+ try:
+ length = int(self.headers.getheader('content-length'))
+ postdata = self.rfile.read(length)
+ except:
+ pass
+
+ # construct the oauth request from the request parameters
+ oauth_request = oauth.OAuthRequest.from_request(self.command, self.path, headers=self.headers, query_string=postdata)
+
+ # request token
+ if self.path.startswith(REQUEST_TOKEN_URL):
+ try:
+ # create a request token
+ token = self.oauth_server.fetch_request_token(oauth_request)
+ # send okay response
+ self.send_response(200, 'OK')
+ self.end_headers()
+ # return the token
+ self.wfile.write(token.to_string())
+ except oauth.OAuthError, err:
+ self.send_oauth_error(err)
+ return
+
+ # user authorization
+ if self.path.startswith(AUTHORIZATION_URL):
+ try:
+ # get the request token
+ token = self.oauth_server.fetch_request_token(oauth_request)
+ # authorize the token (kind of does nothing for now)
+ token = self.oauth_server.authorize_token(token, None)
+ token.set_verifier(VERIFIER)
+ # send okay response
+ self.send_response(200, 'OK')
+ self.end_headers()
+ # return the callback url (to show server has it)
+ self.wfile.write(token.get_callback_url())
+ except oauth.OAuthError, err:
+ self.send_oauth_error(err)
+ return
+
+ # access token
+ if self.path.startswith(ACCESS_TOKEN_URL):
+ try:
+ # create an access token
+ token = self.oauth_server.fetch_access_token(oauth_request)
+ # send okay response
+ self.send_response(200, 'OK')
+ self.end_headers()
+ # return the token
+ self.wfile.write(token.to_string())
+ except oauth.OAuthError, err:
+ self.send_oauth_error(err)
+ return
+
+ # protected resources
+ if self.path.startswith(RESOURCE_URL):
+ try:
+ # verify the request has been oauth authorized
+ consumer, token, params = self.oauth_server.verify_request(oauth_request)
+ # send okay response
+ self.send_response(200, 'OK')
+ self.end_headers()
+ # return the extra parameters - just for something to return
+ self.wfile.write(str(params))
+ except oauth.OAuthError, err:
+ self.send_oauth_error(err)
+ return
+
+ def do_POST(self):
+ return self.do_GET()
+
+def main():
+ try:
+ server = HTTPServer(('', 8080), RequestHandler)
+ print 'Test server running...'
+ server.serve_forever()
+ except KeyboardInterrupt:
+ server.socket.close()
+
+if __name__ == '__main__':
+ main()
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2.egg-info/PKG-INFO
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2.egg-info/PKG-INFO Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,11 @@
+Metadata-Version: 1.0
+Name: oauth2
+Version: 1.5.1.212
+Summary: library for OAuth version 1.0
+Home-page: http://github.com/simplegeo/python-oauth2
+Author: Joe Stump
+Author-email: joe@simplegeo.com
+License: MIT License
+Description: UNKNOWN
+Keywords: oauth
+Platform: UNKNOWN
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2.egg-info/SOURCES.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2.egg-info/SOURCES.txt Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,15 @@
+setup.cfg
+setup.py
+oauth2/__init__.py
+oauth2/_version.py
+oauth2.egg-info/PKG-INFO
+oauth2.egg-info/SOURCES.txt
+oauth2.egg-info/dependency_links.txt
+oauth2.egg-info/requires.txt
+oauth2.egg-info/top_level.txt
+oauth2.egg-info/zip-safe
+oauth2/clients/__init__.py
+oauth2/clients/imap.py
+oauth2/clients/smtp.py
+tests/__init__.py
+tests/test_oauth.py
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2.egg-info/dependency_links.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2.egg-info/dependency_links.txt Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1 @@
+
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2.egg-info/requires.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2.egg-info/requires.txt Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1 @@
+httplib2
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2.egg-info/top_level.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2.egg-info/top_level.txt Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,2 @@
+oauth2
+tests
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2.egg-info/zip-safe
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2.egg-info/zip-safe Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1 @@
+
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2/__init__.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,860 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import base64
+import urllib
+import time
+import random
+import urlparse
+import hmac
+import binascii
+import httplib2
+
+try:
+ from urlparse import parse_qs
+ parse_qs # placate pyflakes
+except ImportError:
+ # fall back for Python 2.5
+ from cgi import parse_qs
+
+try:
+ from hashlib import sha1
+ sha = sha1
+except ImportError:
+ # hashlib was added in Python 2.5
+ import sha
+
+import _version
+
+__version__ = _version.__version__
+
+OAUTH_VERSION = '1.0' # Hi Blaine!
+HTTP_METHOD = 'GET'
+SIGNATURE_METHOD = 'PLAINTEXT'
+
+
+class Error(RuntimeError):
+ """Generic exception class."""
+
+ def __init__(self, message='OAuth error occurred.'):
+ self._message = message
+
+ @property
+ def message(self):
+ """A hack to get around the deprecation errors in 2.6."""
+ return self._message
+
+ def __str__(self):
+ return self._message
+
+
+class MissingSignature(Error):
+ pass
+
+
+def build_authenticate_header(realm=''):
+ """Optional WWW-Authenticate header (401 error)"""
+ return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
+
+
+def build_xoauth_string(url, consumer, token=None):
+ """Build an XOAUTH string for use in SMTP/IMPA authentication."""
+ request = Request.from_consumer_and_token(consumer, token,
+ "GET", url)
+
+ signing_method = SignatureMethod_HMAC_SHA1()
+ request.sign_request(signing_method, consumer, token)
+
+ params = []
+ for k, v in sorted(request.iteritems()):
+ if v is not None:
+ params.append('%s="%s"' % (k, escape(v)))
+
+ return "%s %s %s" % ("GET", url, ','.join(params))
+
+
+def to_unicode(s):
+ """ Convert to unicode, raise exception with instructive error
+ message if s is not unicode, ascii, or utf-8. """
+ if not isinstance(s, unicode):
+ if not isinstance(s, str):
+ raise TypeError('You are required to pass either unicode or string here, not: %r (%s)' % (type(s), s))
+ try:
+ s = s.decode('utf-8')
+ except UnicodeDecodeError, le:
+ raise TypeError('You are required to pass either a unicode object or a utf-8 string here. You passed a Python string object which contained non-utf-8: %r. The UnicodeDecodeError that resulted from attempting to interpret it as utf-8 was: %s' % (s, le,))
+ return s
+
+def to_utf8(s):
+ return to_unicode(s).encode('utf-8')
+
+def to_unicode_if_string(s):
+ if isinstance(s, basestring):
+ return to_unicode(s)
+ else:
+ return s
+
+def to_utf8_if_string(s):
+ if isinstance(s, basestring):
+ return to_utf8(s)
+ else:
+ return s
+
+def to_unicode_optional_iterator(x):
+ """
+ Raise TypeError if x is a str containing non-utf8 bytes or if x is
+ an iterable which contains such a str.
+ """
+ if isinstance(x, basestring):
+ return to_unicode(x)
+
+ try:
+ l = list(x)
+ except TypeError, e:
+ assert 'is not iterable' in str(e)
+ return x
+ else:
+ return [ to_unicode(e) for e in l ]
+
+def to_utf8_optional_iterator(x):
+ """
+ Raise TypeError if x is a str or if x is an iterable which
+ contains a str.
+ """
+ if isinstance(x, basestring):
+ return to_utf8(x)
+
+ try:
+ l = list(x)
+ except TypeError, e:
+ assert 'is not iterable' in str(e)
+ return x
+ else:
+ return [ to_utf8_if_string(e) for e in l ]
+
+def escape(s):
+ """Escape a URL including any /."""
+ return urllib.quote(s.encode('utf-8'), safe='~')
+
+def generate_timestamp():
+ """Get seconds since epoch (UTC)."""
+ return int(time.time())
+
+
+def generate_nonce(length=8):
+ """Generate pseudorandom number."""
+ return ''.join([str(random.randint(0, 9)) for i in range(length)])
+
+
+def generate_verifier(length=8):
+ """Generate pseudorandom number."""
+ return ''.join([str(random.randint(0, 9)) for i in range(length)])
+
+
+class Consumer(object):
+ """A consumer of OAuth-protected services.
+
+ The OAuth consumer is a "third-party" service that wants to access
+ protected resources from an OAuth service provider on behalf of an end
+ user. It's kind of the OAuth client.
+
+ Usually a consumer must be registered with the service provider by the
+ developer of the consumer software. As part of that process, the service
+ provider gives the consumer a *key* and a *secret* with which the consumer
+ software can identify itself to the service. The consumer will include its
+ key in each request to identify itself, but will use its secret only when
+ signing requests, to prove that the request is from that particular
+ registered consumer.
+
+ Once registered, the consumer can then use its consumer credentials to ask
+ the service provider for a request token, kicking off the OAuth
+ authorization process.
+ """
+
+ key = None
+ secret = None
+
+ def __init__(self, key, secret):
+ self.key = key
+ self.secret = secret
+
+ if self.key is None or self.secret is None:
+ raise ValueError("Key and secret must be set.")
+
+ def __str__(self):
+ data = {'oauth_consumer_key': self.key,
+ 'oauth_consumer_secret': self.secret}
+
+ return urllib.urlencode(data)
+
+
+class Token(object):
+ """An OAuth credential used to request authorization or a protected
+ resource.
+
+ Tokens in OAuth comprise a *key* and a *secret*. The key is included in
+ requests to identify the token being used, but the secret is used only in
+ the signature, to prove that the requester is who the server gave the
+ token to.
+
+ When first negotiating the authorization, the consumer asks for a *request
+ token* that the live user authorizes with the service provider. The
+ consumer then exchanges the request token for an *access token* that can
+ be used to access protected resources.
+ """
+
+ key = None
+ secret = None
+ callback = None
+ callback_confirmed = None
+ verifier = None
+
+ def __init__(self, key, secret):
+ self.key = key
+ self.secret = secret
+
+ if self.key is None or self.secret is None:
+ raise ValueError("Key and secret must be set.")
+
+ def set_callback(self, callback):
+ self.callback = callback
+ self.callback_confirmed = 'true'
+
+ def set_verifier(self, verifier=None):
+ if verifier is not None:
+ self.verifier = verifier
+ else:
+ self.verifier = generate_verifier()
+
+ def get_callback_url(self):
+ if self.callback and self.verifier:
+ # Append the oauth_verifier.
+ parts = urlparse.urlparse(self.callback)
+ scheme, netloc, path, params, query, fragment = parts[:6]
+ if query:
+ query = '%s&oauth_verifier=%s' % (query, self.verifier)
+ else:
+ query = 'oauth_verifier=%s' % self.verifier
+ return urlparse.urlunparse((scheme, netloc, path, params,
+ query, fragment))
+ return self.callback
+
+ def to_string(self):
+ """Returns this token as a plain string, suitable for storage.
+
+ The resulting string includes the token's secret, so you should never
+ send or store this string where a third party can read it.
+ """
+
+ data = {
+ 'oauth_token': self.key,
+ 'oauth_token_secret': self.secret,
+ }
+
+ if self.callback_confirmed is not None:
+ data['oauth_callback_confirmed'] = self.callback_confirmed
+ return urllib.urlencode(data)
+
+ @staticmethod
+ def from_string(s):
+ """Deserializes a token from a string like one returned by
+ `to_string()`."""
+
+ if not len(s):
+ raise ValueError("Invalid parameter string.")
+
+ params = parse_qs(s, keep_blank_values=False)
+ if not len(params):
+ raise ValueError("Invalid parameter string.")
+
+ try:
+ key = params['oauth_token'][0]
+ except Exception:
+ raise ValueError("'oauth_token' not found in OAuth request.")
+
+ try:
+ secret = params['oauth_token_secret'][0]
+ except Exception:
+ raise ValueError("'oauth_token_secret' not found in "
+ "OAuth request.")
+
+ token = Token(key, secret)
+ try:
+ token.callback_confirmed = params['oauth_callback_confirmed'][0]
+ except KeyError:
+ pass # 1.0, no callback confirmed.
+ return token
+
+ def __str__(self):
+ return self.to_string()
+
+
+def setter(attr):
+ name = attr.__name__
+
+ def getter(self):
+ try:
+ return self.__dict__[name]
+ except KeyError:
+ raise AttributeError(name)
+
+ def deleter(self):
+ del self.__dict__[name]
+
+ return property(getter, attr, deleter)
+
+
+class Request(dict):
+
+ """The parameters and information for an HTTP request, suitable for
+ authorizing with OAuth credentials.
+
+ When a consumer wants to access a service's protected resources, it does
+ so using a signed HTTP request identifying itself (the consumer) with its
+ key, and providing an access token authorized by the end user to access
+ those resources.
+
+ """
+
+ version = OAUTH_VERSION
+
+ def __init__(self, method=HTTP_METHOD, url=None, parameters=None,
+ body='', is_form_encoded=False):
+ if url is not None:
+ self.url = to_unicode(url)
+ self.method = method
+ if parameters is not None:
+ for k, v in parameters.iteritems():
+ k = to_unicode(k)
+ v = to_unicode_optional_iterator(v)
+ self[k] = v
+ self.body = body
+ self.is_form_encoded = is_form_encoded
+
+
+ @setter
+ def url(self, value):
+ self.__dict__['url'] = value
+ if value is not None:
+ scheme, netloc, path, params, query, fragment = urlparse.urlparse(value)
+
+ # Exclude default port numbers.
+ if scheme == 'http' and netloc[-3:] == ':80':
+ netloc = netloc[:-3]
+ elif scheme == 'https' and netloc[-4:] == ':443':
+ netloc = netloc[:-4]
+ if scheme not in ('http', 'https'):
+ raise ValueError("Unsupported URL %s (%s)." % (value, scheme))
+
+ # Normalized URL excludes params, query, and fragment.
+ self.normalized_url = urlparse.urlunparse((scheme, netloc, path, None, None, None))
+ else:
+ self.normalized_url = None
+ self.__dict__['url'] = None
+
+ @setter
+ def method(self, value):
+ self.__dict__['method'] = value.upper()
+
+ def _get_timestamp_nonce(self):
+ return self['oauth_timestamp'], self['oauth_nonce']
+
+ def get_nonoauth_parameters(self):
+ """Get any non-OAuth parameters."""
+ return dict([(k, v) for k, v in self.iteritems()
+ if not k.startswith('oauth_')])
+
+ def to_header(self, realm=''):
+ """Serialize as a header for an HTTPAuth request."""
+ oauth_params = ((k, v) for k, v in self.items()
+ if k.startswith('oauth_'))
+ stringy_params = ((k, escape(str(v))) for k, v in oauth_params)
+ header_params = ('%s="%s"' % (k, v) for k, v in stringy_params)
+ params_header = ', '.join(header_params)
+
+ auth_header = 'OAuth realm="%s"' % realm
+ if params_header:
+ auth_header = "%s, %s" % (auth_header, params_header)
+
+ return {'Authorization': auth_header}
+
+ def to_postdata(self):
+ """Serialize as post data for a POST request."""
+ d = {}
+ for k, v in self.iteritems():
+ d[k.encode('utf-8')] = to_utf8_optional_iterator(v)
+
+ # tell urlencode to deal with sequence values and map them correctly
+ # to resulting querystring. for example self["k"] = ["v1", "v2"] will
+ # result in 'k=v1&k=v2' and not k=%5B%27v1%27%2C+%27v2%27%5D
+ return urllib.urlencode(d, True).replace('+', '%20')
+
+ def to_url(self):
+ """Serialize as a URL for a GET request."""
+ base_url = urlparse.urlparse(self.url)
+ try:
+ query = base_url.query
+ except AttributeError:
+ # must be python <2.5
+ query = base_url[4]
+ query = parse_qs(query)
+ for k, v in self.items():
+ query.setdefault(k, []).append(v)
+
+ try:
+ scheme = base_url.scheme
+ netloc = base_url.netloc
+ path = base_url.path
+ params = base_url.params
+ fragment = base_url.fragment
+ except AttributeError:
+ # must be python <2.5
+ scheme = base_url[0]
+ netloc = base_url[1]
+ path = base_url[2]
+ params = base_url[3]
+ fragment = base_url[5]
+
+ url = (scheme, netloc, path, params,
+ urllib.urlencode(query, True), fragment)
+ return urlparse.urlunparse(url)
+
+ def get_parameter(self, parameter):
+ ret = self.get(parameter)
+ if ret is None:
+ raise Error('Parameter not found: %s' % parameter)
+
+ return ret
+
+ def get_normalized_parameters(self):
+ """Return a string that contains the parameters that must be signed."""
+ items = []
+ for key, value in self.iteritems():
+ if key == 'oauth_signature':
+ continue
+ # 1.0a/9.1.1 states that kvp must be sorted by key, then by value,
+ # so we unpack sequence values into multiple items for sorting.
+ if isinstance(value, basestring):
+ items.append((to_utf8_if_string(key), to_utf8(value)))
+ else:
+ try:
+ value = list(value)
+ except TypeError, e:
+ assert 'is not iterable' in str(e)
+ items.append((to_utf8_if_string(key), to_utf8_if_string(value)))
+ else:
+ items.extend((to_utf8_if_string(key), to_utf8_if_string(item)) for item in value)
+
+ # Include any query string parameters from the provided URL
+ query = urlparse.urlparse(self.url)[4]
+
+ url_items = self._split_url_string(query).items()
+ url_items = [(to_utf8(k), to_utf8(v)) for k, v in url_items if k != 'oauth_signature' ]
+ items.extend(url_items)
+
+ items.sort()
+ encoded_str = urllib.urlencode(items)
+ # Encode signature parameters per Oauth Core 1.0 protocol
+ # spec draft 7, section 3.6
+ # (http://tools.ietf.org/html/draft-hammer-oauth-07#section-3.6)
+ # Spaces must be encoded with "%20" instead of "+"
+ return encoded_str.replace('+', '%20').replace('%7E', '~')
+
+ def sign_request(self, signature_method, consumer, token):
+ """Set the signature parameter to the result of sign."""
+
+ if not self.is_form_encoded:
+ # according to
+ # http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html
+ # section 4.1.1 "OAuth Consumers MUST NOT include an
+ # oauth_body_hash parameter on requests with form-encoded
+ # request bodies."
+ self['oauth_body_hash'] = base64.b64encode(sha(self.body).digest())
+
+ if 'oauth_consumer_key' not in self:
+ self['oauth_consumer_key'] = consumer.key
+
+ if token and 'oauth_token' not in self:
+ self['oauth_token'] = token.key
+
+ self['oauth_signature_method'] = signature_method.name
+ self['oauth_signature'] = signature_method.sign(self, consumer, token)
+
+ @classmethod
+ def make_timestamp(cls):
+ """Get seconds since epoch (UTC)."""
+ return str(int(time.time()))
+
+ @classmethod
+ def make_nonce(cls):
+ """Generate pseudorandom number."""
+ return str(random.randint(0, 100000000))
+
+ @classmethod
+ def from_request(cls, http_method, http_url, headers=None, parameters=None,
+ query_string=None):
+ """Combines multiple parameter sources."""
+ if parameters is None:
+ parameters = {}
+
+ # Headers
+ if headers and 'Authorization' in headers:
+ auth_header = headers['Authorization']
+ # Check that the authorization header is OAuth.
+ if auth_header[:6] == 'OAuth ':
+ auth_header = auth_header[6:]
+ try:
+ # Get the parameters from the header.
+ header_params = cls._split_header(auth_header)
+ parameters.update(header_params)
+ except:
+ raise Error('Unable to parse OAuth parameters from '
+ 'Authorization header.')
+
+ # GET or POST query string.
+ if query_string:
+ query_params = cls._split_url_string(query_string)
+ parameters.update(query_params)
+
+ # URL parameters.
+ param_str = urlparse.urlparse(http_url)[4] # query
+ url_params = cls._split_url_string(param_str)
+ parameters.update(url_params)
+
+ if parameters:
+ return cls(http_method, http_url, parameters)
+
+ return None
+
+ @classmethod
+ def from_consumer_and_token(cls, consumer, token=None,
+ http_method=HTTP_METHOD, http_url=None, parameters=None,
+ body='', is_form_encoded=False):
+ if not parameters:
+ parameters = {}
+
+ defaults = {
+ 'oauth_consumer_key': consumer.key,
+ 'oauth_timestamp': cls.make_timestamp(),
+ 'oauth_nonce': cls.make_nonce(),
+ 'oauth_version': cls.version,
+ }
+
+ defaults.update(parameters)
+ parameters = defaults
+
+ if token:
+ parameters['oauth_token'] = token.key
+ if token.verifier:
+ parameters['oauth_verifier'] = token.verifier
+
+ return Request(http_method, http_url, parameters, body=body,
+ is_form_encoded=is_form_encoded)
+
+ @classmethod
+ def from_token_and_callback(cls, token, callback=None,
+ http_method=HTTP_METHOD, http_url=None, parameters=None):
+
+ if not parameters:
+ parameters = {}
+
+ parameters['oauth_token'] = token.key
+
+ if callback:
+ parameters['oauth_callback'] = callback
+
+ return cls(http_method, http_url, parameters)
+
+ @staticmethod
+ def _split_header(header):
+ """Turn Authorization: header into parameters."""
+ params = {}
+ parts = header.split(',')
+ for param in parts:
+ # Ignore realm parameter.
+ if param.find('realm') > -1:
+ continue
+ # Remove whitespace.
+ param = param.strip()
+ # Split key-value.
+ param_parts = param.split('=', 1)
+ # Remove quotes and unescape the value.
+ params[param_parts[0]] = urllib.unquote(param_parts[1].strip('\"'))
+ return params
+
+ @staticmethod
+ def _split_url_string(param_str):
+ """Turn URL string into parameters."""
+ parameters = parse_qs(param_str.encode('utf-8'), keep_blank_values=True)
+ for k, v in parameters.iteritems():
+ parameters[k] = urllib.unquote(v[0])
+ return parameters
+
+
+class Client(httplib2.Http):
+ """OAuthClient is a worker to attempt to execute a request."""
+
+ def __init__(self, consumer, token=None, cache=None, timeout=None,
+ proxy_info=None):
+
+ if consumer is not None and not isinstance(consumer, Consumer):
+ raise ValueError("Invalid consumer.")
+
+ if token is not None and not isinstance(token, Token):
+ raise ValueError("Invalid token.")
+
+ self.consumer = consumer
+ self.token = token
+ self.method = SignatureMethod_HMAC_SHA1()
+
+ httplib2.Http.__init__(self, cache=cache, timeout=timeout, proxy_info=proxy_info)
+
+ def set_signature_method(self, method):
+ if not isinstance(method, SignatureMethod):
+ raise ValueError("Invalid signature method.")
+
+ self.method = method
+
+ def request(self, uri, method="GET", body='', headers=None,
+ redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None):
+ DEFAULT_POST_CONTENT_TYPE = 'application/x-www-form-urlencoded'
+
+ if not isinstance(headers, dict):
+ headers = {}
+
+ if method == "POST":
+ headers['Content-Type'] = headers.get('Content-Type',
+ DEFAULT_POST_CONTENT_TYPE)
+
+ is_form_encoded = \
+ headers.get('Content-Type') == 'application/x-www-form-urlencoded'
+
+ if is_form_encoded and body:
+ parameters = dict([(k,v[0]) for k,v in parse_qs(body).items()])
+ else:
+ parameters = None
+
+ req = Request.from_consumer_and_token(self.consumer,
+ token=self.token, http_method=method, http_url=uri,
+ parameters=parameters, body=body, is_form_encoded=is_form_encoded)
+
+ req.sign_request(self.method, self.consumer, self.token)
+
+ schema, rest = urllib.splittype(uri)
+ if rest.startswith('//'):
+ hierpart = '//'
+ else:
+ hierpart = ''
+ host, rest = urllib.splithost(rest)
+
+ realm = schema + ':' + hierpart + host
+
+ if method == "POST" and is_form_encoded:
+ body = req.to_postdata()
+ elif method == "GET":
+ uri = req.to_url()
+ else:
+ headers.update(req.to_header(realm=realm))
+
+ return httplib2.Http.request(self, uri, method=method, body=body,
+ headers=headers, redirections=redirections,
+ connection_type=connection_type)
+
+
+class Server(object):
+ """A skeletal implementation of a service provider, providing protected
+ resources to requests from authorized consumers.
+
+ This class implements the logic to check requests for authorization. You
+ can use it with your web server or web framework to protect certain
+ resources with OAuth.
+ """
+
+ timestamp_threshold = 300 # In seconds, five minutes.
+ version = OAUTH_VERSION
+ signature_methods = None
+
+ def __init__(self, signature_methods=None):
+ self.signature_methods = signature_methods or {}
+
+ def add_signature_method(self, signature_method):
+ self.signature_methods[signature_method.name] = signature_method
+ return self.signature_methods
+
+ def verify_request(self, request, consumer, token):
+ """Verifies an api call and checks all the parameters."""
+
+ self._check_version(request)
+ self._check_signature(request, consumer, token)
+ parameters = request.get_nonoauth_parameters()
+ return parameters
+
+ def build_authenticate_header(self, realm=''):
+ """Optional support for the authenticate header."""
+ return {'WWW-Authenticate': 'OAuth realm="%s"' % realm}
+
+ def _check_version(self, request):
+ """Verify the correct version of the request for this server."""
+ version = self._get_version(request)
+ if version and version != self.version:
+ raise Error('OAuth version %s not supported.' % str(version))
+
+ def _get_version(self, request):
+ """Return the version of the request for this server."""
+ try:
+ version = request.get_parameter('oauth_version')
+ except:
+ version = OAUTH_VERSION
+
+ return version
+
+ def _get_signature_method(self, request):
+ """Figure out the signature with some defaults."""
+ try:
+ signature_method = request.get_parameter('oauth_signature_method')
+ except:
+ signature_method = SIGNATURE_METHOD
+
+ try:
+ # Get the signature method object.
+ signature_method = self.signature_methods[signature_method]
+ except:
+ signature_method_names = ', '.join(self.signature_methods.keys())
+ raise Error('Signature method %s not supported try one of the following: %s' % (signature_method, signature_method_names))
+
+ return signature_method
+
+ def _get_verifier(self, request):
+ return request.get_parameter('oauth_verifier')
+
+ def _check_signature(self, request, consumer, token):
+ timestamp, nonce = request._get_timestamp_nonce()
+ self._check_timestamp(timestamp)
+ signature_method = self._get_signature_method(request)
+
+ try:
+ signature = request.get_parameter('oauth_signature')
+ except:
+ raise MissingSignature('Missing oauth_signature.')
+
+ # Validate the signature.
+ valid = signature_method.check(request, consumer, token, signature)
+
+ if not valid:
+ key, base = signature_method.signing_base(request, consumer, token)
+
+ raise Error('Invalid signature. Expected signature base '
+ 'string: %s' % base)
+
+ def _check_timestamp(self, timestamp):
+ """Verify that timestamp is recentish."""
+ timestamp = int(timestamp)
+ now = int(time.time())
+ lapsed = now - timestamp
+ if lapsed > self.timestamp_threshold:
+ raise Error('Expired timestamp: given %d and now %s has a '
+ 'greater difference than threshold %d' % (timestamp, now,
+ self.timestamp_threshold))
+
+
+class SignatureMethod(object):
+ """A way of signing requests.
+
+ The OAuth protocol lets consumers and service providers pick a way to sign
+ requests. This interface shows the methods expected by the other `oauth`
+ modules for signing requests. Subclass it and implement its methods to
+ provide a new way to sign requests.
+ """
+
+ def signing_base(self, request, consumer, token):
+ """Calculates the string that needs to be signed.
+
+ This method returns a 2-tuple containing the starting key for the
+ signing and the message to be signed. The latter may be used in error
+ messages to help clients debug their software.
+
+ """
+ raise NotImplementedError
+
+ def sign(self, request, consumer, token):
+ """Returns the signature for the given request, based on the consumer
+ and token also provided.
+
+ You should use your implementation of `signing_base()` to build the
+ message to sign. Otherwise it may be less useful for debugging.
+
+ """
+ raise NotImplementedError
+
+ def check(self, request, consumer, token, signature):
+ """Returns whether the given signature is the correct signature for
+ the given consumer and token signing the given request."""
+ built = self.sign(request, consumer, token)
+ return built == signature
+
+
+class SignatureMethod_HMAC_SHA1(SignatureMethod):
+ name = 'HMAC-SHA1'
+
+ def signing_base(self, request, consumer, token):
+ if not hasattr(request, 'normalized_url') or request.normalized_url is None:
+ raise ValueError("Base URL for request is not set.")
+
+ sig = (
+ escape(request.method),
+ escape(request.normalized_url),
+ escape(request.get_normalized_parameters()),
+ )
+
+ key = '%s&' % escape(consumer.secret)
+ if token:
+ key += escape(token.secret)
+ raw = '&'.join(sig)
+ return key, raw
+
+ def sign(self, request, consumer, token):
+ """Builds the base signature string."""
+ key, raw = self.signing_base(request, consumer, token)
+
+ hashed = hmac.new(key, raw, sha)
+
+ # Calculate the digest base 64.
+ return binascii.b2a_base64(hashed.digest())[:-1]
+
+
+class SignatureMethod_PLAINTEXT(SignatureMethod):
+
+ name = 'PLAINTEXT'
+
+ def signing_base(self, request, consumer, token):
+ """Concatenates the consumer key and secret with the token's
+ secret."""
+ sig = '%s&' % escape(consumer.secret)
+ if token:
+ sig = sig + escape(token.secret)
+ return sig, sig
+
+ def sign(self, request, consumer, token):
+ key, raw = self.signing_base(request, consumer, token)
+ return raw
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2/_version.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2/_version.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,18 @@
+# This is the version of this source code.
+
+manual_verstr = "1.5.1"
+
+
+
+auto_build_num = "212"
+
+
+
+verstr = manual_verstr + "." + auto_build_num
+try:
+ from pyutil.version_class import Version as pyutil_Version
+ __version__ = pyutil_Version(verstr)
+except (ImportError, ValueError):
+ # Maybe there is no pyutil installed.
+ from distutils.version import LooseVersion as distutils_Version
+ __version__ = distutils_Version(verstr)
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2/clients/imap.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2/clients/imap.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,40 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import oauth2
+import imaplib
+
+
+class IMAP4_SSL(imaplib.IMAP4_SSL):
+ """IMAP wrapper for imaplib.IMAP4_SSL that implements XOAUTH."""
+
+ def authenticate(self, url, consumer, token):
+ if consumer is not None and not isinstance(consumer, oauth2.Consumer):
+ raise ValueError("Invalid consumer.")
+
+ if token is not None and not isinstance(token, oauth2.Token):
+ raise ValueError("Invalid token.")
+
+ imaplib.IMAP4_SSL.authenticate(self, 'XOAUTH',
+ lambda x: oauth2.build_xoauth_string(url, consumer, token))
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/oauth2/clients/smtp.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/oauth2/clients/smtp.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,41 @@
+"""
+The MIT License
+
+Copyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+
+import oauth2
+import smtplib
+import base64
+
+
+class SMTP(smtplib.SMTP):
+ """SMTP wrapper for smtplib.SMTP that implements XOAUTH."""
+
+ def authenticate(self, url, consumer, token):
+ if consumer is not None and not isinstance(consumer, oauth2.Consumer):
+ raise ValueError("Invalid consumer.")
+
+ if token is not None and not isinstance(token, oauth2.Token):
+ raise ValueError("Invalid token.")
+
+ self.docmd('AUTH', 'XOAUTH %s' % \
+ base64.b64encode(oauth2.build_xoauth_string(url, consumer, token)))
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/setup.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/setup.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+from setuptools import setup, find_packages
+import os, re
+
+PKG='oauth2'
+VERSIONFILE = os.path.join('oauth2', '_version.py')
+verstr = "unknown"
+try:
+ verstrline = open(VERSIONFILE, "rt").read()
+except EnvironmentError:
+ pass # Okay, there is no version file.
+else:
+ MVSRE = r"^manual_verstr *= *['\"]([^'\"]*)['\"]"
+ mo = re.search(MVSRE, verstrline, re.M)
+ if mo:
+ mverstr = mo.group(1)
+ else:
+ print "unable to find version in %s" % (VERSIONFILE,)
+ raise RuntimeError("if %s.py exists, it must be well-formed" % (VERSIONFILE,))
+ AVSRE = r"^auto_build_num *= *['\"]([^'\"]*)['\"]"
+ mo = re.search(AVSRE, verstrline, re.M)
+ if mo:
+ averstr = mo.group(1)
+ else:
+ averstr = ''
+ verstr = '.'.join([mverstr, averstr])
+
+setup(name=PKG,
+ version=verstr,
+ description="library for OAuth version 1.0",
+ author="Joe Stump",
+ author_email="joe@simplegeo.com",
+ url="http://github.com/simplegeo/python-oauth2",
+ packages = find_packages(),
+ install_requires = ['httplib2'],
+ license = "MIT License",
+ keywords="oauth",
+ zip_safe = True,
+ test_suite="tests",
+ tests_require=['coverage', 'mock'])
diff -r 1dbd24575d44 -r e68dbee1f6db Code/python_oauth2-master/tests/test_oauth.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/python_oauth2-master/tests/test_oauth.py Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1309 @@
+# -*- coding: utf-8 -*-
+
+"""
+The MIT License
+
+Copyright (c) 2009 Vic Fryzel
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+"""
+import sys
+import os
+import unittest
+import oauth2 as oauth
+import random
+import time
+import urllib
+import urlparse
+from types import ListType
+import mock
+import httplib2
+
+# Fix for python2.5 compatibility
+try:
+ from urlparse import parse_qs, parse_qsl
+except ImportError:
+ from cgi import parse_qs, parse_qsl
+
+
+sys.path[0:0] = [os.path.join(os.path.dirname(__file__), ".."),]
+
+
+class TestError(unittest.TestCase):
+ def test_message(self):
+ try:
+ raise oauth.Error
+ except oauth.Error, e:
+ self.assertEqual(e.message, 'OAuth error occurred.')
+
+ msg = 'OMG THINGS BROKE!!!!'
+ try:
+ raise oauth.Error(msg)
+ except oauth.Error, e:
+ self.assertEqual(e.message, msg)
+
+ def test_str(self):
+ try:
+ raise oauth.Error
+ except oauth.Error, e:
+ self.assertEquals(str(e), 'OAuth error occurred.')
+
+class TestGenerateFunctions(unittest.TestCase):
+ def test_build_auth_header(self):
+ header = oauth.build_authenticate_header()
+ self.assertEqual(header['WWW-Authenticate'], 'OAuth realm=""')
+ self.assertEqual(len(header), 1)
+ realm = 'http://example.myrealm.com/'
+ header = oauth.build_authenticate_header(realm)
+ self.assertEqual(header['WWW-Authenticate'], 'OAuth realm="%s"' %
+ realm)
+ self.assertEqual(len(header), 1)
+
+ def test_build_xoauth_string(self):
+ consumer = oauth.Consumer('consumer_token', 'consumer_secret')
+ token = oauth.Token('user_token', 'user_secret')
+ url = "https://mail.google.com/mail/b/joe@example.com/imap/"
+ xoauth_string = oauth.build_xoauth_string(url, consumer, token)
+
+ method, oauth_url, oauth_string = xoauth_string.split(' ')
+
+ self.assertEqual("GET", method)
+ self.assertEqual(url, oauth_url)
+
+ returned = {}
+ parts = oauth_string.split(',')
+ for part in parts:
+ var, val = part.split('=')
+ returned[var] = val.strip('"')
+
+ self.assertEquals('HMAC-SHA1', returned['oauth_signature_method'])
+ self.assertEquals('user_token', returned['oauth_token'])
+ self.assertEquals('consumer_token', returned['oauth_consumer_key'])
+ self.assertTrue('oauth_signature' in returned, 'oauth_signature')
+
+ def test_escape(self):
+ string = 'http://whatever.com/~someuser/?test=test&other=other'
+ self.assert_('~' in oauth.escape(string))
+ string = '../../../../../../../etc/passwd'
+ self.assert_('../' not in oauth.escape(string))
+
+ def test_gen_nonce(self):
+ nonce = oauth.generate_nonce()
+ self.assertEqual(len(nonce), 8)
+ nonce = oauth.generate_nonce(20)
+ self.assertEqual(len(nonce), 20)
+
+ def test_gen_verifier(self):
+ verifier = oauth.generate_verifier()
+ self.assertEqual(len(verifier), 8)
+ verifier = oauth.generate_verifier(16)
+ self.assertEqual(len(verifier), 16)
+
+ def test_gen_timestamp(self):
+ exp = int(time.time())
+ now = oauth.generate_timestamp()
+ self.assertEqual(exp, now)
+
+class TestConsumer(unittest.TestCase):
+ def setUp(self):
+ self.key = 'my-key'
+ self.secret = 'my-secret'
+ self.consumer = oauth.Consumer(key=self.key, secret=self.secret)
+
+ def test_init(self):
+ self.assertEqual(self.consumer.key, self.key)
+ self.assertEqual(self.consumer.secret, self.secret)
+
+ def test_basic(self):
+ self.assertRaises(ValueError, lambda: oauth.Consumer(None, None))
+ self.assertRaises(ValueError, lambda: oauth.Consumer('asf', None))
+ self.assertRaises(ValueError, lambda: oauth.Consumer(None, 'dasf'))
+
+ def test_str(self):
+ res = dict(parse_qsl(str(self.consumer)))
+ self.assertTrue('oauth_consumer_key' in res)
+ self.assertTrue('oauth_consumer_secret' in res)
+ self.assertEquals(res['oauth_consumer_key'], self.consumer.key)
+ self.assertEquals(res['oauth_consumer_secret'], self.consumer.secret)
+
+class TestToken(unittest.TestCase):
+ def setUp(self):
+ self.key = 'my-key'
+ self.secret = 'my-secret'
+ self.token = oauth.Token(self.key, self.secret)
+
+ def test_basic(self):
+ self.assertRaises(ValueError, lambda: oauth.Token(None, None))
+ self.assertRaises(ValueError, lambda: oauth.Token('asf', None))
+ self.assertRaises(ValueError, lambda: oauth.Token(None, 'dasf'))
+
+ def test_init(self):
+ self.assertEqual(self.token.key, self.key)
+ self.assertEqual(self.token.secret, self.secret)
+ self.assertEqual(self.token.callback, None)
+ self.assertEqual(self.token.callback_confirmed, None)
+ self.assertEqual(self.token.verifier, None)
+
+ def test_set_callback(self):
+ self.assertEqual(self.token.callback, None)
+ self.assertEqual(self.token.callback_confirmed, None)
+ cb = 'http://www.example.com/my-callback'
+ self.token.set_callback(cb)
+ self.assertEqual(self.token.callback, cb)
+ self.assertEqual(self.token.callback_confirmed, 'true')
+ self.token.set_callback(None)
+ self.assertEqual(self.token.callback, None)
+ # TODO: The following test should probably not pass, but it does
+ # To fix this, check for None and unset 'true' in set_callback
+ # Additionally, should a confirmation truly be done of the callback?
+ self.assertEqual(self.token.callback_confirmed, 'true')
+
+ def test_set_verifier(self):
+ self.assertEqual(self.token.verifier, None)
+ v = oauth.generate_verifier()
+ self.token.set_verifier(v)
+ self.assertEqual(self.token.verifier, v)
+ self.token.set_verifier()
+ self.assertNotEqual(self.token.verifier, v)
+ self.token.set_verifier('')
+ self.assertEqual(self.token.verifier, '')
+
+ def test_get_callback_url(self):
+ self.assertEqual(self.token.get_callback_url(), None)
+
+ self.token.set_verifier()
+ self.assertEqual(self.token.get_callback_url(), None)
+
+ cb = 'http://www.example.com/my-callback?save=1&return=true'
+ v = oauth.generate_verifier()
+ self.token.set_callback(cb)
+ self.token.set_verifier(v)
+ url = self.token.get_callback_url()
+ verifier_str = '&oauth_verifier=%s' % v
+ self.assertEqual(url, '%s%s' % (cb, verifier_str))
+
+ cb = 'http://www.example.com/my-callback-no-query'
+ v = oauth.generate_verifier()
+ self.token.set_callback(cb)
+ self.token.set_verifier(v)
+ url = self.token.get_callback_url()
+ verifier_str = '?oauth_verifier=%s' % v
+ self.assertEqual(url, '%s%s' % (cb, verifier_str))
+
+ def test_to_string(self):
+ string = 'oauth_token_secret=%s&oauth_token=%s' % (self.secret,
+ self.key)
+ self.assertEqual(self.token.to_string(), string)
+
+ self.token.set_callback('http://www.example.com/my-callback')
+ string += '&oauth_callback_confirmed=true'
+ self.assertEqual(self.token.to_string(), string)
+
+ def _compare_tokens(self, new):
+ self.assertEqual(self.token.key, new.key)
+ self.assertEqual(self.token.secret, new.secret)
+ # TODO: What about copying the callback to the new token?
+ # self.assertEqual(self.token.callback, new.callback)
+ self.assertEqual(self.token.callback_confirmed,
+ new.callback_confirmed)
+ # TODO: What about copying the verifier to the new token?
+ # self.assertEqual(self.token.verifier, new.verifier)
+
+ def test_to_string(self):
+ tok = oauth.Token('tooken', 'seecret')
+ self.assertEqual(str(tok), 'oauth_token_secret=seecret&oauth_token=tooken')
+
+ def test_from_string(self):
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string(''))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('blahblahblah'))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('blah=blah'))
+
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token_secret=asfdasf'))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token_secret='))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token=asfdasf'))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token='))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token=&oauth_token_secret='))
+ self.assertRaises(ValueError, lambda: oauth.Token.from_string('oauth_token=tooken%26oauth_token_secret=seecret'))
+
+ string = self.token.to_string()
+ new = oauth.Token.from_string(string)
+ self._compare_tokens(new)
+
+ self.token.set_callback('http://www.example.com/my-callback')
+ string = self.token.to_string()
+ new = oauth.Token.from_string(string)
+ self._compare_tokens(new)
+
+class ReallyEqualMixin:
+ def failUnlessReallyEqual(self, a, b, msg=None):
+ self.failUnlessEqual(a, b, msg=msg)
+ self.failUnlessEqual(type(a), type(b), msg="a :: %r, b :: %r, %r" % (a, b, msg))
+
+class TestFuncs(unittest.TestCase):
+ def test_to_unicode(self):
+ self.failUnlessRaises(TypeError, oauth.to_unicode, '\xae')
+ self.failUnlessRaises(TypeError, oauth.to_unicode_optional_iterator, '\xae')
+ self.failUnlessRaises(TypeError, oauth.to_unicode_optional_iterator, ['\xae'])
+
+ self.failUnlessEqual(oauth.to_unicode(':-)'), u':-)')
+ self.failUnlessEqual(oauth.to_unicode(u'\u00ae'), u'\u00ae')
+ self.failUnlessEqual(oauth.to_unicode('\xc2\xae'), u'\u00ae')
+ self.failUnlessEqual(oauth.to_unicode_optional_iterator([':-)']), [u':-)'])
+ self.failUnlessEqual(oauth.to_unicode_optional_iterator([u'\u00ae']), [u'\u00ae'])
+
+class TestRequest(unittest.TestCase, ReallyEqualMixin):
+ def test_setter(self):
+ url = "http://example.com"
+ method = "GET"
+ req = oauth.Request(method)
+ self.assertTrue(not hasattr(req, 'url') or req.url is None)
+ self.assertTrue(not hasattr(req, 'normalized_url') or req.normalized_url is None)
+
+ def test_deleter(self):
+ url = "http://example.com"
+ method = "GET"
+ req = oauth.Request(method, url)
+
+ try:
+ del req.url
+ url = req.url
+ self.fail("AttributeError should have been raised on empty url.")
+ except AttributeError:
+ pass
+ except Exception, e:
+ self.fail(str(e))
+
+ def test_url(self):
+ url1 = "http://example.com:80/foo.php"
+ url2 = "https://example.com:443/foo.php"
+ exp1 = "http://example.com/foo.php"
+ exp2 = "https://example.com/foo.php"
+ method = "GET"
+
+ req = oauth.Request(method, url1)
+ self.assertEquals(req.normalized_url, exp1)
+ self.assertEquals(req.url, url1)
+
+ req = oauth.Request(method, url2)
+ self.assertEquals(req.normalized_url, exp2)
+ self.assertEquals(req.url, url2)
+
+ def test_bad_url(self):
+ request = oauth.Request()
+ try:
+ request.url = "ftp://example.com"
+ self.fail("Invalid URL scheme was accepted.")
+ except ValueError:
+ pass
+
+ def test_unset_consumer_and_token(self):
+ consumer = oauth.Consumer('my_consumer_key', 'my_consumer_secret')
+ token = oauth.Token('my_key', 'my_secret')
+ request = oauth.Request("GET", "http://example.com/fetch.php")
+ request.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer,
+ token)
+
+ self.assertEquals(consumer.key, request['oauth_consumer_key'])
+ self.assertEquals(token.key, request['oauth_token'])
+
+ def test_no_url_set(self):
+ consumer = oauth.Consumer('my_consumer_key', 'my_consumer_secret')
+ token = oauth.Token('my_key', 'my_secret')
+ request = oauth.Request()
+
+ try:
+ try:
+ request.sign_request(oauth.SignatureMethod_HMAC_SHA1(),
+ consumer, token)
+ except TypeError:
+ self.fail("Signature method didn't check for a normalized URL.")
+ except ValueError:
+ pass
+
+ def test_url_query(self):
+ url = "https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10"
+ normalized_url = urlparse.urlunparse(urlparse.urlparse(url)[:3] + (None, None, None))
+ method = "GET"
+
+ req = oauth.Request(method, url)
+ self.assertEquals(req.url, url)
+ self.assertEquals(req.normalized_url, normalized_url)
+
+ def test_get_parameter(self):
+ url = "http://example.com"
+ method = "GET"
+ params = {'oauth_consumer' : 'asdf'}
+ req = oauth.Request(method, url, parameters=params)
+
+ self.assertEquals(req.get_parameter('oauth_consumer'), 'asdf')
+ self.assertRaises(oauth.Error, req.get_parameter, 'blah')
+
+ def test_get_nonoauth_parameters(self):
+
+ oauth_params = {
+ 'oauth_consumer': 'asdfasdfasdf'
+ }
+
+ other_params = {
+ u'foo': u'baz',
+ u'bar': u'foo',
+ u'multi': [u'FOO',u'BAR'],
+ u'uni_utf8': u'\xae',
+ u'uni_unicode': u'\u00ae',
+ u'uni_unicode_2': u'åÅøØ',
+ }
+
+ params = oauth_params
+ params.update(other_params)
+
+ req = oauth.Request("GET", "http://example.com", params)
+ self.assertEquals(other_params, req.get_nonoauth_parameters())
+
+ def test_to_header(self):
+ realm = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", realm, params)
+ header, value = req.to_header(realm).items()[0]
+
+ parts = value.split('OAuth ')
+ vars = parts[1].split(', ')
+ self.assertTrue(len(vars), (len(params) + 1))
+
+ res = {}
+ for v in vars:
+ var, val = v.split('=')
+ res[var] = urllib.unquote(val.strip('"'))
+
+ self.assertEquals(realm, res['realm'])
+ del res['realm']
+
+ self.assertTrue(len(res), len(params))
+
+ for key, val in res.items():
+ self.assertEquals(val, params.get(key))
+
+ def test_to_postdata_nonascii(self):
+ realm = "http://sp.example.com/"
+
+ params = {
+ 'nonasciithing': u'q\xbfu\xe9 ,aasp u?..a.s',
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", realm, params)
+
+ self.failUnlessReallyEqual(req.to_postdata(), 'nonasciithing=q%C2%BFu%C3%A9%20%2Caasp%20u%3F..a.s&oauth_nonce=4572616e48616d6d65724c61686176&oauth_timestamp=137131200&oauth_consumer_key=0685bd9184jfhq22&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=ad180jjd733klru7&oauth_signature=wOJIO9A2W5mFwDgiDvZbTSMK%252FPY%253D')
+
+ def test_to_postdata(self):
+ realm = "http://sp.example.com/"
+
+ params = {
+ 'multi': ['FOO','BAR'],
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", realm, params)
+
+ flat = [('multi','FOO'),('multi','BAR')]
+ del params['multi']
+ flat.extend(params.items())
+ kf = lambda x: x[0]
+ self.assertEquals(sorted(flat, key=kf), sorted(parse_qsl(req.to_postdata()), key=kf))
+
+ def test_to_url(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", url, params)
+ exp = urlparse.urlparse("%s?%s" % (url, urllib.urlencode(params)))
+ res = urlparse.urlparse(req.to_url())
+ self.assertEquals(exp.scheme, res.scheme)
+ self.assertEquals(exp.netloc, res.netloc)
+ self.assertEquals(exp.path, res.path)
+
+ a = parse_qs(exp.query)
+ b = parse_qs(res.query)
+ self.assertEquals(a, b)
+
+ def test_to_url_with_query(self):
+ url = "https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", url, params)
+ # Note: the url above already has query parameters, so append new ones with &
+ exp = urlparse.urlparse("%s&%s" % (url, urllib.urlencode(params)))
+ res = urlparse.urlparse(req.to_url())
+ self.assertEquals(exp.scheme, res.scheme)
+ self.assertEquals(exp.netloc, res.netloc)
+ self.assertEquals(exp.path, res.path)
+
+ a = parse_qs(exp.query)
+ b = parse_qs(res.query)
+ self.assertTrue('alt' in b)
+ self.assertTrue('max-contacts' in b)
+ self.assertEquals(b['alt'], ['json'])
+ self.assertEquals(b['max-contacts'], ['10'])
+ self.assertEquals(a, b)
+
+ def test_signature_base_string_nonascii_nonutf8(self):
+ consumer = oauth.Consumer('consumer_token', 'consumer_secret')
+
+ url = u'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc\u2766,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ url = 'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc\xe2\x9d\xa6,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ url = 'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc%E2%9D%A6,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ url = u'http://api.simplegeo.com:80/1.0/places/address.json?q=monkeys&category=animal&address=41+Decatur+St,+San+Francisc%E2%9D%A6,+CA'
+ req = oauth.Request("GET", url)
+ self.failUnlessReallyEqual(req.normalized_url, u'http://api.simplegeo.com/1.0/places/address.json')
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'WhufgeZKyYpKsI70GZaiDaYwl6g=')
+
+ def test_signature_base_string_with_query(self):
+ url = "https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10"
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+ req = oauth.Request("GET", url, params)
+ self.assertEquals(req.normalized_url, 'https://www.google.com/m8/feeds/contacts/default/full/')
+ self.assertEquals(req.url, 'https://www.google.com/m8/feeds/contacts/default/full/?alt=json&max-contacts=10')
+ normalized_params = parse_qsl(req.get_normalized_parameters())
+ self.assertTrue(len(normalized_params), len(params) + 2)
+ normalized_params = dict(normalized_params)
+ for key, value in params.iteritems():
+ if key == 'oauth_signature':
+ continue
+ self.assertEquals(value, normalized_params[key])
+ self.assertEquals(normalized_params['alt'], 'json')
+ self.assertEquals(normalized_params['max-contacts'], '10')
+
+ def test_get_normalized_parameters_empty(self):
+ url = "http://sp.example.com/?empty="
+
+ req = oauth.Request("GET", url)
+
+ res = req.get_normalized_parameters()
+
+ expected='empty='
+
+ self.assertEquals(expected, res)
+
+ def test_get_normalized_parameters_duplicate(self):
+ url = "http://example.com/v2/search/videos?oauth_nonce=79815175&oauth_timestamp=1295397962&oauth_consumer_key=mykey&oauth_signature_method=HMAC-SHA1&q=car&oauth_version=1.0&offset=10&oauth_signature=spWLI%2FGQjid7sQVd5%2FarahRxzJg%3D"
+
+ req = oauth.Request("GET", url)
+
+ res = req.get_normalized_parameters()
+
+ expected='oauth_consumer_key=mykey&oauth_nonce=79815175&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1295397962&oauth_version=1.0&offset=10&q=car'
+
+ self.assertEquals(expected, res)
+
+ def test_get_normalized_parameters_from_url(self):
+ # example copied from
+ # https://github.com/ciaranj/node-oauth/blob/master/tests/oauth.js
+ # which in turns says that it was copied from
+ # http://oauth.net/core/1.0/#sig_base_example .
+ url = "http://photos.example.net/photos?file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=original"
+
+ req = oauth.Request("GET", url)
+
+ res = req.get_normalized_parameters()
+
+ expected = 'file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=original'
+
+ self.assertEquals(expected, res)
+
+ def test_signing_base(self):
+ # example copied from
+ # https://github.com/ciaranj/node-oauth/blob/master/tests/oauth.js
+ # which in turns says that it was copied from
+ # http://oauth.net/core/1.0/#sig_base_example .
+ url = "http://photos.example.net/photos?file=vacation.jpg&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1191242096&oauth_token=nnch734d00sl2jdk&oauth_version=1.0&size=original"
+
+ req = oauth.Request("GET", url)
+
+ sm = oauth.SignatureMethod_HMAC_SHA1()
+
+ consumer = oauth.Consumer('dpf43f3p2l4k3l03', 'foo')
+ key, raw = sm.signing_base(req, consumer, None)
+
+ expected = 'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal'
+ self.assertEquals(expected, raw)
+
+ def test_get_normalized_parameters(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'multi': ['FOO','BAR', u'\u00ae', '\xc2\xae'],
+ 'multi_same': ['FOO','FOO'],
+ 'uni_utf8_bytes': '\xc2\xae',
+ 'uni_unicode_object': u'\u00ae'
+ }
+
+ req = oauth.Request("GET", url, params)
+
+ res = req.get_normalized_parameters()
+
+ expected='multi=BAR&multi=FOO&multi=%C2%AE&multi=%C2%AE&multi_same=FOO&multi_same=FOO&oauth_consumer_key=0685bd9184jfhq22&oauth_nonce=4572616e48616d6d65724c61686176&oauth_signature_method=HMAC-SHA1&oauth_timestamp=137131200&oauth_token=ad180jjd733klru7&oauth_version=1.0&uni_unicode_object=%C2%AE&uni_utf8_bytes=%C2%AE'
+
+ self.assertEquals(expected, res)
+
+ def test_get_normalized_parameters_ignores_auth_signature(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_signature': "some-random-signature-%d" % random.randint(1000, 2000),
+ 'oauth_token': "ad180jjd733klru7",
+ }
+
+ req = oauth.Request("GET", url, params)
+
+ res = req.get_normalized_parameters()
+
+ self.assertNotEquals(urllib.urlencode(sorted(params.items())), res)
+
+ foo = params.copy()
+ del foo["oauth_signature"]
+ self.assertEqual(urllib.urlencode(sorted(foo.items())), res)
+
+ def test_set_signature_method(self):
+ consumer = oauth.Consumer('key', 'secret')
+ client = oauth.Client(consumer)
+
+ class Blah:
+ pass
+
+ try:
+ client.set_signature_method(Blah())
+ self.fail("Client.set_signature_method() accepted invalid method.")
+ except ValueError:
+ pass
+
+ m = oauth.SignatureMethod_HMAC_SHA1()
+ client.set_signature_method(m)
+ self.assertEquals(m, client.method)
+
+ def test_get_normalized_string_escapes_spaces_properly(self):
+ url = "http://sp.example.com/"
+ params = {
+ "some_random_data": random.randint(100, 1000),
+ "data": "This data with a random number (%d) has spaces!" % random.randint(1000, 2000),
+ }
+
+ req = oauth.Request("GET", url, params)
+ res = req.get_normalized_parameters()
+ expected = urllib.urlencode(sorted(params.items())).replace('+', '%20')
+ self.assertEqual(expected, res)
+
+ @mock.patch('oauth2.Request.make_timestamp')
+ @mock.patch('oauth2.Request.make_nonce')
+ def test_request_nonutf8_bytes(self, mock_make_nonce, mock_make_timestamp):
+ mock_make_nonce.return_value = 5
+ mock_make_timestamp.return_value = 6
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ con = oauth.Consumer(key="con-test-key", secret="con-test-secret")
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_token': tok.key,
+ 'oauth_consumer_key': con.key
+ }
+
+ # If someone passes a sequence of bytes which is not ascii for
+ # url, we'll raise an exception as early as possible.
+ url = "http://sp.example.com/\x92" # It's actually cp1252-encoding...
+ self.assertRaises(TypeError, oauth.Request, method="GET", url=url, parameters=params)
+
+ # And if they pass an unicode, then we'll use it.
+ url = u'http://sp.example.com/\u2019'
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'cMzvCkhvLL57+sTIxLITTHfkqZk=')
+
+ # And if it is a utf-8-encoded-then-percent-encoded non-ascii
+ # thing, we'll decode it and use it.
+ url = "http://sp.example.com/%E2%80%99"
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'yMLKOyNKC/DkyhUOb8DLSvceEWE=')
+
+ # Same thing with the params.
+ url = "http://sp.example.com/"
+
+ # If someone passes a sequence of bytes which is not ascii in
+ # params, we'll raise an exception as early as possible.
+ params['non_oauth_thing'] = '\xae', # It's actually cp1252-encoding...
+ self.assertRaises(TypeError, oauth.Request, method="GET", url=url, parameters=params)
+
+ # And if they pass a unicode, then we'll use it.
+ params['non_oauth_thing'] = u'\u2019'
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], '0GU50m0v60CVDB5JnoBXnvvvKx4=')
+
+ # And if it is a utf-8-encoded non-ascii thing, we'll decode
+ # it and use it.
+ params['non_oauth_thing'] = '\xc2\xae'
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_signature'], 'pqOCu4qvRTiGiXB8Z61Jsey0pMM=')
+
+
+ # Also if there are non-utf8 bytes in the query args.
+ url = "http://sp.example.com/?q=\x92" # cp1252
+ self.assertRaises(TypeError, oauth.Request, method="GET", url=url, parameters=params)
+
+ def test_request_hash_of_body(self):
+ tok = oauth.Token(key="token", secret="tok-test-secret")
+ con = oauth.Consumer(key="consumer", secret="con-test-secret")
+
+ # Example 1a from Appendix A.1 of
+ # http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html
+ # Except that we get a differetn result than they do.
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_token': tok.key,
+ 'oauth_nonce': 10288510250934,
+ 'oauth_timestamp': 1236874155,
+ 'oauth_consumer_key': con.key
+ }
+
+ url = u"http://www.example.com/resource"
+ req = oauth.Request(method="PUT", url=url, parameters=params, body="Hello World!", is_form_encoded=False)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_body_hash'], 'Lve95gjOVATpfV8EL5X4nxwjKHE=')
+ self.failUnlessReallyEqual(req['oauth_signature'], 't+MX8l/0S8hdbVQL99nD0X1fPnM=')
+ # oauth-bodyhash.html A.1 has
+ # '08bUFF%2Fjmp59mWB7cSgCYBUpJ0U%3D', but I don't see how that
+ # is possible.
+
+ # Example 1b
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_token': tok.key,
+ 'oauth_nonce': 10369470270925,
+ 'oauth_timestamp': 1236874236,
+ 'oauth_consumer_key': con.key
+ }
+
+ req = oauth.Request(method="PUT", url=url, parameters=params, body="Hello World!", is_form_encoded=False)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_body_hash'], 'Lve95gjOVATpfV8EL5X4nxwjKHE=')
+ self.failUnlessReallyEqual(req['oauth_signature'], 'CTFmrqJIGT7NsWJ42OrujahTtTc=')
+
+ # Appendix A.2
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_token': tok.key,
+ 'oauth_nonce': 8628868109991,
+ 'oauth_timestamp': 1238395022,
+ 'oauth_consumer_key': con.key
+ }
+
+ req = oauth.Request(method="GET", url=url, parameters=params, is_form_encoded=False)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, None)
+ self.failUnlessReallyEqual(req['oauth_body_hash'], '2jmj7l5rSw0yVb/vlWAYkK/YBwk=')
+ self.failUnlessReallyEqual(req['oauth_signature'], 'Zhl++aWSP0O3/hYQ0CuBc7jv38I=')
+
+
+ def test_sign_request(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200"
+ }
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ con = oauth.Consumer(key="con-test-key", secret="con-test-secret")
+
+ params['oauth_token'] = tok.key
+ params['oauth_consumer_key'] = con.key
+ req = oauth.Request(method="GET", url=url, parameters=params)
+
+ methods = {
+ 'DX01TdHws7OninCLK9VztNTH1M4=': oauth.SignatureMethod_HMAC_SHA1(),
+ 'con-test-secret&tok-test-secret': oauth.SignatureMethod_PLAINTEXT()
+ }
+
+ for exp, method in methods.items():
+ req.sign_request(method, con, tok)
+ self.assertEquals(req['oauth_signature_method'], method.name)
+ self.assertEquals(req['oauth_signature'], exp)
+
+ # Also if there are non-ascii chars in the URL.
+ url = "http://sp.example.com/\xe2\x80\x99" # utf-8 bytes
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'loFvp5xC7YbOgd9exIO6TxB7H4s=')
+
+ url = u'http://sp.example.com/\u2019' # Python unicode object
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'loFvp5xC7YbOgd9exIO6TxB7H4s=')
+
+ # Also if there are non-ascii chars in the query args.
+ url = "http://sp.example.com/?q=\xe2\x80\x99" # utf-8 bytes
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'IBw5mfvoCsDjgpcsVKbyvsDqQaU=')
+
+ url = u'http://sp.example.com/?q=\u2019' # Python unicode object
+ req = oauth.Request(method="GET", url=url, parameters=params)
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), con, tok)
+ self.assertEquals(req['oauth_signature'], 'IBw5mfvoCsDjgpcsVKbyvsDqQaU=')
+
+ def test_from_request(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ req = oauth.Request("GET", url, params)
+ headers = req.to_header()
+
+ # Test from the headers
+ req = oauth.Request.from_request("GET", url, headers)
+ self.assertEquals(req.method, "GET")
+ self.assertEquals(req.url, url)
+
+ self.assertEquals(params, req.copy())
+
+ # Test with bad OAuth headers
+ bad_headers = {
+ 'Authorization' : 'OAuth this is a bad header'
+ }
+
+ self.assertRaises(oauth.Error, oauth.Request.from_request, "GET",
+ url, bad_headers)
+
+ # Test getting from query string
+ qs = urllib.urlencode(params)
+ req = oauth.Request.from_request("GET", url, query_string=qs)
+
+ exp = parse_qs(qs, keep_blank_values=False)
+ for k, v in exp.iteritems():
+ exp[k] = urllib.unquote(v[0])
+
+ self.assertEquals(exp, req.copy())
+
+ # Test that a boned from_request() call returns None
+ req = oauth.Request.from_request("GET", url)
+ self.assertEquals(None, req)
+
+ def test_from_token_and_callback(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': "137131200",
+ 'oauth_consumer_key': "0685bd9184jfhq22",
+ 'oauth_signature_method': "HMAC-SHA1",
+ 'oauth_token': "ad180jjd733klru7",
+ 'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
+ }
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ req = oauth.Request.from_token_and_callback(tok)
+ self.assertFalse('oauth_callback' in req)
+ self.assertEquals(req['oauth_token'], tok.key)
+
+ req = oauth.Request.from_token_and_callback(tok, callback=url)
+ self.assertTrue('oauth_callback' in req)
+ self.assertEquals(req['oauth_callback'], url)
+
+ def test_from_consumer_and_token(self):
+ url = "http://sp.example.com/"
+
+ tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
+ tok.set_verifier('this_is_a_test_verifier')
+ con = oauth.Consumer(key="con-test-key", secret="con-test-secret")
+ req = oauth.Request.from_consumer_and_token(con, token=tok,
+ http_method="GET", http_url=url)
+
+ self.assertEquals(req['oauth_token'], tok.key)
+ self.assertEquals(req['oauth_consumer_key'], con.key)
+ self.assertEquals(tok.verifier, req['oauth_verifier'])
+
+class SignatureMethod_Bad(oauth.SignatureMethod):
+ name = "BAD"
+
+ def signing_base(self, request, consumer, token):
+ return ""
+
+ def sign(self, request, consumer, token):
+ return "invalid-signature"
+
+
+class TestServer(unittest.TestCase):
+ def setUp(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': "1.0",
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ self.consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ self.token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = self.token.key
+ params['oauth_consumer_key'] = self.consumer.key
+ self.request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ self.request.sign_request(signature_method, self.consumer, self.token)
+
+ def test_init(self):
+ server = oauth.Server(signature_methods={'HMAC-SHA1' : oauth.SignatureMethod_HMAC_SHA1()})
+ self.assertTrue('HMAC-SHA1' in server.signature_methods)
+ self.assertTrue(isinstance(server.signature_methods['HMAC-SHA1'],
+ oauth.SignatureMethod_HMAC_SHA1))
+
+ server = oauth.Server()
+ self.assertEquals(server.signature_methods, {})
+
+ def test_add_signature_method(self):
+ server = oauth.Server()
+ res = server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+ self.assertTrue(len(res) == 1)
+ self.assertTrue('HMAC-SHA1' in res)
+ self.assertTrue(isinstance(res['HMAC-SHA1'],
+ oauth.SignatureMethod_HMAC_SHA1))
+
+ res = server.add_signature_method(oauth.SignatureMethod_PLAINTEXT())
+ self.assertTrue(len(res) == 2)
+ self.assertTrue('PLAINTEXT' in res)
+ self.assertTrue(isinstance(res['PLAINTEXT'],
+ oauth.SignatureMethod_PLAINTEXT))
+
+ def test_verify_request(self):
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ parameters = server.verify_request(self.request, self.consumer,
+ self.token)
+
+ self.assertTrue('bar' in parameters)
+ self.assertTrue('foo' in parameters)
+ self.assertTrue('multi' in parameters)
+ self.assertEquals(parameters['bar'], 'blerg')
+ self.assertEquals(parameters['foo'], 59)
+ self.assertEquals(parameters['multi'], ['FOO','BAR'])
+
+ def test_build_authenticate_header(self):
+ server = oauth.Server()
+ headers = server.build_authenticate_header('example.com')
+ self.assertTrue('WWW-Authenticate' in headers)
+ self.assertEquals('OAuth realm="example.com"',
+ headers['WWW-Authenticate'])
+
+ def test_no_version(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ self.consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ self.token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = self.token.key
+ params['oauth_consumer_key'] = self.consumer.key
+ self.request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ self.request.sign_request(signature_method, self.consumer, self.token)
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ parameters = server.verify_request(self.request, self.consumer,
+ self.token)
+
+ def test_invalid_version(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': '222.9922',
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['foo','bar'],
+ 'foo': 59
+ }
+
+ consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = token.key
+ params['oauth_consumer_key'] = consumer.key
+ request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ request.sign_request(signature_method, consumer, token)
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ self.assertRaises(oauth.Error, server.verify_request, request, consumer, token)
+
+ def test_invalid_signature_method(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': '1.0',
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = token.key
+ params['oauth_consumer_key'] = consumer.key
+ request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = SignatureMethod_Bad()
+ request.sign_request(signature_method, consumer, token)
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ self.assertRaises(oauth.Error, server.verify_request, request,
+ consumer, token)
+
+ def test_missing_signature(self):
+ url = "http://sp.example.com/"
+
+ params = {
+ 'oauth_version': '1.0',
+ 'oauth_nonce': "4572616e48616d6d65724c61686176",
+ 'oauth_timestamp': int(time.time()),
+ 'bar': 'blerg',
+ 'multi': ['FOO','BAR'],
+ 'foo': 59
+ }
+
+ consumer = oauth.Consumer(key="consumer-key",
+ secret="consumer-secret")
+ token = oauth.Token(key="token-key", secret="token-secret")
+
+ params['oauth_token'] = token.key
+ params['oauth_consumer_key'] = consumer.key
+ request = oauth.Request(method="GET", url=url, parameters=params)
+
+ signature_method = oauth.SignatureMethod_HMAC_SHA1()
+ request.sign_request(signature_method, consumer, token)
+ del request['oauth_signature']
+
+ server = oauth.Server()
+ server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
+
+ self.assertRaises(oauth.MissingSignature, server.verify_request,
+ request, consumer, token)
+
+
+# Request Token: http://oauth-sandbox.sevengoslings.net/request_token
+# Auth: http://oauth-sandbox.sevengoslings.net/authorize
+# Access Token: http://oauth-sandbox.sevengoslings.net/access_token
+# Two-legged: http://oauth-sandbox.sevengoslings.net/two_legged
+# Three-legged: http://oauth-sandbox.sevengoslings.net/three_legged
+# Key: bd37aed57e15df53
+# Secret: 0e9e6413a9ef49510a4f68ed02cd
+class TestClient(unittest.TestCase):
+# oauth_uris = {
+# 'request_token': '/request_token.php',
+# 'access_token': '/access_token.php'
+# }
+
+ oauth_uris = {
+ 'request_token': '/request_token',
+ 'authorize': '/authorize',
+ 'access_token': '/access_token',
+ 'two_legged': '/two_legged',
+ 'three_legged': '/three_legged'
+ }
+
+ consumer_key = 'bd37aed57e15df53'
+ consumer_secret = '0e9e6413a9ef49510a4f68ed02cd'
+ host = 'http://oauth-sandbox.sevengoslings.net'
+
+ def setUp(self):
+ self.consumer = oauth.Consumer(key=self.consumer_key,
+ secret=self.consumer_secret)
+
+ self.body = {
+ 'foo': 'bar',
+ 'bar': 'foo',
+ 'multi': ['FOO','BAR'],
+ 'blah': 599999
+ }
+
+ def _uri(self, type):
+ uri = self.oauth_uris.get(type)
+ if uri is None:
+ raise KeyError("%s is not a valid OAuth URI type." % type)
+
+ return "%s%s" % (self.host, uri)
+
+ def create_simple_multipart_data(self, data):
+ boundary = '---Boundary-%d' % random.randint(1,1000)
+ crlf = '\r\n'
+ items = []
+ for key, value in data.iteritems():
+ items += [
+ '--'+boundary,
+ 'Content-Disposition: form-data; name="%s"'%str(key),
+ '',
+ str(value),
+ ]
+ items += ['', '--'+boundary+'--', '']
+ content_type = 'multipart/form-data; boundary=%s' % boundary
+ return content_type, crlf.join(items)
+
+ def test_init(self):
+ class Blah():
+ pass
+
+ try:
+ client = oauth.Client(Blah())
+ self.fail("Client.__init__() accepted invalid Consumer.")
+ except ValueError:
+ pass
+
+ consumer = oauth.Consumer('token', 'secret')
+ try:
+ client = oauth.Client(consumer, Blah())
+ self.fail("Client.__init__() accepted invalid Token.")
+ except ValueError:
+ pass
+
+ def test_access_token_get(self):
+ """Test getting an access token via GET."""
+ client = oauth.Client(self.consumer, None)
+ resp, content = client.request(self._uri('request_token'), "GET")
+
+ self.assertEquals(int(resp['status']), 200)
+
+ def test_access_token_post(self):
+ """Test getting an access token via POST."""
+ client = oauth.Client(self.consumer, None)
+ resp, content = client.request(self._uri('request_token'), "POST")
+
+ self.assertEquals(int(resp['status']), 200)
+
+ res = dict(parse_qsl(content))
+ self.assertTrue('oauth_token' in res)
+ self.assertTrue('oauth_token_secret' in res)
+
+ def _two_legged(self, method):
+ client = oauth.Client(self.consumer, None)
+
+ return client.request(self._uri('two_legged'), method,
+ body=urllib.urlencode(self.body))
+
+ def test_two_legged_post(self):
+ """A test of a two-legged OAuth POST request."""
+ resp, content = self._two_legged("POST")
+
+ self.assertEquals(int(resp['status']), 200)
+
+ def test_two_legged_get(self):
+ """A test of a two-legged OAuth GET request."""
+ resp, content = self._two_legged("GET")
+ self.assertEquals(int(resp['status']), 200)
+
+ @mock.patch('httplib2.Http.request')
+ def test_multipart_post_does_not_alter_body(self, mockHttpRequest):
+ random_result = random.randint(1,100)
+
+ data = {
+ 'rand-%d'%random.randint(1,100):random.randint(1,100),
+ }
+ content_type, body = self.create_simple_multipart_data(data)
+
+ client = oauth.Client(self.consumer, None)
+ uri = self._uri('two_legged')
+
+ def mockrequest(cl, ur, **kw):
+ self.failUnless(cl is client)
+ self.failUnless(ur is uri)
+ self.failUnlessEqual(frozenset(kw.keys()), frozenset(['method', 'body', 'redirections', 'connection_type', 'headers']))
+ self.failUnlessEqual(kw['body'], body)
+ self.failUnlessEqual(kw['connection_type'], None)
+ self.failUnlessEqual(kw['method'], 'POST')
+ self.failUnlessEqual(kw['redirections'], httplib2.DEFAULT_MAX_REDIRECTS)
+ self.failUnless(isinstance(kw['headers'], dict))
+
+ return random_result
+
+ mockHttpRequest.side_effect = mockrequest
+
+ result = client.request(uri, 'POST', headers={'Content-Type':content_type}, body=body)
+ self.assertEqual(result, random_result)
+
+ @mock.patch('httplib2.Http.request')
+ def test_url_with_query_string(self, mockHttpRequest):
+ uri = 'http://example.com/foo/bar/?show=thundercats&character=snarf'
+ client = oauth.Client(self.consumer, None)
+ random_result = random.randint(1,100)
+
+ def mockrequest(cl, ur, **kw):
+ self.failUnless(cl is client)
+ self.failUnlessEqual(frozenset(kw.keys()), frozenset(['method', 'body', 'redirections', 'connection_type', 'headers']))
+ self.failUnlessEqual(kw['body'], '')
+ self.failUnlessEqual(kw['connection_type'], None)
+ self.failUnlessEqual(kw['method'], 'GET')
+ self.failUnlessEqual(kw['redirections'], httplib2.DEFAULT_MAX_REDIRECTS)
+ self.failUnless(isinstance(kw['headers'], dict))
+
+ req = oauth.Request.from_consumer_and_token(self.consumer, None,
+ http_method='GET', http_url=uri, parameters={})
+ req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), self.consumer, None)
+ expected = parse_qsl(urlparse.urlparse(req.to_url()).query)
+ actual = parse_qsl(urlparse.urlparse(ur).query)
+ self.failUnlessEqual(len(expected), len(actual))
+ actual = dict(actual)
+ for key, value in expected:
+ if key not in ('oauth_signature', 'oauth_nonce', 'oauth_timestamp'):
+ self.failUnlessEqual(actual[key], value)
+
+ return random_result
+
+ mockHttpRequest.side_effect = mockrequest
+
+ client.request(uri, 'GET')
+
+ @mock.patch('httplib2.Http.request')
+ @mock.patch('oauth2.Request.from_consumer_and_token')
+ def test_multiple_values_for_a_key(self, mockReqConstructor, mockHttpRequest):
+ client = oauth.Client(self.consumer, None)
+
+ request = oauth.Request("GET", "http://example.com/fetch.php", parameters={'multi': ['1', '2']})
+ mockReqConstructor.return_value = request
+
+ client.request('http://whatever', 'POST', body='multi=1&multi=2')
+
+ self.failUnlessEqual(mockReqConstructor.call_count, 1)
+ self.failUnlessEqual(mockReqConstructor.call_args[1]['parameters'], {'multi': ['1', '2']})
+
+ self.failUnless('multi=1' in mockHttpRequest.call_args[1]['body'])
+ self.failUnless('multi=2' in mockHttpRequest.call_args[1]['body'])
+
+if __name__ == "__main__":
+ unittest.main()
diff -r 1dbd24575d44 -r e68dbee1f6db Code/read_songID.py
--- a/Code/read_songID.py Tue Aug 04 12:13:47 2015 +0100
+++ b/Code/read_songID.py Tue Aug 11 10:50:36 2015 +0100
@@ -1,23 +1,82 @@
-import csv
+
+
+
+
+
+
+
+
+import time
import pandas as pd
-import itertools
-# Read songIDs from Million Song Dataset songID-trackID mismatches
-with open('/homes/pchilguano/dataset/sid_mismatches.txt', 'rb') as f, open('/homes/pchilguano/dataset/sid_mismatches_songID.txt', 'wb') as out:
- writer = csv.writer(out, delimiter=',')
+# Read songIDs from Million Song Dataset songID-trackID mismatches
+start_time = time.time()
+print 'Reading songID mismatches...'
+filename = '/Users/paulochiliguano/Documents/msc-project/Dataset/\
+sid_mismatches.txt'
+with open(filename, 'rb') as f:
+ mismatches = set()
next = f.readline()
while next != "":
- writer.writerow([next[8:26]])
+ songID = next[8:26]
+ mismatches.add(songID)
#print(next[8:26])
next = f.readline()
-# Read unique songIDs from Taste Profile dataset
-location = r'~/dataset/train_triplets.txt'
-df = pd.read_csv(location, delim_whitespace=True, header=None, names=['user','song','plays'])
+# Delete rows with songIDs mismatches from Taste Profile Subset
+print 'Reading Taste Profile subset...'
+result = pd.DataFrame()
+filename = '/Users/paulochiliguano/Documents/msc-project/Dataset/\
+train_triplets.txt'
+filename_out = '/Users/paulochiliguano/Documents/msc-project/Dataset/\
+train_triplets_wo_mismatches.csv'
+for chunk in pd.read_csv(
+ filename,
+ low_memory=False,
+ delim_whitespace=True,
+ chunksize=20000,
+ names=['user', 'song', 'plays'],
+ header=None):
+ chunk = chunk[~chunk.song.isin(mismatches)]
+ chunk.to_csv(filename_out, mode='a', header=False, index=False)
+ #result = result.append(chunk, ignore_index=True)
+elapsed_time = time.time() - start_time
+print 'Execution time: %.3f seconds' % elapsed_time
+#result.to_pickle('/homes/pchilguano/dataset/train_triplets_wo_mismatch.pkl')
+
+# Select (most active) users with more than 1000 songs played
+start_time = time.time()
+print 'Reading (filtered) Taste Profile subset...'
+df = pd.read_csv(
+ filename_out,
+ delim_whitespace=False,
+ header=None,
+ names=['user','song','plays'])
+print 'Selecting most active users (>= 1000 songs played)...'
+df_active = df.groupby('user').filter(lambda x: len(x) > 1000)
+print 'Reducing Taste Profile subset to 1500 songs...'
+counts = df_active['song'].value_counts().head(1500)
+df_active = df_active.loc[df['song'].isin(counts.index), :]
+df_active.to_pickle('/Users/paulochiliguano/Documents/msc-project/Dataset/\
+CF_dataset.pkl')
+filename = '/Users/paulochiliguano/Documents/msc-project/Dataset/\
+CF_dataset_songID.txt'
+with open(filename, 'wb') as f:
+ for item in counts.index.tolist():
+ f.write("%s\n" % item)
+elapsed_time = time.time() - start_time
+print 'Execution time: %.3f seconds' % elapsed_time
+
+
+'''
+#important
+#df['user'].value_counts().head(50)
+
ddf = df.drop_duplicates(subset = 'song')
ddf.to_csv('/homes/pchilguano/dataset/train_triplets_songID.csv',columns=['song'], header=False, index=False)
-# Delete songIDs mismatches from Taste Profile Dataset
+
+
with open('/homes/pchilguano/dataset/sid_mismatches_songID.txt', 'rb') as input1, open('/homes/pchilguano/dataset/train_triplets_songID.csv', 'rb') as input2, open('/homes/pchilguano/dataset/echonest_songID.txt', 'wb') as myfile:
l1 = list(csv.reader(input1))
chain1 = list(itertools.chain(*l1))
@@ -38,5 +97,4 @@
result = result.append(chunk.pivot(index='user', columns='song', values='plays')
, ignore_index=True)
print (result.shape)
-
-
\ No newline at end of file
+'''
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Dataset/CF_dataset.pkl
Binary file Dataset/CF_dataset.pkl has changed
diff -r 1dbd24575d44 -r e68dbee1f6db Dataset/CF_dataset_songID.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Dataset/CF_dataset_songID.txt Tue Aug 11 10:50:36 2015 +0100
@@ -0,0 +1,1500 @@
+SOZVCRW12A67ADA0B7
+SOEBOWM12AB017F279
+SOPUCYA12A8C13A694
+SOSXLTC12AF72A7F54
+SOQGVCS12AF72A078D
+SOCVTLJ12A6310F0FD
+SONNSYV12A8C146BEC
+SOPXKYD12A6D4FA876
+SORRCNC12A8C13FDA9
+SOBUBLL12A58A795A8
+SOWCKVR12A8C142411
+SOEGIYH12A6D4FC0E3
+SOKLRPJ12A8C13C3FE
+SOPQLBY12A6310E992
+SORVLRC12A8151E078
+SOLRGVL12A8C143BC3
+SOUFTBI12AB0183F65
+SOBIMTY12A6D4F931F
+SONWUZV12AB0180BAD
+SOEOJHS12AB017F3DC
+SOKEYJQ12A6D4F6132
+SONQBUB12A6D4F8ED0
+SOMGIYR12AB0187973
+SOHTKMO12AB01843B0
+SOAKMDU12A8C1346A9
+SOIZLKI12A6D4F7B61
+SOVWADY12AB0189C63
+SOXIIIM12A6D4F66C8
+SOHJOLH12A6310DFE5
+SOPPROJ12AB0184E18
+SOSJDQJ12A8C13D4A9
+SOIWBJU12A6701CBE7
+SOBKLTU12A58A7FB77
+SOKNWRZ12A8C13BF62
+SOPXLWJ12A8C132639
+SOBZFSZ12A8C13F2CA
+SONYKOW12AB01849C9
+SOMMKEW12A58A80F00
+SOFLJQZ12A6D4FADA6
+SOELOOM12AB017DB4C
+SOUSAXA12AF72A73F5
+SOLWRZI12A6D4FC4F0
+SOGVKXX12A67ADA0B8
+SOTEKMT12A67AD954E
+SOAXGDH12A8C13F8A1
+SOAIAAT12A8C145D49
+SODEYDM12A58A77072
+SOYSJUV12A8C139DCE
+SOYMIMI12AB0181E5C
+SOSPXWA12AB0181875
+SOBHNKR12AB0186218
+SOKUECJ12A6D4F6129
+SOTCMDJ12A6D4F8528
+SOUVTSM12AC468F6A7
+SOBOAFP12A8C131F36
+SODEOCO12A6701E922
+SOOFYTN12A6D4F9B35
+SOUGCDK12AC95F075F
+SOPAYPV12AB017DB0C
+SOMZVGZ12A8C140EFF
+SOBAKOT12A67021B3D
+SOPEOGA12AB017B694
+SOBONKR12A58A7A7E0
+SOUNZHU12A8AE47481
+SOPJULC12A6D4F667F
+SOAFTRR12AF72A8D4D
+SOEYDSK12A6D4FC6CE
+SOHVWPV12A8C135C5B
+SOTEFFR12A8C144765
+SOGPBAW12A6D4F9F22
+SODGJKH12AAA8C9487
+SOXQYSC12A6310E908
+SOXFPND12AB017C9D1
+SOTKMXA12A6D4F672F
+SOAVWHY12AB017C6C0
+SOZXEZV12A6D4F737F
+SOMMONH12A6D4F41CD
+SOUOEMP12A8C13866E
+SOKZZGT12A67ADA4C3
+SOFEGST12A58A7D682
+SOWRREB12A6D4FA7CB
+SOFKABN12A8AE476C6
+SOTVLQY12A58A798C2
+SOIXKRK12A8C140BD1
+SOWEJXA12A6701C574
+SOXRKFO12A6310D84B
+SOUXFVB12A8C1416D5
+SORAHAG12AB0182BD0
+SOKKKZW12A6D4F7F88
+SOEHDTU12AF72A8BD5
+SOHFNKO12AB017C772
+SOKVTGU12A6701E7B1
+SOUXNNU12A67020A48
+SOEHZQB12A6702016D
+SOSNOSA12A67ADA05B
+SOMWTWK12AB01860CD
+SOJGSIO12A8C141DBF
+SOQJKGN12A8C1425B5
+SORKFPY12A8AE46AFB
+SOWUZVU12A6D4F914D
+SOFCPOU12A8C13BF40
+SOWPASM12A8C142B88
+SOGTDJQ12A8C13324F
+SOCQSZB12A58A7B71D
+SOBRHVR12A8C133F35
+SOUPMLF12A6701EAFE
+SOZBZFF12A6310F12D
+SOOXRJG12A8C13773E
+SODCNJX12A6D4F93CB
+SOLTIVF12AAFF43797
+SOIBSWV12A6D4F6AB3
+SOKXQDO12AB017FD04
+SOFQWHD12A58A7C5AC
+SOUSMXX12AB0185C24
+SOAUFOF12AB0180C65
+SOBSLVH12A8C131F38
+SOGIEOU12A8C134815
+SOUOPLF12AB017F40F
+SOHHSYJ12AB017F40A
+SOZCWQA12A6701C798
+SOVRTPN12AB0184F9E
+SOIMCDE12A6D4F8383
+SOARUBA12A8C138E3D
+SOQLFRX12A6D4F9200
+SOTORXA12A58A79338
+SOGCBQL12A67ADE302
+SODWUBY12A6D4F8E8A
+SOMDVSL12A6D4F7230
+SORMGEO12A8C14406D
+SOSCDWE12AB01823C4
+SOZZIOH12A67ADE300
+SOLAUOW12A8C13A400
+SOOZFCC12A58A7D783
+SOYDTRQ12AF72A3D61
+SOXBCZH12A67ADAD77
+SODKWYD12A8C13BA04
+SOVHVBJ12A58A7AB0A
+SOMCMKG12A8C1347BF
+SOAJAFJ12A58A7B75A
+SORFVMQ12AB0184135
+SOLFXKT12AB017E3E0
+SOALEQA12A58A77839
+SOCGWCK12A67020F39
+SOUKJBT12A6701C4D6
+SOFRCGW12A81C21EA6
+SODGVGW12AC9075A8D
+SOADJQJ12A8C141D38
+SOYLDJC12A6701E2FF
+SOPGOJB12A8C13B05C
+SOETHKN12AF72A65A6
+SODLAPJ12A8C142002
+SOVCHUK12AB017F41F
+SONCBGG12AB0183F8E
+SOBXHDL12A81C204C0
+SONIQRE12AF72A2B02
+SOTHUUY12A58A79BB8
+SOMLYJD12A58A7B155
+SOOSDMO12A6D4F80F9
+SONQEYS12AF72AABC9
+SONLCTW12A58A7BB70
+SOAMPRJ12A8AE45F38
+SOQGOPT12AAF3B2B27
+SOSGBJB12A6D4FCDEC
+SOMTTXF12A8C1428A9
+SOBEVGM12A67ADBCA7
+SOSELMV12A6D4FCF5A
+SOXLOQG12AF72A2D55
+SOBBCWG12AF72AB9CB
+SOBOUPA12A6D4F81F1
+SOQIXUL12A6D4FAE93
+SOOGNOZ12AAF3B2936
+SOSCIZP12AB0181D2F
+SOPTLQL12AB018D56F
+SOYEQLD12AB017C713
+SOEHHNH12AB017F715
+SOEHMKZ12A58A7DF45
+SOKTJXL12A8C13C90B
+SOPEGMI12AF72AA77F
+SOULTKQ12AB018A183
+SOMYXWV12A8C14232E
+SODJVTF12A8AE46DFD
+SOBGPHU12A8C1424E3
+SORQVPO12AF72A690C
+SOQZBYZ12A6701E7B0
+SOGXGKK12AB0184CD6
+SOCKFVF12A8C1442A7
+SOETMGH12AB01822F2
+SOZOIUU12A67ADFA39
+SOIYHAZ12A6D4F6D30
+SOIIOUS12A8AE47E20
+SODEVXZ12A67020A45
+SOXFXDH12A8C13326E
+SODVSFY12AB017F8ED
+SOLARJV12AB018306B
+SOAAFAC12A67ADF7EB
+SOVWHPM12AB017DABB
+SOUHQHP12AB017FCA7
+SOVQJRY12A81C210C0
+SOXWYZP12AF72A42A6
+SOOWVNN12A8C140775
+SONGIXY12A58A7BB42
+SOQLUTQ12A8AE48037
+SODXTMM12AF729F8F1
+SOKLSGL12AF72A2AF4
+SOUCBEB12A6310E1F9
+SOEWYLX12A6D4F8E5F
+SOXPFLM12A8AE48C50
+SOXCUHM12B0B8092BB
+SOFXJCS12A58A7DF02
+SOKUPAO12AB018D576
+SOCZUBU12A8C1311DD
+SOCKSGZ12A58A7CA4B
+SONQSBF12AF72ABB86
+SOCGXXL12B0B808865
+SOGFFET12A58A7ECA9
+SOLGJYY12A6701C431
+SOLLDVS12AB0183835
+SOTEGWG12AB01897AC
+SOSLZXV12A8C1354C9
+SOITIDA12A6D4FBC7D
+SOSACAB12AB01876E4
+SOPTLTT12A58A7938D
+SOCNAXF12A6D4F9B34
+SOHXBXX12B34F2609B
+SOBBKGF12A8C1311EE
+SOANQFY12AB0183239
+SOGPMUO12A6D4F6D31
+SOJFARO12AF72A709A
+SOPZKGR12A6D4F3F3A
+SOHNVHC12A6D4F95AB
+SOWVNWB12A8C133171
+SOVUAIQ12A6D4FA180
+SOWNIUS12A8C142815
+SOYDTIW12A67ADAFC9
+SOJTLHS12A8C13F633
+SOQTPLM12B0B809575
+SOJCAVK12A8151B805
+SOTDKEJ12AB0187AAA
+SOGPBDO12A6D4F7F85
+SORKVID12A6D4FC6D2
+SOWRTJD12A8C132704
+SOVIKOY12AB018627D
+SOOJJCT12A6310E1C0
+SOTGHQR12A8C1406C5
+SOLMWQA12AF729CCB8
+SOPDRWC12A8C141DDE
+SOQSPDJ12A58A7EC6E
+SOWGIBZ12A8C136A2E
+SOEMUXL12A58A7B848
+SONEYTB12AF72A73F0
+SOTHQRU12A58A78698
+SOPWKOX12A8C139D43
+SOLQNRC12A6D4F7458
+SOAUXEN12A81C23960
+SOCIUSI12AB018DD03
+SOUKXIN12A8C133C7F
+SORGFZZ12AB0181289
+SOHHALP12A6D4FB6A8
+SOQRHIX12A6701F955
+SOZARJQ12A6D4F66CE
+SOWIYOP12A8C140E73
+SOXONIW12A8C1390D8
+SOEHTZE12A6310F0F2
+SOWUKPB12A8C13F320
+SOTNHIP12AB0183131
+SOXZUUK12A6D4F8EE3
+SOIUHFO12A67AD954B
+SOUSZSW12AB01800C2
+SORJUET12A6D4F9591
+SOGJJON12A67AD9554
+SORWPCP12A8C13B9D8
+SONREBX12A8C142DBA
+SOCAHRT12A8C13A1A4
+SOJHVZZ12A58A75BBE
+SOOUNYA12AF72A5397
+SOVIFRY12AB017B114
+SOSLQGG12A6D4F5045
+SOYGHUM12AB018139C
+SOGWKBQ12A670207C1
+SOIYWPZ12A81C204EF
+SOWKLEE12A81C232AC
+SOUFWFG12AC9072C7E
+SOPMQFR12A6701FC26
+SOANUKH12AB0182B83
+SOLPDGD12A6701F951
+SOWHATW12A8C132857
+SOGTXWE12AC4687F2D
+SOOZNZY12A8151B80A
+SOHZPIK12A58A7CCAE
+SOMJJAM12A8C13B607
+SOIFDQD12AB01822F5
+SOJSTYO12A8C13F200
+SOCNCGL127D9786D66
+SOWKUZM12A67AE0D37
+SOWGZIE12A6D4FC6F2
+SOLZEED12A6D4FA8C9
+SOXGIWN12A6310E0D8
+SOWOMMY127F8096DF9
+SOJPCYJ12A81C22380
+SOMWCVL12AF729E81A
+SOZCDWG12A6D4F81E1
+SOFDENQ12AB017FD79
+SONOYIB12A81C1F88C
+SOGDZSB12AB017CC29
+SODCLQR12A67AE110D
+SOINUJV12A8C1429E9
+SODOWUC12AC9097E76
+SOLVLFW12A67020A3F
+SOHNOOC12A8C13BF35
+SOCKJZJ12A8C130C20
+SOTUNOQ12A67ADADA7
+SOAMIQK12A6701D94F
+SOATNYF12AF72A8D48
+SOHOTAA12A8AE45F43
+SOYGKNI12AB0187E6E
+SOODWNJ12AC4688DA4
+SOSUZFA12A8C13C04A
+SOHYRUG12A8C13599D
+SOMDVMS12A6D4FB8C6
+SOGJPMB12A8C13A9DB
+SOFRVNS12A6701D924
+SOXAQJS12AB018CBF7
+SOWYYUQ12A6701D68D
+SODXFAS12A58A7B24B
+SOLLNTU12A6701CFDC
+SOTYLCV12A8C143772
+SOPMWXY12A58A7E908
+SODEAJC12A58A7769F
+SOPLUOT12A6D4F7AC3
+SODABFP12AB01845EC
+SOOXJDU12A8AE47ECB
+SODACBL12A8C13C273
+SOFWNCW12A8151B81A
+SOVNVRF12A8C14477B
+SOPBXPQ12AB01887E2
+SOSVDRD12A67ADAEF1
+SOGPNGN12A8C143969
+SOSQQGF12A6310F0FB
+SOTARUJ12A8C13B0DA
+SOYLLGK12A81C217A1
+SOJDHGS12A6310D85E
+SOSLHMP12A8C1416C1
+SOSYXDE12A8AE45E45
+SOSXPFU12AB017FE27
+SOTWNDJ12A8C143984
+SOKVSAH12A8C133C6D
+SOLVMXY12A8C131E36
+SOZBZSY12A6D4FA404
+SOUYMPF12A58A7C78A
+SOUODFE12A58A80347
+SOGKGLB12A81C22AFA
+SOEDLKD12A8C1381F9
+SOARUPP12AB01842E0
+SOHTQAS12A6701C7BA
+SOSYOHI12A8C144584
+SOVHPUT12A81C22A56
+SOKPECC12A8C144E4A
+SOEJMGM12AF72A6261
+SOWSPUS12AC468BEE3
+SOYSADG12A8AE47F2C
+SOFJOSL12AB0181CA8
+SODTJFU12B0B80C9BE
+SOGAUOB12A58A7AAC8
+SOKUTUM12A6701D9CD
+SOSJRJP12A6D4F826F
+SOMCAFM12A58A7B024
+SOIQUSV12A8C13A402
+SOEBPXF12A8C14295A
+SOAJJDS12A8C13A3FB
+SOOTKWZ12AB0181082
+SOZYSDT12A8C13BFD7
+SOUNJIO12AB0181339
+SOVDYZE12A58A7AA62
+SOYONCL12A8C13B9F7
+SOXVVSM12A8C142224
+SOUKDZN12A6701BEDB
+SOXZMNC12A8C135DD5
+SOXCEYU12A6D4F3E70
+SOEKSGJ12A67AE227E
+SOMEBUD12AB01869CA
+SOMGVYU12A8C1314FF
+SOJITNW12A8C13D951
+SOOSIWM12A670202B9
+SOADISH12AB018DFAC
+SOMKFAH12A6701BEDF
+SOFBTSA12A8151B81E
+SOQJLTG12AAA8C665D
+SOZGINR12A6D4F58E4
+SOHWNCK12A67020845
+SOSVDXO12A8C13EDB9
+SOQJLWB12A6701E7B3
+SOOKZPI12A67AD9549
+SOPOFBW12AB0187196
+SOPMDSY12AF72A0C6F
+SOBBVDC12AB01806C6
+SONEWAX12AB018DD3F
+SOEXMJG12A8C13EC18
+SOODWUO12AB01813C1
+SOWAGYW12A67020A3A
+SOOKGRB12A8C13CD66
+SOGZCOB12A8C14280E
+SOWZAHB12AF72A4B46
+SOVUBST12AB018C9A4
+SOEKVCJ12AB0185E18
+SOFCRRN12A58A78FC6
+SOXILLO12A6310F1B6
+SOKUAGP12A8C133B94
+SOPYNHK12AB017E7D2
+SOYUFEX12AB0182255
+SOVJUYC12AB018079C
+SOPYJJA12AF729BBFD
+SOJHCOH12A8AE45F4F
+SOYELXR12A8C14153A
+SOMORYX12B0B80908A
+SODGTHG12AB017F730
+SOAZZRU12AB0182B0E
+SOGUJGE12AF72A5BC9
+SOGCVPU12AB017CA73
+SOYSPYK12A81C228A0
+SOHXDTJ12A81C219C2
+SOEFNWL12AF729CD2F
+SOBWDHM12A6D4F60C9
+SOSEUUV12A6701E93C
+SOJLEMO12A6701EAF9
+SODRVBA12A58A7F235
+SOEWTBE12A58A7E7C2
+SOBYDAA12A6D4F8847
+SOBTNNG12AF72A73E8
+SOFHIQQ12AB017ACE1
+SOOLULU12A6701FBC4
+SOGIDSA12A8C142829
+SOVSGXX12A58A7F991
+SODNOWW12A8C1450DD
+SOWFIFP12A8C13A9EE
+SONDCOR12A8C13BA16
+SOEPZQS12A8C1436C7
+SOETSTN12A81C219A9
+SORHJAS12AB0187D3F
+SOEBGYH12A81C22B00
+SOAOPCG12AC468D27E
+SOJMUUU12A8C137A4F
+SORWLTW12A670208FA
+SOCAIKQ12A6701E578
+SOHPETF12A8C1311E0
+SOYYIZT12A8C1408CA
+SOQCGHN12AB0181246
+SOCUBFV12AB01810BB
+SOOLKLP12AF729D959
+SOQWYAQ12A6D4FB9A3
+SOQZYQH12A8AE468E5
+SOALPEC12AB0185D8F
+SOIOHLX12A6702162F
+SOKNCNR12A6701FDEC
+SOPWZGK12A67020744
+SOEVYKO12A8C13F31C
+SOVHRGF12A8C13852F
+SOFBOXR12A6310F0FC
+SORPQKU12AB0182340
+SOIZAZL12A6701C53B
+SONGNHO12AB0183915
+SOEOUUQ12AB018182A
+SOOXJZI12A8C141AEA
+SOIBLKQ12AB0183E85
+SONDWXT12A8C13C37F
+SOXLKNJ12A58A7E09A
+SONNPCF12A6701E0A6
+SOCCASN12B0B8069FA
+SODHJHX12A58A7D24C
+SOGCKET12A81C221CF
+SONDUKG12A58A7DA36
+SOTGZIH12A8C1428A5
+SOSGAIT12AB018CC18
+SOCAFDI12A8C13D10E
+SOKJQGO12AF72ACA9F
+SORXQQP12AC960DAB3
+SOTCDXR12A679D7E5E
+SOAXGDY12AB01813B0
+SOULBNJ12AB01851E9
+SOUBXSF12A6701D23C
+SOYMEKY12A6D4F88FE
+SOYQQAC12A6D4FD59E
+SOCBWRP12A8C1311DB
+SOOQIEK12A8C13EA1E
+SOLJHUB12A58A78151
+SOHWVJJ12AB0185F6D
+SONBNVV12A8151B825
+SOZCKAG12AB0182BA1
+SOTXDCY12AF729A39B
+SOWRGEF12A81C228A3
+SOWGXOP12A6701E93A
+SOTLTXQ12AB0182257
+SOZBAAH12A6D4F959F
+SOFGJCW12AF72A812D
+SOAAROC12A6D4FA420
+SOBJBEU12AF729D526
+SOEXMSL12A6BD4F9B3
+SOPCTBB12AF72A1B64
+SOGWXGL12A6D4F41C0
+SOCXCTS12AC468A380
+SOAOOWF12A8C1347EC
+SOUZBUD12A8C13FD8E
+SOOGBWC12A8C140B96
+SOJVPDY12AF72A1B04
+SOYYKLS12A8C134802
+SOUCMUI12AB018C0C6
+SOALERS12A6701E91F
+SODJTHN12AF72A8FCD
+SOMPKTP12A67020A3B
+SOTFIPT12A6701F2FA
+SOYDNQZ12A67020A42
+SOPASVK12AB0180CDB
+SOCHYVZ12A6D4F5908
+SOTWCDE12AB018909C
+SOUCPBK12A58A7881A
+SOBOOXZ12A8C13AF83
+SONPLUD12A8C13BF4B
+SOYIZSN12A6701E0BB
+SOUFPNI12A8C142D19
+SOVWBYM12A6D4F8A22
+SOJUOYC12AB017F6A7
+SOQEDIK12A8AE46BA6
+SOSJSSU12A6D4F8F41
+SOTJQZN12AF72AA288
+SOGMLQO12A670207BF
+SOIMREX12A6D4F99FE
+SOWIMTL12A8C1386DC
+SOWMGHQ12A6D4F914D
+SOOXLND12A6D4FE36E
+SOZHJKI12A81C2248F
+SOASRCN12AB0187549
+SOCSHHV12A8AE45F45
+SOBNOSD12A8C13C4E0
+SOIPYDT12A6701F992
+SODUANR12A6D4F5036
+SOHJSRO12A8C13D385
+SOXGXKY12A8C13A405
+SOSBKKN12A8C1384B4
+SOLDJLX12A6D4F9A78
+SOQGSUC12A8C13B66D
+SOPKPFW12A6D4F84BC
+SOPHBRE12A8C142825
+SOUEGBF12AB017EFD5
+SOTVFIU12AC46878B7
+SOTNCZU12A8C13EDC8
+SOJNNUA12A8AE48C7A
+SOTGKTG12AB0189D2E
+SOESZWS12A6D4F910C
+SOTCSEH12AB01884A2
+SOLFEWX12A8C1442C8
+SOXRFOK12A58A77CD5
+SOCXJFM12A8C13EB1C
+SOBFONC12A8C140932
+SOAETMP12A8C140E7F
+SOZXBIS12A8AE44A2E
+SOQOSMU12A8C138957
+SOLRDEI12A8C13AAA2
+SOHIROU12AB01852AF
+SOPJWVJ12A6D4FA182
+SOSTWFY12AB01828AF
+SOPFFBU12A6D4FA7D2
+SOFWUWJ12A6D4F991E
+SOMXKNW12A8C141932
+SOEBYTE12A8C14389C
+SOMZGNN12A8C13F32C
+SOQEXLO12A58A79D0E
+SODWETS12AF729C56F
+SODSESK12A81C2178C
+SOGSAYQ12AB018BA14
+SOVFNKP12A81C2177F
+SOCXGVX12A67AD85A1
+SOQGXVR12B0B80C04E
+SOLRTCP12A8C13B5F5
+SOOXLWT12AF729D9ED
+SOEAJTP12A6310D999
+SOAUBGU12A6701C57A
+SOVRGXP12AB017D2B9
+SOXPDDQ12A58A76829
+SOSRIHB12A8C13608B
+SONRRQH12AC3DFA45F
+SOQTFOI12AB0185675
+SOEMAIM12AC90759AC
+SOMMLDP12A8C13BA46
+SOGJDOV12A6310E91B
+SOMUWFQ12AB0184608
+SOOEXHQ12AB0182BC5
+SOXXVSU12A8C133445
+SODEMCU12A8C13ECCE
+SOCNKUW12A8C13DE89
+SOBCOWD12A6701FD78
+SOYEWFR12AB0189AB6
+SOKEUYU12A67ADF7E6
+SOHXKKN12A8151DCDF
+SOUKTVI12A8C13BF74
+SOMQTAK12AB0183C3E
+SOBNJZN12A67ADE984
+SORGRVL12A6310F105
+SOCKJVP12A6D4F920C
+SODUGQV12AF72A6803
+SOGDQWF12A67AD954F
+SOVZHYS12A8C14663F
+SOMNPAP12A8C1385D6
+SOWEWRL12A58A7961F
+SOSINBC12A67ADAEF6
+SOTQMGD12A81C2289C
+SORJICW12A8C13640D
+SOTDIAP12A8C136478
+SOSFSWB12AB018C99A
+SOQIQZU12A6D4FB8B5
+SOBDGQD12A58A7C5DF
+SODLUPC12A6701ED60
+SOJQKCE12A67020846
+SOCGMXY12A6701E069
+SOMHMQW12A8C14098B
+SOGZSQJ12AB01841FC
+SOMJWPP12A6D4F8506
+SOHFFVC12AB0184DDB
+SOHBFUU12A6D4F9DD8
+SOQDTEU12A6701EADA
+SOWDRRZ12A8C13AE89
+SOTWSXL12A8C143349
+SOSJBVE12A6D4F894A
+SOZGDUH12AF72A6DB2
+SOYEMQG12A6D4F7826
+SOINDRZ12A6701DAF6
+SONHVVE12AB018D038
+SOPCRCE12A6D4FAB47
+SOXZCIH12A8C1425F0
+SONQCXC12A6D4F6A37
+SOWSSRH12A58A7CE5D
+SOWFGLJ12A58291695
+SOWSWBS12A6D4F658A
+SOXDEDR12A8AE452CC
+SONGPKC12A8C13ABD9
+SOCBNIS12AF72AB9D3
+SOYVSHP12A6702016E
+SOTOKSY12AB017E7FE
+SOXGQEM12AB0181D35
+SOXNOYN12A6D4FB4B4
+SODOBMN12A6D4F9CBF
+SOCZVSX12A6D4F5033
+SOHYHMJ12A6D4F615E
+SOEHTDA12A8C13B1D3
+SOZSZTY12A8C13B693
+SOTVQBZ12A8C13B0E7
+SOKJILN12AB0182BC9
+SOCSHFI12A8C13F324
+SODMBJL12A8C13EB1A
+SOZMINK12AF72AAC26
+SOCPMIK12A6701E96D
+SOAGFFD12AC909761F
+SOWKVVW12A8AE45E8C
+SOSUWJE12AB0184567
+SOCMRWF12AB018AC92
+SOIMEAQ12AB0181F28
+SOXKFRI12A8C137A5F
+SOMCWAZ12A67ADBCE3
+SOCJCVE12A8C13CDDB
+SOVIIOV12A67020315
+SOKBSRE12A6701D937
+SOWOZBR12A8C13F4F6
+SOVLJHG12A81C21AA0
+SOGKGDF12AF72A5DD6
+SOKYHYL12A8C13D79D
+SONCZXW12A8C13A28A
+SONIMNU12B0B8092AB
+SOAXJOU12A6D4F6685
+SOAXEPS12AF729E550
+SOLLMBX12A8C13DC2D
+SOBPLGR12A6D4F82BE
+SONJQAH12A8C13C2FF
+SOBVKFF12A8C137A79
+SOGLBDH12AB018847B
+SOOJAQM12A8C1400F9
+SOVYMPX12A8C1359B7
+SOMXDFJ12AB0183B34
+SOYXHRY12A6701C877
+SOEVOXS12A8C1398CE
+SOILFUU12AB017C75F
+SOTVSBY12A6D4F74D8
+SOGNKVE12A8C13E9EE
+SONOZVC12A8C146161
+SONUWKO12A67020A3E
+SOYRJTL12A67AD9551
+SOXERNH12A67AD8642
+SOZIBZP12A6701C434
+SOPVQLJ12A67AE2281
+SOXJLLK12A8C139E3D
+SOAPIHX12AB0184CB1
+SOUNSQC12AC9071827
+SOLJWHN12AB017ACCE
+SOQISNQ12A8AE45F4C
+SOAQTNT12A6701F957
+SOGUUQH12A8C1427D6
+SOCKZIS12A8AE47FE0
+SORYCIK12AB018535E
+SOFNYFB12AB0183A73
+SOUFNSM12A58A77715
+SOIROON12A6701E0B8
+SOZAPQT12A8C142821
+SOFTWWH12AB017AD0E
+SOQQGBB12A6D4FCE33
+SOUEKFN12A8C13C509
+SORALYQ12A8151BA99
+SONYMUZ12A8C139350
+SOQIHFL12A58A79480
+SOCBNYL12A8C13404D
+SOCHYDE12A8C13E438
+SOIFPJU12A8C136FC6
+SOWCBKV12AC90732A6
+SOXBZEQ12A8C14307F
+SOEENHE12A8C13CA68
+SORKLNO12A6D4F70D7
+SOTBBMP12A58A79A48
+SOQLFVE12AB017E74E
+SOGNFOD12A6D4F8584
+SOHEMBB12A6701E907
+SONPBEY12A67ADD330
+SOMMATZ12AF72A17CC
+SOFYGGN12AB0183416
+SOEYVHS12AB0181D31
+SOYLZZB12A67AD9791
+SOHOCMM12AB01845E0
+SOSRCCU12A67ADA089
+SOBJOSC12A8C137A74
+SOMEUED12A6701DBEA
+SOTRSFZ12A8C142BF6
+SOXHIDK12A58A7CFB3
+SOGHVDP12A8C130C19
+SOFQFWN12A58A7A84E
+SOIPFGR12B0B8063CB
+SOKZCKU12AB017E289
+SOWKKGX12A6D4FCC01
+SOIMRLG12A6D4F5031
+SOJQCAO12AB0183B8A
+SOGZHXG12AF72A0EE8
+SOQIOXQ12AAF3B2A37
+SOQAEHC12A67020A41
+SOYTDPP12A6BD4F990
+SOJYRWX12AF729D9FD
+SODCNEE12A6310E037
+SOBJCFV12A8AE469EE
+SOLLOWH12A3F1E9FB5
+SOVYNVS12AC3DF64AB
+SOURBIU12AC3DF683C
+SOFKEDR12A8C13D381
+SOXSMGP12A6310DFA6
+SOQRKAO12A67ADA1C6
+SOPGBMT12A8C142E7F
+SOBGLBX12A8C13AE8E
+SOWKYIJ12AB017B0AA
+SOPAETP12A8C131E3B
+SOWUTFF12A8C138AB2
+SORDPFI12AF72A5B0E
+SODRUCE12A8C141123
+SOXPZEZ12A8AE48AC9
+SONJNEQ12A6D4F9EB6
+SOXSURP12A58A7BE92
+SONMKLO12AB017B593
+SOAGIAY12AB0183D8F
+SOMJFPG12A58A7DD95
+SOSBYAJ12A679AE5CD
+SOSZJFV12AB01878CB
+SOJJBVA12A58A78A79
+SOCHXEH12A8C1425D2
+SOPAOQL12A6D4F9EC2
+SOJERWB12A8C13E654
+SOZJPMJ12A6701E089
+SOTQUOJ12A8C13A203
+SOKUIUK12A8C13F7F0
+SOEWNJA12A67AE110B
+SODJDHK12AB0181540
+SOUABXY12A8C133A3F
+SOWFRJS12A6701D93B
+SOINKVP12A8C13BF5D
+SOLOFYI12A8C145F8D
+SONZWDK12A6701F62B
+SOCBMFC12A6701D7BA
+SOQMRTC12A8C13B091
+SOEGOAB12A8C13BAE4
+SOHYWRK12A8C13D117
+SOLIXJW12A58A79D02
+SOUOECO12A6D4F5C6F
+SOTHRRH12A8C13DCBA
+SOTLSTC12A8C142B6B
+SOPEOQF12A67ADA074
+SOEQCMA12AB01891C5
+SOSUUQF12A6D4F8B2A
+SOXQROF12AB0186B1D
+SOJAMUV12A58A7AB78
+SOCVMXL12A6D4F6EE7
+SOGIWKD12AB018640B
+SOBBGTM12A6D4F6199
+SOBJIZY12A6701F11A
+SODEHVU12AB017FCD1
+SOHHMIE12A670209D6
+SOFVOQL12A6D4F7456
+SOCWRMC12A58A7AFE5
+SOCUARC12A6701E94D
+SOPXBSU12AB018917D
+SODQBES12AAFF4444C
+SOEYIND12A6310E02E
+SOAOSNO12A6D4FA76F
+SOIVPRW12A6310F237
+SORVBEQ12A8C133D6B
+SOXEUDZ12A8C13145B
+SONMEPF12A6D4F3C92
+SOUXBNY12A8C13BADB
+SOMJFXX12A8C13E9F1
+SOHKJWA12A67AD8700
+SOOAALH12A8C13C51A
+SOXLSBV12AB018397A
+SOKLQRE12A58A7BB97
+SOFWJHD12AB018392B
+SOQWYUA12A81C217E6
+SOLWZVR12AB01849C6
+SOPXWLG12A8C13E75D
+SOSFZBK12A8C137A1E
+SOOBDDB12A58A7C99B
+SOYJJRX12A8C137A0F
+SOICNON12A8C140437
+SOGVEYM12A8C13C0ED
+SOUKPBU12A8C140E2E
+SOBGMYK12A6D4F6730
+SOOURJG12A8C13A9F3
+SOFPZIX12A6701CFAD
+SONIJFN12A6D4F7A7A
+SOFZOTX12A67ADF6DB
+SOHORHW12A8C139E45
+SOTZRNJ12A67AD8640
+SOCZQUU12AB018CFEE
+SOESVAM12A8C138BF2
+SOKHYXV12A6D4F676A
+SOBBHVN12A6702162D
+SOVIGZG12A6D4FB188
+SOOVSUC12A8C13ED09
+SOBTXJE12A6D4FA416
+SODZJCH12A8C132ADC
+SOLDFMB12AB017B5A2
+SOASTSF12A8C1420B5
+SORKMCT12A8C136ED7
+SOJEGJX12AF72A2919
+SORZSTP12A8C133573
+SOSQUZL12A67ADAFCB
+SOMTWFZ12AB0184E46
+SOUGAYN12A6D4F6E90
+SOARXRU12A8C134ABB
+SOYOKCE12A58A79862
+SOLFTVV12A6BD54FFC
+SOYQLII12A8C143321
+SOUANJU12A8C14278B
+SODSAHJ12A6D4F8A26
+SOOBEOM12A58A78166
+SOGVJCW12A6D4F8EFD
+SOKOXWU12AF72AD1BC
+SOTHABI12A58A7DACB
+SOKXDOB12AB017EFE7
+SODEKWG12A8C134DC1
+SOKFDWP12A8C1362CC
+SOTJCZJ12A58A7E54B
+SOTHRKJ12A6701C2D8
+SOGLWGG12A6D4F8046
+SOKRDBG12A81C2179B
+SOGWJEY12AC9618862
+SOIZRER12A8C137A26
+SOJLJQK12A6D4FC6E9
+SOZOWON12A67ADA091
+SOVPAJA12A58A77B15
+SORJVDO12AF72A1970
+SOXCZGH12A8C13C4FE
+SONAEJC12A8AE45BB4
+SOFKEIK12A6310D86A
+SODAGSR12AB01855DF
+SOKYDWK12A6D4F623F
+SOTVZIB12A6D4F694A
+SORKDWS12A6701E6D9
+SOOGBTU12AB0187CB9
+SOATJMN12AB0184D1E
+SOQTYPY12A8C13F642
+SOZJHUF12A8C13E642
+SOZIMYM12A8C13C707
+SODLCIU12A8AE45F1D
+SOLWRQM12AB0184C86
+SOMJLKL12AF72A4508
+SOYGPCH12A8151BD66
+SORVKCB12AB0188D90
+SOKBPDK12A6D4FB679
+SOKTJMZ12AB018C9A0
+SOTMMSE12A8C1410FF
+SOGGMMV12AB0184AEB
+SOWQJUV12A6701FA45
+SODILEO12A8C13BC53
+SOZVVRE12A8C143150
+SOJZDMW12A8151E092
+SOXMARU12AB017CDF7
+SOLLVFE12A6D4F9793
+SODLOYF12AB017BBCD
+SOQTFOR12A6D4F612A
+SOMSTHJ12A6D4F93DA
+SOYKNUX12A58A7B1C6
+SOZDGEW12A8C13E748
+SOFMWSD12A8C13CE54
+SOVHBUI12AB0184DEB
+SOLZHLL12A6310D85C
+SORGIAF12A81C224C2
+SOEQJBS12A8AE475A4
+SOZSILE12AB01885B7
+SOCDNMP12AB018440C
+SOMVPBQ12A58A7835F
+SOHPICJ12A6D4F6BD0
+SOUVDUK12A8AE489A3
+SONIEQI12AF72A9822
+SOHHJYE12A8AE47599
+SOGHJWA12A6D4FC6D7
+SORBCRG12A6D4F8440
+SOLVFKS12A58A778DE
+SOKBIIQ12AB017FEFC
+SOFKTPP12A8C1385CA
+SOYWRZU12A6D4F66C2
+SOBYZRW12A58A7ABF1
+SOZKDMB12B0B80C4AC
+SOHSHMS12A8C13BF58
+SODEAWL12AB0187032
+SOSEKZA12A8C13FF24
+SOWFHCO12AB0189063
+SOGVQTZ12A6D4FB490
+SOWBYZF12A6D4F9424
+SOWEWCO12A8C14074E
+SOUGMXP12AB017C76C
+SONYMUG12A8C136FE5
+SOYWTUB12A8C13B429
+SOYIBFQ12A6701C628
+SOMLSMH12A6310DF24
+SOCELEG12AF72A7052
+SOLJQPF12A67020924
+SODWZZQ12A6D4FA7B7
+SOSTVOA12A8C14261D
+SOXDFVJ12A6D4FD18A
+SOYWHPF12AB0181039
+SOYCQJH12A8C138CF6
+SOOYDAZ12A58A7AE08
+SOEHWGF12A6D4F8B2B
+SOXUYUZ12A8C13A67E
+SOFJAJP12AB0181E62
+SORBAJD12AF72A78C4
+SOWRMTT12A8C137064
+SOPBGKX12A8C13D97B
+SOBEAHS12A6D4F97A6
+SOHXQWR12AF72AB9CD
+SOCHSYC12AB017B5B9
+SOKASXK12AB0184343
+SOTDIMP12AB01821E8
+SOUUPZA12A8C136429
+SOOVANF12A6D4FA500
+SOQVJTK12AC9E16E56
+SOBEVXQ12A8C13AE57
+SOTSPVI12A6D4FA446
+SOLSCUX12A8C13D10B
+SOKOHLQ12AF729B221
+SOSLCRU12A6701DB0B
+SOBKTKO12AB01857FD
+SOCQNII12A6D4FD0EF
+SOGHOJB12A6D4FA7DC
+SOPGCXT12A8C138AD1
+SOTMTTY12A6D4F95A1
+SOMYFOB12AAA15FD4F
+SOERTOA12A81C204F3
+SONAISQ12A81C2236D
+SOREPNQ12A58A7B49E
+SOUYXNU12A8C135590
+SOGMNFC12AF72A4FB1
+SOKBOOY12A58A7BE8C
+SOYQKPA12A8C13F31A
+SOFPEZR12A67021B80
+SOJAAYY12A8C13E631
+SOKWOKS12A58A7BF56
+SOGUPIJ12A8C13AEA1
+SOIITXW12A8C142B66
+SOSZAST12A6D4F6245
+SOZPPYS12898B694CE
+SOBFRNE12A6D4F7995
+SOXTBGF12A6D4FB49C
+SOWNZVL12B0B80670A
+SONGIPI12A8AE46162
+SOVEMJL12A8C13B645
+SOSDTGC12AF72A2BC3
+SOYYCTP12AB017E29C
+SOIKTWI12AB017DB72
+SONUWMR12AF72A374B
+SOCJWZY12A67021D18
+SOPKEIV12AB018220D
+SOFROGM12A8C136F19
+SOPGYCQ12A6D4FB4DC
+SOLOZRE12A8C133256
+SOWEHOM12A6BD4E09E
+SOHWMES12A67AE0D06
+SORTPHZ12A8C13D374
+SOFTTQV12A58A7CD57
+SOGJLEH12A8C13EA19
+SOHZPYD12AF72A12E2
+SOONVAG12A8C145227
+SOYFRVX12AAF3B3F3E
+SOATQOD12A8159E8A6
+SODWVWI12A81C21791
+SOPRVKW12A6D4FD57B
+SOJQOIK12AF72A0AAF
+SOAMNJX12A679D8AF1
+SOIAXDW12A6D4F9466
+SOLGPOU12A58A7EA20
+SOGDKEK12AF72A193B
+SOLMAIK12A8C13F7B5
+SONMEBQ12A8C14177F
+SOFCIQA12A58A7EAE7
+SOVGAEE12A8C14210A
+SOGHPTS12A8C1313E5
+SOFSTEG12AF72A02A4
+SOMSLQP12A8C14135B
+SODIDUA12A6D4F8707
+SONSYTN12A67020962
+SOERVER12A58A7DE48
+SOWBPNX12A8C13465B
+SOAYATB12A6701FD50
+SOSDPYF12AB017FE44
+SOHYSXA12AB0186704
+SONOYTE12A6D4F8697
+SOGOSHO12AB0184D38
+SOZEWZS12AB018FAF1
+SOCBGZW12A58A7CAC2
+SOYCQFR12A6D4F8EEA
+SOPGPTD12A6310E032
+SOPGMKX12AB0182B4C
+SOIUVYE12A6D4FA66E
+SOCXQJM12A8C132098
+SOEFSXD12AF72ACED4
+SONWGOD12A8C13D36E
+SORFRGW12A8C13EB13
+SOGZQHS12A8C137A12
+SOAVFLR12A8C138576
+SOQDMED12A67ADE731
+SOVIUZY12AF72AB1D2
+SOSLKVW12A6D4F7ACB
+SOXDMAC12AB017E7FF
+SOVTJHU12A6D4FB15E
+SOAGGLN12AB018AC9B
+SOCEWVG12A8C13DCC2
+SOSJIOV12A8C141AA1
+SOAUNAX12AB01876D0
+SODOLRB12A8AE47628
+SOGPWVK12A58A7B419
+SONKYVR12B0B80AF82
+SOWBTMO12A6701C56D
+SOFAFXU12A8C141523
+SONCELS12A58A7D2A7
+SOMVEVM12AB01855C6
+SOMNGMO12A6702187E
+SOXAIMS12A8C137E90
+SOOBGSW12A6D4F9D51
+SOALITF12A6310DFCD
+SOADOVQ12AB01797EB
+SOMXPHT12AB0182BE7
+SOXDIDW12B0B80954B
+SOQBPJS12A67ADA077
+SOYLKVN12A6D4F7CCA
+SOFTTSD12A81C219CC
+SOAFQGA12A8C1367FA
+SOMUOZR12A63110840
+SOYFQVR12AB018ACA5
+SOPCCWV12A670205F3
+SOMLMKI12A81C204BC
+SOVVCON12A6D4F775F
+SOFCSUT12A8C138EDD
+SOLASAK12A58A7DB32
+SORVEKH12A6D4F6CF2
+SOKTHPP12A8AE47F2A
+SOVRIZO12AF72A4C0C
+SOKSQLW12A8C133858
+SOPNOHB12AB0186834
+SOPUDMQ12A6D4FE9EB
+SOLGLUC12AB018A8FA
+SOHFVJR12AF72A9805
+SOPIQZP12A670201C7
+SOKKUJN12A63110824
+SOOPOWN12A6310E2A3
+SOKMNVE12A8C13BA72
+SOQPBQQ12A6701D1D8
+SOYWVJX12A8C13EDA9
+SOCRNTA12A8C13CCB6
+SOHWFUW12A8C13ECCA
+SOPAEYW12A58A7DBFE
+SOQYLUM12A58A7CB55
+SOUWEJS12AB01868A4
+SONUYPZ12AC46899E2
+SOMKHKP12A6D4F8BA7
+SOPOCCO12A58A7ADED
+SOACGVR12A8C13B60A
+SOYIWVC12A8AE47F31
+SOJVSVP12A8C13C0DE
+SOCKYCG12A58A78E37
+SOWSADH12A6D4F3C8F
+SOVPBLT12A6D4F5113
+SONJJXC12A6701D7BD
+SOQXNGV12A6701E312
+SOODSPH12AB01819C3
+SOLPFNY12A8C134C25
+SOXUMBC12AB018DA2B
+SOCHAXM12AB01876F8
+SOGTQNI12AB0184A5C
+SOHKKFX12A58A7975B
+SOQAQYN12A58A7B08D
+SOMRPMY12AF72A1025
+SOWQBBT12AC4686122
+SOHQRUK12A6701F9AD
+SOJEVHC12A8C13C3E5
+SOFAMRP12AF72A069E
+SOFKYDZ12AB017F425
+SOJDPNR12A8C13C7AE
+SOPRCPH12A6D4F71AF
+SOMZRXL12A81C224B9
+SOXTYBL12AB01887BB
+SOJPFPR12AB018109D
+SOVUOOE12A6D4F86A3
+SOHSXAV12A67ADF7E7
+SOXMGUX12A8C136EBC
+SOVGWOO12A5891F805
+SOJMUAN12AB0183911
+SORPVUD12A67020454
+SOFRNOJ12AB018839A
+SODOWQF12A81C2371B
+SOFFXKH12AB0186D38
+SOGYLTC12A8C14111E
+SOFFWND12A58A796B7
+SOZSFWF12A6D4F93D5
+SOAJFTU12A6701E0A3
+SOPIJAI12AB01838F8
+SOCLANN12AC907598C
+SOOZZGS12A6D4FBDF8
+SONWZJC12AB018B68D
+SOLIFTZ12AB017AFED
+SOPHRXX12A67ADA08E
+SOXGQCN12A8C1384FA
+SOAWIDW12A81C22AEB
+SONEYYW12AF72A2AA6
+SOVOFJP12AB0185555
+SOOFCHQ12AF729FF21
+SOWQMMX12AB017DBE2
+SOJJLYN12A6D4FB160
+SOHQWZJ12AB01892EC
+SOBIWNU12A6BD56C1E
+SOETQJP12A6D4F6731
+SONFNJO12A8C136FD2
+SOODHLO12AF72A1980
+SOUAOQU12A81C1FFCC
+SOEBWPL12A6310D958
+SOAMHNB12A6D4F8E9F
+SOAMDXO12A8C131E2F
+SOUJVIT12A8C1451C1
+SOWOBQK12A8C13A5F0
+SOQULVK12A6701E7A0
+SOJNFQR12A8C13F5E9
+SOXTSFL12A81C217DD
+SOLECUR12A58A7CB58
+SOCTOZW12A8C13AE90
+SOBPFAB12A8C140A2C
+SOQFEDG12AB018DD24
+SOKMHKY12AF72AB079
+SOIYNJG12AB01810B2
+SOOEQSA12AF729BE63
+SOMMUEI12A8C136462
+SOAYSMC12A67020927
+SOOANGH12A67AE0D11
+SOJKAGI12AC468D4D1
+SOJUBSU12AF729FEC1
+SOOISOS12A6701E086
+SOZPLKR12A6D4F8421
+SODTQFE12A8C133B0B
+SOVEHBY12A8C13F32E
+SOMYAYY12A8C13E667
+SOGRWVE12A8AE488B1
+SOWDKXZ12A81C22377
+SOINIUZ12A67ADF6D8
+SOAJXWO12A8C1436D0
+SOMVAGR12A67AE1114
+SORALMO12AF729EBB4
+SOLKOOO12AB018794A
+SOHAHTQ12AB017AA32
+SOKVADK12A8C1359C6
+SOVSCKX12A8C13D3E1
+SOKQTHF12B0B80B306
+SOPUNVR12A6D4FB09C
+SOBZCTQ12AB0183220
+SOYIYFF12A6701D22F
+SOBDVAK12AC90759A2
+SOMACPC12AF729DB65
+SOTIJLA12A6701C536
+SOBGDOL12A6D4F6F21
+SOTRBHF12A8C142F20
+SOWVBDQ12A8C13503D
+SOJYOJZ12A6D4F97BE
+SORVYTS12A6D4F77D5
+SOVDSJC12A58A7A271
+SOBADEB12AB018275F
+SOJGLYJ12A8C1345F6
+SOGACXN12AB0188245
+SOPEVJE12A67ADE837
+SOGEZGA12A6D4F74F6
+SOSUBHV12AF72A4220
+SOCQXPE12A58A7A964
+SONIFRR12A8AE46079
+SOJIDVJ12AF729C7C4
+SOLHEHV12A8C13ECB2
+SOHUXJQ12AF729F8FE
+SOXZUAV12A6310F21A
+SOIMTFP12AC907599E
+SOOJWBH12A6D4F64E3
+SOHFJAQ12AB017E4AF
+SOMBLEM12A8C13C4F6
+SOZXTUT12A6D4F6D03
+SOANSPC12A6702154A
+SOSNEEJ12A6D4FA429
+SOGAUIQ12A6D4F8262
+SONKHQE12A58A7C8AD
+SOHQIBR12A6310E0ED
+SOTIVDJ12AF72A9442
+SOPUUQJ12AF72A5748
+SOHDQMI12A6D4F9A77
+SOPLUBC12A8C142B6D
+SOMGPML12A8C13AE8C
+SODMSPG12A6D4F6B0E
+SOJKAWG12A81C21781
+SOMUEZH12A6D4F66C6
+SOQJAZE12A6D4F95A8
+SOWBNGK12A8C143932
+SOHLLRP12A6701F2F4
+SOFSETB12A8C134038
+SOJEMSC12A6D4F81A6
+SOKDUUY12B0B80BD37
+SOTIHYU12AB0182C2A
+SOYTDBL12A6D4F8148
+SOGISVQ12A8C13AE9B
+SOORUQV12A67020A4C
+SOVTLQW12AB0186641
+SOGEFOF12A81C2235D
+SOKHPOV12A8C13D641
+SOZKLMU12A8AE4714C
+SOVJHCB12A8AE4636E
+SOKQMOW12A6701DEFC
+SOKLADX12A8C13AA37
+SOIDFMK12A8C14616C
+SOOPXFG12A6D4FB80C
+SOYVUDI12A81C22872
+SORFSKT12A8C1430A0
+SOOXVHJ12AB017C566
+SOVIZNF12AF72A710A
+SOHODOM12A6D4FD028
+SOKOTYF12A8C13F2E7
+SOMVUAM12A8C14416D
+SOJOVEU12A8C140C34
+SONEWOI12AAF3B3602
+SOZJWDN12A8151B851
+SOIDDNJ12AC9071B90
+SOYSZFQ12A58A7C2DD
+SORPWOM12A6D4F7971
+SOTSUPP12A6D4FB9AD
+SOWOAXK12A6310D81F
+SOFSIKY12AF72A0807
+SOCFPBP12AB0182D2B
+SOPUGAT12A58A78F65
+SOMPBQG12AC3DF6169
+SOLMIUU12A58A79C99
+SOHNGUW12A81C22370
+SOGCCBF12AB0188DEE
+SOJZSUP12A6D4F73E1
+SOCFYUZ12AF729E4B6
+SOGEOIU12A6D4F9DC6
+SOTFGVC12A6D4F8A32
+SOSXTNT12A58A809DC
+SOKWQAS12AF72A2686
+SOCWMMA12AB018157B
+SOAAAGQ12A8C1420C8
+SOQQQQR12A6D4F654D
+SOFVUOC12A6310F9A0
+SOTASGN12AC9075A8F
+SOWGDDU12AF72A03DA
+SOFZRXA12AC960DAB5
+SOIICEQ12A6D4F7FE0
+SOWBFBP12A58A7D6EA
+SOFWBSS12A8C136313
+SOSNESF12A8C143097
+SOHZDYL12A8C141C73
+SOMTGKH12AB0180394
+SOOROCA12AF72A07D1
+SOZQRSR12A6701E2F7
+SOAOERV12AF72A48FC
+SOVJTTZ12AB017F48F
+SONKFWL12A6D4F93FE
+SOHDSVJ12A6D4F93FF
+SOFFWDQ12A8C13B433
+SOMZMOQ12A8C13A687
+SOIJPQV12A6701F959
+SOCZDGH12A6D4FAABA
+SOBNPFN12A8C142E6F
+SOCCDAW12A8C133D56
+SOLDJQS12A8C140B19
+SOJIVRN12A8C143041
+SODNKEP12A8C134E4C
+SONFCUC12A58A7BC34
+SOOTKBQ12AC3DFA4A2
+SONVCEJ12AB017B5A9
+SOKDFZW12AC9072C8C
+SOKVYTI12A8C13B5DC
+SOOGZYY12A6701D9CB
+SOGUKDL12A6D4FAAB9
+SOSJZPO12A8C13AA82
+SOPXSEP12A67ADE986
+SODMUPG12A67021CC7
+SOPXSYV12A8C13AAA8
+SOGPGBV12A6701EEE5
+SOBSGZI12A8C13F8DF
+SOABGQW12AB017CFB2
+SOGKIWV12A6D4F86C4
+SOBRREA12A6701C403
+SOHOWRD12AB018FBF5
+SOXDJEK12A8C13D248
+SOEPWPM12AC468611C
+SOZPQES12A6D4F8E57
+SOVBQGQ12AF72A9803
+SORKPVE12A81C20227
+SOJZEXX12A6D4F6247
+SOQUJLT12A8C141F8A
+SOKFNBL12AF72A1A41
+SOALBSB12A58A814C0
+SOHNDWU12A8C13F487
+SOQEMXA12A8C13F962
+SOGJMTM12A6310E17B
+SOYMQKD12A6310D7EB
+SOVVRDZ12A6701C577
+SOYVMAW12A8C141CBB
+SONQBQO12A8C137642
+SOYIEGB12A6D4F8C07
+SOMRTUH12AB0185650
+SOAVCHX12A6D4FA7B6
+SOITFPA12A670201C6
+SONSJVQ12AB01841B3
+SOHKWKV12A58A78917
+SOWEBRA12A6701F115
+SOTJRSO12AB0182AE4
+SOPMKMD12A67020BD9
+SOXELPB12A8AE46000
+SOQNRFZ12AB017F899
+SOISNSU12AC468C0D8
+SOUGLIK12A8C143DF4
+SOBUXNB12AB0182BF3
+SOMCPUY12A81C2399A
+SOGFRJT12A8AE490A9
+SOXVIYQ12A6D4F8C9C
+SOOOJYW12A58A7B82B
+SODRLEQ12A6701F953
+SOIOESO12A6D4F621D
+SOVMOCU12A8C140E82
+SOIDAAV12AB0182D50
+SOLEWHB12AB01831B3
+SOUYPYF12A58A76897
+SOWGCMN12A8C136E44
+SOFGIVB12A6D4F5923
+SONTNHB12A8C1391D6
+SOJMJMS12AB018566E
+SOWQTQZ12A58A7B63E
+SOASOOD12A8C13EE86
+SODBDBV12A6310E14A
+SOMAUYZ12A8C135979
+SORBBBO12A67AE111A
+SONFEUF12AAF3B47E3
+SOBYSRH12A8C13AE98
+SOITMVX12AF72A089F
+SOGFKJE12A8C138D6A
+SOKDCMZ12A58A7804A
+SOLKDYK12AB018DA3C
+SOINDXC12A6D4F8C3C
+SOGJMJH12A6702154D
+SOQWSHS12A6701C576
+SOIPYPB12A8C1360D4
+SOVCUAX12AB017EFB5
+SODNNHQ12A67ADBAB8
+SOBGNMG12A8C133DFD
+SOZZWZV12A67AE140F
+SOKBTWI12B0B80BD8F
+SOYUSCG12AB0182BB5
+SOLBWFV12A8C13D5B2
+SOUODZY12A6701D231
+SOFJCCE12AB0183F96
+SOSKVCM12AF729D67B
+SOUVUHC12A67020E3B
+SOSQIHH12A8C13370B
+SODHKOL12A8C141128
+SOFYIWG12A6D4F9203
+SOZKOLK12A58A7CD05
+SOUCPUM12A81C20BC5
+SOGISSQ12A8C13261F
+SONSXTH12A8C13B4A0
+SOGANEO12AB018018E
+SOOXLKF12A6D4F594A
+SOHKQUZ12A67020A3D
+SOQQITV12A8C13D23E
+SOHEGSJ12AB0183790
+SOIEYZO12AB0188717
+SOOALOT12A8C13ABD9
+SORGKYF12A8C143966
+SODUPLP12A6D4FB8E3
+SOQFLTR12AC3DFA558
+SOXLKBQ12A8C131B17
+SOPQCHU12A8C140C9E
+SONBXQW12A6701FD05
+SOCAAWX12A6D4F7901
+SOTGOVG12A6701C573
+SOBLTMH12A6D4FA44D
+SOKCZCN12A6D4F94CF
+SOGJYVC12A6D4F51EE
+SOMDIFH12A6310F24B
+SOUDZSZ12A6D4FA238
+SOZXDDH12A8C134AE4
+SODXRTY12AB0180F3B
+SOMKNTR12A6D4F9CCD
+SOWJENM12AC4686110
+SOZRUPG12AB017EEEE
+SOEAXRO12A6701FB82
+SOBVMSA12A8C13C546
+SOMIHZH12AB01821D8
+SOXMTXB12AF729A276
+SOZEBAZ12AF72A80C8
+SOJDMAS12B0B8079A4
+SORMNIY12A8C13BC44
+SOABJBU12A8C13F63F
+SOPZBUU12A6D4F6F0C
+SOBBJKR12A6D4FA788
+SOAYONZ12AF72A5DE3
+SOTSHYT12A8C142868
+SOHTCVN12A8C134E46
+SOTKFFF12AC9072C86
+SOVOOSP12A6310F1AC
+SOGFISS12A58A7E5FE
+SOZDMZB12A6701D925
+SOJUYDG12A8C1345FF
+SOVBJIV12A81C22366
+SOIZIME12A6D4FA78F
+SOLYCOX12A8C1466E8
+SOWMDQL12A8C13FB54
+SOKXMHW12AF729EAA6
+SOPNSJN12AF72A50A6
+SOCVDDD12AB017E85A
+SOPTLQQ12A8C1389A2
+SONLOQQ12A8C139AF9
+SOVSQGR12A8C13ECB7
+SOGSMFF12A8C13F5F9
+SOZFWXQ12A58A7C631
+SOULYQW12A8C13708E
+SOTGWWO12A8C13E806
+SOIHOIQ12A8C138593
+SOYHKYO12AB018224C
+SOIAKEF12A6701DC48
+SOFRWHG12A58A7DF46
+SOHDPUQ12A6701FB97
+SOHXSEH12A67020A2D
+SOQBMFK12A8C13835B
+SOQNOAF12A8151AB86
+SODHZZY12A81C217D7
+SOXLDLO12AB0186373
+SOONJMQ12A8C137E6D
+SOPREHY12AB01815F9
+SOFZXIO12A8C1362C9
+SOYNZTE12A6D4F6FB7
+SOVOLWT12A8C132DA5
+SOBYPWB12A8C141665
+SOGNIXD12A8C1341C3
+SOZVSSP12AB01819DE
+SOXLWPN12A8C143667
+SOVYICV12AB0186216
+SOYFMNU12AB0181435
+SOYIJRW12A8C134621
+SOKTUOG12A8C135990
+SOEFNYW12A8C13C56A
+SOGLKUJ12A8AE46B92
+SOOIZTZ12A6D4FBDC7
+SOLXEHW12AB0180288
+SORSSEI12A6701E511
+SOKTUUN12AB017E5B5
+SOAOLBY12A8C131ADC
+SOWLCQY12A6D4F84CF
+SOYHCED12A6701EB78
+SOXAJDB12A8C13AB22
+SOJSUQF12A67ADF6C0
+SOWOZLK12A8C136B33
+SOAAMOW12AB018149B
+SOWONPQ12A8BED02A8
+SOMIPZX12A8C1410FA
+SOVMGXI12AF72A80B0
+SORRRIK12B0B80908D
+SOKKVXX12AB017AFB7
+SOKAQBY12AB0185614
+SOSEXRD12A67ADE28D
+SOXIMEI12AB0185E55
+SOAMFCO12A6701F117
diff -r 1dbd24575d44 -r e68dbee1f6db Dataset/echonest.txt
--- a/Dataset/echonest.txt Tue Aug 04 12:13:47 2015 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2597 +0,0 @@
-SOAGJAZ12AB017C786,http://previews.7digital.com/clip/4898327,Richie Spice,Motherland Africa
-SOAGJCQ12A6D4F7D18,http://previews.7digital.com/clip/272208,S Club,Whole Lotta Nothing
-SOAGJCZ12A67AD8622,http://previews.7digital.com/clip/722256,Maya Saban,Glücklich
-SOAGJCZ12A8C145883,NA,Sleeping at Last,Needle & Thread
-SOAGJDH12AB0186B85,http://previews.7digital.com/clip/3883435,Illya Kuryaki and the Valderramas,¿De Qué Me Hablás?
-SOAGJDW12AB0189F97,http://previews.7digital.com/clip/7548381,Audio Lotion,Cosmetic Odyssey
-SOAGJGA12A6D4F980C,http://previews.7digital.com/clip/510022,Rickie Lee Jones,Love Is Gonna Bring Us Back Alive
-SOAGJIB12A6D4F9211,http://previews.7digital.com/clip/256451,Beverley Knight,Till I See Ya
-SOAGJIE12A8C13A98C,http://previews.7digital.com/clip/1653087,Wayne Gratz,Snowing
-SOAGJJQ12A67020EB4,http://previews.7digital.com/clip/161515,Bryan Adams,Victim Of Love
-SOAGJOB12AB0182B92,NA,Amusement Parks on Fire,Local Boy Makes God
-SOAGJPB12AB0189A85,NA,Mux Mool,Dandelion
-SOAGJSK12A8C13B932,NA,Quidam,Des Nuits
-SOAGJVF12A8C132EF6,NA,Bobby Womack,A Change Is Gonna Come
-SOAGJVJ12AB017E92C,http://previews.7digital.com/clip/5978732,Peter Case,Just Hangin' On
-SOAGJVY12A6D4F9336,http://previews.7digital.com/clip/264476,Rohff,Le cauchemar du rap français
-SOAGJYA12AB018D10A,http://previews.7digital.com/clip/7610129,Joan of Arc,Outside the Gap
-SOAGJZC12A81C20EE3,http://previews.7digital.com/clip/1361364,Fjk,Kära mor
-SOAGKBO12AB0186943,http://previews.7digital.com/clip/14071095,The Rembrandts,I'll Be There For You
-SOAGKDP12A6D4F9456,http://previews.7digital.com/clip/315161,Brigitte Fontaine,Il se mêle à tout ça
-SOAGKHQ12AB018A905,http://previews.7digital.com/clip/7565964,40 Glocc,Spin The Globe
-SOAGKJZ12A58A7989C,http://previews.7digital.com/clip/13821310,En Voice,Hold the Universe
-SOAGKKA12AB01840B4,http://previews.7digital.com/clip/8798251,CocoRosie,Fairy Paradise
-SOAGKKE12AC3DF81AF,http://previews.7digital.com/clip/6591920,Tony Trischka,Fox Chase
-SOAGKOM12A8C13FFE5,http://previews.7digital.com/clip/12824748,Mississippi Fred McDowell,My Bottleneck (Story)
-SOAGKPS12A6D4FA43A,http://previews.7digital.com/clip/2474379,Los Rodríguez,Mi Enfermedad
-SOAGKSE12A8C1375AE,NA,DJ Mitsu The Beats,stolen moments feat. Audessey the Sound Sci from Mass Influence (Original)
-SOAGKVF12AB01838B9,http://previews.7digital.com/clip/11681082,Wagon Christ,The Premise
-SOAGKVZ12AB0182EC7,http://previews.7digital.com/clip/6222171,Winter Hours,Carpenter's Square
-SOAGKXD12A8C13DB69,http://previews.7digital.com/clip/6969005,Mulatu Astatke,Yekermo Sew - A Man Of Experience And Wisdom
-SOAGKXS12A6D4F50CA,http://previews.7digital.com/clip/815030,Patti Drew,There'll Never Be Another
-SOAGKXV12A6D4F751B,http://previews.7digital.com/clip/423693,Pignoise,Fingiendo
-SOAGKYA12A8C13A122,NA,Tiger Army,Devil Girl
-SOAGKYJ12A8C13A3F2,http://previews.7digital.com/clip/1673963,All Wound Up,Show Me (Hero Album Version)
-SOAGKYY12A8C13FD03,http://previews.7digital.com/clip/3532104,Taylor Hicks,Gonna Move
-SOAGLET12A8C135F3A,http://previews.7digital.com/clip/4541360,Rick Wakeman,Witchwood
-SOAGLGA12AB017F82F,http://previews.7digital.com/clip/8827699,Al B. Sure!,Never Stop Loving You
-SOAGLIF12A8C13A2D2,http://previews.7digital.com/clip/2329200,Clare Teal,Breaking Up Is Hard To Do
-SOAGLIR12AF729BFAB,http://previews.7digital.com/clip/2764589,Heaven Shall Burn,Eternal
-SOAGLKH12AB01846F2,http://previews.7digital.com/clip/7865756,Flunk,Magic Potion
-SOAGLKW12A8C141CA6,http://previews.7digital.com/clip/9007784,Scott Dunbar,Forty-Four Blues
-SOAGLQT12A58A7AE1A,NA,Insane Clown Posse,My Axe
-SOAGLVB12A58A77067,http://previews.7digital.com/clip/347273,Ima Robot.,Dirty Life
-SOAGLXB12A8C132DB6,http://previews.7digital.com/clip/17810400,Sébastien Tellier,Pomme
-SOAGLXG12AC4688865,http://previews.7digital.com/clip/7606245,Throwdown,Skeleton Vanguard
-SOAGLYF12AB0181073,http://previews.7digital.com/clip/3763937,The Legendary Pink Dots,Savannah Red
-SOAGLYS12A8C13AA50,NA,Da Weasel,Faça Favor
-SOAGLZF12AB0181A31,NA,Jay Clifford,Caught in the Rain
-SOAGLZT12A8C131780,http://previews.7digital.com/clip/3141884,Big L,Fed Up Wit The Bullshit
-SOAGMFI12A58A7EF82,http://previews.7digital.com/clip/6404872,Banner Pilot,Empty Lot
-SOAGMJG12AB01877E4,http://previews.7digital.com/clip/7330523,Urszula Dudziak,Body Rub (Live)
-SOAGMLZ12A8C13B808,http://previews.7digital.com/clip/1134515,Seu Jorge,Life On Mars?
-SOAGMNK12AB018D41C,http://previews.7digital.com/clip/8971788,Juniper Moon,Un Sueño Tan Sólo Eso
-SOAGMPG12A6D4FBAB2,http://previews.7digital.com/clip/15723822,The Tossers,Phoenix Park
-SOAGMRB12A6D4F7D0D,http://previews.7digital.com/clip/239903,China Crisis,Strength Of Character
-SOAGMRD12AB0185765,NA,Acumen Nation,Mangle-A
-SOAGMVS12A8C13FD27,http://previews.7digital.com/clip/2951723,Sigur Rós,Fljótavík
-SOAGMWJ12A8C13BBCA,NA,Team Dresch,"Yes I Am Too, But Who Am I Really?"
-SOAGMXH12A8C138B25,NA,Five Way Friday,Homecoming
-SOAGMXH12AB018AA06,http://previews.7digital.com/clip/6506317,Matt Wertz,Lonely Tonight
-SOAGMXN12A8C13D358,http://previews.7digital.com/clip/2954361,Karen Dalton,Red Are the Flowers
-SOAGMYD12A6D4F94DA,NA,Bryan Ferry,Hold On (I'm Coming) (1999 Digital Remaster)
-SOAGMZB12AB01856F6,http://previews.7digital.com/clip/7242508,Masters of Reality,I Walk Beside Your Love
-SOAGNCB12AB0181D46,http://previews.7digital.com/clip/4019090,Dropkick Murphys,Take It And Run
-SOAGNCI12A8C13C883,http://previews.7digital.com/clip/30000558,L.S.G.,My Time Is Yours (Club Mix)
-SOAGNDB12AB018369D,http://previews.7digital.com/clip/36935192,The Devil Makes Three,Car Wreck
-SOAGNEN12AB0187EE4,http://previews.7digital.com/clip/8859165,Rockabye Baby!,"Lovin', Touchin', Squeezin'"
-SOAGNGF12AB0184A79,http://previews.7digital.com/clip/13505218,Emmylou Harris,Sweet Chariot
-SOAGNIK12AB017D37C,http://previews.7digital.com/clip/34925854,Casiotone for the Painfully Alone,Holly Hobby
-SOAGNJW12A6D4F892B,http://previews.7digital.com/clip/10694193,CeCe Winans,I Surrender All (Alone In His Presence Album Version)
-SOAGNKM12AB0182086,http://previews.7digital.com/clip/5704656,CRASHDÏET,Riot In Everyone
-SOAGNNX12AC9074D90,http://previews.7digital.com/clip/23337793,John Tesh,Joy To The World
-SOAGNOF12AB017B8F8,http://previews.7digital.com/clip/5128487,Lady Sovereign,Guitar
-SOAGNOI12A6D4F8CB5,http://previews.7digital.com/clip/1442872,Duncan Dhu,A Tientas
-SOAGNON12AB0187FE7,http://previews.7digital.com/clip/4045345,Faunts,Place I've Found (Mark Templeton Remix)
-SOAGNSW12AB0185174,http://previews.7digital.com/clip/7455513,Ney Matogrosso,As Ilhas
-SOAGNTD12A8C140B3D,http://previews.7digital.com/clip/7277497,Full Flava,Nature Boy (feat Hazel Fernandes)
-SOAGNTU12A8C13E3A3,http://previews.7digital.com/clip/1170171,Ana Torroja y Miguel Bosé,Sol Forastero
-SOAGOCY12AB018376A,NA,Lindisfarne,Same Way Down (Live)
-SOAGOEX12A6D4FBB98,NA,Pinetop Perkins,You Don't Have To Go
-SOAGOFN12A6D4FD8DD,NA,Stephan Micus,Part 6: Gates Of Fire
-SOAGOFR12A6D4FB02A,http://previews.7digital.com/clip/168799,Temple of the Dog,Wooden Jesus
-SOAGOHW12AC3DFB2FD,http://previews.7digital.com/clip/6591937,Tony Trischka,Old Stone Church
-SOAGOII12A58A7AD25,http://previews.7digital.com/clip/34212931,Mississippi Sheiks,Please Baby
-SOAGOIY12A6D4FBC93,http://previews.7digital.com/clip/1918980,The Cloud Room,We Sleep In The Ocean
-SOAGOJR12A8C1319CA,http://previews.7digital.com/clip/1493375,John Fogerty,Long Dark Night
-SOAGOMN12A8C137630,http://previews.7digital.com/clip/1578341,Wanda Jackson,Your Memory Comes And Gets Me
-SOAGOMZ12AF72AB039,http://previews.7digital.com/clip/5371687,Crazy Town,Intro
-SOAGORD12AB0185396,http://previews.7digital.com/clip/5685782,New Trolls,Venti o cent'anni
-SOAGOSJ12A67ADAF32,http://previews.7digital.com/clip/178798,Greg Osby,Cad'Lack Back
-SOAGOSO12A8C144C30,NA,The Blue Nile,Soul Boy
-SOAGOST12AB017D4B3,http://previews.7digital.com/clip/7708126,Enchant,Queen Of The Informed
-SOAGOTH12A8C1446E7,http://previews.7digital.com/clip/5289070,Vanden Plas,Iodic Rain
-SOAGOUU12AB017CEA7,http://previews.7digital.com/clip/6907225,Coko,Oh Mary
-SOAGOVE12A8C1390A1,http://previews.7digital.com/clip/1689865,Freedom,Masihkan Ada Esok
-SOAGOVU12A8C13C40E,http://previews.7digital.com/clip/1097271,Seefeel,Plainsong (sine Bubble Embossed Dub)
-SOAGOVY12A67ADA6A0,NA,Sonic Youth,Freezer Burn/ I Wanna Be Your Dog
-SOAGOWA12AC3DFAB7E,http://previews.7digital.com/clip/8602857,Alvin Lee,Anytime U Want Me
-SOAGOWS12A8C132A33,http://previews.7digital.com/clip/2069198,Kristin Hersh,A Loon
-SOAGOYL12AB018A451,http://previews.7digital.com/clip/19865905,José James,PROMISE IN LOVE
-SOAGPAS12AB0189D0C,http://previews.7digital.com/clip/7327517,The English Band,Yield To The Spirit
-SOAGPDF12A8AE486B6,http://previews.7digital.com/clip/3107997,Eurythmics,She's Invisible Now
-SOAGPEB12A8C14046F,http://previews.7digital.com/clip/2462791,Tokyo Police Club,Nursery Academy
-SOAGPEH12AB0183ED6,http://previews.7digital.com/clip/7704982,Pain of Salvation,Laterticius Valette
-SOAGPGY12A8C144335,http://previews.7digital.com/clip/3579027,Zach Gill,Handy Man
-SOAGPHM12AB017FCAA,http://previews.7digital.com/clip/4919786,Los Twang! Marvels,Nose Walkin'
-SOAGPJS12A8AE48225,http://previews.7digital.com/clip/2565578,Mint Royale,Space Farm
-SOAGPMH12AB0187E20,http://previews.7digital.com/clip/5191651,Eric Benét,I'll Be There
-SOAGPMS12A6D4F86CC,http://previews.7digital.com/clip/347568,Broder Daniel,Underground (2005 Digital Remaster)
-SOAGPOS12A8C142A54,http://previews.7digital.com/clip/3732731,David Cook,Mr. Sensitive
-SOAGPPN12AB0186CAC,http://previews.7digital.com/clip/8523092,Finley,Un'Altra Come Te
-SOAGPTS12A58A7EB02,http://previews.7digital.com/clip/94144,Television,See No Evil
-SOAGPVC12A8C13E80D,http://previews.7digital.com/clip/1833822,Ferlin Husky,I Wish It Could Be Christmas All Year Long
-SOAGPWN12AB017E392,http://previews.7digital.com/clip/8651238,Tides of Man,Knowing That You've Already Arrived
-SOAGPXM12A58A7E90A,NA,Mary Mary,Still My Child
-SOAGPXW12A6701E871,http://previews.7digital.com/clip/141791,Bad Brains,How I Love Thee
-SOAGPYR12A6701DE67,http://previews.7digital.com/clip/163486,Sonic Youth,Renegade Princess
-SOAGQAH12AB018A24C,http://previews.7digital.com/clip/9029341,Sondaschule,Talkshowpussi
-SOAGQAS12AB0182E3E,http://previews.7digital.com/clip/3737583,Laid Back,It's A Shame (M&M Remix) (1987 Digital Remaster)
-SOAGQBA12AAF3B2FC2,http://previews.7digital.com/clip/6868119,Chris Botti,Flamenco Sketches
-SOAGQDV12A6D4F84E1,http://previews.7digital.com/clip/354067,Yeah Yeah Yeahs,Gold Lion (Nick Remix)
-SOAGQIQ12A8C13A033,http://previews.7digital.com/clip/3320718,Ruben Studdard,I Surrender All
-SOAGQJK12AB017E5BD,NA,The Rakes,You're In It
-SOAGQJU12A6D4F7F6E,http://previews.7digital.com/clip/241546,Prince Far I,Jah Do That
-SOAGQJU12A8C1339F2,http://previews.7digital.com/clip/12628620,Blue Öyster Cult,Mirrors
-SOAGQKL12A8C145DFA,http://previews.7digital.com/clip/3928171,Hanoi Rocks,Teenage Revolution
-SOAGQMH12AC468A427,http://previews.7digital.com/clip/6727223,A Day to Remember,A Second Glance
-SOAGQMJ12A8C1384BB,http://previews.7digital.com/clip/2205007,Kay Starr,Tears And Heartaches
-SOAGQND12AB017CE34,http://previews.7digital.com/clip/7688589,Stream of Passion,Spellbound
-SOAGQNK12A8C143140,NA,Three Drives,Greece 2000
-SOAGQQY12A6D4F7E0A,http://previews.7digital.com/clip/1652068,Julien Clerc,Assez assez (live)
-SOAGQTO12A8C13832C,http://previews.7digital.com/clip/2233257,Musiq Soulchild,Previouscats (Album Version (Edited))
-SOAGQVA12A8C138A7A,http://previews.7digital.com/clip/2747676,Clara Nunes,Pau De Arara
-SOAGQYE12AB017B981,http://previews.7digital.com/clip/6957377,Captain Beyond,Fantasy
-SOAGRAA12AB01858DD,http://previews.7digital.com/clip/4623677,Glenn Morrison,Starship Road
-SOAGRBF12AB0186FB0,http://previews.7digital.com/clip/8351015,Nic Jones,The Little Pot Stove
-SOAGRBH12A6310EB5B,http://previews.7digital.com/clip/15812,Mos Def,The Easy Spell
-SOAGRCI12A8C134FF4,http://previews.7digital.com/clip/3237626,CeCe Winans,Looking Back At You
-SOAGRDF12A8C13E06C,http://previews.7digital.com/clip/1171922,Gatsby's American Dream,The Loosing of the Shadow
-SOAGRDI12AC960DA6C,http://previews.7digital.com/clip/10806830,Darlene Love,Chapel Of Love
-SOAGRGP12A6D4F90AC,http://previews.7digital.com/clip/554588,Gary Moore,Woke Up This Morning (2002 Digital Remaster)
-SOAGRHS12A5891F654,http://previews.7digital.com/clip/12416001,Use,We The People
-SOAGRJW12A8C1424CA,http://previews.7digital.com/clip/4191726,Wilco,Say You Miss Me
-SOAGRPL12A6701F667,http://previews.7digital.com/clip/146718,Big L,Ebonics
-SOAGRPW12A6310D929,http://previews.7digital.com/clip/12198,My Life Story,Funny Ha Ha
-SOAGRTK12AB0186FF5,http://previews.7digital.com/clip/8477673,Luigi Rubino,Fragments
-SOAGRTS12A8C13B86B,http://previews.7digital.com/clip/31552459,Yo La Tengo,Nuclear War (Version 1)
-SOAGRXB12A58A7B529,NA,Son House,My Black Mama Pt. II
-SOAGSCH12A67ADC1CE,http://previews.7digital.com/clip/1417242,Tyler Bates,Fight In The Shade
-SOAGSHR12A8C14523C,http://previews.7digital.com/clip/4774991,Kalibas,Floating In Concrete
-SOAGSIV12AB018AF30,http://previews.7digital.com/clip/8292967,Thom Hell,'Til That Day Was Gone
-SOAGSLF12AB0180DB8,http://previews.7digital.com/clip/7123799,Kapasiteettiyksikkö,Kaiken tän jälkeen
-SOAGSNW12AB017E7D2,http://previews.7digital.com/clip/3778517,Beginner,Stift Her
-SOAGSQE12A6D4FB748,http://previews.7digital.com/clip/655389,Herbert Grönemeyer,Stand Der Dinge
-SOAGSQT12AC3DFA2F7,http://previews.7digital.com/clip/7703512,Russell Allen,The Distance
-SOAGSRS12A6310F2B0,NA,Massive Attack,Teardrop (Mad Professor Mazaruni Instrumental)
-SOAGSRW12A8C142D96,http://previews.7digital.com/clip/18895489,Herb Alpert & The Tijuana Brass,Limbo Rock
-SOAGSSV12A5891ECBD,http://previews.7digital.com/clip/10220965,Brian Kennedy,Carrickfergus
-SOAGSSZ12AB0182319,http://previews.7digital.com/clip/668594,Slick Shoes,Alone (Slick Shoes Album Version)
-SOAGSVD12A6D4F9D10,http://previews.7digital.com/clip/9802591,Bloodjinn,See Through
-SOAGSYE12A58A7A5A7,http://previews.7digital.com/clip/6332183,Mariah Carey,"Heartbreaker/""If You Should Ever Be Lonely"" (Junior's Heartbreaker Club Mix)"
-SOAGTAG12A6D4F7441,http://previews.7digital.com/clip/326989,The Velvet Underground,Candy Says - Closet Mix
-SOAGTAQ12A8C131A49,http://previews.7digital.com/clip/3179557,Neal Schon,Send Me An Angel
-SOAGTBN12A58A7ED83,http://previews.7digital.com/clip/7878857,Black Oak Arkansas,Red Hot Lovin'
-SOAGTBT12A8C136D86,http://previews.7digital.com/clip/36318928,Griffin House,Hanging On (Tom's Song)
-SOAGTCN12A8C1452C6,http://previews.7digital.com/clip/5321903,Nevertheless,Its Me
-SOAGTCW12A6D4F939E,http://previews.7digital.com/clip/537552,Lucie Bílá,Tolik Vina Tolik Slov
-SOAGTHZ12AB018C0A9,http://previews.7digital.com/clip/8567823,Graham Central Station,Entrow
-SOAGTIX12A6D4F45A3,http://previews.7digital.com/clip/274149,Midge Ure,The Chieftain/The Dancer (Live)
-SOAGTJQ12A6D4F8370,http://previews.7digital.com/clip/338145,Dem Franchize Boyz,You Know What It Is
-SOAGTJW12A6701F1F5,http://previews.7digital.com/clip/25068,Status Quo,Don't Think It Matters
-SOAGTMG12A8C13E893,http://previews.7digital.com/clip/19624197,Circus Maximus,The Prophecy
-SOAGTMN12A6D4F9EC1,http://previews.7digital.com/clip/37421611,Windsor for the Derby,A Spring Like Sixty
-SOAGTMZ12AF72A92CD,http://previews.7digital.com/clip/7790035,Shearwater,Meridian
-SOAGTTM12A6D4FB327,http://previews.7digital.com/clip/653478,Stereo Total,Tout le Monde se Fout des Fleurs
-SOAGTXK12A58A7A939,http://previews.7digital.com/clip/32062252,Ra,Crazy Little Voices
-SOAGTYH12AB01810A5,http://previews.7digital.com/clip/4368992,Corey Harris,More Precious Than Gold
-SOAGTYL12AB018B3C4,http://previews.7digital.com/clip/9007466,Edge of Sanity,After Afterlife
-SOAGUCR12A67ADAEDF,http://previews.7digital.com/clip/3386084,Shaggy,Would You Be
-SOAGUCZ12A6701FFA2,http://previews.7digital.com/clip/157378,Ed Harcourt,The Unlucky One
-SOAGUEA12A8C1329E3,http://previews.7digital.com/clip/7960755,Osunlade,My Reflection (Manoo Stella Remix)
-SOAGUEK12A8C1357D1,http://previews.7digital.com/clip/3236302,Hindu Love Gods,Battleship Chains
-SOAGUGD12A8C13FB69,http://previews.7digital.com/clip/6077919,Teairra Mari,Make Her Feel Good
-SOAGUHP12AB018B6D2,http://previews.7digital.com/clip/8882363,Los Papines,Mi Quinto
-SOAGULR12A6D4F67E6,http://previews.7digital.com/clip/251399,Be Bop Deluxe,Rocket Cathedrals
-SOAGUMS12A6D4F8C83,http://previews.7digital.com/clip/324931,Heino,Rosemarie
-SOAGUOE12A58A7BC92,http://previews.7digital.com/clip/1161821,Lalo Rodríguez,Atado A Tus Brazos
-SOAGUOR12A8C13AF1E,http://previews.7digital.com/clip/1738665,Gordon Lightfoot,Long Thin Dawn
-SOAGUOX12A67ADC908,http://previews.7digital.com/clip/31390532,Job for a Cowboy,Entombment Of A Machine
-SOAGUTJ12AB0189B08,http://previews.7digital.com/clip/8910229,La Puta Opepé,La Escuela
-SOAGUUD12A8C1348B8,http://previews.7digital.com/clip/2071772,Biffy Clyro,Solution Devices
-SOAGUUJ12AB0183716,http://previews.7digital.com/clip/7810640,Lil 1/2 Dead,That's What You Get
-SOAGUUZ12A8AE489C9,http://previews.7digital.com/clip/1441202,Olga Tañón,El Papel De Malo
-SOAGUWZ12AB0189D23,http://previews.7digital.com/clip/8743232,Skalariak,Errainuaren Modura
-SOAGUYZ12AF72A34ED,http://previews.7digital.com/clip/7663126,Kevin Lyttle,That Vibe
-SOAGVAA12A67ADE80F,http://previews.7digital.com/clip/724637,Yes,Hearts
-SOAGVET12A58A7C448,http://previews.7digital.com/clip/11687966,Caural,Interlude
-SOAGVGM12A8C1438D8,http://previews.7digital.com/clip/4157988,Médine,Enfant du destin (sou-han)
-SOAGVHL12A58A79D1C,http://previews.7digital.com/clip/3061328,Dan Hicks,Moody Richard
-SOAGVHM12A58A77F85,http://previews.7digital.com/clip/778562,Donna the Buffalo,In This Life
-SOAGVIC12AB0189778,http://previews.7digital.com/clip/7400072,Yukmouth,Thugged Out
-SOAGVJA12AB0189D84,http://previews.7digital.com/clip/8480383,Seeed,New Dubby Conquerors (Oct. 2000 Mix)
-SOAGVKA12A6D4F7079,NA,Gary U.S. Bonds,Soul Deep
-SOAGVOA12A6D22827E,http://previews.7digital.com/clip/8130485,Sentenced,Mourn
-SOAGVON12A6D222782,http://previews.7digital.com/clip/34480781,Kim Waters,So Sick
-SOAGVOY12AF72A585D,http://previews.7digital.com/clip/4589910,Brad Paisley,Don't Breathe
-SOAGVPC12AB018BD69,http://previews.7digital.com/clip/2866927,Kékélé,Delali
-SOAGVPH12AF729CF04,http://previews.7digital.com/clip/11472138,Default,One Late Night
-SOAGVTH12AB0182880,http://previews.7digital.com/clip/5369095,Hilltop Hoods,Hillatoppa
-SOAGVUT12AB01882C8,http://previews.7digital.com/clip/7816442,September Malevolence,Moments
-SOAGVWY12A8C1393B7,http://previews.7digital.com/clip/2276525,Embrace,Retread (Live At Abbey Road)
-SOAGVXF12A8C13FE8A,http://previews.7digital.com/clip/3486422,Melt-Banana,Rough Dogs Have Bumps
-SOAGVXG12AAF3B3FF3,http://previews.7digital.com/clip/4252648,Yuksek,Deladeu 2
-SOAGVXZ12A6D4F992E,NA,Lords of Acid,Stoned On Love Again
-SOAGVYS12A8C131C69,http://previews.7digital.com/clip/1529169,Buju Banton,My Woman Now
-SOAGVYV12A8C144344,http://previews.7digital.com/clip/7911730,Rose Tattoo,Man About Town
-SOAGVZF12A6D4F8CE7,http://previews.7digital.com/clip/265724,The Robert Cray Band,Midnight Stroll
-SOAGWBO12A6D4F8AA9,http://previews.7digital.com/clip/6859390,AfroReggae,Imagine
-SOAGWCG12A6701D470,http://previews.7digital.com/clip/16704516,Cheech & Chong,Blind Melon Chitlin'
-SOAGWCJ12AC3DF7305,NA,Hit the Lights,Don't Wait
-SOAGWCZ12A58A7F5A6,http://previews.7digital.com/clip/981747,Everyday Sunday,Apathy For Apologies (Wake Up! Wake Up! Album Version)
-SOAGWEI12AB018952A,http://previews.7digital.com/clip/8379951,Silkk the Shocker,Ghetto Rain (feat. Master P & O' Dell)
-SOAGWGS12A6D4F7B73,http://previews.7digital.com/clip/23909850,Frank Sinatra,How Are Ya' Fixed for Love?
-SOAGWOE12A58A7CAE6,http://previews.7digital.com/clip/9001465,2Much,Loungin'
-SOAGWPY12AB018CD74,http://previews.7digital.com/clip/8526721,Iration,Time Bomb
-SOAGWQH12AB0186867,http://previews.7digital.com/clip/22940755,David Jalbert,L'étoffe D'un Héros
-SOAGWSX12A58A774AA,http://previews.7digital.com/clip/1528809,Chris Squire,Hold Out Your Hand
-SOAGWTU12AB0184AF7,NA,"Richard ""Groove"" Holmes",Slo Booze
-SOAGWUW12A8C13BF1B,http://previews.7digital.com/clip/1679586,Drafi Deutscher,Über Grenzen Geh'n
-SOAGWVO12A8C1399A9,http://previews.7digital.com/clip/1670489,Philharmonia Orchestra,"Swan Lake Suite, Op. 20: I. Scène"
-SOAGWWU12A8C142032,NA,Clem Snide,Jews for Jesus Blues
-SOAGWWW12A8C138C93,NA,Augustus Pablo,Jah Say Dub
-SOAGWXI12A8AE499AA,http://previews.7digital.com/clip/2019032,Tony Curtis,Faith
-SOAGXCO12AB018187F,http://previews.7digital.com/clip/6049305,Kate Campbell,New South
-SOAGXCQ12A8C13EF90,http://previews.7digital.com/clip/2353047,The Flying Lizards,Cirrus
-SOAGXDA12A6D4F8B13,http://previews.7digital.com/clip/215493,Jean-Louis Aubert,Le Meilleur De Toi-Même
-SOAGXDD12A8C14353E,http://previews.7digital.com/clip/21241969,Blue Rodeo,God and Country
-SOAGXDK12A81C22574,http://previews.7digital.com/clip/1351740,Timbaland & Magoo,Shennanigans
-SOAGXHO12A8C13DCFE,http://previews.7digital.com/clip/3621020,Miranda Cosgrove,Leave It All To Me (Theme from iCarly)
-SOAGXOE12A81C23320,http://previews.7digital.com/clip/3070958,Lynda,Salvame
-SOAGXPF12AB01859C4,http://previews.7digital.com/clip/8879394,Oliver Koletzki,Song For S. (Original Version)
-SOAGXPK12A67020FD1,http://previews.7digital.com/clip/11776227,Altar,Spikes and Pain
-SOAGXQF12AB0186F16,http://previews.7digital.com/clip/8347629,Keller Williams,Zilla a Trois
-SOAGXQH12A58A79703,http://previews.7digital.com/clip/1898269,Unloco,Whimper
-SOAGXQM12A6D4F9CF8,http://previews.7digital.com/clip/1527762,Shirley Scott,Messie Bessie
-SOAGXQY12A8AE45F71,http://previews.7digital.com/clip/3113096,Amp Fiddler,Possibilities
-SOAGXRU12AB01903A1,http://previews.7digital.com/clip/6558085,Grant-Lee Phillips,Nightbirds
-SOAGXSO12A8C1438A7,http://previews.7digital.com/clip/3928180,Hanoi Rocks,Tootin' Star
-SOAGXTK12A8C1405B9,NA,Big in Japan,For That Special Someone Else
-SOAGXVD12AB0181F54,http://previews.7digital.com/clip/4874451,Nashville Pussy,Dead Men Can't Get Drunk
-SOAGXWV12AB01827DD,http://previews.7digital.com/clip/7164697,X-Raided,Kill Or Be Killed (The Legend of Li'L Man)
-SOAGXXI12A6D4F71FF,http://previews.7digital.com/clip/238026,Horace Silver,Mary Lou
-SOAGXZI12AB0181077,http://previews.7digital.com/clip/6161039,Virtue!,You'll Win If You Try
-SOAGXZL12AB017B28D,http://previews.7digital.com/clip/8196462,Lacuna Coil,Not Enough
-SOAGYBV12A8C142402,http://previews.7digital.com/clip/17264154,Pole,Pferd
-SOAGYEY12A58A77D1D,http://previews.7digital.com/clip/1862592,Ryan Adams,Blue Hotel
-SOAGYFN12AB018B24F,NA,Ronnie Dove,I Have Something To Give You
-SOAGYGF12AB018B0F9,http://previews.7digital.com/clip/33314171,The Soft Pack,Tides Of Time
-SOAGYHH12AB0185FA5,http://previews.7digital.com/clip/8302987,Crop Circles,Antonomasia (Lotus Omega Remix)
-SOAGYJI12A8C143EE7,http://previews.7digital.com/clip/17320968,Oldelaf et Monsieur D.,Trahis
-SOAGYMT12A8C143821,http://previews.7digital.com/clip/9001929,We Are Wolves,"Vosotros, Monstrous"
-SOAGYNF12AB0187EEE,http://previews.7digital.com/clip/239407,Brian Eno,The Jezebel Spirit
-SOAGYOP12AAF3B2356,http://previews.7digital.com/clip/5845134,OV7,Joy
-SOAGYPD12A67ADE62B,http://previews.7digital.com/clip/367624,The Corrs,Heart Like A Wheel
-SOAGYSK12A6D4F857D,http://previews.7digital.com/clip/530444,Melissa Etheridge,Lover Please
-SOAGYTK12A81C2005C,http://previews.7digital.com/clip/1357527,American Hi-Fi,Where Did We Go Wrong
-SOAGYTY12A8C13CE35,NA,Dirty on Purpose,Girls & Sunshine
-SOAGYUC12A6701F399,http://previews.7digital.com/clip/92135,Peter Cetera,Scheherazade
-SOAGZBR12A58A7A7E0,NA,Skankin' Pickle,Skinless Friend
-SOAGZDM12A8C134D30,http://previews.7digital.com/clip/1542557,DeGarmo & Key,Brother Against Brother (It's Not Right) (Degarmo And Key Album Version)
-SOAGZFJ12AB017F947,http://previews.7digital.com/clip/6970781,Gameface,Scared
-SOAGZNK12A8C144EC7,http://previews.7digital.com/clip/117784,Finch,Fireflies
-SOAGZNP12A8C13884D,http://previews.7digital.com/clip/2210457,Tanya Tucker,Ridin' Out The Heartache
-SOAGZPS12A6D4F8510,http://previews.7digital.com/clip/2304526,The Communards,Don't Slip Away
-SOAGZQJ12A6D4FBFCD,http://previews.7digital.com/clip/6654176,Jeff Bennett's Lounge Experience,I Am
-SOAGZQM12A6D4F8FBC,http://previews.7digital.com/clip/1568643,Mickey 3D,Amen
-SOAGZRD12A6D4F6017,http://previews.7digital.com/clip/818262,Silje Nergaard,Who goes there
-SOAGZRS12A8C141C61,http://previews.7digital.com/clip/14252259,CCCP Fedeli alla linea,Emilia Paranoica (Remiscelata) (2008 - Remaster)
-SOAGZSY12AB01875BB,NA,Al Hirt,Orange Blossom Special
-SOAGZTH12AF72A08E1,http://previews.7digital.com/clip/266860,Stroke 9,Reject
-SOAGZUH12AB018B4A2,NA,Frozen Plasma,A Second of Life
-SOAGZVT12AB01874AB,http://previews.7digital.com/clip/7953284,Greg X. Volz,The Carpenter
-SOAGZYD12AB0188E01,http://previews.7digital.com/clip/14831591,God Dethroned,Coloseum Serenades
-SOAGZYO12A58A776AC,http://previews.7digital.com/clip/503200,Lucie Silvas,Already Gone
-SOAGZYR12AB018064B,NA,Blutengel,Black Roses (Opposite Sex)
-SOAGZZO12A6701F444,http://previews.7digital.com/clip/125329,Freestyle,Ögon Som Glittrar
-SOAGZZV12AB017EC83,http://previews.7digital.com/clip/5926966,Air Supply,Keeping the Love Alive
-SOAHAEF12AB017E6A5,http://previews.7digital.com/clip/6126386,Dub Pistols,I'm In Love (Faomo remix)
-SOAHAEU12A8C1382E0,NA,The Primary 5,Sunsets
-SOAHAFO12A67ADBC7E,http://previews.7digital.com/clip/181369,Nicole C. Mullen,Baby Girl
-SOAHAFY12AB018D6A3,NA,Fler,Meine Homies
-SOAHAHL12AB017B60A,http://previews.7digital.com/clip/6957401,Bread,Move Over
-SOAHAHU12A6D4F959E,http://previews.7digital.com/clip/591328,Slim Gaillard,Don't Blame Me
-SOAHAKA12A8C142C0F,NA,India.Arie,A Beautiful Day
-SOAHAKE12A58A77A38,http://previews.7digital.com/clip/14419897,Terra Samba,Palpite
-SOAHAKS12A6D4FA146,http://previews.7digital.com/clip/12513697,Snooks Eaglin,Veal Chop And Pork Chop
-SOAHANF12A8C138A94,http://previews.7digital.com/clip/19616742,Ismael Rivera,Son Son Sonero
-SOAHAQG12A81C2163B,http://previews.7digital.com/clip/5502124,Able Baker Fox,What Doesn't Kill You
-SOAHAQJ12A6D4F3AFB,http://previews.7digital.com/clip/204354,Melody Club,Wildhearts (Piano Version)
-SOAHARC12A58A798E2,http://previews.7digital.com/clip/33957012,Spok Frevo Orquestra,Frevo Aberto
-SOAHARR12AB01810F6,http://previews.7digital.com/clip/8831290,Das Ich,He Mensch - Remixed By Ernst Horn Of Deine Lakaien
-SOAHASQ12A8C1456BC,http://previews.7digital.com/clip/6838490,Jude Cole,This Time It's Us
-SOAHAVL12A8C141789,http://previews.7digital.com/clip/3559404,Mad Sin,Alien Bug
-SOAHAXH12AB01878E1,NA,20 Minute Loop,All Manner
-SOAHAZZ12AAF3B464A,http://previews.7digital.com/clip/5335312,Beherit,Lord Of Shadows And Golden Wood
-SOAHBFE12A8C137A11,NA,Kinnie Starr,E-Merged
-SOAHBHM12A67ADC82E,http://previews.7digital.com/clip/598507,Kate Ryan,Magical Love
-SOAHBHP12A8C13CF98,http://previews.7digital.com/clip/3479204,Eliane Elias,We're So Good
-SOAHBIR12A8C132F2A,http://previews.7digital.com/clip/3143007,'Til Tuesday,Everything's Different Now
-SOAHBOP12A8C13D537,http://previews.7digital.com/clip/9612633,Murder by Death,'52 Ford
-SOAHBSF12AC4689BAD,http://previews.7digital.com/clip/6632510,Landon Pigg,High Times
-SOAHBSP12A8C13DC71,http://previews.7digital.com/clip/1266096,Rachel Unthank & The Winterset,Whitehorn
-SOAHBUE12AB017E56C,http://previews.7digital.com/clip/4973190,Newcleus,I'm Not A Robot
-SOAHBVJ12A6310F2A5,http://previews.7digital.com/clip/9632,Neneh Cherry,Telephone Pole (Demo)
-SOAHBWS12A58A78C17,http://previews.7digital.com/clip/5635260,María Elena Walsh,En El País De Nomeacuerdo
-SOAHBWX12AC4686B2A,http://previews.7digital.com/clip/7627886,Teresa De Sio,Ukellelle
-SOAHBWZ12A8C1436DD,http://previews.7digital.com/clip/4047995,Don Henley,Everybody Knows
-SOAHCAG12A8C134B57,http://previews.7digital.com/clip/1562783,André Hazes,Nu Weet Ik Wat Ik Mis
-SOAHCAL12A8C13B780,http://previews.7digital.com/clip/1667936,M.A. Numminen,Rakkauden vanki
-SOAHCBY12A8C14555B,http://previews.7digital.com/clip/3609833,Lightnin' Hopkins,I'm A Stranger
-SOAHCEJ12A58A7F5A2,http://previews.7digital.com/clip/3964566,Brand New Disaster,Pull the Trigger Like You Mean It
-SOAHCGL12AB018DDB5,http://previews.7digital.com/clip/9684822,Miles Davis,Blue Monk
-SOAHCHP12A8C13BF5C,http://previews.7digital.com/clip/1174828,Trick Daddy,Nann Ni**a (Explicit Album Version)
-SOAHCIJ12A8C13965E,http://previews.7digital.com/clip/32033196,Chris Isaak,Solitary Man
-SOAHCJB12AB0183A26,http://previews.7digital.com/clip/4523372,Ewa Farna,La la laj
-SOAHCJL12A6D4FAEA5,http://previews.7digital.com/clip/600919,Crazy Horse,I'll Get By
-SOAHCKI12AB018B574,http://previews.7digital.com/clip/6386632,The 4 of Us,Possessed
-SOAHCKL12AB018D26C,http://previews.7digital.com/clip/8871153,The New Pornographers,We End Up Together
-SOAHCMY12AB018B69D,http://previews.7digital.com/clip/6506720,Sofia Talvik,Something Good
-SOAHCOZ12A8C1429E5,http://previews.7digital.com/clip/4766157,Current 93,She Is Dead And All Fall Down
-SOAHCRL12A58A7A41A,http://previews.7digital.com/clip/276994,Jenifer,Nos Points Communs
-SOAHCRL12A8C1381D6,NA,Lisa Marie Presley,Shine
-SOAHCRY12A8C135523,http://previews.7digital.com/clip/1538081,Snoop Dogg,Paper'd Up / Singles) (Edited)
-SOAHCTW12A8C133D4F,http://previews.7digital.com/clip/1831116,Lars Vogt/Georg Faust/Wolfram Christ/Wayne Marshall/Berliner Philharmoniker/Claudio Abbado,"Kammermusik Nr.3: Mässig bewegte Halbe. Munter, aber immer gemächlich"
-SOAHCUU12A6D4F93B2,NA,TTC,Strip pour moi
-SOAHCVZ12AB01842A6,NA,Natasja,Better Than Dem
-SOAHCWA12A8C1419B5,NA,Matthew Good Band,Advertising On Police Cars
-SOAHCXP12A8C13F0E4,http://previews.7digital.com/clip/1819388,Secret Machines,Blue Jay Way
-SOAHCZN12AB0188986,http://previews.7digital.com/clip/6205396,Bascom Lamar Lunsford,Mole in the Ground
-SOAHCZT12A58A7D3C9,http://previews.7digital.com/clip/3973510,Lesley Garrett,Voi che sapete
-SOAHDAP12A6D4F81A4,http://previews.7digital.com/clip/494411,Melody Club,Walk Of Love
-SOAHDAT12A6D4FD144,http://previews.7digital.com/clip/1337494,Los Enemigos,Fuagras
-SOAHDCY12AB01819BC,http://previews.7digital.com/clip/5647791,Iris DeMent,Blessed Assurance
-SOAHDDG12A6D4F95A6,http://previews.7digital.com/clip/398462,Macaco,Meu Amigo Gandhi
-SOAHDGG12AB0186EE2,http://previews.7digital.com/clip/5220765,Tyler Hilton,Tore The Line
-SOAHDHK12AB017C8AC,http://previews.7digital.com/clip/7688626,Roine Stolt,Hotrod (the Atomic Wrestler)
-SOAHDJE12AB0185053,http://previews.7digital.com/clip/22861737,RSD,Naked Mario Kart
-SOAHDJZ12A6D4F5BEA,http://previews.7digital.com/clip/232591,Tom Cochrane,West Coast Saga
-SOAHDLF12AC468AA9E,http://previews.7digital.com/clip/7662894,Government Warning,Killing For Fun
-SOAHDMC12A67ADE6D3,http://previews.7digital.com/clip/196614,Scott Walker,Who (Will Take My Place)
-SOAHDQH12A58A77997,http://previews.7digital.com/clip/5044763,Madina Lake,Not For This World
-SOAHDTF12A6310DA84,http://previews.7digital.com/clip/15480,Oscar Peterson,Cake Walk (Live)
-SOAHDTH12AC3DF6C28,http://previews.7digital.com/clip/8705884,Sonny Criss,The First One
-SOAHDUE12A6D4FA4FC,http://previews.7digital.com/clip/23599449,Scooter,Don't Let It Be Me
-SOAHDVA12A6D4F7BBF,http://previews.7digital.com/clip/236860,Linda Ronstadt,Rock Me On The Water
-SOAHDXD12AB0187AAC,http://previews.7digital.com/clip/8962104,Amari,Le Gite Fuori Porta (Original Version)
-SOAHDXK12AB0180710,http://previews.7digital.com/clip/5970445,Squarepusher,Seb-1.03
-SOAHDXU12A6D4F81E0,http://previews.7digital.com/clip/863057,Tubeway Army / Gary Numan,Basic J.
-SOAHEAB12A8C1322E9,NA,Venetian Snares,Frictional Nevada
-SOAHEBF12A58A78754,http://previews.7digital.com/clip/17731582,TM Juke and the Jack Baker Trio,Spread It On
-SOAHEBS12AB0183767,NA,Boris Vian,La java des bombes atomiques (instrumental)
-SOAHECE12AB017FD5B,http://previews.7digital.com/clip/7076584,Clyde Carson,I'm On
-SOAHECF12A670215FF,http://previews.7digital.com/clip/6796162,The Futureheads,Trying Not To Think About Time
-SOAHEDW12A8C141B56,http://previews.7digital.com/clip/6802020,Ian Siegal,Groundhog Blues
-SOAHEGA12A6D4FB4A4,http://previews.7digital.com/clip/684545,Pat Metheny,Long Before
-SOAHEGT12AAF3B495E,NA,Royal Bangs,Let's Get Even
-SOAHEGX12AB0188A95,http://previews.7digital.com/clip/8312019,George Benson,Let Go
-SOAHEHR12A6D4F7A4E,http://previews.7digital.com/clip/263083,Medeski Martin and Wood,Sugar Craft (Yuka Honda Remix)
-SOAHEKX12AB018B4E1,http://previews.7digital.com/clip/7871312,sToa,Conclusio
-SOAHELY12A6310E055,http://previews.7digital.com/clip/7376,Sparklehorse,Cow
-SOAHEPE12AB0185969,http://previews.7digital.com/clip/8849312,Aga Zaryan,Seeking My Love
-SOAHEPI12AB01866BA,http://previews.7digital.com/clip/37923715,Novalima,Conchaperla
-SOAHESC12A8C139969,http://previews.7digital.com/clip/1094981,White Lion,Wait (2006 Remastered Live on Westwood One Version)
-SOAHEWY12A8C13C5F5,http://previews.7digital.com/clip/2948620,The Detroit Cobras,Out Of This World
-SOAHEYL12A6D4FA8B8,http://previews.7digital.com/clip/425115,Olle Adolphson,Madame Läboms visa om den förunderliga kärleken (remaster '03)
-SOAHEZZ12AB0184C16,http://previews.7digital.com/clip/4061730,Elektraws,Shock Rock
-SOAHFIA12A3F1EA5DA,http://previews.7digital.com/clip/5213684,Pete Townshend,Street In The City
-SOAHFQN12AB0186997,http://previews.7digital.com/clip/9011000,José Larralde,Como Todas
-SOAHFSF12A6D4FC7DB,http://previews.7digital.com/clip/30788872,The Crash Crew,Scratching
-SOAHFTJ12A8C146C3A,http://previews.7digital.com/clip/8542639,Sounds From the Ground,Gather
-SOAHFVN12A8C136993,http://previews.7digital.com/clip/35071475,Keith Martin,Here In Heaven
-SOAHFWL12A6D4FA3F1,http://previews.7digital.com/clip/559511,Parliament,This Is The Way We Funk With You
-SOAHFWL12AF729FF83,http://previews.7digital.com/clip/163763,Primus,Pork Soda
-SOAHFXJ12A8C13CA07,http://previews.7digital.com/clip/8440371,Air Supply,It's Never Too Late
-SOAHFXK12A6D4F7C45,http://previews.7digital.com/clip/3329834,July For Kings,Anything But Beautiful
-SOAHFXW12A8C138C33,http://previews.7digital.com/clip/1603418,Colin James,Evening
-SOAHFXY12A8C136722,NA,Modwheelmood,Yesterday (TRS-80 Dark Circles Mix)
-SOAHFYD12A6BD4F000,http://previews.7digital.com/clip/772064,José Mercé,Te Pintaré
-SOAHFYE12A6D4FBA23,http://previews.7digital.com/clip/550238,Sergio Cammariere,E Mi Troverai
-SOAHFYL12A8C13B974,http://previews.7digital.com/clip/14124127,Γιώργος Νταλάρας,Paraponemena Logia (Sad Words)
-SOAHFZF12A8C133C3E,http://previews.7digital.com/clip/931744,Dr. Calypso,Try Me (One More Time)
-SOAHGBC12AB018C90B,http://previews.7digital.com/clip/8490523,Colin James,Sky Diving
-SOAHGBE12A8C1338B9,NA,Uncle Tupelo,Life Worth Livin'
-SOAHGBK12A6BD5314A,http://previews.7digital.com/clip/756912,Herbert von Karajan,"Symphony No. 4 in F Minor, Op. 36: I. Andante sostenuto - Moderato con anima"
-SOAHGDP12A8C140E02,http://previews.7digital.com/clip/2433719,Pignoise,Pasar de cuartos
-SOAHGFG12A8C14143C,http://previews.7digital.com/clip/3556030,Gabe Dixon Band,Disappear
-SOAHGHO12A8C13F797,NA,Krzysztof Komeda,Rosemary's Baby Komeda Composing 1
-SOAHGIJ12AB01880F7,http://previews.7digital.com/clip/6114683,Ominous Seapods,Tornado Rain
-SOAHGIW12AB018DAB4,http://previews.7digital.com/clip/8519353,El Gran Combo de Puerto Rico,Sin Salsa No Hay Paraíso
-SOAHGJT12B0B8093AD,NA,Blind Melon,Hell
-SOAHGKF12AB0185A32,http://previews.7digital.com/clip/7131859,Master Margherita,For Aldo
-SOAHGMP12A58A77B1B,http://previews.7digital.com/clip/6563186,Thursday,Common Existence (Bonus Track)
-SOAHGPA12AB0187D36,http://previews.7digital.com/clip/8889587,Killa Kyleon,Glass Chrome And Bumper Kit (feat. Big Pokey & Smoke)
-SOAHGQC12AC4686634,http://previews.7digital.com/clip/8229110,4 Promille,Mrs. Nice
-SOAHGQZ12A8C138209,http://previews.7digital.com/clip/2432634,The Amps,Just Like A Briar
-SOAHGRS12A58A80656,http://previews.7digital.com/clip/70745,Petra,Amo Al Se'nor
-SOAHGUZ12AB0186B80,http://previews.7digital.com/clip/21871523,Theodor Bastard,Alteya
-SOAHGVU12AF72A35DB,http://previews.7digital.com/clip/5433428,NewSong,What Child Is This?
-SOAHGWN12AB017DDDF,http://previews.7digital.com/clip/4295152,Stacy Lattisaw,Perfect Combination
-SOAHGYM12A8C13DB0D,http://previews.7digital.com/clip/3450861,Premiata Forneria Marconi,Per Un Amico
-SOAHHAZ12AB0187A95,http://previews.7digital.com/clip/8967237,Falsalarma,Que Buscais
-SOAHHDG12AC468865C,http://previews.7digital.com/clip/7650044,Lemongrass,Tokyo 2
-SOAHHFR12A6D4FB416,http://previews.7digital.com/clip/681383,Todd Rundgren,Hungry For Love
-SOAHHJZ12AB0185A5D,NA,Jeannie C. Riley,Free
-SOAHHKW12A8C13B5E2,http://previews.7digital.com/clip/1428948,Killing Joke,Wilful Days (2007 Digital Remaster)
-SOAHHLB12AB017E311,http://previews.7digital.com/clip/4307010,Kostia,Girl From Barcelona
-SOAHHLE12A8A9D8141,http://previews.7digital.com/clip/3092489,Rich Kids,No Lip (2003 Digital Remaster)
-SOAHHMA12A8C133E7C,http://previews.7digital.com/clip/923879,Rocky Hill,Bad Girl Blues
-SOAHHMQ12A8C1421E0,http://previews.7digital.com/clip/8560818,The Human Abstract,Procession Of The Fates
-SOAHHPS12A8C1317AA,NA,NOFX,I'm Going to Hell for This One
-SOAHHPW12A6D4F9808,http://previews.7digital.com/clip/510018,Rickie Lee Jones,Satellites
-SOAHHRA12A8C13F65D,http://previews.7digital.com/clip/37422507,Bobb Trimble,When The Raven Calls
-SOAHHRW12AB0186D03,http://previews.7digital.com/clip/8196027,Embrace the End,After Me the Floods
-SOAHHSL12A8C1371B4,http://previews.7digital.com/clip/2174217,Bob Crosby & The Bobcats,The Wedding Samba
-SOAHHTM12AB018AC87,http://previews.7digital.com/clip/8538329,Bloody Sunday,Set In Stone
-SOAHHUZ12A8C13D111,http://previews.7digital.com/clip/2316338,The Hush Sound,Love You Much Better
-SOAHHWM12A8C1434B6,http://previews.7digital.com/clip/3554016,Light of the World,I Walk The Streets Alone
-SOAHHYM12A6D4F94D4,http://previews.7digital.com/clip/319477,Bryan Ferry,All Night Operator (1999 Digital Remaster)
-SOAHICJ12AB017F2AE,http://previews.7digital.com/clip/4445377,The London Metropolitan Orchestra,Constitutional Crisis
-SOAHICO12A6D4F85D0,http://previews.7digital.com/clip/442374,Danny Williams,I'm Beginning To See The Light
-SOAHIFC12A6D4F7FB8,http://previews.7digital.com/clip/439183,of Montreal,Rapture Rapes The Muses (DJ Dave P. and Adam Sparkles Making Time remix)
-SOAHIFF12A6701E01B,http://previews.7digital.com/clip/3776975,Eagle-Eye Cherry,Crashing Down
-SOAHIFH12AB017ADE6,http://previews.7digital.com/clip/3683955,Phil Keaggy,The Apprentice
-SOAHIGT12AB018CB41,http://previews.7digital.com/clip/30943619,Carl Dawkins,Hard To Handle
-SOAHIHM12A8C139F73,NA,Ewan MacColl,Dirty Old Town
-SOAHIJF12A6D4FDB77,http://previews.7digital.com/clip/3043572,Dream Theater,Surrounded
-SOAHIJS12AAF3B3AAE,http://previews.7digital.com/clip/5847487,Zombie Girl,Bonesniffer
-SOAHILL12A8AE469AB,http://previews.7digital.com/clip/1431886,Sielun Veljet,Mustamaalaan
-SOAHIRN12AF729BE8A,http://previews.7digital.com/clip/1163614,Yellowcard,Date Line (I Am Gone)
-SOAHIWR12A58A7737F,http://previews.7digital.com/clip/4558694,John Rich,I Thought You'd Never Ask
-SOAHIYO12AB0188938,http://previews.7digital.com/clip/7123496,Cheek,Kulje mun kanssa
-SOAHJBD12AB017FB8C,http://previews.7digital.com/clip/11649321,Blockhead,The Music Scene
-SOAHJBZ12A8C133DE5,http://previews.7digital.com/clip/3195685,Fuel,New Thing
-SOAHJCB12A8C135201,NA,The Thermals,Ballad of Big Nothing
-SOAHJGE12AC468918B,NA,Sonicflood,God Rest Ye Merry Gentlemen
-SOAHJHL12A6D4FD084,NA,Across the Border,The Fool and the Bird
-SOAHJID12A8AE487DE,http://previews.7digital.com/clip/4277302,Anna Abreu,Are You Ready
-SOAHJIT12A6D4FA0D6,http://previews.7digital.com/clip/365032,Joy Electric,Synthesized I Want You Synthesized (Christian Songs Album Version)
-SOAHJMA12AB017DE16,http://previews.7digital.com/clip/7031340,Dar Williams,Arrival
-SOAHJON12AB017EB07,http://previews.7digital.com/clip/13799806,Austrian Death Machine,Intro to the Intro
-SOAHJPE12A8C144F99,http://previews.7digital.com/clip/5289357,Emmerson Nogueira,America
-SOAHJQO12AB0183081,NA,Jump Little Children,Pigeon
-SOAHJQY12AB018534B,http://previews.7digital.com/clip/31021103,Madvillain,Money Folder
-SOAHJSV12AC46872A1,http://previews.7digital.com/clip/7768576,Kultiration,Rikemansgetto
-SOAHJTE12A8C13958F,http://previews.7digital.com/clip/4457302,The Hives,Mad Man
-SOAHJTF12A6D4FA4A4,NA,Bobby Collins,Ma' Dog
-SOAHJUT12AF729CAE1,http://previews.7digital.com/clip/2073171,Lisa Gerrard,Sailing To Byzantium
-SOAHJVW12AB01904E9,http://previews.7digital.com/clip/6562890,Jupiter One,Anna
-SOAHJWE12A8C141098,http://previews.7digital.com/clip/1829026,Worlds Apart,Au-delà des larmes
-SOAHJXT12AB01870C4,http://previews.7digital.com/clip/7119444,Mike Stern,Slow Change
-SOAHKAJ12A8C143592,http://previews.7digital.com/clip/7659741,Krisiun,Contradictions Of Decay
-SOAHKBT12A8AE47E1F,http://previews.7digital.com/clip/31865686,Avec pas d'casque,Gratuit à l'achat d'une montagne
-SOAHKBV12A582A2AC6,http://previews.7digital.com/clip/8180893,Johan,Something About You
-SOAHKCM12A6D4F764F,http://previews.7digital.com/clip/3578425,Plan B,Who Needs Actions When You Got Words- album version
-SOAHKER12AB0180249,http://previews.7digital.com/clip/5072472,Aventura,Skit
-SOAHKFJ12A67ADE492,NA,Blue States,Looking Glass
-SOAHKFQ12A8C1415C4,http://previews.7digital.com/clip/8881177,Ahmad Jamal Trio,Angel Eyes
-SOAHKGS12A6D4FB3CB,http://previews.7digital.com/clip/496568,Jessica Andrews,Never Be Forgotten
-SOAHKHL12AC4688687,http://previews.7digital.com/clip/34481359,Kim Waters,You Are The Sunshine of My Life
-SOAHKHU12AB0189CEB,NA,Globus,Europa (Live)
-SOAHKIB12A6D4F929F,NA,Tony Furtado,Another Man
-SOAHKJW12AC9075031,http://previews.7digital.com/clip/37614514,I Am the World Trade Center,Sounds so Crazy
-SOAHKKT12A8C137B92,http://previews.7digital.com/clip/1576183,Eric Tingstad,Rokeby
-SOAHKKZ12AB0187347,http://previews.7digital.com/clip/2892347,The Hold Steady,Slapped Actress
-SOAHKOC12A6D4F9653,http://previews.7digital.com/clip/11793631,Mazz,Dentro De Tu Corazón
-SOAHKOO12AB0181025,http://previews.7digital.com/clip/4622348,Augustus Pablo,Chalawa
-SOAHKOU12AB01839CC,NA,Eddie,Metropolitano
-SOAHKTO12AB0182801,NA,Kultur Shock,Chororo
-SOAHKWB12A6D4F61B3,NA,Engineers,Forgiveness
-SOAHKWC12AAF3B11DA,http://previews.7digital.com/clip/29624860,Jensen Reed,Four Corners
-SOAHKWR12A6310E01A,http://previews.7digital.com/clip/7287,Everclear,Her Brand New Skin
-SOAHKWV12A8C135D93,NA,The Lawrence Arms,Detention
-SOAHKXJ12A8C142E62,http://previews.7digital.com/clip/5325311,Daniel Johnston,Syrup of Tears
-SOAHKYK12AB0187BE6,http://previews.7digital.com/clip/7572451,Scorn,On Ice
-SOAHLBB12A8C1352BB,http://previews.7digital.com/clip/12588496,Leon McAuliffe,Blue Guitar Stomp
-SOAHLDY12A6701F5AE,http://previews.7digital.com/clip/153165,Cat Stevens,The Boy With A Moon And Star On His Head
-SOAHLGV12AF72A6DFC,http://previews.7digital.com/clip/147,blink-182,Adam's Song
-SOAHLHK12AB018AABF,http://previews.7digital.com/clip/8972168,Look Mexico,"They Offered Me A Deal (I Said No, Naturally)"
-SOAHLLE12A6D4F9261,http://previews.7digital.com/clip/443870,Van Hunt,Hole In My Heart
-SOAHLLP12AB01808E5,http://previews.7digital.com/clip/6883709,The Mantles,Disappearing Act
-SOAHLON12A8C142385,NA,Jean Claude Ades,I Begin To Wonder 2008 (Plastik Funk Remix)
-SOAHLOZ12A6D4F85C1,http://previews.7digital.com/clip/233654,BeBe & CeCe Winans,In Return
-SOAHLTF12AB017F9C4,http://previews.7digital.com/clip/326978,Joe Strummer & The Mescaleros,X-Ray Style
-SOAHLUI12AB017C844,http://previews.7digital.com/clip/162798,Soledad Brothers,Cage That Tiger
-SOAHLUK12A58A77F7F,NA,Sami Yusuf,Eid Song
-SOAHLXS12AB018A689,http://previews.7digital.com/clip/15718823,Barry Brown,Step It Up Youthman
-SOAHLYB12A8C146F45,http://previews.7digital.com/clip/4809239,Niños Mutantes,Tu Radiacion
-SOAHLYC12AB017E691,http://previews.7digital.com/clip/6095192,Bo Kaspers Orkester,Är Det Där Vi Är Nu
-SOAHLYW12A6D4F8E5B,http://previews.7digital.com/clip/414252,Sweet Honey in the Rock,Sometime (Album Version)
-SOAHMFO12AC3DF7EA5,http://previews.7digital.com/clip/8584627,Meshell Ndegeocello,Sweet Love
-SOAHMGX12AC468B4E9,http://previews.7digital.com/clip/7736177,Tattoo Rodeo,Everybody Wants What She's Got
-SOAHMHB12AB0186F3C,http://previews.7digital.com/clip/9006647,Carole King,Machine Gun Kelly
-SOAHMJM12A81C22D63,http://previews.7digital.com/clip/11423352,Judge D,The End
-SOAHMNB12A8C130EE8,http://previews.7digital.com/clip/2072705,Badly Drawn Boy,Stone On The Water
-SOAHMNG12A8C138EB7,http://previews.7digital.com/clip/1686715,The Blue Aeroplanes,S.t.r.a.n.g.e
-SOAHMNT12A6D4F6760,http://previews.7digital.com/clip/863392,Ultra Vivid Scene,Lightning
-SOAHMQR12A8C14205C,http://previews.7digital.com/clip/8150266,Mike Ladd,Infogee Rhapsody
-SOAHMRZ12A6D4F85BF,http://previews.7digital.com/clip/280108,Thalia,Quiero Hacerte El Amor
-SOAHMSF12AB0181AEA,http://previews.7digital.com/clip/36201638,Goldie,Never Still
-SOAHMSR12A58A7DA53,http://previews.7digital.com/clip/2027179,One Bad Pig,Swine Flew
-SOAHMTV12AB017C3EE,http://previews.7digital.com/clip/4859209,Pan.Thy.Monium,Khaooohs I
-SOAHMUP12AB0188112,http://previews.7digital.com/clip/19616685,Minotaur Shock,Three Magpies
-SOAHMVK12AB0182E6C,http://previews.7digital.com/clip/30410804,Xu Xu Fang,Fascination Street
-SOAHMYB12A8C1334CF,http://previews.7digital.com/clip/3197281,Ashley Ballard,Don't Get Lost In The Crowd (From Center Stage)
-SOAHMZK12A6D4F868A,http://previews.7digital.com/clip/16835824,Dominique A,Burano
-SOAHNAN12A8C131D5A,http://previews.7digital.com/clip/2072664,Anjali,Ain't No Friend
-SOAHNAY12A58A77BA9,http://previews.7digital.com/clip/4018907,Sir Neville Marriner,The Birds (1996 Digital Remaster): II. The Dove (Jacques de Gallot)
-SOAHNBL12AB01828FF,http://previews.7digital.com/clip/14918508,Sound Barrier,What Price Glory?
-SOAHNDD12A8C1444F4,http://previews.7digital.com/clip/6838922,Daniel Lanois,For The Beauty Of Wynona
-SOAHNFD12A8C144666,http://previews.7digital.com/clip/6803555,Herb Alpert & The Tijuana Brass,The Charmer
-SOAHNGL12AF72A356F,http://previews.7digital.com/clip/5443731,Los Tiki Phantoms,Regresan de la Tumba
-SOAHNNY12AB01820AF,http://previews.7digital.com/clip/5393698,Jesper Kyd,Meditation of the Assassin
-SOAHNPL12AF72A5F30,http://previews.7digital.com/clip/278965,Geri Halliwell,Don't Call Me Baby
-SOAHNQX12AB018AE2C,http://previews.7digital.com/clip/8950443,Becky,Toki no nakani
-SOAHNRC12A8C138210,http://previews.7digital.com/clip/3355076,PeterLicht,Lied gegen die Schwerkraft
-SOAHNRG12AB0184320,http://previews.7digital.com/clip/6767398,Pastora Soler,Volver a Sevilla
-SOAHNRS12A8C13AE3C,http://previews.7digital.com/clip/1089216,Lou Reed,Endless Cycle
-SOAHNTN12A67AE20AA,http://previews.7digital.com/clip/693878,Voodoo Church,May I
-SOAHNUK12A8C1373BB,http://previews.7digital.com/clip/3290974,Per Gessle,Jo-Anna Says Farewell
-SOAHNWQ12A8C13440F,http://previews.7digital.com/clip/3240091,Joe Lynn Turner,Feel The Fire
-SOAHNXD12AC468EEB6,http://previews.7digital.com/clip/35978813,Delerium,Monuments of Deceit
-SOAHOAU12A8C1394ED,http://previews.7digital.com/clip/1430639,Hell Is for Heroes,Burning Lafayette
-SOAHOBE12AB0187F18,http://previews.7digital.com/clip/8425097,Current Value,Death Marching (Katharsys remix
-SOAHOCO12A6D4F81B4,http://previews.7digital.com/clip/256104,Ghoti Hook,It's Alright
-SOAHOHL12A6D4F683A,http://previews.7digital.com/clip/224460,Sister Hazel,Green (Welcome To The World)
-SOAHOIU12AB0185B86,NA,Diary of Dreams,Odyssey Asylum
-SOAHOKI12A6310D8DB,http://previews.7digital.com/clip/7997,Derek and Clive,I Can't Shit
-SOAHONR12A6D4F964D,http://previews.7digital.com/clip/1657294,Mazz,El Juego Es Tuyo
-SOAHONZ12A6D4F668A,http://previews.7digital.com/clip/295193,La Mosca Tsé-Tsé,Patadas En El Corazon
-SOAHOOF12AB017D8CE,http://previews.7digital.com/clip/6971369,Metronomy,Black Eye/Burnt Thumb
-SOAHOSV12AB0185DA4,http://previews.7digital.com/clip/8905604,Nach,Intro
-SOAHOWC12A8C145446,http://previews.7digital.com/clip/36180991,Hanne Hukkelberg,Salt Of The Earth
-SOAHOYE12AB01845B7,NA,Amon Amarth,Thousand Years Of Oppression
-SOAHPAW12AB018478A,NA,Afrob,Allein
-SOAHPBR12AC392A890,http://previews.7digital.com/clip/9086177,Gare du Nord,Come To The Ball (Bond Mix)
-SOAHPCS12AB017ED55,http://previews.7digital.com/clip/5516269,Alison Krauss,I'm Gone
-SOAHPFI12AB017D82F,http://previews.7digital.com/clip/5452210,Tristania,Lotus
-SOAHPHS12A6D4F825D,http://previews.7digital.com/clip/276667,Richard Groove Holmes,Groovin' Time
-SOAHPLE12A8C13C53C,http://previews.7digital.com/clip/1689493,Alberto Plaza,Adios (acústico)
-SOAHPLI12AB01887CC,http://previews.7digital.com/clip/8928307,Ambelique,Hallelujah
-SOAHPLX12A58A7BCEE,http://previews.7digital.com/clip/3007752,Akphaezya,Khamsin
-SOAHPNG12A8C13E437,http://previews.7digital.com/clip/3434736,Gripin,Elalem
-SOAHPNK12A8C144649,http://previews.7digital.com/clip/6803550,Herb Alpert & The Tijuana Brass,Shades Of Blue
-SOAHPNQ12AC468D71B,http://previews.7digital.com/clip/32005053,Julian Fane,Jonah The Freak
-SOAHPOL12A8AE46EA9,NA,Primal Fear,Fear
-SOAHPON12AB0183CC7,http://previews.7digital.com/clip/14447178,The Hassles,Further Than Heaven
-SOAHPOW12A8C142E38,http://previews.7digital.com/clip/5251766,Korpiklaani,Isku Pitkästä Ilosta
-SOAHPPA12A8AE46C11,http://previews.7digital.com/clip/2574136,Kings of Tomorrow,Thru (Junior Jack Remix)
-SOAHPPV12A6D4FB0FA,http://previews.7digital.com/clip/3022831,Remembering Never,Con Artist
-SOAHPRE12A6D4F9582,http://previews.7digital.com/clip/415073,Soul Asylum,Growing Pain
-SOAHPSK12AB017D8FD,NA,Dave Gahan,Dirty Sticky Floors (Junkie XL Vocal Remix)
-SOAHPTJ12A8C13DD2B,http://previews.7digital.com/clip/2436120,Emily Jane White,Time On Your Side
-SOAHPTZ12A81C235E0,http://previews.7digital.com/clip/3074014,Los Originales de San Juan,Del Brazo De Otro
-SOAHPUK12A6D4F7D4A,http://previews.7digital.com/clip/4706721,EPMD,You Had Too Much To Drink
-SOAHPUX12AC4687362,NA,Geiom,Eitiel
-SOAHPVJ12A8C132F37,http://previews.7digital.com/clip/2629603,Tommy Peoples,"The Silver Spire, The Boys of Ballisadare"
-SOAHPVM12AB018868C,http://previews.7digital.com/clip/19821768,Soldiers of Jah Army,True Love
-SOAHPVX12A8C13519F,http://previews.7digital.com/clip/34623777,Silly Wizard,Wi' My Dog And Gun
-SOAHPXB12A8C139325,http://previews.7digital.com/clip/31005005,Matthew Dear,Vine To Vine
-SOAHPXV12AB018FC1F,NA,Gary Numan,Gymnopédie No. 1 (Demo)
-SOAHPZT12AB017DED6,http://previews.7digital.com/clip/36077468,Morgan Page,Fight For You
-SOAHPZT12AB01874C2,http://previews.7digital.com/clip/5072169,DJ Paul,Dont Get Up On Me
-SOAHQBL12A8C1411E3,NA,John Pinette,Low Carb Diets and Dr. Phil
-SOAHQDE12A8AE46A31,http://previews.7digital.com/clip/2014076,Vybz Kartel,What U Want From Me
-SOAHQFM12A8C134B65,http://previews.7digital.com/clip/15899289,Autopsy,Service For A Vacant Coffin
-SOAHQHR12AB0181C8E,http://previews.7digital.com/clip/4875270,Poncho K,Al Loro
-SOAHQIB12A8C142BB6,http://previews.7digital.com/clip/3521524,Black Box Recorder,Andrew Ridgley
-SOAHQIR12B0B80AEA4,NA,Shantel,Fige Ki Ase Me
-SOAHQPL12AB01868AF,http://previews.7digital.com/clip/8740587,Zpu,Servicio de Habitaciones
-SOAHQWP12A8C13F772,NA,Bastian,Love Sickness
-SOAHQZR12A8C13F7B0,http://previews.7digital.com/clip/1774401,Discount,Malarie's Mission
-SOAHRFR12AB018B782,http://previews.7digital.com/clip/8542463,Umek,Utopian Societies
-SOAHRLQ12A6D4FCCB6,http://previews.7digital.com/clip/1906314,Buddy Guy,The Garbage Man Blues
-SOAHRLX12A58A7C372,http://previews.7digital.com/clip/8040518,DJ Icey,A Little Louder (kelly Reverb vs Funk W Texas Sidewiinder Mix)
-SOAHRNL12A8AE45FAD,http://previews.7digital.com/clip/7099382,Barbara Jones,Let It Be
-SOAHROC12A8C13E91D,http://previews.7digital.com/clip/3532264,La Oreja de Van Gogh,Cuantos Cuentos Cuento
-SOAHROC12AB017F5C3,http://previews.7digital.com/clip/5044963,Pat Metheny,Ferry Cross The Mersey
-SOAHRPN12AB018687F,http://previews.7digital.com/clip/17264487,Rabia Sorda,Walking on Nails
-SOAHRTD12AC3DF92D4,NA,The Q4,One of These Days (Glen Porter Remix)
-SOAHRWC12AF72A1735,http://previews.7digital.com/clip/7573145,Carcass,Carbonized Eyesockets
-SOAHRWS12A8C13CE1C,http://previews.7digital.com/clip/1692555,Wordsworth,3eme Mvt Con Moto Mod.(Sym N4 La Maj Op90 Italian)
-SOAHRXL12A6D4F5E00,http://previews.7digital.com/clip/243112,Lonnie Gordon,Little Ghetto Boy
-SOAHRYN12AAF3B1C36,http://previews.7digital.com/clip/3642566,Paul Taylor,Pendulum
-SOAHSAF12A81C238F8,http://previews.7digital.com/clip/6756119,Fragile State,Hoop Dreams (Ralph Myerz 5th Floor Magic Retake)
-SOAHSBR12A58A7DC26,http://previews.7digital.com/clip/7575053,C-Murder/Silkk The Shocker,Get N Paid (feat. Silkk The Shocker)
-SOAHSCV12A6D4F672F,NA,Bo Hansson,Leaving Shire (2002 Digital Remaster)
-SOAHSEP12A6D4FBBF5,http://previews.7digital.com/clip/685565,Rosario,Yo Se Que Te Amare
-SOAHSEQ12AB017ED27,http://previews.7digital.com/clip/5516258,Aeroblus,Aire En Movimiento (Remastered Version)
-SOAHSGD12A8C12FFFB,http://previews.7digital.com/clip/21734364,Cesária Évora,Besame Mucho
-SOAHSHC12AF72A3DF1,http://previews.7digital.com/clip/7466798,Pride and Fall,Serenade Of Dreams
-SOAHSHF12A6D4F9550,http://previews.7digital.com/clip/494300,Anita Lipnicka I John Porter,Love Song (Live)
-SOAHSJC12AB018BBB2,http://previews.7digital.com/clip/6433233,Brand New,Noro
-SOAHSJT12A6D4F7FDB,http://previews.7digital.com/clip/488802,Edie Brickell,Lover Take Me
-SOAHSJZ12A81C2341E,http://previews.7digital.com/clip/1625817,Cut 'n' Move,Real Emotion
-SOAHSJZ12AB018B18C,http://previews.7digital.com/clip/7558415,Adrian Belew,Heartbeat
-SOAHSMI12AF72A9FA7,http://previews.7digital.com/clip/7031497,Dar Williams,End Of The Summer
-SOAHSOG12A6D4FB24A,http://previews.7digital.com/clip/1526042,Warrior King,I Wonder
-SOAHSOV12AB01846CA,http://previews.7digital.com/clip/17731824,Lizzy Parks,It Was A Very Good Year
-SOAHSRF12AB0183F3D,http://previews.7digital.com/clip/4960514,Hector Zazou,Ice flower
-SOAHSWE12A8C1408B6,NA,Arrah and The Ferns,Bernadette
-SOAHSYQ12A8C133EBF,NA,Steve Vai,Devil's Food
-SOAHSZF12A8C13D7F6,http://previews.7digital.com/clip/2357581,Oscar Peterson Trio,Quiet Nights of Quiet Stars (Corcovado)
-SOAHTAT12A58A7BFED,http://previews.7digital.com/clip/125243,bloodsimple,What If I Lost It
-SOAHTBW12A6D4FAFB4,http://previews.7digital.com/clip/629696,Gyroscope,Get Down
-SOAHTGV12A58A7C373,http://previews.7digital.com/clip/8081721,Pnau,The Last Track
-SOAHTJZ12AB01835D9,http://previews.7digital.com/clip/5129547,Ornatos Violeta,Chaga
-SOAHTKF12A8C14315C,http://previews.7digital.com/clip/7718781,Björn Rosenström,Nu du kärring
-SOAHTML12AB0186D0E,http://previews.7digital.com/clip/7979235,Sincabeza,Malalido
-SOAHTNQ12AC9097B99,http://previews.7digital.com/clip/7693487,Mia X,Rainy Dayz
-SOAHTNY12AC9097A85,http://previews.7digital.com/clip/8684626,The Nels Cline Singers,Red Line to Greenland
-SOAHTSO12A67AD7164,http://previews.7digital.com/clip/33927553,The Warlocks,Come Save Us
-SOAHTXF12A8C13BB02,http://previews.7digital.com/clip/1672920,Jean-Louis Murat,Mirabelle Mirabeau
-SOAHTXK12A8C13DF3A,http://previews.7digital.com/clip/1184998,Marco Beltrami,Out Of Bullets
-SOAHTYB12A670208C2,http://previews.7digital.com/clip/11496366,The Heptones,Diana
-SOAHTZL12A6D4F9EE8,http://previews.7digital.com/clip/11679816,The Cinematic Orchestra,In To You
-SOAHUAC12A58A7F49C,http://previews.7digital.com/clip/2376791,Blue Rodeo,Small Miracles
-SOAHUBH12A67ADE3CD,http://previews.7digital.com/clip/716696,Warren Zevon,Bo Diddley's A Gunslinger/Bo Diddley (2007 Remastered Live LP Version)
-SOAHUDL12AB017A6A5,http://previews.7digital.com/clip/9041653,Classified,Things Are Looking Up
-SOAHUDO12A8C133DBB,http://previews.7digital.com/clip/15899628,Katatonia,Increase
-SOAHUEA12A8C13A8B1,http://previews.7digital.com/clip/2855141,Amy Winehouse,"Teach Me Tonight (Live, Hootenanny, London/2004)"
-SOAHUED12A6701DDB1,http://previews.7digital.com/clip/151403,Diana Ross,Rhythm Of Life (TV Soundtrack Version)
-SOAHUEQ12AF72A0229,http://previews.7digital.com/clip/3591416,The Replacements,My Little Problem [Alternate Version]
-SOAHUGD12AB018101A,http://previews.7digital.com/clip/6044742,Hella,The Mother Could Be You
-SOAHULJ12A67ADD7C7,http://previews.7digital.com/clip/184090,East 17,Feel What U Can't C
-SOAHUTA12AB01821A0,http://previews.7digital.com/clip/4532401,Cristian Castro,Lo Mejor De Mi (Remix)
-SOAHUUT12A8C13CC38,NA,Luke Vibert,Blasted Wook
-SOAHUWI12AC468D680,http://previews.7digital.com/clip/35978463,Gob,Lobster Boy
-SOAHUYI12AB0189501,http://previews.7digital.com/clip/6441279,Órla Fallon,Voices On The Wind
-SOAHUZR12AC468CFE6,http://previews.7digital.com/clip/6680052,Screaming Lights,Hello Tomorrow
-SOAHVAU12A6D4F966D,http://previews.7digital.com/clip/496512,Pressure 4-5,These Hands
-SOAHVBC12A58A78F03,http://previews.7digital.com/clip/6160469,Trance Dance,River Of Love
-SOAHVBG12A8C1439A1,http://previews.7digital.com/clip/5645521,Kevin Johansen,Anoche Soñé Contigo
-SOAHVCC12A8C131959,http://previews.7digital.com/clip/21665801,The Old Dead Tree,Start the Fire
-SOAHVHJ12A67020AF1,http://previews.7digital.com/clip/123928,Weezer,Glorious Day
-SOAHVIG12A6D4FC315,http://previews.7digital.com/clip/15682817,Bury Your Dead,Mirror Mirror
-SOAHVKX12A6D4F7C68,http://previews.7digital.com/clip/8395535,Five Deez,peace out
-SOAHVMM12AB017CA38,http://previews.7digital.com/clip/3739482,Juan Formell y los Van Van,Despues de Todo
-SOAHVMV12A58A790BE,http://previews.7digital.com/clip/2073887,Resurrection Band,Paint A Picture
-SOAHVNA12A8C134F1B,http://previews.7digital.com/clip/2937610,The Libertines,Tell The King
-SOAHVNT12A8C13DE6F,http://previews.7digital.com/clip/2376795,Blue Rodeo,Where I Was Before
-SOAHVNY12A8C134494,http://previews.7digital.com/clip/9920562,DJ Sammy,The Boys of Summer (US Vocal Extended Mix)
-SOAHVPK12AB0185C7F,http://previews.7digital.com/clip/16557037,Omar And The Howlers,Steady Rock
-SOAHVRU12AB018796D,http://previews.7digital.com/clip/7460490,X,How I (Learned My Lessons)
-SOAHVVU12AC46867D0,http://previews.7digital.com/clip/8156800,The String Cheese Incident,Hold Whatcha Got
-SOAHVXI12A8C143F93,http://previews.7digital.com/clip/3600831,Lewis Taylor,Til The Morning Light
-SOAHWAA12A6D4F8BCE,http://previews.7digital.com/clip/514353,Francesco Guccini,Bisanzio (1996 Digital Remaster)
-SOAHWBL12AC3DF5C8E,http://previews.7digital.com/clip/8590287,Lady & Bird,Stephanie Says
-SOAHWCD12A6702056F,http://previews.7digital.com/clip/99336,Sun Yan-Zi,You Don't Really Love Me
-SOAHWCP12AB0180423,http://previews.7digital.com/clip/17705930,Mychael Danna,A Feather for Your Soul
-SOAHWFY12A8C1402C0,http://previews.7digital.com/clip/16091015,American Music Club,All My Love
-SOAHWKB12A8C139A46,NA,Promoe,Long Distance Runner
-SOAHWLA12AAF3B3357,http://previews.7digital.com/clip/5848865,The Stone Roses,Bye Bye Bad Man
-SOAHWLY12A8C133B56,NA,Mariah Carey,I Am Free
-SOAHWMA12AB0184F18,http://previews.7digital.com/clip/6186776,Cisco Houston,The Killer
-SOAHWMN12A8C13DE6D,http://previews.7digital.com/clip/14927244,Amebix,Right To Ride (Bonus Track)
-SOAHWQW12A8C13657F,http://previews.7digital.com/clip/1625815,Cut 'n' Move,I've Been Waiting
-SOAHWSZ12AB0182317,NA,Gripin,Baba Meslegi
-SOAHWTF12A58A7D9FD,NA,Crippled Black Phoenix,The Whistler
-SOAHWWQ12AC4689407,NA,Rockwell,Bone Structure
-SOAHWWX12AB017CDC2,http://previews.7digital.com/clip/11676663,Jag Panzer,Cold
-SOAHWXH12A6D4F6E90,http://previews.7digital.com/clip/299800,David Guetta,The World Is Mine (Deep Dish Remix)
-SOAHWXT12A8C13965A,http://previews.7digital.com/clip/4044554,Satanic Surfers,Hero Of Our Time
-SOAHWYC12A58A7DD4B,http://previews.7digital.com/clip/306939,Oingo Boingo,My Life (1988 Boingo Alive Version)
-SOAHWYK12A58A7A493,http://previews.7digital.com/clip/3185863,James Taylor,That's Why I'm Here (reprise)
-SOAHWZB12A8AE47097,http://previews.7digital.com/clip/12843405,Primal Scream,Inner Flight
-SOAHXBD12A670214EA,http://previews.7digital.com/clip/152659,dEUS,"One Advice, Space"
-SOAHXDM12A8C13D7EC,NA,Anthony Evans,You're My God
-SOAHXEI12AB01831CF,http://previews.7digital.com/clip/11677164,Treva Whateva,Dedicated VIP
-SOAHXFY12AB0181DCD,http://previews.7digital.com/clip/6007252,Flynt,1 pour la plume
-SOAHXHI12A6D4FE017,http://previews.7digital.com/clip/2488871,Lovex,Time And Time Again
-SOAHXIW12A6D4F7D39,http://previews.7digital.com/clip/242528,The Dubliners,The Fairmoye Lasses And Sporting Paddy (1993 Digital Remaster)
-SOAHXJI12A8C13B7E6,http://previews.7digital.com/clip/5820393,Shinedown,Burning Bright [Remix]
-SOAHXOY12AB0183F15,http://previews.7digital.com/clip/4032014,Ian Siegal,CCKMP
-SOAHXQI12A8C1424D9,http://previews.7digital.com/clip/24035269,Blank Dogs,Leaving The Light On
-SOAHXRG12A8C13BF74,http://previews.7digital.com/clip/3794037,Mateo Messina,The Lorings
-SOAHXSH12A8C141BE8,NA,Herman Düne,My Baby Is Afraid Of Sharks
-SOAHXVV12A6D4FAC88,http://previews.7digital.com/clip/646680,Jim Cuddy,Whistler
-SOAHXYU12A6D4F8010,http://previews.7digital.com/clip/669937,Watashi Wa,Broken Man
-SOAHYCH12A8AE46EEB,http://previews.7digital.com/clip/1348010,Eugenio Finardi,I Giardini Di Marzo
-SOAHYCQ12A6D4FC926,NA,Eisbrecher,Vergissmmeinnicht (Phase III Remix)
-SOAHYEQ12A8C140A08,http://previews.7digital.com/clip/3546815,Talkdemonic,Human Till Born
-SOAHYFL12A58A7EB68,http://previews.7digital.com/clip/9269539,matchbox twenty,All Your Reasons
-SOAHYGN12AAF3B3ADD,http://previews.7digital.com/clip/6865089,Mickey Gang,Horses Can't Dance
-SOAHYHM12A6D4F97D6,http://previews.7digital.com/clip/294433,Melanie C,Water
-SOAHYMF12A8C13383A,NA,June Carter Cash,Oh Susannah
-SOAHYMX12AB0182021,http://previews.7digital.com/clip/3861274,Basement Jaxx,Sfm
-SOAHYQR12A8C13EE16,http://previews.7digital.com/clip/22530300,Cutting Pink With Knives,IDIC
-SOAHYRI12A6D4F8ADB,http://previews.7digital.com/clip/215417,Tim Wilson,The Family Reunion
-SOAHYUO12AAF3B4800,http://previews.7digital.com/clip/6871180,Commissioned,No More Loneliness
-SOAHYYL12A58A784E7,http://previews.7digital.com/clip/10221176,Etran Finatawa,A Dunya
-SOAHZAZ12AB0183102,NA,Goteki,Geisha Deconstruct
-SOAHZDZ12AF72A8A68,http://previews.7digital.com/clip/3106858,Rick Astley,Till Then (Time Stands Still)
-SOAHZGM12AF72ABE0D,http://previews.7digital.com/clip/3662866,The Alan Parsons Project,One Good Reason
-SOAHZIE12AB0181D50,http://previews.7digital.com/clip/5926843,Broadcast,Hammer Without A Master
-SOAHZKH12A58A7772C,http://previews.7digital.com/clip/16086370,The Apples in Stereo,Rainfall
-SOAHZKJ12AB018589E,NA,Yves Deruyter,The Rebel (Original Mix)
-SOAHZKM12A6D4F7985,http://previews.7digital.com/clip/231021,K-Ci & JoJo,What Am I Gonna Do
-SOAHZNC12A8C140BC6,http://previews.7digital.com/clip/4155213,ballboy,Songs For Kylie
-SOAHZRA12A6D4F9A1F,NA,Egberto Gismonti,Mágico
-SOAHZRZ12A8C137C36,http://previews.7digital.com/clip/1548838,Bob Carlisle,Man Of No Reputation
-SOAHZRZ12A8C13D3A7,http://previews.7digital.com/clip/2353646,Aaron Sprinkle,No Reason To Pretend
-SOAHZSF12A58A7662E,http://previews.7digital.com/clip/2936517,Aberfeldy,Something I Must Tell You
-SOAHZSS12A8C1306BB,http://previews.7digital.com/clip/3166834,Milton Nascimento,Idolatrada/Paula E Bebeto
-SOAHZSS12A8C136D39,http://previews.7digital.com/clip/2244399,Percubaba,Tambours Beatnik
-SOAHZSX12A6701D967,http://previews.7digital.com/clip/162402,Amy Studt,If Only
-SOAHZWE12A8C136F43,http://previews.7digital.com/clip/2170768,Sir Neville Marriner,Die Frau Meisterin: Overture
-SOAHZZV12AC960A2DB,http://previews.7digital.com/clip/32206385,Ego Likeness,Raise Your Red Flags
-SOAIAAI12AB0180A64,http://previews.7digital.com/clip/3838862,Letta Mbulu,What's Wrong With Groovin'
-SOAIAAT12A8C145D49,http://previews.7digital.com/clip/3615402,Creedence Clearwater Revival,Bad Moon Rising
-SOAIABL12AB018BF4E,http://previews.7digital.com/clip/9044230,Ron Sexsmith,Same Old Eyes
-SOAIADV12A6D4F887B,http://previews.7digital.com/clip/300262,Manfred Mann,Brother Jack (Frere Jacques) (1997 Digital Remaster)
-SOAIAEV12A8C13B1AD,http://previews.7digital.com/clip/1709624,Angel Romero,Suite Espanola (2001 Digital Remaster): VII. La Minena de Cataluna
-SOAIAGB12AB017D7D4,http://previews.7digital.com/clip/4290247,Sparta,False Start
-SOAIAHI12A8C132701,http://previews.7digital.com/clip/12749684,Aerosmith,Fly Away From Here
-SOAIAHS12A6D228267,http://previews.7digital.com/clip/8131282,Cryptopsy,Depths You've Fallen
-SOAIAHV12AB018B2DA,http://previews.7digital.com/clip/8913789,DJ Yulian,Shock
-SOAIAJK12A6D4F9D1D,NA,Miguel Caló,Disco Rayado
-SOAIAKJ12AB018235B,http://previews.7digital.com/clip/7643118,Louise Attaque,Justement
-SOAIAMF12A8C13E28E,NA,Chandeen,Welcome The Still
-SOAIAOQ12A8C13620D,http://previews.7digital.com/clip/1557838,José Mercé,Oxígeno
-SOAIAOV12AC9072FC3,http://previews.7digital.com/clip/6686495,Dwight Yoakam,Since I Started Drinkin' Again
-SOAIAOZ12A8C136BE1,http://previews.7digital.com/clip/3301096,Estopa,Tanta Tinta Tonta
-SOAIAQG12A6D4FA937,http://previews.7digital.com/clip/629214,Jean-Luc Ponty,Question With No Answer
-SOAIAQO12A6D4FACE9,http://previews.7digital.com/clip/576179,American Head Charge,Effigy 23 (Album Version (Explicit))
-SOAIAWN12AB0187356,http://previews.7digital.com/clip/6499295,Carlos Baute,Pobre diabla (Directo 09)
-SOAIAWO12A8C1325EF,http://previews.7digital.com/clip/2072826,The Prodigy,No Man Army
-SOAIAXK12A6D4F8BA6,http://previews.7digital.com/clip/514302,Saïan Supa Crew,Originales (live)
-SOAIBAM12AB0185EB5,http://previews.7digital.com/clip/5633438,Matt Nathanson,Heartbreak World
-SOAIBBI12A58A7CBDE,http://previews.7digital.com/clip/7398488,RBL Posse,Niggas On The Jock
-SOAIBBT12AB018A8E6,http://previews.7digital.com/clip/6323039,Ivy,15 Seconds
-SOAIBDW12AB017B34E,NA,Raymond Scott,Good Air (take 7)
-SOAIBEJ12A6D4F93B6,NA,Amon Tobin,Esther's
-SOAIBLU12AB0184F75,http://previews.7digital.com/clip/18852301,Sandy Posey,The Single Girl
-SOAIBMY12A6D4F94EA,http://previews.7digital.com/clip/368377,JT Money,On Da Grind
-SOAIBNS12A6D4F8238,http://previews.7digital.com/clip/3115554,Pink Fairies,The Snake
-SOAIBOU12A8C13C56B,http://previews.7digital.com/clip/11589556,Dinah Shore,Way Down Yonder in New Orleans
-SOAIBPS12A8C139792,http://previews.7digital.com/clip/2226164,Union 13,The Game
-SOAIBQA12AB01873AF,http://previews.7digital.com/clip/9006930,Byron Lee & The Dragonaires,Ride On Sammy
-SOAIBQK12A8C13F4E0,http://previews.7digital.com/clip/2424070,Tamara,Me Olvidé De Vivir
-SOAIBRV12A58A7A42E,http://previews.7digital.com/clip/31704146,Toumani Diabaté,Ali Farka Toure
-SOAIBTL12A58A7D60D,http://previews.7digital.com/clip/3637239,See You Next Tuesday,Eternity?
-SOAIBVK12A58A7B1CF,http://previews.7digital.com/clip/1288925,The Ventures,Introduction (Live)
-SOAIBWA12AB017E55B,http://previews.7digital.com/clip/5455202,Gamma Ray,Real world
-SOAIBWZ12A8C13E1E9,http://previews.7digital.com/clip/22198379,Rootz Underground,Rain (Album Version)
-SOAIBZF12A6D4F9B97,http://previews.7digital.com/clip/455874,Milk Inc.,Answer me
-SOAICCG12AB018880B,http://previews.7digital.com/clip/8829784,Patrice Pike,Kiss Me Baby
-SOAICDE12AB0182D8D,http://previews.7digital.com/clip/4558681,John Rich,Preacher Man
-SOAICDR12AB018A913,http://previews.7digital.com/clip/4680980,Deniece Williams,Black Butterfly
-SOAICET12A8C13A15D,http://previews.7digital.com/clip/3313883,ZOEgirl,Nick Of Time
-SOAICGF12A8C1322CD,http://previews.7digital.com/clip/34627027,Cliff Eberhardt,Mona Lisa Waits
-SOAICHP12A6D4F5930,http://previews.7digital.com/clip/417203,Metallica,It's Electric
-SOAICHQ12AB018D0F4,NA,Kool Savas,Orchestrator feat. Ercandize
-SOAICIM12AB018C184,http://previews.7digital.com/clip/8441048,The Rentals,It's Alright
-SOAICJA12AB018579C,http://previews.7digital.com/clip/16518606,Terminal Sound System,Alaska
-SOAICJC12A8C13B01F,http://previews.7digital.com/clip/32005174,The Gasman,Vigor
-SOAICKK12A8C13B07F,http://previews.7digital.com/clip/35979664,Sara Melson,Nuclear Sun
-SOAICLQ12A58A7B440,http://previews.7digital.com/clip/7572902,Morbid Angel,Invocation To A Continual One
-SOAICOY12A6D4F8F38,NA,Lyrics Born,Hott Bizness
-SOAICPH12AB0184AB9,NA,Amduscia,Seal you in red
-SOAICQP12AB018191A,http://previews.7digital.com/clip/7581257,3 gars su'l sofa,Trois
-SOAICVP12AB018110D,http://previews.7digital.com/clip/6139771,Times New Viking,Take The Piss
-SOAICVV12A8C1350D2,http://previews.7digital.com/clip/2152893,Marky Ramone,Good Luck You're Gonna Need It
-SOAICVZ12AC4688DCC,http://previews.7digital.com/clip/32976938,Barry Adamson,Diamonds
-SOAICWY12A8C13F8C6,NA,Crucial Conflict,In the Circle
-SOAICYO12AB017D5AA,http://previews.7digital.com/clip/6877612,We Shot the Moon,A Silver Lining
-SOAICZB12AB0189582,http://previews.7digital.com/clip/8488080,Doug Martsch,Impossible (Album Version)
-SOAICZT12A58A770F7,http://previews.7digital.com/clip/1357524,American Hi-Fi,The Everlasting Fall
-SOAIDAN12A6D4FBD8F,http://previews.7digital.com/clip/665513,Robert Rodriguez & Graeme Revell,Cardinal Sin
-SOAIDBB12AB0185D45,http://previews.7digital.com/clip/13799734,Evergreen Terrace,Failure To Operate
-SOAIDBH12A6D4F9D02,http://previews.7digital.com/clip/543367,Banda Cheiro de Amor,Esperando Na Janela
-SOAIDCM12A58A7D66A,http://previews.7digital.com/clip/2225386,U.S. Bombs,The Wig Out
-SOAIDCQ12A8C139A1A,http://previews.7digital.com/clip/1625390,Shenandoah,Nowhere To Go But Back
-SOAIDIQ12A6D4F6C73,http://previews.7digital.com/clip/830847,Luomo,Class
-SOAIDJN12A8C13A518,http://previews.7digital.com/clip/3384698,Angie Stone,Come Home (Live With Me)
-SOAIDJT12A8C13C67E,http://previews.7digital.com/clip/3367171,Adema,Betrayed Me
-SOAIDJX12AAFF4050B,http://previews.7digital.com/clip/5865624,Larry Norman,The Rock That Doesn't Roll
-SOAIDKA12A58A768A9,http://previews.7digital.com/clip/6838146,Randy Travis,I Won't Need You Anymore
-SOAIDPJ12AAA8C9033,http://previews.7digital.com/clip/3623176,Anis,L'eau
-SOAIDPN12A8C132620,http://previews.7digital.com/clip/3165468,Yo-Yo Ma,Primacy of Number
-SOAIDRV12AB01888BB,http://previews.7digital.com/clip/6323524,Collective Soul,All
-SOAIDSN12A6D4F6FB9,http://previews.7digital.com/clip/370021,The J. Geils Band,Mean Love
-SOAIDTB12AB0189912,http://previews.7digital.com/clip/8408411,David Sanborn,Rumpelstiltskin
-SOAIDTF12AB018968E,http://previews.7digital.com/clip/7303300,Single File,Girlfriends
-SOAIDZQ12A6D4FBD08,http://previews.7digital.com/clip/14614677,Goldenhorse,Fish
-SOAIDZX12A8C13B3B6,NA,Codeseven,Leaches Of Karma
-SOAIEAX12A58A7FB52,NA,Steinski,Hit The Disco (Mc Enuff Mix)
-SOAIEFQ12AB0181A5D,http://previews.7digital.com/clip/14921972,Helstar,Winds Of War
-SOAIEIN12A8C13F8B0,NA,New Buffalo,Lobe Limbique
-SOAIEIX12A6D4F9014,http://previews.7digital.com/clip/555028,Perturbazione,Spalle Strette
-SOAIEJF12A6D4F95DE,http://previews.7digital.com/clip/533944,Jesse Cook,Paloma
-SOAIELM12A6701DEEC,http://previews.7digital.com/clip/3329614,Live,Top
-SOAIEMM12AB017EC98,http://previews.7digital.com/clip/4971352,The Black Crowes,Locust Street
-SOAIEQQ12A81C21675,http://previews.7digital.com/clip/3059941,Dir en grey,Jesus Christ R'n'R
-SOAIERA12A81C22C66,http://previews.7digital.com/clip/2529492,Oneiroid Psychosis,Birth and Death
-SOAIEYC12A6D4F9233,http://previews.7digital.com/clip/372280,Inimigos da HP,Caça E Caçador
-SOAIFAD12A58A7991B,http://previews.7digital.com/clip/413061,Maura O'Connell,Irish Blues
-SOAIFAY12A8C146696,http://previews.7digital.com/clip/3599636,스텔라,Migration Instinct
-SOAIFCN12A6D4F758B,http://previews.7digital.com/clip/315791,Shyheim,Still There
-SOAIFDF12AB018140C,http://previews.7digital.com/clip/7709088,Symphony X,Eve Of Seduction
-SOAIFFB12A58A7C8B7,http://previews.7digital.com/clip/3548066,Nonpoint,Impossible Needs
-SOAIFFU12AB018903E,http://previews.7digital.com/clip/11667812,Violent Femmes,Freak Magnet
-SOAIFFW12A58A7E117,NA,Capdown,I Wanna Riot
-SOAIFHS12A8C132481,http://previews.7digital.com/clip/3163995,Rodney Crowell,The Obscenity Prayer (Give It To Me)
-SOAIFJS12AB0180670,http://previews.7digital.com/clip/5158902,John Wesley,Come and Gone
-SOAIFLG12AB0186AFC,http://previews.7digital.com/clip/12902732,Carmel,More More More
-SOAIFLU12AB0185F65,http://previews.7digital.com/clip/6021448,Patrick Bruel,"Joue, Docteur Joue !"
-SOAIFNY12AF72A5A0E,http://previews.7digital.com/clip/4426693,KRS-One,The Teacha Returns
-SOAIFSL12A8C13C17A,http://previews.7digital.com/clip/1101218,Daisy,Új élet kezdodik
-SOAIFSN12A8C143DB6,http://previews.7digital.com/clip/4793349,NOFX,Best God In Show
-SOAIFTL12AF72AC0B7,http://previews.7digital.com/clip/3780502,D12,Dude (Skit)
-SOAIFUE12AB017DB24,http://previews.7digital.com/clip/4434741,Larnelle Harris,The Lord's Prayer
-SOAIFUN12A8C13B9F5,http://previews.7digital.com/clip/2266958,Murderdolls,Dressed To Depress
-SOAIFUP12A8C139F8C,http://previews.7digital.com/clip/1099608,Badly Drawn Boy,A Journey From A To B (Oui FM)
-SOAIFUU12AF72A22DD,http://previews.7digital.com/clip/8014463,Enuff Z'Nuff,Wheels
-SOAIFVL12AB0184D6D,http://previews.7digital.com/clip/3777069,Molotov,Da Da Da (DADADA)
-SOAIFXB12A6701F857,http://previews.7digital.com/clip/97374,Revolver,Dame
-SOAIFZY12AB0184688,NA,Natas,Kill Me
-SOAIGBA12AF72AB214,http://previews.7digital.com/clip/32918279,Liars,Mr Your On Fire Mr
-SOAIGEU12A8C133D31,http://previews.7digital.com/clip/2684372,Fulanito,Trai la Bulla
-SOAIGGA12A8AE4899A,http://previews.7digital.com/clip/2000875,David Bromberg,Spanish Johnny
-SOAIGGC12A8AE46C4F,http://previews.7digital.com/clip/4250277,Leona Lewis,Take A Bow
-SOAIGHO12A8C13B2B9,http://previews.7digital.com/clip/1658874,Trijntje Oosterhuis,They Can't Take That Away From Me (Live)
-SOAIGII12A8AE47CE0,http://previews.7digital.com/clip/2576967,Kiuas,Across The Snows
-SOAIGOC12AC9097324,http://previews.7digital.com/clip/34559708,Ofra Haza,Tzur Menti/Se'i Yona/Sapri Tama
-SOAIGOQ12A6D4F9A76,http://previews.7digital.com/clip/8719293,Faith No More,Collision
-SOAIGPJ12A6D4F86DA,http://previews.7digital.com/clip/547221,Jarabe de Palo,Agustito Con La Vida
-SOAIGTO12AAF3B4676,http://previews.7digital.com/clip/4634725,Adagio,Getsu Senshi
-SOAIGTW12AF72A1104,http://previews.7digital.com/clip/312934,Deana Carter,To The Other Side
-SOAIGUM12A6D4F6FCB,http://previews.7digital.com/clip/370241,The Rascals,Nubia
-SOAIGVD12A8AE48707,http://previews.7digital.com/clip/2015982,La buena vida,Honrado Ciudadano De Occidente
-SOAIGXG12A6D4F9CF1,http://previews.7digital.com/clip/683525,Passion,I Will Exalt Your Name (Passion 98 Album Version)
-SOAIGXN12A6D4F7328,NA,The Frank And Walters,Indian Ocean
-SOAIGXT12A58A7AC37,http://previews.7digital.com/clip/3679717,The Real Kids,No Place Fast
-SOAIGYY12A8C13598B,http://previews.7digital.com/clip/2126722,Gene McDaniels,Will It Last Forever (1995 Digital Remaster)
-SOAIHAS12A6310EDD9,http://previews.7digital.com/clip/2631,Lewis Taylor,How
-SOAIHCA12AB018F461,http://previews.7digital.com/clip/8559307,36 Crazyfists,Circle the Drain (Demo)
-SOAIHCO12A8C13746B,http://previews.7digital.com/clip/2178081,Nubla,Al Agua
-SOAIHEF12A6D4F8109,http://previews.7digital.com/clip/309647,Ivor Cutler,Oho My Eyes
-SOAIHGO12A8C137205,http://previews.7digital.com/clip/981824,Michael McDonald,You Are Everything
-SOAIHHM12A8151CB62,http://previews.7digital.com/clip/5373078,Clinic,Visitations
-SOAIHKO12A6D4F7B53,http://previews.7digital.com/clip/793707,The Cranberries,I Don't Need
-SOAIHML12A58A7A6B0,http://previews.7digital.com/clip/1692233,Jacek Kaczmarski,Koleda
-SOAIHPB12A58A7B182,http://previews.7digital.com/clip/15699577,Ben Folds,Gracie
-SOAIHRS12A6D4FA484,http://previews.7digital.com/clip/525654,Hector 'El Father',Hello Mama
-SOAIHTN12AB01856C9,NA,Para,Zatancuj
-SOAIHWL12A58A7DC0F,http://previews.7digital.com/clip/4387098,Buffy Sainte-Marie,You Know How To Turn on Those Lights
-SOAIHWX12A6D4FC493,http://previews.7digital.com/clip/1286462,Lil' Kim,Single Black Female
-SOAIHXZ12A6D4F991A,http://previews.7digital.com/clip/354927,Fito Páez,Yo Te Ame en Nicaragua
-SOAIHZN12A8C13D352,http://previews.7digital.com/clip/2319682,Rodolphe Burger,Elle Est Pas Belle Ma Chérie ?
-SOAIIBF12A8C13517B,http://previews.7digital.com/clip/3239680,Kleeer,Running Back To You
-SOAIICY12A8C13B733,http://previews.7digital.com/clip/4510408,Klément Julienne,Martin
-SOAIIDF12A58A7AECF,http://previews.7digital.com/clip/18102173,Carla Bozulich,Can I Sleep In Your Arms?
-SOAIIHI12AB0183223,http://previews.7digital.com/clip/6259147,Mohsen Namjoo,Toranj
-SOAIIHS12A8C13D666,http://previews.7digital.com/clip/3378832,Renee Rosnes,Abstraction Blue (for Georgia O'Keeffe)
-SOAIIJV12A8C13D2B5,http://previews.7digital.com/clip/1159554,Against Me!,New Wave
-SOAIIKX12A8C133D00,http://previews.7digital.com/clip/3166932,Milton Nascimento,Sunset Marquis 333 - Los Angeles
-SOAIIPA12A8C13E0EC,http://previews.7digital.com/clip/20236247,Katatonia,This Punishment
-SOAIIPB12A8C133940,http://previews.7digital.com/clip/32215140,Luke Vibert,Prick Tat
-SOAIIUJ12A8C137819,http://previews.7digital.com/clip/1592807,Academy of St. Martin-in-the-Fields/Sir Neville Marriner,"Prelude from Holberg Suite, Op.40"
-SOAIIUQ12A8C13D355,http://previews.7digital.com/clip/21542565,Dan Bern,Baby Bye Bye
-SOAIIYK12A6D4F6666,NA,Daft Punk,Human After All (Alter Ego Remix)
-SOAIIZY12AB01822AE,http://previews.7digital.com/clip/3823912,Peter Cetera,On The Line
-SOAIJCU12A6D4FBDE3,http://previews.7digital.com/clip/34478724,Ann Hampton Callaway,Easy to Love
-SOAIJCU12A81C23B1D,http://previews.7digital.com/clip/1366740,L-Kan,Pobrecilla
-SOAIJFI12AB0188387,http://previews.7digital.com/clip/6405876,Alison Krauss,"Baby, Now That I've Found You"
-SOAIJHH12A81C20668,http://previews.7digital.com/clip/1377130,John Stevens,Let's Fall In Love
-SOAIJIL12AC46861C4,http://previews.7digital.com/clip/6631955,Faith Hill,This Kiss
-SOAIJKC12A8C131D6F,http://previews.7digital.com/clip/3154858,The Fabulous Thunderbirds,Why Get Up
-SOAIJKU12AB017CE6C,http://previews.7digital.com/clip/3694257,The Rippingtons,Be Cool
-SOAIJLA12A58A79A39,http://previews.7digital.com/clip/629009,Fanny,Borrowed Time
-SOAIJMI12A8C13827B,http://previews.7digital.com/clip/2784867,Rondellus,Spiral Architect (Architectus Urbis Caeletis)
-SOAIJMO12A67ADAC59,http://previews.7digital.com/clip/3238879,Sam & Dave,Wrap It Up
-SOAIJPU12A6D4F8B81,http://previews.7digital.com/clip/317616,Gang Starr,JFK 2 LAX
-SOAIJQN12AAF3B4FEC,http://previews.7digital.com/clip/13625131,Rocco,Drop the Bass (In Da Mix)
-SOAIJSH12A6D4FAEAC,NA,Ibrahím Ferrer,Ahora No Puedo
-SOAIJSM12AB0186D1B,http://previews.7digital.com/clip/12415972,Use,Dance With Me
-SOAIJUA12A8C132770,http://previews.7digital.com/clip/1509518,The Cult,Christians (Lyceum Live)
-SOAIJVL12AC3DF6D93,NA,Kiave,Live Report (feat. Patrick Benifei)
-SOAIJXI12A8C135007,http://previews.7digital.com/clip/15355435,Saves the Day,Woe
-SOAIJYG12A6D4FBBF4,http://previews.7digital.com/clip/5319651,Gary P. Nunn,Roadtrip
-SOAIJYK12AB01860DF,http://previews.7digital.com/clip/33493317,Moneybrother,It Might As Well Be Winter All Year Long
-SOAIJZD12A6D4F6445,http://previews.7digital.com/clip/6006414,The Notorious B.I.G.,"I'm With Whateva (featuring Lil' Wayne, Juelz Santana and Jim Jones)"
-SOAIKAJ12A8C143110,http://previews.7digital.com/clip/3598896,Cocteau Twins,High Monkey Monk
-SOAIKAT12A8C141961,http://previews.7digital.com/clip/4167789,HammerFall,One Of A Kind
-SOAIKBV12A6701C388,http://previews.7digital.com/clip/87576,Candlebox,Sometimes
-SOAIKCL12AB018A2A6,http://previews.7digital.com/clip/15263298,The Phantom,Love Me
-SOAIKEQ12AB018971D,http://previews.7digital.com/clip/7307247,Sinéad O'Connor,The State I'm In
-SOAIKFU12A8C13EFA6,NA,Breaking Point,Killing With Kindness
-SOAIKGL12AB0184ABD,NA,Amduscia,Incitación pagana
-SOAIKIM12AAF3B4D29,http://previews.7digital.com/clip/36742440,Nazan Öncel,Küçük Gemiler
-SOAIKIT12AB018CE82,http://previews.7digital.com/clip/6626463,Raul Midón,Next Generation
-SOAIKJR12AB017F1B8,http://previews.7digital.com/clip/6881519,Max B,Disturbia Money
-SOAIKLV12AB0187C83,http://previews.7digital.com/clip/7903211,Atrox,A Minds Escape
-SOAIKTN12A8C13CBFE,http://previews.7digital.com/clip/6978835,Thrice,To What End
-SOAIKUG12AB017F7A7,http://previews.7digital.com/clip/5073912,Screaming Trees,Troubled Times
-SOAIKWE12A8C13C95A,http://previews.7digital.com/clip/313213,Grant Green,California Green (2007 Digital Remaster)
-SOAIKYC12AB0185D3C,http://previews.7digital.com/clip/8438674,Wayman Tisdale,Brazilia
-SOAIKZS12A81C22FA5,http://previews.7digital.com/clip/34772352,Dozer,Until Man Exists No More
-SOAIKZT12AB0181AFA,http://previews.7digital.com/clip/20428763,The Working Title,Blind
-SOAIKZY12AB0184627,http://previews.7digital.com/clip/31420133,Brainstorm,Kamikaze (Demo)
-SOAIKZY12AF72A3F11,http://previews.7digital.com/clip/4415382,"Harry Connick, Jr.",The Christmas Waltz
-SOAILCF12A6D4FD6C2,NA,The Hellacopters,Making Up For Lost time
-SOAILCJ12A6D4F82E9,http://previews.7digital.com/clip/477455,Clara Nunes,Valsa De Realejo
-SOAILEA12AB0184D3D,http://previews.7digital.com/clip/5013285,Vive La Fête,Je Ne Veux Pas
-SOAILFU12A67ADE8A7,http://previews.7digital.com/clip/8116914,Nevermore,Passenger
-SOAILHT12A8C134B76,http://previews.7digital.com/clip/17479385,Sylvan,Pane of Truth
-SOAILIO12A8C1388DD,http://previews.7digital.com/clip/1570540,Urban Knights,Close Your Eyes And Remember
-SOAILLC12A58A77CAC,http://previews.7digital.com/clip/1628581,Sentidos Opuestos,Ding Dong
-SOAILLF12A8C13BBDC,http://previews.7digital.com/clip/1142221,Dubstar,It's Clear
-SOAILLL12A58A7DBC6,http://previews.7digital.com/clip/7842352,Bjørn Berge,Minutes
-SOAILLL12AB017C3B8,http://previews.7digital.com/clip/4403817,Tony Rice,Song For Life
-SOAILNA12AB018420B,http://previews.7digital.com/clip/3852872,Claseria,Heart
-SOAILNK12A8C138876,http://previews.7digital.com/clip/32350039,Helio Ziskind,Passarinho Que Som É Esse: Trompa
-SOAILNR12A58A7D146,http://previews.7digital.com/clip/1332422,Stir,Spaceman
-SOAILRX12A8C13AB18,http://previews.7digital.com/clip/1136965,Gary Bartz,Oo Baby Baby (Digitally Remastered)
-SOAIMBS12A58A7A762,http://previews.7digital.com/clip/30166943,Maanam,Eksplozja
-SOAIMCL12AB01834A1,http://previews.7digital.com/clip/4502569,Szinetár Dóra,Angyal (Live)
-SOAIMCO12A6D4FAB30,NA,No te va Gustar,No era cierto
-SOAIMEX12A8C13A5E2,http://previews.7digital.com/clip/1647924,Twila Paris,"Come, Worship The Lord (Sanctuary Album Version)"
-SOAIMFG12AB0189AC2,NA,Caribou,Hannibal
-SOAIMGN12A8C142DF3,http://previews.7digital.com/clip/3739798,Essie Jain,Goodbye
-SOAIMGP12AC3DF8078,NA,Los Visitantes,Fiesta
-SOAIMIC12AB017AF03,http://previews.7digital.com/clip/3673874,Wild Billy Childish & The Blackhands,It's A Long Way To Tipperary
-SOAIMIE12A8C133373,http://previews.7digital.com/clip/2129668,Kenny G,Fiesta Loca
-SOAIMJH12A8C13AFA7,http://previews.7digital.com/clip/2305622,Revolver,Lisa Y Fran
-SOAIMLF12AB017BFCD,http://previews.7digital.com/clip/5969864,Thad Cockrell,Are You Still Missing Me?
-SOAIMLG12A8C136389,http://previews.7digital.com/clip/1564773,Wilson Phillips,Over And Over
-SOAIMMD12AB017CF0A,http://previews.7digital.com/clip/4387022,Sam Bush,Angel To Be
-SOAIMMH12AB017F2A8,http://previews.7digital.com/clip/4516077,Richard Pryor,Niggas
-SOAIMSF12A8C142BE0,NA,Black Box Recorder,Sex Life
-SOAIMTW12AB0180AFD,http://previews.7digital.com/clip/5072077,DJ Paul,Get Right
-SOAIMZC12AB018001C,http://previews.7digital.com/clip/3894168,Los Abuelos de la Nada,Tristeza De La Ciudad
-SOAINBS12AB0186773,NA,José José,"New York, New York"
-SOAINDD12A58A7D6D4,http://previews.7digital.com/clip/513512,Mariza,Duas Lágrimas De Orvalho (Live)
-SOAINDW12AB01883D2,http://previews.7digital.com/clip/8378999,Xiu Xiu,Gray Death
-SOAINEA12AB017F69F,http://previews.7digital.com/clip/5375443,Toranja,Só Eu Sei Ver
-SOAINFA12A8C13C30F,http://previews.7digital.com/clip/4044529,59 Times the Pain,More Out Of Today
-SOAINFU12AB018FC43,NA,The Animals,Let It Rock
-SOAINGB12AB018CCDC,http://previews.7digital.com/clip/7485080,Anaïs Mitchell,All My Trials
-SOAINLG12AB018A86A,http://previews.7digital.com/clip/7214854,Bare Egil Band,Asfalt
-SOAINNF12AB018E5E2,http://previews.7digital.com/clip/8481663,Gregory Isaacs,Six Months
-SOAINNU12AB01835F1,http://previews.7digital.com/clip/5974423,Dolorean,Just Don't Leave Town
-SOAINOT12A8C135064,http://previews.7digital.com/clip/3280954,Anastácia,Maybe Today
-SOAINPK12A8C142466,NA,Ray Quinn,Ain't That A Kick In The Head
-SOAINTL12AB017FBE9,http://previews.7digital.com/clip/6029102,Robyn Hitchcock,The Man With The Lightbulb Head
-SOAINXH12A6D4F66F4,http://previews.7digital.com/clip/214414,Portishead,Roads (Live)
-SOAINYY12A8C13BCAF,http://previews.7digital.com/clip/2380420,Billo's Caracas Boys,Cumbia Caletera
-SOAINZT12A8C137CB6,http://previews.7digital.com/clip/2224074,Viki Mosholiou,Pagida
-SOAIOCA12A8AE461B8,http://previews.7digital.com/clip/1416523,Turbulence,R.E.S.P.E.C.T.
-SOAIOFG12A6D4FA3ED,http://previews.7digital.com/clip/34927319,Final Fantasy,The Miner Becomes Forgetful
-SOAIOHZ12AB017E76A,http://previews.7digital.com/clip/6978966,Dillinger Four,Maximum Piss & Vinegar
-SOAIOIU12A8C13854A,http://previews.7digital.com/clip/2205661,Agoria,Anni Mari
-SOAIOIZ12AB018495A,http://previews.7digital.com/clip/6119921,The Stitches,Better Looks (When You Were Dead)
-SOAIOJT12A58A7A246,http://previews.7digital.com/clip/6946303,Swollen Members,Dynamite
-SOAIOJZ12AB0184FA1,http://previews.7digital.com/clip/3154222,"""Weird Al"" Yankovic",You Make Me
-SOAIOKI12A58A7E136,http://previews.7digital.com/clip/238414,When in Rome,Everything
-SOAIOMK12A6D4F796F,http://previews.7digital.com/clip/347239,Bitch Alert,Gas
-SOAIOMN12A8C14367A,http://previews.7digital.com/clip/4457420,Cosmic Gate,Flatline
-SOAIOMR12A6D4F8D84,http://previews.7digital.com/clip/428434,LeToya,Outro
-SOAIOOE12AB018E1B8,http://previews.7digital.com/clip/8967069,Fred Numf,On The Edge (Stef Vrolijk & 16 Bit Lolita's Remix)
-SOAIOOJ12A8C1385D2,http://previews.7digital.com/clip/3279628,Phantom Planet,After Hours
-SOAIOPM12A8C141DE1,http://previews.7digital.com/clip/1825777,Tramaine Hawkins,He's That Kind Of Friend (We Will Stand Version)
-SOAIOZM12AB0186B53,http://previews.7digital.com/clip/6048656,Kleenex,Eisiger Wind
-SOAIPAL12A8C136893,http://previews.7digital.com/clip/2214253,Tanya Tucker,Somebody To Care
-SOAIPAT12AB01816F1,NA,Allen Toussaint,Bono
-SOAIPBE12AB01871D4,NA,Cry Cry Cry,I Know What Kind of Love This Is
-SOAIPCV12A58A80DF1,http://previews.7digital.com/clip/3364126,Gianni Morandi,Andavo a cento all'ora
-SOAIPGY12A8C144CD7,http://previews.7digital.com/clip/3559947,M2M,Don't (album version)
-SOAIPHO12AB018217E,http://previews.7digital.com/clip/5404011,Desorden Público,Gorilón
-SOAIPIK12A58A78DBB,http://previews.7digital.com/clip/4286490,Reckless Kelly,Break My Heart Tonight
-SOAIPIN12A6D4FCCBE,http://previews.7digital.com/clip/3022491,The Subways,Always Tomorrow
-SOAIPJE12AB01819D2,NA,Smut Peddlers,Diseases
-SOAIPKS12AB0185441,http://previews.7digital.com/clip/5495675,Neil Young,I've Loved Her So Long
-SOAIPOE12AB0182D1E,http://previews.7digital.com/clip/4124823,Billy J. Kramer & The Dakotas,I Live To Love You (Stereo) (2009 Digital Remaster)
-SOAIPQE12A8C131E2C,http://previews.7digital.com/clip/31389867,The Black Dahlia Murder,I'm Charning
-SOAIPRT12A8C136749,http://previews.7digital.com/clip/5499441,Eugene McGuinness,High Score
-SOAIPSY12A8C13098D,http://previews.7digital.com/clip/2093261,G. Love,Hobo Blues
-SOAIPTJ12A8C131EEE,http://previews.7digital.com/clip/2132311,Miss Kittin,Play Me A Tape
-SOAIPUV12A8C13BB0B,http://previews.7digital.com/clip/2820555,Mikey Spice,Open Your Eyes
-SOAIPUZ12AB018160F,http://previews.7digital.com/clip/4446264,Gentleman Reg,Falling Back
-SOAIPVI12AB0188F4A,http://previews.7digital.com/clip/238928,Frost,Mi Vida Loca
-SOAIPVZ12A8C141F66,http://previews.7digital.com/clip/4167474,Beth Carvalho,Bar Da Neguinha
-SOAIPWV12A8AE4563D,http://previews.7digital.com/clip/3116442,Camel,Aristillus (Instrumental Version)
-SOAIPWZ12AB0187298,http://previews.7digital.com/clip/8374488,Metsatöll,Ema hääl kutsub
-SOAIPYT12A8C13B784,http://previews.7digital.com/clip/3354103,Graaf,You Got (What I Want)
-SOAIPZN12A6D4F9C73,http://previews.7digital.com/clip/29142437,Psychic Ills,Diamond City Redux
-SOAIPZX12A8C13825C,http://previews.7digital.com/clip/1624821,Enrique Morente,Sale El Sol
-SOAIQAF12AC3923BDC,http://previews.7digital.com/clip/7575276,TRU,Watch your Ass (feat. Master P)
-SOAIQCY12A8AE4616E,http://previews.7digital.com/clip/5781160,Santana,Corazon Espinado
-SOAIQDT12A6D4F747F,http://previews.7digital.com/clip/238598,Kid Frost,Hispanic Causing Panic
-SOAIQKT12AB017E6D5,http://previews.7digital.com/clip/6908108,North Mississippi Allstars,Circle In The Sky
-SOAIQLH12A8C13D8DB,http://previews.7digital.com/clip/1200069,Benny Green,The Sheik Of Araby (Live)
-SOAIQOZ12A6D4F91ED,http://previews.7digital.com/clip/474338,Tihuana,Campo Minado
-SOAIQRH12A6701F9A9,http://previews.7digital.com/clip/109457,Eels,"In The Yard, Behind The Church"
-SOAIQTI12A67AD85C4,http://previews.7digital.com/clip/701592,Johnny Copeland,Same Thing
-SOAIQUG12AC3DF42ED,http://previews.7digital.com/clip/16835920,Dominique A,Chiqué chiqué
-SOAIQWO12A6310D90E,http://previews.7digital.com/clip/11925,Runrig,Healer In Your Heart
-SOAIQYV12A8AE4786A,http://previews.7digital.com/clip/29800748,Arab on Radar,Molar System
-SOAIRAZ12AF729B2D7,NA,The Lucksmiths,Under The Rotunda
-SOAIREP12A8C13EF35,http://previews.7digital.com/clip/2948376,Jenny Lewis with The Watson Twins,Paradise
-SOAIRJH12AF729D572,NA,Ian Dury and the Blockheads,The Passing Show
-SOAIRLM12AB018B341,http://previews.7digital.com/clip/8886444,Piebald,torso
-SOAIRMY12A5891FEE4,http://previews.7digital.com/clip/5673545,Randy Newman,Bad News From Home
-SOAIRPP12A6D4F83FE,http://previews.7digital.com/clip/1166022,La Vela Puerca,Neutro
-SOAIRPP12A8C13CC90,http://previews.7digital.com/clip/3432289,Obús,Da Igual
-SOAIRPS12AB018AA3C,http://previews.7digital.com/clip/8475394,Paul Brandt,It's A Beautiful Thing
-SOAIRSJ12AB0182171,http://previews.7digital.com/clip/5714358,The Germs,Sugar Sugar
-SOAIRTJ12A8C13CA0A,http://previews.7digital.com/clip/1141196,Shampoo,Outta Control
-SOAIRTO12A58A7848E,http://previews.7digital.com/clip/2518546,D.R.S.,Bonnie & Clyde
-SOAIRVX12A8C14433B,http://previews.7digital.com/clip/3579029,Zach Gill,Beautiful Reason
-SOAIRXE12A58A771D1,NA,Estados Alterados,Me Partiras En Dos
-SOAIRYO12AB018C2DA,http://previews.7digital.com/clip/7427298,Jimi Hendrix,Jam 292
-SOAIRYU12A8C143F7C,http://previews.7digital.com/clip/4794049,Pete Yorn,Don't Mean Nothing
-SOAISAY12AB018A37B,http://previews.7digital.com/clip/7810691,Mad Flava,Hype Dawgs Vibe
-SOAISCH12AB0189C9A,http://previews.7digital.com/clip/35750918,The Legends,Wish Me Gone
-SOAISCY12AAF3B2E48,http://previews.7digital.com/clip/6851146,Paul de Leeuw,'k Wacht Op Jou
-SOAISDM12AB018710D,http://previews.7digital.com/clip/7610328,New End Original,Leper Song
-SOAISFL12A8C1341F9,http://previews.7digital.com/clip/3260595,Serge Lama,Je Voudrais Tant Que Tu Sois Là
-SOAISFP12A8C136122,http://previews.7digital.com/clip/2682781,2 in a Room,Carnival
-SOAISHJ12A6D4FABF9,http://previews.7digital.com/clip/453665,O Terço,Minha Fe
-SOAISKH12A6D4F6CC0,http://previews.7digital.com/clip/284046,"Richard ""Groove"" Holmes",Down Home Funk (24-Bit Mastering) (2002 Digital Remaster)
-SOAISKR12AB0181011,http://previews.7digital.com/clip/6136898,Lifelover,Söndag (Sunday)
-SOAISLZ12A6D4F8B31,http://previews.7digital.com/clip/581700,Kurt Rosenwinkel,Our Secret World
-SOAISMF12A58A7A649,http://previews.7digital.com/clip/7711238,Motion City Soundtrack,The Weakends
-SOAISPB12A6D4F9E3A,http://previews.7digital.com/clip/1108419,Cartola,Alvorada
-SOAISRU12A6D4FBE5A,NA,Primal Fear,Armageddon
-SOAISUM12A67ADF9FB,http://previews.7digital.com/clip/7249435,Deerhoof,The Galaxist
-SOAISUU12AB017F70E,http://previews.7digital.com/clip/14009648,Ane Brun,Are They Saying Goodbye?
-SOAISXH12A8C142A60,http://previews.7digital.com/clip/3732738,David Cook,Permanent
-SOAISZC12A8C13E384,http://previews.7digital.com/clip/3470541,Bette Midler,He's A Tramp
-SOAISZV12A8C13CB26,http://previews.7digital.com/clip/11526053,Limbeck,Brand New Orange
-SOAITCL12A6D4FAB1C,http://previews.7digital.com/clip/647267,Zen Café,Mustaa
-SOAITEI12A6310E30C,http://previews.7digital.com/clip/11165,The Human League,Jam
-SOAITIC12A58A7C79C,http://previews.7digital.com/clip/325224,La Portuaria,Amar Es Dificil(En vivo)
-SOAITPP12AB0187776,http://previews.7digital.com/clip/8373279,Matt Monro,On A Clear Day You Can See Forever (2010 Digital Remaster)
-SOAITQX12A8AE46F7C,http://previews.7digital.com/clip/1999196,Tři sestry,Rohace
-SOAITTY12A8C135550,http://previews.7digital.com/clip/1578524,Teresa Cristina & Grupo Semente,João Teimoso (Instrumental)
-SOAITVD12A6D4F824B,http://previews.7digital.com/clip/497887,dredg,Convalescent
-SOAITWC12AB018B069,http://previews.7digital.com/clip/6498944,Bratze,Pelikan
-SOAITXP12A6D4F92A0,http://previews.7digital.com/clip/259868,Luscious Jackson,Fantastic Fabulous
-SOAITYV12A6D4F7748,http://previews.7digital.com/clip/327536,T-Connection,Totally Connected
-SOAITZJ12AB017F472,http://previews.7digital.com/clip/5374917,Xutos & Pontapés,Alta Rotação
-SOAIUAC12A6D4FBF7C,http://previews.7digital.com/clip/28997541,Axxis,Icewind
-SOAIUBC12A67ADF9C1,NA,Lucky Soul,Struck Dumb
-SOAIUIN12A8C132F82,http://previews.7digital.com/clip/3196739,Kingmaker,This Time This Town This Sea
-SOAIUKU12A58A76A24,http://previews.7digital.com/clip/3177195,Blue Öyster Cult,Lonely Teardrops
-SOAIULF12A8C13CB20,NA,Blueboy,Too Good To Be True
-SOAIUMI12A6D4FA570,NA,Wishbone Ash,Powerthrack
-SOAIUND12A8C141039,http://previews.7digital.com/clip/1828993,Operation Ivy,Officer
-SOAIUNI12AB0180036,http://previews.7digital.com/clip/14740750,Leon Rosselson,Song Of The Old Communist
-SOAIUOJ12AC468A4F3,NA,Nachtmahr,Tanzdiktator (Yade Remix)
-SOAIUPJ12AB01806DC,http://previews.7digital.com/clip/17146345,Agonoize,Pavillon 5
-SOAIUSG12AB0186C50,http://previews.7digital.com/clip/10933639,Way Out West,We Love Machine (Jaytech Remix)
-SOAIUTU12AB0180FA1,http://previews.7digital.com/clip/11677772,Busdriver,Low Flying Winged Books
-SOAIUUY12A58A7AE78,http://previews.7digital.com/clip/1138897,Shabba Ranks,V.i.p.
-SOAIUXB12AAFF41493,http://previews.7digital.com/clip/14749804,Houston Calls,Abandone
-SOAIUXI12A6D4F71BE,http://previews.7digital.com/clip/23459186,Sandie Shaw,Till The Night Begins To Die
-SOAIUXW12A8AE45999,http://previews.7digital.com/clip/1399768,Raimundos,Princesinha
-SOAIUYU12AB017E3B1,http://previews.7digital.com/clip/18065179,Billy Bragg & Wilco,Meanest Man
-SOAIVAD12A8C143DCC,http://previews.7digital.com/clip/4171459,John Scofield,Something's Got A Hold On Me
-SOAIVBV12AB017E804,NA,Kidz Bop Kids,Girl Next Door
-SOAIVCK12AB0180708,NA,The Real McKenzies,Raise The Banner
-SOAIVCW12A8AE472D5,http://previews.7digital.com/clip/6163072,Lock Up,Salvation Thru' Destruction
-SOAIVEV12A6D4F6919,http://previews.7digital.com/clip/364008,Martin Denny,La Pampa Y La Puna (Digitally Remastered 96)
-SOAIVIF12A67AD97A6,http://previews.7digital.com/clip/16088139,The Mendoza Line,Flat Feet and Western Style
-SOAIVIZ12AB017D684,http://previews.7digital.com/clip/6484749,Raised Fist,Friends & Traitors
-SOAIVKN12A6D4FBAF3,http://previews.7digital.com/clip/16162821,David Meece,The Man With the Nail Scars
-SOAIVKX12AC468D8CA,http://previews.7digital.com/clip/8235627,Enter Shikari,Hectic [Live '09]
-SOAIVMG12A8C141A8A,http://previews.7digital.com/clip/2422918,Hayes Carll,A Lover Like You
-SOAIVOJ12A6D4FAECC,http://previews.7digital.com/clip/30431715,Inspiral Carpets,I'll Keep It in Mind
-SOAIVQP12A8C143185,http://previews.7digital.com/clip/3646021,Electric Light Orchestra,Roll Over Beethoven
-SOAIVRC12A8C13904E,http://previews.7digital.com/clip/1655192,Golden Boys,Meu Romance Com Laura
-SOAIVRY12AB018A740,http://previews.7digital.com/clip/29107143,No me pises que llevo Chanclas,Yo Robo
-SOAIVWH12AF729EB59,http://previews.7digital.com/clip/3734530,Tracy Chapman,Goodbye
-SOAIVWU12A6D4F8382,http://previews.7digital.com/clip/4680196,Tam Tam Go!,El Onanista De La Caja De Sorpresas
-SOAIVWY12A6D4F6A4A,http://previews.7digital.com/clip/384536,Queensrÿche,I Don't Believe In Love (2000 Digital Remaster)
-SOAIVXL12AB0180F99,http://previews.7digital.com/clip/4927502,Melocos,Asi
-SOAIVZC12A58A779EC,http://previews.7digital.com/clip/6966622,The Jacka,Murder On My Mind
-SOAIVZL12A8C139DFB,http://previews.7digital.com/clip/1689108,A Perfect Circle,The Outsider
-SOAIWAB12A8C13710A,NA,The Bouncing Souls,Blind Date
-SOAIWAT12AB018557F,http://previews.7digital.com/clip/28949772,Grossomodo,Grozzeros
-SOAIWCC12AC907107C,http://previews.7digital.com/clip/34558096,The Dixie Cups,Iko Iko
-SOAIWCN12A6D4F726C,http://previews.7digital.com/clip/389485,Archie Bell & The Drells,I Don't Wanna Be A Playboy
-SOAIWCX12AB0189A83,http://previews.7digital.com/clip/34630903,John Renbourn,The Moon Shines Bright
-SOAIWFL12A6D4F627E,http://previews.7digital.com/clip/839727,Building 429,Singing Over Me
-SOAIWGK12AB018325D,http://previews.7digital.com/clip/5100112,John Patitucci,Bach Prelude In G Major (From The Cello Suite)
-SOAIWGP12AB0188C18,http://previews.7digital.com/clip/4107627,Spiderbait,The Dog
-SOAIWIV12A6D4FCE3E,http://previews.7digital.com/clip/21665787,Christian Death,Workship Along the Nile
-SOAIWMG12A6D4FA280,NA,AFI,Don't Change
-SOAIWNM12A6D4FA9A4,http://previews.7digital.com/clip/9031838,Daddy X,Peaceful Day
-SOAIWOF12A8C136FF5,http://previews.7digital.com/clip/2224433,Soft,Droppin'
-SOAIWOH12AB018859A,http://previews.7digital.com/clip/8439233,Hot Action Cop,Goin' Down On It (album/edited version)
-SOAIWOT12AC90752F7,http://previews.7digital.com/clip/7677504,The Grown-Ups,Scarz
-SOAIWQN12A8C143C09,http://previews.7digital.com/clip/10364604,Rodgau Monotones,Nutella is' all
-SOAIWRH12AB017D6DC,http://previews.7digital.com/clip/19315606,Annie Ross,The Way You Look Tonight
-SOAIWSY12AB017AE28,http://previews.7digital.com/clip/3253720,Savage Garden,Tears Of Pearls
-SOAIWVI12AB0184A04,http://previews.7digital.com/clip/8366984,鄧麗欣,Pei Zhe Wo Zou
-SOAIWVT12A8C13A65E,http://previews.7digital.com/clip/5947726,Next,My Place
-SOAIWXK12A8C142F9B,http://previews.7digital.com/clip/11641806,Yppah,Sun Flower Sun Kissed
-SOAIWYR12A67020C40,http://previews.7digital.com/clip/161707,Ofra Haza,Goodbye Brother (The Prince Of Egypt/Soundtrack Version)
-SOAIWZP12A8C13F700,http://previews.7digital.com/clip/22305011,808 State,Revenge Of The Girlie Men
-SOAIXEP12AB0186E49,http://previews.7digital.com/clip/161530,Burt Bacharach,I Say A Little Prayer
-SOAIXHF12AC960DE5A,http://previews.7digital.com/clip/8581341,Billy Sheehan,One Good Reason
-SOAIXHM12AB018387E,http://previews.7digital.com/clip/7163878,The Young Dubliners,Howaya Girls
-SOAIXKE12A8C13701D,http://previews.7digital.com/clip/1559491,Chicos De Barrio,Cumbia Urbana
-SOAIXKK12A6D4F96F7,http://previews.7digital.com/clip/29028445,Roachford,Open Road
-SOAIXLN12A6BD4CFB4,http://previews.7digital.com/clip/751584,Jaime Roos,Por Amor Al Arte
-SOAIXRT12AB018190F,NA,Pierre Perret,Le fils-père
-SOAIXTD12AB017FC9E,http://previews.7digital.com/clip/4914467,Paul Kalkbrenner,Absynthe
-SOAIXUP12A8C13AAD3,http://previews.7digital.com/clip/1624645,Enrique Morente,Yo He Visto A Un Niño Llorar (Peteneras De Chacón) (1996 Digital Remaster)
-SOAIXXM12A6D4FC2CC,http://previews.7digital.com/clip/2488634,Johnny Truant,I Love You Even Though You're A Zombie Now
-SOAIXYC12AB0183312,http://previews.7digital.com/clip/8343528,City Haze,Tell Me Whats good
-SOAIXYO12A6D4F82E7,http://previews.7digital.com/clip/338919,Black Star Liner,Swimmer
-SOAIXYU12A6D4F83AE,http://previews.7digital.com/clip/280794,Van Hunt,Hold My Hand
-SOAIYCM12AF72A09E3,http://previews.7digital.com/clip/7867527,Nevea Tears,No One Ever Shuts Up
-SOAIYEW12AB0182AB5,http://previews.7digital.com/clip/5709021,Jeremy Enigk,On The Wayside
-SOAIYFP12A8C139152,NA,Meat Puppets,"Oh, Me"
-SOAIYIP12A58A7AF8A,NA,Superheist,A Dignified Rage
-SOAIYLY12A8C1300BC,http://previews.7digital.com/clip/1463465,Pops Staples,People Get Ready
-SOAIYMY12A8159E955,http://previews.7digital.com/clip/1346333,Super Deluxe,Johnny's Gone Fishin'
-SOAIYRA12AB017FDD6,NA,Kotiteollisuus,Routa ei lopu (2003)
-SOAIYVJ12A8C13B2C3,http://previews.7digital.com/clip/1748030,Howard Carpendale,Vielleicht Bis Morgen
-SOAIYYR12AB0186820,http://previews.7digital.com/clip/19620827,Eddy Current Suppression Ring,Isn't It Nice
-SOAIYZT12AB018AABC,http://previews.7digital.com/clip/7609714,The Promise Ring,E. Texas Ave.
-SOAIZAW12A6D4F801D,http://previews.7digital.com/clip/396646,Kierra Sheard,This Is Me
-SOAIZBR12A8C13C54A,http://previews.7digital.com/clip/1690099,ストレイテナー,March
-SOAIZEP12AC3DF66BB,http://previews.7digital.com/clip/9083486,IOS,Lichtjaren
-SOAIZEY12A8C1337BF,http://previews.7digital.com/clip/2678611,Betagarri,Txikia naiz
-SOAIZGD12AB01819AD,http://previews.7digital.com/clip/5615474,la india,El Hombre Perfecto
-SOAIZGM12A6D4F7D7D,http://previews.7digital.com/clip/7465144,Figures on a Beach,No Stars
-SOAIZGZ12A8C137C11,http://previews.7digital.com/clip/1603776,Urban Knights,I'm Not In Love
-SOAIZIO12AC4686AFE,http://previews.7digital.com/clip/7760336,Cars & Trains,Dead Telephone
-SOAIZJK12A8C135B8B,http://previews.7digital.com/clip/5923213,Rage Against the Machine,Ashes In The Fall
-SOAIZMN12A8C1332A6,http://previews.7digital.com/clip/13143526,Vashti Bunyan,Coldest Night of the Year
-SOAIZMO12A8C13D999,http://previews.7digital.com/clip/1696451,Martha Argerich,"Piano Sonata No. 3 in B Minor, Op.58 (1999 Digital Remaster): I. Allegro maestoso"
-SOAIZMY12AC9072B57,http://previews.7digital.com/clip/7677851,The Neptunas,To Serve Man
-SOAIZOW12A8C13AA68,http://previews.7digital.com/clip/33308621,Miranda Sex Garden,Though My Carriage Be But Careless
-SOAIZVR12AB0183B18,http://previews.7digital.com/clip/7083908,Suburban Tribe,One Of My Little Memories
-SOAIZWN12AF729F8CA,http://previews.7digital.com/clip/374983,Beastie Boys,Shazam!
-SOAIZZG12A6D4F9BC0,http://previews.7digital.com/clip/603174,Lady Sovereign,Pretty Vacant (Live at Commodore Ballroom)
-SOAIZZJ12A6D4F87CA,http://previews.7digital.com/clip/384780,Love Is All,Motorboat
-SOAIZZW12AF72A71DC,http://previews.7digital.com/clip/32756546,Scanners,A Girl Like You
-SOAJACT12A8C13B8FE,http://previews.7digital.com/clip/1097391,Cocteau Twins And Harold Budd,Why Do You Love Me?
-SOAJACY12AC3DF7F4F,NA,Matthew Herbert,Manchester
-SOAJAJH12A6D4F64F8,http://previews.7digital.com/clip/241707,T'Pau,Road To Our Dream
-SOAJAKT12A58A7C70E,http://previews.7digital.com/clip/374886,Chris Cagle,Who Needs The Whiskey
-SOAJAMD12A58A7BC4C,NA,Dead Can Dance,Don’t Fade Away (Live Remastered)
-SOAJANR12A6D4F7C23,http://previews.7digital.com/clip/406427,Nuyorican Soul,Nuyorican Soul Intro
-SOAJAUN12A8C141AD0,http://previews.7digital.com/clip/3546172,Daisy Chainsaw,Candy Floss
-SOAJAYZ12A8C135270,NA,Lifesavas,Happiness
-SOAJBAF12A8C136AF2,http://previews.7digital.com/clip/3297909,Anthony Hamilton,"Cornbread, Fish & Collard Greens"
-SOAJBEI12A6D4FE658,http://previews.7digital.com/clip/1331996,Royal Bliss,I'll Be Around
-SOAJBFA12AB01873E2,http://previews.7digital.com/clip/7241582,Gangster Fun,Butt Down Under
-SOAJBFP12A8AE45C72,http://previews.7digital.com/clip/3097189,Inkubus Sukkubus,Leveller
-SOAJBJP12A8A9D5770,http://previews.7digital.com/clip/3092960,Stan Whitmire,Better Hurry Up
-SOAJBJP12AB0180E36,http://previews.7digital.com/clip/7136261,The Barbarians,Mr. Tambourine Man
-SOAJBKD12A8C14005D,http://previews.7digital.com/clip/11739570,Alexisonfire,We Are The Sound
-SOAJBPD12A8C13B166,http://previews.7digital.com/clip/3365657,Eros Ramazzotti,C'è Una Strada In Cielo
-SOAJBPP12AC4689BB7,http://previews.7digital.com/clip/10240661,The Chordettes,Lollipop (Squeak E Clean & Desert Eagles Remix)
-SOAJBWK12AB0183AED,http://previews.7digital.com/clip/8305935,Grinspoon,Hold On Me
-SOAJBYA12A6D4F50B0,http://previews.7digital.com/clip/862400,Velvet,Funzioni Primarie
-SOAJBYT12A6D4F733C,http://previews.7digital.com/clip/296117,David Usher,Hallucinations
-SOAJCAX12A58A7AC30,http://previews.7digital.com/clip/4325427,The Meteors,Fuck Off And Die
-SOAJCDK12A5891E650,http://previews.7digital.com/clip/8900197,Compton's Most Wanted,Growin' Up In The Hood
-SOAJCDT12AB0187257,NA,Agonoize,Evil Illusion
-SOAJCKQ12A67ADF337,http://previews.7digital.com/clip/30148688,Cochi e Renato,E La Vita La Vita
-SOAJCLG12AB0184CD2,http://previews.7digital.com/clip/11674250,Roots Manuva,Artical
-SOAJCPJ12A8C13557C,NA,Pinetop Seven,Our First Drunk Dream
-SOAJCPL12A58A79D75,http://previews.7digital.com/clip/671379,Don Francisco,Jesus Of Nazareth
-SOAJCQX12A8C138D6A,http://previews.7digital.com/clip/1640815,The Sleepy Jackson,Raindrop
-SOAJCVY12A8C136556,NA,Jerry Holland,Boo Baby's Lullaby
-SOAJCYT12A6D4F98DC,http://previews.7digital.com/clip/647452,Francisco Céspedes,Drume negrita
-SOAJCZP12A6D4F762E,http://previews.7digital.com/clip/2274826,Fran Perea,Tal vez
-SOAJDAF12A8C1320BF,http://previews.7digital.com/clip/1466385,Ismo Alanko Säätiö,T
-SOAJDAL12AC90716B0,http://previews.7digital.com/clip/6679147,The Hammersmith Gorillas,You Really Got Me
-SOAJDBS12AB018E28C,http://previews.7digital.com/clip/9072410,Robert and Johnny,We Belong Together
-SOAJDCW12A6D4FB482,http://previews.7digital.com/clip/2205762,Le Peuple de l'Herbe,Déjà à l'école
-SOAJDCW12A8C13A284,NA,Fujiya & Miyagi,Goosebumps
-SOAJDEU12A8C13D3A3,NA,Jeff Golub,Metro Cafe
-SOAJDJH12A6D4F8A30,http://previews.7digital.com/clip/371128,Los Nikis,Olaf El Vikingo
-SOAJDJL12AAF3B2AF3,http://previews.7digital.com/clip/6870235,Thyrfing,The Breaking of Serenity
-SOAJDMI12A67020BD3,http://previews.7digital.com/clip/161534,Carpenters,Aurora
-SOAJDNG12A6D4F9F14,NA,The Young Gods,El Magnifico
-SOAJDOE12A8C13AA0F,http://previews.7digital.com/clip/3720023,Alan Jackson,She Likes It Too
-SOAJDRP12AF72A0F56,NA,Britney Spears,Blur (Main Version)
-SOAJDSD12A58A7A608,http://previews.7digital.com/clip/4503161,John Fogerty,Have You Ever Seen The Rain?
-SOAJDTC12A67ADC7B2,http://previews.7digital.com/clip/182866,Compay Segundo,Amor Gigante
-SOAJDVN12A6D4F8927,http://previews.7digital.com/clip/318045,Ministère AMER,Un été à la cité
-SOAJDWU12A8C1389F3,NA,Loquillo y Trogloditas,Besos Robados (Versión Country)
-SOAJDXB12A6D4FDAAB,http://previews.7digital.com/clip/35823326,Tarkan,Dedikodu
-SOAJDYB12A8C1341CB,http://previews.7digital.com/clip/940275,San Telmo Lounge,Hotel Victoria
-SOAJDZY12AB0182CED,http://previews.7digital.com/clip/4124812,Billy J. Kramer & The Dakotas,Under The Boardwalk (Stereo) (2009 Digital Remaster)
-SOAJEAJ12AC9097E5B,http://previews.7digital.com/clip/6578324,Adie,Sufficient (Medium Key-Premiere Performance Plus w/ Background Vocals)
-SOAJEBX12A8C13AAAB,http://previews.7digital.com/clip/2230723,Modern English,Smiles And Laughter
-SOAJECT12AB0182A8B,http://previews.7digital.com/clip/5735819,王力宏,Ai Yin Wei Zai Xin Zhong
-SOAJEEY12A8C13F90B,http://previews.7digital.com/clip/2463277,Alias,lost friend advice
-SOAJEFW12A8C133366,http://previews.7digital.com/clip/2129663,Kenny G,Mirame Bailar
-SOAJEHW12AF72A6326,http://previews.7digital.com/clip/6314176,Collective Soul,Simple
-SOAJEIE12A6D4FA55E,http://previews.7digital.com/clip/663577,Don Davis,Exit Mr. Hat
-SOAJEJB12AB0189270,http://previews.7digital.com/clip/12467479,The Ziggens,It's Great To Be Unemployed
-SOAJEJX12A8C135032,NA,ActionReaction,March On
-SOAJEMK12A6D4FCD63,http://previews.7digital.com/clip/1308520,Dario Marianelli,The Cottage On The Beach
-SOAJENR12A8C135CA0,http://previews.7digital.com/clip/2126206,Los Delinqüentes,Mortadelo Y Filemon
-SOAJEOB12AB017FDC0,http://previews.7digital.com/clip/7396557,Dog Fashion Disco,Sweet Insanity
-SOAJEPL12A6D4FA93A,http://previews.7digital.com/clip/3523402,Jesse Malin,Little Star
-SOAJEPW12A8C142BFA,NA,Los Amigos invisibles,Mi Linda
-SOAJEPY12A8C13D9E6,http://previews.7digital.com/clip/6966781,The Rutles,Love Life
-SOAJEQO12A6D4FA3A4,http://previews.7digital.com/clip/560251,Beulah,Popular Mechanics for Lovers
-SOAJERK12A8C137287,http://previews.7digital.com/clip/2227735,Compay Segundo,Desvelo De Amor
-SOAJEUE12AB0188C96,http://previews.7digital.com/clip/7705271,Enchant,Ultimate Gift
-SOAJEWS12AF72A1037,NA,Clutch,Impetus
-SOAJEXL12AB017DD7A,http://previews.7digital.com/clip/4368207,IIIrd Tyme Out,Little Rabbit
-SOAJEXV12AB0189BDA,http://previews.7digital.com/clip/30629401,Fionn Regan,House Detective
-SOAJEZF12A8C13C816,http://previews.7digital.com/clip/1747761,Guff,"No Gods, No Masters"
-SOAJFAR12A8C142E4A,NA,Shameboy,Monofour (Live At The Pyramid Marquee)
-SOAJFBK12A8C1371B4,http://previews.7digital.com/clip/3268170,Mass Hysteria,P 4
-SOAJFBP12AB0181298,http://previews.7digital.com/clip/36224761,Margaret Cho,Grandmother Died
-SOAJFDK12A67020A83,http://previews.7digital.com/clip/123692,Mighty Joe Young,Early In The Morning
-SOAJFDX12AB017F50A,http://previews.7digital.com/clip/6925226,Ornella Vanoni,Cosa M'Importa
-SOAJFDZ12A6701FC5E,http://previews.7digital.com/clip/152123,Nelly,Kings Highway
-SOAJFFT12A8C13CF97,http://previews.7digital.com/clip/1680144,Alice,Orléans
-SOAJFJX12AB017F985,http://previews.7digital.com/clip/5456419,Uli Jon Roth,The Magic Word
-SOAJFKI12A6D4FC7C2,http://previews.7digital.com/clip/2490413,Matt Nathanson,Decade Of Hits (Dialogue)
-SOAJFNH12AB0181BB4,NA,Modulate,Hard And Dirty
-SOAJFSQ12A58A81993,http://previews.7digital.com/clip/11424869,Kottonmouth Kings,Somwhere Between Nowhere
-SOAJFUR12A8C13C9CD,NA,Heavenly,Over And Over
-SOAJFWJ12A8C13D523,http://previews.7digital.com/clip/12514308,Piano Red,"Blues, Blues, Blues"
-SOAJFWJ12AB018716E,http://previews.7digital.com/clip/8484028,Lucinda Williams,Lines Around Your Eyes
-SOAJGBB12AB018673B,http://previews.7digital.com/clip/7389530,Tony Rice,Orphan Annie
-SOAJGFJ12AAA15FC03,http://previews.7digital.com/clip/4813109,Sheila Walsh,Amazing Grace
-SOAJGFS12AAF3B494C,http://previews.7digital.com/clip/5861746,The Black Seeds,Keep On Pushing (Son Sine's In Da In Mix)
-SOAJGIA12AB0186D28,http://previews.7digital.com/clip/33926687,Koop,Summer Sun (Carlito Remix)
-SOAJGKU12A58A77F08,http://previews.7digital.com/clip/3221166,Ricky Skaggs,Somebody's Prayin'
-SOAJGLS12A58A79AB7,http://previews.7digital.com/clip/34482549,Makem & Clancy,The Dutchman
-SOAJGLT12A6D4F9602,http://previews.7digital.com/clip/281049,Labi Siffre,Would You Dance?
-SOAJGPJ12A6D4F951D,http://previews.7digital.com/clip/319637,Bryan Ferry,Chain Reaction (1999 Digital Remaster)
-SOAJGPO12A8C13AD23,http://previews.7digital.com/clip/2318562,PlankEye,Remind
-SOAJGRE12A81C22794,http://previews.7digital.com/clip/3061219,Dan Hicks,Coast To Coast (Live (1971 Troubadour))
-SOAJGRF12A8AE47577,NA,Fruko y Sus Tesos,El Nuevo Caimán
-SOAJGSO12A58A7C602,http://previews.7digital.com/clip/2170984,Fred Neil,The Other Side Of This Life
-SOAJGSQ12A6701FA3A,http://previews.7digital.com/clip/123502,Bond,Sugarplum
-SOAJGTU12AAA8C5AD5,http://previews.7digital.com/clip/498590,"Crosby, Stills & Nash",Into The Darkness
-SOAJGUL12A8C137A80,NA,Def Jef,God Made Me Funky
-SOAJGUO12A8C142CE3,NA,Calexico,Inspiracion
-SOAJGXX12A8C13B06C,http://previews.7digital.com/clip/1633033,Leo Kottke,Side One Suite: My Double
-SOAJGZJ12A6D4F8CAD,http://previews.7digital.com/clip/31739730,Mahlathini and The Mahotella Queens,Nyamphemphe
-SOAJHBD12AB018403A,http://previews.7digital.com/clip/5051520,Sonny Rollins,Disco Monk
-SOAJHBR12AB018923A,NA,Banda Bassotti,All Are Equal for the Law
-SOAJHCC12A8C1372DE,http://previews.7digital.com/clip/22419591,Doug Stanhope,Intro
-SOAJHDE12AB0185F1A,http://previews.7digital.com/clip/13123206,Paul Taylor,Side Pocket
-SOAJHEV12A8C1330CC,http://previews.7digital.com/clip/3214353,Ray Barretto,Cocinando
-SOAJHEY12A6D4F5BF1,http://previews.7digital.com/clip/232598,Tom Cochrane,When I'm With You
-SOAJHHK12A67ADF44A,http://previews.7digital.com/clip/697947,Life in Your Way,Making Waves
-SOAJHKZ12A8C1457AA,http://previews.7digital.com/clip/6829890,DJ Sneak,Some more
-SOAJHNN12A6D4F8194,http://previews.7digital.com/clip/34301416,Zola,Mdlwembe
-SOAJHPS12AB017F6D6,http://previews.7digital.com/clip/6891416,Doe Maar,Dansmuziek
-SOAJHSY12A8C1441D6,http://previews.7digital.com/clip/3603603,Kokolo,Democracy (Bonus Track)
-SOAJHTK12A6310E13D,http://previews.7digital.com/clip/273165,Bentley Rhythm Ace,A Lot Of Stick (But Not Much Carrot)
-SOAJHZM12A8C146F9A,http://previews.7digital.com/clip/3614340,Glashaus,Solange
-SOAJIAY12AB017EAB8,http://previews.7digital.com/clip/7021042,Cloak/Dagger,Runways
-SOAJIBJ12AAF3B35BA,http://previews.7digital.com/clip/3635007,Eliane Elias,Superwoman
-SOAJIDU12A679AE5BA,http://previews.7digital.com/clip/166363,Monster Magnet,Temple Of Your Dreams
-SOAJIFX12A58A78445,http://previews.7digital.com/clip/11677727,Busdriver,Avantcore (D-Styles Remix)
-SOAJIGS12A8C14506B,http://previews.7digital.com/clip/3603510,The New Mastersounds,YOUVE HAD IT ALL
-SOAJIGU12A8C13F8B9,http://previews.7digital.com/clip/8704785,Dennis Ferrer,Sinfonia Della Notte (John Dahlbäck Remix)
-SOAJIIO12AF72A64E1,http://previews.7digital.com/clip/164006,Rob Zombie,Transylvanian Transmissions Pt. 1
-SOAJIOV12A6D4FB3EF,http://previews.7digital.com/clip/496604,Eastmountainsouth,On Your Way
-SOAJIRD12A8C13B725,http://previews.7digital.com/clip/1674520,Ace Troubleshooter,My Way
-SOAJIUB12A8C133929,http://previews.7digital.com/clip/15772168,Warzone,Wound Up
-SOAJIVL12A6D4FA7CD,http://previews.7digital.com/clip/570714,Trick Daddy,Breaka Breaka [Explicit Album Version]
-SOAJIWO12A8C13FB5C,http://previews.7digital.com/clip/35979556,Adrienne Pierce,One Perfect Day
-SOAJIXC12AB0183243,http://previews.7digital.com/clip/1819369,Jim Sturgess,Girl
-SOAJIXF12AB017E58A,http://previews.7digital.com/clip/4424225,Stephen Lynch,Dear Diary 1
-SOAJIYS12AB0182B71,http://previews.7digital.com/clip/4707847,Alex Gopher,The shell
-SOAJJBD12A8C133D78,http://previews.7digital.com/clip/32214437,Venetian Snares,Banana Seat Girl
-SOAJJBP12A6701E6EC,http://previews.7digital.com/clip/24443,Nelly,Paradise
-SOAJJFM12A6701E3D0,http://previews.7digital.com/clip/79089,Static-X,I Am (Demo Version)
-SOAJJJG12AB017F375,http://previews.7digital.com/clip/5880033,Meg & Dia,Agree To Disagree
-SOAJJJT12A3F1EBC34,http://previews.7digital.com/clip/3845194,Randy Crawford,Blue Flame
-SOAJJLA12A58A7C97F,http://previews.7digital.com/clip/6839424,George Duke,C'est La Vie
-SOAJJMD12A8C13E1DE,http://previews.7digital.com/clip/3430409,Joaquín Sabina,Cuando Era Mas Joven
-SOAJJOW12AB0183275,http://previews.7digital.com/clip/4551677,Ana Carolina,Trancado
-SOAJJPC12AB017D63F,http://previews.7digital.com/clip/7846353,Nasty Nate,The Aftermath Feat: The Game
-SOAJJRC12A58A77CD6,http://previews.7digital.com/clip/19572691,Blur,Movin' On
-SOAJJRO12AB0182B3A,http://previews.7digital.com/clip/15458478,The Smiths,The Queen Is Dead / Take Me Back To Dear Old Blighty [Medley]
-SOAJJSC12A6701F70B,http://previews.7digital.com/clip/87493,Orgy,Blue Monday (Optical Vocal Mix)
-SOAJJSR12A8AE478A6,http://previews.7digital.com/clip/1429681,Fear Factory,Pisschrist (Concrete Version)
-SOAJJTE12A8C13206C,http://previews.7digital.com/clip/1494411,Peabo Bryson,Don't Give Your Heart
-SOAJJVJ12AB018368D,http://previews.7digital.com/clip/3695295,Despistaos,Resucito (version acustica)
-SOAJKAG12AB017D899,http://previews.7digital.com/clip/29106019,El Barrio,Y No Lo Puedo Soportar
-SOAJKBB12A6310E8F4,http://previews.7digital.com/clip/284645,Marc Almond,King Of The Fools
-SOAJKEM12A8C13E567,http://previews.7digital.com/clip/2387368,Black Moth Super Rainbow,Caterpillar House
-SOAJKEP12A6D4F6F42,http://previews.7digital.com/clip/266155,Richie Sambora,The Answer
-SOAJKFN12A58A7FB78,http://previews.7digital.com/clip/1321879,Joseph Arthur,Star Song
-SOAJKJL12AB01855E6,http://previews.7digital.com/clip/37767103,Dan Deacon,Paddling Ghost
-SOAJKLG12A81C21CCE,http://previews.7digital.com/clip/3071958,James Newton Howard,Five Miles Back
-SOAJKRD12AC3DF49CC,NA,Los Visitantes,Sopa Yanqui
-SOAJKTB12A6D4F7ECF,http://previews.7digital.com/clip/317494,Roudoudou,Funky monkey
-SOAJLAI12A8C142D2D,http://previews.7digital.com/clip/3591273,Murs,Think You Know Me
-SOAJLFI12AB018A345,http://previews.7digital.com/clip/7810675,Mad Flava,Raw Interlude
-SOAJLIC12A8C13ADF9,http://previews.7digital.com/clip/1668788,Dżem,Detox (2003 Digital Remaster;)
-SOAJLJU12AB0187DBE,http://previews.7digital.com/clip/8469823,Airwave,Escape From Nowhere (Original Mix)
-SOAJLLN12AB0184718,http://previews.7digital.com/clip/17856799,Super700,The Other Side
-SOAJLLV12AB0185656,http://previews.7digital.com/clip/8417053,Oliver P,Lost Without You
-SOAJLPR12AB017DC28,http://previews.7digital.com/clip/4286568,The Infamous Stringdusters,You Can't Handle The Truth
-SOAJLRL12A81C23F31,http://previews.7digital.com/clip/6127650,Mistress,Godless Drunken Wreck
-SOAJLSA12AB0188376,http://previews.7digital.com/clip/11673461,TTC,Leguman
-SOAJLUJ12A6D4F7E8F,http://previews.7digital.com/clip/382169,Peer Günt,Wanna Shake Your Boomboom
-SOAJLUX12AB0188F4D,http://previews.7digital.com/clip/8485179,Cher,You Take It All
-SOAJLWA12A6D4FCF25,NA,The Wildhearts,Thye Revolution Will Be Televised
-SOAJLXH12AB0189EB8,http://previews.7digital.com/clip/4064934,Richard Marx,Have Mercy
-SOAJLXT12AB018DFBB,http://previews.7digital.com/clip/6536347,Eugenio Finardi,La Paura Del Domani
-SOAJLXY12AB018AC34,NA,Erland & The Carnival,Was You Ever See
-SOAJLYJ12AB0187442,http://previews.7digital.com/clip/4732662,Havana Black,Speed Up The Time (2009 Digital Remaster)
-SOAJLZP12AAF3B294F,http://previews.7digital.com/clip/8055373,Mouth of the Architect,Hate And Heartache
-SOAJMBB12A8C144C7A,http://previews.7digital.com/clip/4349826,Gasolin',Sjagge
-SOAJMBV12AC46878DA,http://previews.7digital.com/clip/7633501,John O'Callaghan,Broken - Bryan Kearney Remix
-SOAJMDV12A6310DFEE,http://previews.7digital.com/clip/9101,My Life Story,Strumpet
-SOAJMED12A8C13A467,http://previews.7digital.com/clip/3958625,Raised Fist,Envy Is Dangerous
-SOAJMFD12A8C137012,http://previews.7digital.com/clip/12931886,Sam Cooke,"Jesus, I'll Never Forget"
-SOAJMHL12A8C13BBB4,http://previews.7digital.com/clip/6779713,Pennywise,Try
-SOAJMIX12A6D4FCF9F,http://previews.7digital.com/clip/2841105,HammerFall,Man On The Silver Mountain
-SOAJMJL12AB018355F,http://previews.7digital.com/clip/16741087,Carla Bozulich,Pissing
-SOAJMKL12A58A7E8CE,http://previews.7digital.com/clip/14749562,Halifax,Giant In The Ring
-SOAJMMG12A8C135155,http://previews.7digital.com/clip/961162,Orquesta El Arranque,La guitarrera
-SOAJMMN12B34F1EE1A,http://previews.7digital.com/clip/20587413,Threshold,Segue
-SOAJMRT12A8C13D647,http://previews.7digital.com/clip/13287933,Kasse Mady Diabate,Namanike
-SOAJMSD12AB018E70F,http://previews.7digital.com/clip/6563816,Manassas,Panhandle Rag
-SOAJMWR12A8C135A9B,http://previews.7digital.com/clip/1565054,Andrei Gavrilov,"Suite No. 7 in G Minor, HWV 432 (1996 - Remaster): V. Gigue (Vivo)"
-SOAJNEC12A8C13FDD6,http://previews.7digital.com/clip/3466345,Lorie,Santiago de Cuba
-SOAJNHM12A6D4F8D2A,http://previews.7digital.com/clip/449439,The Lemonheads,Hannah And Gabi
-SOAJNHU12AB017B5D2,http://previews.7digital.com/clip/4276368,Kristian Meurman,Lapin kesä
-SOAJNMN12A8C1363DA,NA,Richard Hawley,Darlin'
-SOAJNNL12A670215F0,http://previews.7digital.com/clip/80568,The Sun,Justice (Album Version)
-SOAJNOK12AB017FBDD,http://previews.7digital.com/clip/4392472,Max Morath,Maple Leaf Rag
-SOAJNOM12A6BD546F3,http://previews.7digital.com/clip/758037,Björn Skifs,Välkommen Till Mitt Liv
-SOAJNOZ12AB01816C7,http://previews.7digital.com/clip/4572381,Daryl Coley,He'll Never Let You Down
-SOAJNQB12A8C137EC2,http://previews.7digital.com/clip/8190339,Hellhammer,Death Fiend
-SOAJNQP12AB0184557,http://previews.7digital.com/clip/8137612,Nightrage,In My Heart
-SOAJNSN12A8AE4945A,http://previews.7digital.com/clip/3136731,"Harry Connick, Jr.",Charade
-SOAJNUL12A8C14036C,http://previews.7digital.com/clip/14859503,The Red Chord,Mouthful Of Precious Stones
-SOAJNYK12AF729F33B,http://previews.7digital.com/clip/255462,Amos Lee,"Keep It Loose, Keep It Tight"
-SOAJNZA12AB01830D0,NA,Marco V,A Journey into Sound
-SOAJNZL12AB01832FF,http://previews.7digital.com/clip/4308920,Holly Golightly,Listen
-SOAJOAV12A6310E147,http://previews.7digital.com/clip/13677,Derek and Clive,Hello Colin
-SOAJOBM12A8C136FD3,http://previews.7digital.com/clip/11271352,Oxford Collapse,For The Winter Coats
-SOAJOCQ12AF72AA7E7,http://previews.7digital.com/clip/33942654,Bad Manners,Hokey Cokey
-SOAJODS12A8C138A23,http://previews.7digital.com/clip/2203231,Whiskeytown,Inn Town
-SOAJODZ12AB018458F,http://previews.7digital.com/clip/4127712,Burzum,Erblicket die Tochter des Firmaments
-SOAJOEZ12AB018AECE,http://previews.7digital.com/clip/7487372,Florence Valentin,Hopplös
-SOAJOHY12A8C1335FE,http://previews.7digital.com/clip/5738926,Lightspeed Champion,Xanadu
-SOAJONZ12A8C137E4C,http://previews.7digital.com/clip/2268629,Brandy,Where You Wanna Be
-SOAJOQJ12AB017D98A,http://previews.7digital.com/clip/32441152,Kero One,On and On
-SOAJORE12A6701E3DA,http://previews.7digital.com/clip/126355,The Soundtrack of Our Lives,Bendover Babies
-SOAJORS12A58A7A9FB,http://previews.7digital.com/clip/6822743,Talking Heads,Making Flippy Floppy (Live)
-SOAJOSA12AB0186E41,http://previews.7digital.com/clip/5532426,The Kingsmen,I Will Rise Up From My Grave
-SOAJOVF12A6D4F4794,http://previews.7digital.com/clip/285642,Charly García,Happy And Real
-SOAJOWP12AC90716C9,http://previews.7digital.com/clip/35819825,Enam,Arinya
-SOAJOXD12B34F32B26,http://previews.7digital.com/clip/7710948,Beardfish,Abigails Questions (in An Infinite Universe)
-SOAJOYP12A8C14102E,http://previews.7digital.com/clip/9630983,Alexia Bomtempo,Cromologia (mix)
-SOAJOZD12A58A7E74B,http://previews.7digital.com/clip/3282475,The Manhattan Transfer,Goodnight
-SOAJPCY12A6D4F6955,http://previews.7digital.com/clip/530584,Zebda,Y'A Pas D'Arrangement
-SOAJPDI12A6D4F80F2,http://previews.7digital.com/clip/322923,Shampoo,Boys Are Us
-SOAJPEH12AB0185E66,http://previews.7digital.com/clip/15681736,The Autumn Offering,Light of Day
-SOAJPFO12A8AE45C68,http://previews.7digital.com/clip/19268210,Necro,Katsumi Skit
-SOAJPGC12AC468E1D8,http://previews.7digital.com/clip/34188258,Papa Charlie Jackson,"You Put It In, I'll Take It Out"
-SOAJPGO12A58A7E8F5,http://previews.7digital.com/clip/2225920,Agnostic Front,"Today, Tomorrow, Forever"
-SOAJPHC12A8C13936E,http://previews.7digital.com/clip/15993041,Helge Schneider,Der berühmte Beethoven
-SOAJPKX12A8C13B15E,http://previews.7digital.com/clip/2304266,Luar na Lubre,Danzando nos confins
-SOAJPOR12A8C141001,http://previews.7digital.com/clip/1787395,CRASHDÏET,Falling Rain
-SOAJPPH12AB0183076,http://previews.7digital.com/clip/5943208,Showbread,Out Of My Mind
-SOAJPPT12A58A7DD78,http://previews.7digital.com/clip/6041499,REO Speedwagon,You Won't See Me
-SOAJPQA12AB01818F5,http://previews.7digital.com/clip/7030787,Sutton Foster,Flight
-SOAJPUI12A8C1338D6,http://previews.7digital.com/clip/16157360,Josh Ritter,Real Long Distance
-SOAJPVA12A8C132EAB,http://previews.7digital.com/clip/3168389,Console,Pigeon Party
-SOAJPVO12A6D4F9D16,http://previews.7digital.com/clip/172933,Kevin Ayers,Oleh Oleh Bandu Bandong (2003 - Remaster)
-SOAJPXU12A670207AD,http://previews.7digital.com/clip/112280,Ryan Adams,Sweet Illusions
-SOAJPYM12AB0180791,http://previews.7digital.com/clip/3821950,BAP,Ewije Affhängerei
-SOAJQAQ12A8C135D0F,http://previews.7digital.com/clip/23101372,Tom Brosseau,My Heart Belongs to the Sea
-SOAJQAY12A8C1381BA,NA,Richard Hawley,Can You Hear The Rain Love
-SOAJQBC12A81C1FE9E,http://previews.7digital.com/clip/34627383,Four Bitchin' Babes,My Father (Megon & Co.)
-SOAJQBG12A67ADA6B8,http://previews.7digital.com/clip/718727,Sonic Youth,Sweet Shine
-SOAJQCL12A58A79581,http://previews.7digital.com/clip/10562807,John Mayer,Good Love Is On The Way (Live at the Nokia Theatre)
-SOAJQDK12A8AE48245,http://previews.7digital.com/clip/3127043,CSS,Jager Yoga
-SOAJQKX12AB0182ECB,http://previews.7digital.com/clip/7702454,Demolition Hammer,Infectious Hospital Waste (live)
-SOAJQNY12AB017F370,http://previews.7digital.com/clip/4023580,Souad Massi,Ilham
-SOAJQQR12A8C137683,http://previews.7digital.com/clip/1649952,Jore Marjaranta,Miten Pelko Lähtee
-SOAJQRI12A6D4F6E27,http://previews.7digital.com/clip/262170,Rui Veloso,Golden Days
-SOAJQSJ12AB01823F2,http://previews.7digital.com/clip/34558941,Brian Keane,Shenandoah
-SOAJQVU12A6D4F6FBE,http://previews.7digital.com/clip/270833,Paloalto,Always Running Home
-SOAJQWM12A8C139379,http://previews.7digital.com/clip/13781737,Chris Spedding,Motor Bikin'
-SOAJRAJ12AC3DFB02F,http://previews.7digital.com/clip/6581379,Hybrid,Formula Of Fear (Armchair Instrumental)
-SOAJRFJ12A8C13CD39,NA,Amiina,Sogg
-SOAJRHM12A8C14047D,http://previews.7digital.com/clip/6155596,Shriekback,Il Mystera Del Tempo
-SOAJRJS12AB0186B2E,http://previews.7digital.com/clip/8515150,William Orbit,Piece In The Old Style I
-SOAJRLM12AB01836C8,http://previews.7digital.com/clip/4706260,Tepr,My friend Guo Ran
-SOAJRLP12A58A7AB24,http://previews.7digital.com/clip/2999377,Cryptic Slaughter,American Heroes
-SOAJROU12A8C13A666,http://previews.7digital.com/clip/1660380,Paulinho da Viola,Batuqueiro
-SOAJROX12AC468B762,NA,Jill Barber,Nothing On Me
-SOAJRRG12A6D4F7C93,http://previews.7digital.com/clip/240345,Culture,The International Herb
-SOAJRRV12A8C1422DF,http://previews.7digital.com/clip/36180993,Hanne Hukkelberg,No One But Yourself
-SOAJRRZ12A8C132F18,http://previews.7digital.com/clip/5718777,Left Lane Cruiser,Amy's In the Kitchen
-SOAJRSH12A8C137499,NA,Rockabye Baby!,Dazed and Confused
-SOAJSAF12A8C140963,http://previews.7digital.com/clip/1270826,Legião Urbana,Metropole
-SOAJSCA12A58A7AD0E,http://previews.7digital.com/clip/2353769,Starfield,The Loveliest Sound
-SOAJSCK12A6D4FA272,http://previews.7digital.com/clip/439471,El Sueño de Morfeo,Rendida a tus pies
-SOAJSDB12A8C141B0B,NA,MC Devvo & Shady Piez,Crystal Meffin
-SOAJSDI12A58A7E165,http://previews.7digital.com/clip/34481810,Phil Perry,Shower The People
-SOAJSDT12A6D4F9E76,http://previews.7digital.com/clip/481198,Maria de Barros,Oh Menel
-SOAJSFW12A6D4FA519,http://previews.7digital.com/clip/20199851,De Mens,Sex Verandert Alles
-SOAJSLR12B35055CCE,http://previews.7digital.com/clip/13802315,Six Feet Under,Waiting for Decay
-SOAJSMN12AB0186908,http://previews.7digital.com/clip/7998988,Beanfield,Catalpa
-SOAJSOM12A8C142EE3,http://previews.7digital.com/clip/2463727,Noe Venable,Climb
-SOAJSRN12A6D4F6EAB,http://previews.7digital.com/clip/299835,Alphonse Mouzon,Some Of The Things People Do
-SOAJSSJ12AB018A6A4,http://previews.7digital.com/clip/7817494,Banda Eva,"Eu Vou No Eva (Live At Riocentro, Rio de Janeiro (RJ), Brazil/2005)"
-SOAJSSP12A8C1313E9,http://previews.7digital.com/clip/3156771,Phoebe Snow,There's A Boat That's Leavin' Soon For New York
-SOAJSUN12A8C13FC6E,http://previews.7digital.com/clip/2417000,Jamie Cullum,Pointless Nostalgic
-SOAJSUT12A6D4F7AA9,http://previews.7digital.com/clip/1153513,Nick Glennie-Smith,A Taste of Something
-SOAJSWN12AB017B01B,http://previews.7digital.com/clip/5393663,Tom Salta,Secure Those Nukes!
-SOAJSXH12A58A7A1C0,http://previews.7digital.com/clip/370107,Brownsville Station,I'm The Leader Of The Gang
-SOAJSZE12AB018869C,http://previews.7digital.com/clip/5215277,Depth Affect,Street Level
-SOAJSZI12A6D4F8137,http://previews.7digital.com/clip/255936,MxPx,Sick Boy (Let It Happen Album Version)
-SOAJSZL12A58A79D4A,http://previews.7digital.com/clip/961164,Orquesta El Arranque,Redención
-SOAJTBN12AC468BB75,http://previews.7digital.com/clip/13142190,Jimmy Yancey,Jimmy's Stuff
-SOAJTCD12AF72A2F1C,http://previews.7digital.com/clip/15401022,Gary Go,Heart And Soul
-SOAJTCF12AC960DE22,http://previews.7digital.com/clip/32921569,Maps,Without You
-SOAJTDO12AB0184CE8,http://previews.7digital.com/clip/11674489,TTC,De Pauvres Riches
-SOAJTEN12AB01867E5,http://previews.7digital.com/clip/8835534,The Pointer Sisters,(She's Got) The Fever
-SOAJTFA12AB01809A1,http://previews.7digital.com/clip/3687011,Marvin Sease,Candy Licker 2
-SOAJTHN12A67021D07,http://previews.7digital.com/clip/161871,Alien Ant Farm,Flesh and Bone
-SOAJTIR12A81C22901,http://previews.7digital.com/clip/1377886,Fear,Disconnected
-SOAJTMZ12AB01816E9,NA,Allen Toussaint,Me and You
-SOAJTNM12A8C1354B2,http://previews.7digital.com/clip/1564385,El Arrebato,No Se Entera De Ná
-SOAJTPQ12A8C13B35A,NA,Sugar Minott,Going Back To Mother Land
-SOAJTPX12A58A78F13,http://previews.7digital.com/clip/4094163,Heideroosjes,We're All Fucked Up!
-SOAJTQB12A8C13F29F,http://previews.7digital.com/clip/29622404,JJ Grey & Mofro,Country Ghetto
-SOAJTQF12A8C13DB0E,NA,Samy Deluxe,Geh wo Du wohnst
-SOAJTQI12A8C13B847,http://previews.7digital.com/clip/2355958,Luis Alberto Spinetta,Flecha Zen
-SOAJTSM12AAF3B1BF8,http://previews.7digital.com/clip/3565284,The Bangles,Dover Beach
-SOAJTUT12A8C13FCB3,http://previews.7digital.com/clip/9045073,Downchild,Scars
-SOAJUDA12A67ADE647,http://previews.7digital.com/clip/197752,Jaime Urrutia,Maribel
-SOAJUDF12A8C145BD0,NA,Andrew Spencer,Here Without You (Alex M. Vs. Marc Van Damme Bigroom Edit)
-SOAJUEF12A8C141B00,http://previews.7digital.com/clip/3546177,Daisy Chainsaw,Mosquito
-SOAJUFT12AB017FDC7,NA,Zebrahead,Death By Disco
-SOAJUGL12AB018B827,http://previews.7digital.com/clip/7969987,Sunday Driver,Down By the Den
-SOAJUHB12A6310EE95,http://previews.7digital.com/clip/508298,Athlete,Out Of Nowhere
-SOAJUHS12AB01843B3,http://previews.7digital.com/clip/7665430,Bolt Thrower,Realm Of Chaos
-SOAJUJO12AC4688861,http://previews.7digital.com/clip/7593342,Strike Anywhere,S.S.T.
-SOAJULY12A8C133C72,http://previews.7digital.com/clip/21666394,Carpathian Forest,Cold Murderous Music
-SOAJUPN12AB018AE45,http://previews.7digital.com/clip/7888136,Rally,Jag Kan Inte Säga 'R'
-SOAJUQD12A670203E4,http://previews.7digital.com/clip/3635399,The 101ers,Shake Your Hips (Live)
-SOAJURC12A8C138D60,NA,Peter Sarstedt,margueritte
-SOAJUSW12A6D4FD06F,http://previews.7digital.com/clip/16362948,Frau Doktor,The sound of the suburbs
-SOAJUSY12A6D4F8BBF,http://previews.7digital.com/clip/378751,Bitch Alert,If You Were Mine
-SOAJUTM12A81C2053D,http://previews.7digital.com/clip/2555468,Jeff Mills,Time Machine (Blue Potential Version)
-SOAJUWA12A6D4F9B38,http://previews.7digital.com/clip/670372,Erin O'Donnell,Thank You (Get It Right) (Wide Wide World Album Version)
-SOAJUXM12A58A7D8D8,http://previews.7digital.com/clip/630905,LoveHateHero,Theatre of Robots
-SOAJUYL12A6D4FA7DB,http://previews.7digital.com/clip/620524,Mr. Review,Prejudice
-SOAJUYS12AB0189726,NA,DoomSword,Death of Ferdia
-SOAJUZG12AB0186B74,http://previews.7digital.com/clip/12018228,Pedro Laurenz,Alma de Bohemio
-SOAJVAQ12A8C13C926,http://previews.7digital.com/clip/2354698,Merche,Necesito Libertad
-SOAJVBL12AB018ABD8,http://previews.7digital.com/clip/8069274,Scraps of Tape,Wright Is Rong
-SOAJVCC12A6D4FAA76,http://previews.7digital.com/clip/578731,Corinne Bailey Rae,Since I've Been Loving You (iTunes Session)
-SOAJVCD12A6701D947,http://previews.7digital.com/clip/386196,Dashboard Confessional,Rapid Hope Loss
-SOAJVCL12A6D4F5697,http://previews.7digital.com/clip/17106902,No-Man,The Break Up For Real (Drum Mix)
-SOAJVDE12AB018CA29,http://previews.7digital.com/clip/7338766,Dan Zanes and Friends,Let's Shake
-SOAJVDQ12A6D4FA38B,http://previews.7digital.com/clip/34927098,Casiotone for the Painfully Alone,Attic Room
-SOAJVDU12A6310E32C,http://previews.7digital.com/clip/18406,U2,Are You Gonna Wait Forever?
-SOAJVEI12A6D4FA8A0,http://previews.7digital.com/clip/6828029,The Crystals,Parade of the Wooden Soldiers
-SOAJVGJ12A8C13A54B,http://previews.7digital.com/clip/2305923,Theory of a Deadman,Any Other Way
-SOAJVGO12AB017EB8E,http://previews.7digital.com/clip/5389210,Bong-Ra,Slaytronic
-SOAJVGS12A8C13D042,http://previews.7digital.com/clip/1748444,Howard Carpendale,I Was A Stranger
-SOAJVIM12AB0182A96,http://previews.7digital.com/clip/7184165,Abdoulaye Diabaté,Xam-Xam
-SOAJVJT12AB0186F75,http://previews.7digital.com/clip/5654909,Japandroids,Crazy/Forever
-SOAJVJX12A6D4FB839,http://previews.7digital.com/clip/1278999,Christine Anu,Monkey & The Turtle
-SOAJVKW12A8C136E12,NA,The Lightning Seeds,All The Things
-SOAJVKX12A8C13D8FE,http://previews.7digital.com/clip/14491239,Lifehouse,Learn You Inside Out
-SOAJVKZ12AB0185DFA,http://previews.7digital.com/clip/1760657,Jay-Z,Pray
-SOAJVLQ12AB018A28D,http://previews.7digital.com/clip/33975954,Emily Jane White,Stairs
-SOAJVML12AB018B1F3,http://previews.7digital.com/clip/6291764,Boom Bip & Doseone,Ho's
-SOAJVOP12AB0183F1D,http://previews.7digital.com/clip/3739164,Genesis,The Colony Of Slippermen (The Arrival/A Visit To The Doktor/Raven) (2008 Digital Remaster)
-SOAJVPM12A8C133B83,http://previews.7digital.com/clip/301710,Elis Regina,Nova Estação
-SOAJVPT12A67ADD466,http://previews.7digital.com/clip/183597,Los Secretos,Contando estrellas
-SOAJWAC12AB018350F,NA,Backstreet Boys,Unsuspecting Sunday Afternoon (Main Version)
-SOAJWAH12AF72AD548,http://previews.7digital.com/clip/4942561,Train,Heavy
-SOAJWBU12A8C136FE9,http://previews.7digital.com/clip/3326654,Minotaur Shock,Beekeeper
-SOAJWHP12AB017F9A4,http://previews.7digital.com/clip/3727250,Engelbert Humperdinck,Wonderland By Night
-SOAJWHQ12A58A80412,http://previews.7digital.com/clip/8042228,Minipop,Generator
-SOAJWMO12A6D4F8747,http://previews.7digital.com/clip/347782,Rocco Deluca and the Burden,How Fast
-SOAJWNE12AF72A6BB3,http://previews.7digital.com/clip/5680367,Fabolous,Pachanga
-SOAJWNV12A6D4F86E9,http://previews.7digital.com/clip/1545119,Ulf Lundell,Gå Ut Och Var Glad
-SOAJWOH12A6D4F66A3,NA,The Blind Boys of Alabama,Many Rivers To Cross
-SOAJWTT12A8C13F9DE,http://previews.7digital.com/clip/2956897,The Ragga Twins,The Homeless Problem
-SOAJWUL12A6D4F7ADB,http://previews.7digital.com/clip/2764613,Between the Buried and Me,What We Have Become
-SOAJWVX12A6D4F63EE,http://previews.7digital.com/clip/278959,Geri Halliwell,Shake Your Bootie Cutie
-SOAJXBF12AB018A1A2,http://previews.7digital.com/clip/8528081,Natalie MacMaster,Hey Johnny Cope (March And Reels Medley)
-SOAJXBS12A58A7AEBC,http://previews.7digital.com/clip/698078,Cliff Richard,Do You Remember (2007 Digital Remaster)
-SOAJXBT12AB018A234,http://previews.7digital.com/clip/7903293,Windir,Destroy
-SOAJXDF12AB0185D5A,http://previews.7digital.com/clip/13799742,Evergreen Terrace,The Letdown
-SOAJXFD12A8C13B71E,http://previews.7digital.com/clip/3860559,Delroy Wilson,Sun Is Shining
-SOAJXFG12A6D4F4A92,http://previews.7digital.com/clip/824746,Sonya Kitchell,Too Beautiful
-SOAJXGU12A8C13921E,http://previews.7digital.com/clip/1103581,St. Vincent,The Apocalypse Song
-SOAJXGV12AB0185AF0,http://previews.7digital.com/clip/7953035,Jaheim,Another Round
-SOAJXHH12AB0184199,http://previews.7digital.com/clip/5483250,Angels of Light & Akron/Family,One For Hope
-SOAJXHY12AB0185CDB,http://previews.7digital.com/clip/8350663,Mr. Vegas,Thank You Girl
-SOAJXIJ12AB018810B,http://previews.7digital.com/clip/7830358,Go Betty Go,Unreal
-SOAJXIT12A58A7AB55,http://previews.7digital.com/clip/269560,Kurt Elling,Oh My God (Live)
-SOAJXJU12A6D228293,http://previews.7digital.com/clip/563292,Love of Diagrams,Pace Or The Patience
-SOAJXMN12A8C13AC0A,http://previews.7digital.com/clip/1733648,Da Weasel,Joaninha (Bem Vinda!)
-SOAJXMT12AB0187BFC,http://previews.7digital.com/clip/7268150,Giannis Aggelakas,I Ekdikisi Tis Giannoulas
-SOAJXNU12AC468CF01,http://previews.7digital.com/clip/7631074,Esmée Denters,Just Can't Have It
-SOAJXOH12AB0187863,http://previews.7digital.com/clip/30436559,Erasure,Fingers and Thumbs (Cold Summer's Day) [Sound Factory Remix Radop Edit]
-SOAJXPI12AB0182F02,http://previews.7digital.com/clip/7714634,Spiritual Beggars,Blind Mountain (live)
-SOAJXPK12AB01844B7,http://previews.7digital.com/clip/8311116,Airbourne,Bottom Of The Well
-SOAJXPO12AB018C77E,http://previews.7digital.com/clip/8985107,Jawbreaker,Busy
-SOAJXRY12A670211E8,http://previews.7digital.com/clip/123288,Gyllene Tider,Speciell
-SOAJXRY12A6D4F91B1,http://previews.7digital.com/clip/606013,Böhse Onkelz,Keine Amnestie für MTV
-SOAJXSK12AAF3B4246,http://previews.7digital.com/clip/4244121,Rupert Holmes,Morning Man
-SOAJXYU12A8C13C022,http://previews.7digital.com/clip/3388643,Gareth Gates,Anyone Of Us (Stupid Mistake)
-SOAJYBD12AB018D6C5,http://previews.7digital.com/clip/8524544,Floor,Who Are You
-SOAJYCD12A8AE4826F,http://previews.7digital.com/clip/5995842,Blues Explosion,Burn It Off
-SOAJYDW12A58A7BE47,http://previews.7digital.com/clip/2384735,Lifesavas,Night Out + Scene 5 - Connects
-SOAIVXL12AB0180F99,http://previews.7digital.com/clip/4927502,Melocos,Asi
-SOAIVZC12A58A779EC,http://previews.7digital.com/clip/6966622,The Jacka,Murder On My Mind
-SOAIVZL12A8C139DFB,http://previews.7digital.com/clip/1689108,A Perfect Circle,The Outsider
-SOAIWAB12A8C13710A,NA,The Bouncing Souls,Blind Date
-SOAIWAT12AB018557F,http://previews.7digital.com/clip/28949772,Grossomodo,Grozzeros
-SOAIWCC12AC907107C,http://previews.7digital.com/clip/34558096,The Dixie Cups,Iko Iko
-SOAIWCN12A6D4F726C,http://previews.7digital.com/clip/389485,Archie Bell & The Drells,I Don't Wanna Be A Playboy
-SOAIWCX12AB0189A83,http://previews.7digital.com/clip/34630903,John Renbourn,The Moon Shines Bright
-SOAIWFL12A6D4F627E,http://previews.7digital.com/clip/839727,Building 429,Singing Over Me
-SOAIWGK12AB018325D,http://previews.7digital.com/clip/5100112,John Patitucci,Bach Prelude In G Major (From The Cello Suite)
-SOAIWGP12AB0188C18,http://previews.7digital.com/clip/4107627,Spiderbait,The Dog
-SOAIWIV12A6D4FCE3E,http://previews.7digital.com/clip/21665787,Christian Death,Workship Along the Nile
-SOAIWMG12A6D4FA280,NA,AFI,Don't Change
-SOAIWNM12A6D4FA9A4,http://previews.7digital.com/clip/9031838,Daddy X,Peaceful Day
-SOAIWOF12A8C136FF5,http://previews.7digital.com/clip/2224433,Soft,Droppin'
-SOAIWOH12AB018859A,http://previews.7digital.com/clip/8439233,Hot Action Cop,Goin' Down On It (album/edited version)
-SOAIWOT12AC90752F7,http://previews.7digital.com/clip/7677504,The Grown-Ups,Scarz
-SOAIWQN12A8C143C09,http://previews.7digital.com/clip/10364604,Rodgau Monotones,Nutella is' all
-SOAIWRH12AB017D6DC,http://previews.7digital.com/clip/19315606,Annie Ross,The Way You Look Tonight
-SOAIWSY12AB017AE28,http://previews.7digital.com/clip/3253720,Savage Garden,Tears Of Pearls
-SOAIWVI12AB0184A04,http://previews.7digital.com/clip/8366984,鄧麗欣,Pei Zhe Wo Zou
-SOAIWVT12A8C13A65E,http://previews.7digital.com/clip/5947726,Next,My Place
-SOAIWXK12A8C142F9B,http://previews.7digital.com/clip/11641806,Yppah,Sun Flower Sun Kissed
-SOAIWYR12A67020C40,http://previews.7digital.com/clip/161707,Ofra Haza,Goodbye Brother (The Prince Of Egypt/Soundtrack Version)
-SOAIWZP12A8C13F700,http://previews.7digital.com/clip/22305011,808 State,Revenge Of The Girlie Men
-SOAIXEP12AB0186E49,http://previews.7digital.com/clip/161530,Burt Bacharach,I Say A Little Prayer
-SOAIXHF12AC960DE5A,http://previews.7digital.com/clip/8581341,Billy Sheehan,One Good Reason
-SOAIXHM12AB018387E,http://previews.7digital.com/clip/7163878,The Young Dubliners,Howaya Girls
-SOAIXKE12A8C13701D,http://previews.7digital.com/clip/1559491,Chicos De Barrio,Cumbia Urbana
-SOAIXKK12A6D4F96F7,http://previews.7digital.com/clip/29028445,Roachford,Open Road
-SOAIXLN12A6BD4CFB4,http://previews.7digital.com/clip/751584,Jaime Roos,Por Amor Al Arte
-SOAIXRT12AB018190F,NA,Pierre Perret,Le fils-père
-SOAIXTD12AB017FC9E,http://previews.7digital.com/clip/4914467,Paul Kalkbrenner,Absynthe
-SOAIXUP12A8C13AAD3,http://previews.7digital.com/clip/1624645,Enrique Morente,Yo He Visto A Un Niño Llorar (Peteneras De Chacón) (1996 Digital Remaster)
-SOAIXXM12A6D4FC2CC,http://previews.7digital.com/clip/2488634,Johnny Truant,I Love You Even Though You're A Zombie Now
-SOAIXYC12AB0183312,http://previews.7digital.com/clip/8343528,City Haze,Tell Me Whats good
-SOAIXYO12A6D4F82E7,http://previews.7digital.com/clip/338919,Black Star Liner,Swimmer
-SOAIXYU12A6D4F83AE,http://previews.7digital.com/clip/280794,Van Hunt,Hold My Hand
-SOAIYCM12AF72A09E3,http://previews.7digital.com/clip/7867527,Nevea Tears,No One Ever Shuts Up
-SOAIYEW12AB0182AB5,http://previews.7digital.com/clip/5709021,Jeremy Enigk,On The Wayside
-SOAIYFP12A8C139152,NA,Meat Puppets,"Oh, Me"
-SOAIYIP12A58A7AF8A,NA,Superheist,A Dignified Rage
-SOAIYLY12A8C1300BC,http://previews.7digital.com/clip/1463465,Pops Staples,People Get Ready
-SOAIYMY12A8159E955,http://previews.7digital.com/clip/1346333,Super Deluxe,Johnny's Gone Fishin'
-SOAIYRA12AB017FDD6,NA,Kotiteollisuus,Routa ei lopu (2003)
-SOAIYVJ12A8C13B2C3,http://previews.7digital.com/clip/1748030,Howard Carpendale,Vielleicht Bis Morgen
-SOAIYYR12AB0186820,http://previews.7digital.com/clip/19620827,Eddy Current Suppression Ring,Isn't It Nice
-SOAIYZT12AB018AABC,http://previews.7digital.com/clip/7609714,The Promise Ring,E. Texas Ave.
-SOAIZAW12A6D4F801D,http://previews.7digital.com/clip/396646,Kierra Sheard,This Is Me
-SOAIZBR12A8C13C54A,http://previews.7digital.com/clip/1690099,ストレイテナー,March
-SOAIZEP12AC3DF66BB,http://previews.7digital.com/clip/9083486,IOS,Lichtjaren
-SOAIZEY12A8C1337BF,http://previews.7digital.com/clip/2678611,Betagarri,Txikia naiz
-SOAIZGD12AB01819AD,http://previews.7digital.com/clip/5615474,la india,El Hombre Perfecto
-SOAIZGM12A6D4F7D7D,http://previews.7digital.com/clip/7465144,Figures on a Beach,No Stars
-SOAIZGZ12A8C137C11,http://previews.7digital.com/clip/1603776,Urban Knights,I'm Not In Love
-SOAIZIO12AC4686AFE,http://previews.7digital.com/clip/7760336,Cars & Trains,Dead Telephone
-SOAIZJK12A8C135B8B,http://previews.7digital.com/clip/5923213,Rage Against the Machine,Ashes In The Fall
-SOAIZMN12A8C1332A6,http://previews.7digital.com/clip/13143526,Vashti Bunyan,Coldest Night of the Year
-SOAIZMO12A8C13D999,http://previews.7digital.com/clip/1696451,Martha Argerich,"Piano Sonata No. 3 in B Minor, Op.58 (1999 Digital Remaster): I. Allegro maestoso"
-SOAIZMY12AC9072B57,http://previews.7digital.com/clip/7677851,The Neptunas,To Serve Man
-SOAIZOW12A8C13AA68,http://previews.7digital.com/clip/33308621,Miranda Sex Garden,Though My Carriage Be But Careless
-SOAIZVR12AB0183B18,http://previews.7digital.com/clip/7083908,Suburban Tribe,One Of My Little Memories
-SOAIZWN12AF729F8CA,http://previews.7digital.com/clip/374983,Beastie Boys,Shazam!
-SOAIZZG12A6D4F9BC0,http://previews.7digital.com/clip/603174,Lady Sovereign,Pretty Vacant (Live at Commodore Ballroom)
-SOAIZZJ12A6D4F87CA,http://previews.7digital.com/clip/384780,Love Is All,Motorboat
-SOAIZZW12AF72A71DC,http://previews.7digital.com/clip/32756546,Scanners,A Girl Like You
-SOAJACT12A8C13B8FE,http://previews.7digital.com/clip/1097391,Cocteau Twins And Harold Budd,Why Do You Love Me?
-SOAJACY12AC3DF7F4F,NA,Matthew Herbert,Manchester
-SOAJAJH12A6D4F64F8,http://previews.7digital.com/clip/241707,T'Pau,Road To Our Dream
-SOAJAKT12A58A7C70E,http://previews.7digital.com/clip/374886,Chris Cagle,Who Needs The Whiskey
-SOAJAMD12A58A7BC4C,NA,Dead Can Dance,Don’t Fade Away (Live Remastered)
-SOAJANR12A6D4F7C23,http://previews.7digital.com/clip/406427,Nuyorican Soul,Nuyorican Soul Intro
-SOAJAUN12A8C141AD0,http://previews.7digital.com/clip/3546172,Daisy Chainsaw,Candy Floss
-SOAJAYZ12A8C135270,NA,Lifesavas,Happiness
-SOAJBAF12A8C136AF2,http://previews.7digital.com/clip/3297909,Anthony Hamilton,"Cornbread, Fish & Collard Greens"
-SOAJBEI12A6D4FE658,http://previews.7digital.com/clip/1331996,Royal Bliss,I'll Be Around
-SOAJBFA12AB01873E2,http://previews.7digital.com/clip/7241582,Gangster Fun,Butt Down Under
-SOAJBFP12A8AE45C72,http://previews.7digital.com/clip/3097189,Inkubus Sukkubus,Leveller
-SOAJBJP12A8A9D5770,http://previews.7digital.com/clip/3092960,Stan Whitmire,Better Hurry Up
-SOAJBJP12AB0180E36,http://previews.7digital.com/clip/7136261,The Barbarians,Mr. Tambourine Man
-SOAJBKD12A8C14005D,http://previews.7digital.com/clip/11739570,Alexisonfire,We Are The Sound
-SOAJBPD12A8C13B166,http://previews.7digital.com/clip/3365657,Eros Ramazzotti,C'è Una Strada In Cielo
-SOAJBPP12AC4689BB7,http://previews.7digital.com/clip/10240661,The Chordettes,Lollipop (Squeak E Clean & Desert Eagles Remix)
-SOAJBWK12AB0183AED,http://previews.7digital.com/clip/8305935,Grinspoon,Hold On Me
-SOAJBYA12A6D4F50B0,http://previews.7digital.com/clip/862400,Velvet,Funzioni Primarie
-SOAJBYT12A6D4F733C,http://previews.7digital.com/clip/296117,David Usher,Hallucinations
-SOAJCAX12A58A7AC30,http://previews.7digital.com/clip/4325427,The Meteors,Fuck Off And Die
-SOAJCDK12A5891E650,http://previews.7digital.com/clip/8900197,Compton's Most Wanted,Growin' Up In The Hood
-SOAJCDT12AB0187257,NA,Agonoize,Evil Illusion
-SOAJCKQ12A67ADF337,http://previews.7digital.com/clip/30148688,Cochi e Renato,E La Vita La Vita
-SOAJCLG12AB0184CD2,http://previews.7digital.com/clip/11674250,Roots Manuva,Artical
-SOAJCPJ12A8C13557C,NA,Pinetop Seven,Our First Drunk Dream
-SOAJCPL12A58A79D75,http://previews.7digital.com/clip/671379,Don Francisco,Jesus Of Nazareth
-SOAJCQX12A8C138D6A,http://previews.7digital.com/clip/1640815,The Sleepy Jackson,Raindrop
-SOAJCVY12A8C136556,NA,Jerry Holland,Boo Baby's Lullaby
-SOAJCYT12A6D4F98DC,http://previews.7digital.com/clip/647452,Francisco Céspedes,Drume negrita
-SOAJCZP12A6D4F762E,http://previews.7digital.com/clip/2274826,Fran Perea,Tal vez
-SOAJDAF12A8C1320BF,http://previews.7digital.com/clip/1466385,Ismo Alanko Säätiö,T
-SOAJDAL12AC90716B0,http://previews.7digital.com/clip/6679147,The Hammersmith Gorillas,You Really Got Me
-SOAJDBS12AB018E28C,http://previews.7digital.com/clip/9072410,Robert and Johnny,We Belong Together
-SOAJDCW12A6D4FB482,http://previews.7digital.com/clip/2205762,Le Peuple de l'Herbe,Déjà à l'école
-SOAJDCW12A8C13A284,NA,Fujiya & Miyagi,Goosebumps
-SOAJDEU12A8C13D3A3,http://previews.7digital.com/clip/1137394,Jeff Golub,Metro Cafe
-SOAJDJH12A6D4F8A30,http://previews.7digital.com/clip/371128,Los Nikis,Olaf El Vikingo
-SOAJDJL12AAF3B2AF3,http://previews.7digital.com/clip/6870235,Thyrfing,The Breaking of Serenity
-SOAJDMI12A67020BD3,http://previews.7digital.com/clip/161534,Carpenters,Aurora
-SOAJDNG12A6D4F9F14,NA,The Young Gods,El Magnifico
-SOAJDOE12A8C13AA0F,http://previews.7digital.com/clip/3720023,Alan Jackson,She Likes It Too
-SOAJDRP12AF72A0F56,NA,Britney Spears,Blur (Main Version)
-SOAJDSD12A58A7A608,http://previews.7digital.com/clip/4503161,John Fogerty,Have You Ever Seen The Rain?
-SOAJDTC12A67ADC7B2,http://previews.7digital.com/clip/182866,Compay Segundo,Amor Gigante
-SOAJDVN12A6D4F8927,http://previews.7digital.com/clip/318045,Ministère AMER,Un été à la cité
-SOAJDWU12A8C1389F3,NA,Loquillo y Trogloditas,Besos Robados (Versión Country)
-SOAJDXB12A6D4FDAAB,http://previews.7digital.com/clip/35823326,Tarkan,Dedikodu
-SOAJDYB12A8C1341CB,http://previews.7digital.com/clip/940275,San Telmo Lounge,Hotel Victoria
-SOAJDZY12AB0182CED,http://previews.7digital.com/clip/4124812,Billy J. Kramer & The Dakotas,Under The Boardwalk (Stereo) (2009 Digital Remaster)
-SOAJEAJ12AC9097E5B,http://previews.7digital.com/clip/6578324,Adie,Sufficient (Medium Key-Premiere Performance Plus w/ Background Vocals)
-SOAJEBX12A8C13AAAB,http://previews.7digital.com/clip/2230723,Modern English,Smiles And Laughter
-SOAJECT12AB0182A8B,http://previews.7digital.com/clip/5735819,王力宏,Ai Yin Wei Zai Xin Zhong
-SOAJEEY12A8C13F90B,http://previews.7digital.com/clip/2463277,Alias,lost friend advice
-SOAJEFW12A8C133366,http://previews.7digital.com/clip/2129663,Kenny G,Mirame Bailar
-SOAJEHW12AF72A6326,NA,Collective Soul,Simple
-SOAJEIE12A6D4FA55E,http://previews.7digital.com/clip/663577,Don Davis,Exit Mr. Hat
-SOAJEJB12AB0189270,http://previews.7digital.com/clip/12467479,The Ziggens,It's Great To Be Unemployed
-SOAJEJX12A8C135032,NA,ActionReaction,March On
-SOAJEMK12A6D4FCD63,http://previews.7digital.com/clip/1308520,Dario Marianelli,The Cottage On The Beach
-SOAJENR12A8C135CA0,http://previews.7digital.com/clip/2126206,Los Delinqüentes,Mortadelo Y Filemon
-SOAJEOB12AB017FDC0,http://previews.7digital.com/clip/7396557,Dog Fashion Disco,Sweet Insanity
-SOAJEPL12A6D4FA93A,http://previews.7digital.com/clip/3523402,Jesse Malin,Little Star
-SOAJEPW12A8C142BFA,NA,Los Amigos invisibles,Mi Linda
-SOAJEPY12A8C13D9E6,http://previews.7digital.com/clip/6966781,The Rutles,Love Life
-SOAJEQO12A6D4FA3A4,http://previews.7digital.com/clip/560251,Beulah,Popular Mechanics for Lovers
-SOAJERK12A8C137287,http://previews.7digital.com/clip/2227735,Compay Segundo,Desvelo De Amor
-SOAJEUE12AB0188C96,http://previews.7digital.com/clip/7705271,Enchant,Ultimate Gift
-SOAJEWS12AF72A1037,NA,Clutch,Impetus
-SOAJEXL12AB017DD7A,http://previews.7digital.com/clip/4368207,IIIrd Tyme Out,Little Rabbit
-SOAJEXV12AB0189BDA,http://previews.7digital.com/clip/30629401,Fionn Regan,House Detective
-SOAJEZF12A8C13C816,http://previews.7digital.com/clip/1747761,Guff,"No Gods, No Masters"
-SOAJFAR12A8C142E4A,NA,Shameboy,Monofour (Live At The Pyramid Marquee)
-SOAJFBK12A8C1371B4,http://previews.7digital.com/clip/3268170,Mass Hysteria,P 4
-SOAJFBP12AB0181298,http://previews.7digital.com/clip/36224761,Margaret Cho,Grandmother Died
-SOAJFDK12A67020A83,http://previews.7digital.com/clip/123692,Mighty Joe Young,Early In The Morning
-SOAJFDX12AB017F50A,http://previews.7digital.com/clip/6925226,Ornella Vanoni,Cosa M'Importa
-SOAJFDZ12A6701FC5E,http://previews.7digital.com/clip/152123,Nelly,Kings Highway
-SOAJFFT12A8C13CF97,http://previews.7digital.com/clip/1680144,Alice,Orléans
-SOAJFJX12AB017F985,http://previews.7digital.com/clip/5456419,Uli Jon Roth,The Magic Word
-SOAJFKI12A6D4FC7C2,http://previews.7digital.com/clip/2490413,Matt Nathanson,Decade Of Hits (Dialogue)
-SOAJFNH12AB0181BB4,NA,Modulate,Hard And Dirty
-SOAJFSQ12A58A81993,http://previews.7digital.com/clip/11424869,Kottonmouth Kings,Somwhere Between Nowhere
-SOAJFUR12A8C13C9CD,NA,Heavenly,Over And Over
-SOAJFWJ12A8C13D523,http://previews.7digital.com/clip/12514308,Piano Red,"Blues, Blues, Blues"
-SOAJFWJ12AB018716E,http://previews.7digital.com/clip/8484028,Lucinda Williams,Lines Around Your Eyes
-SOAJGBB12AB018673B,http://previews.7digital.com/clip/7389530,Tony Rice,Orphan Annie
-SOAJGFJ12AAA15FC03,http://previews.7digital.com/clip/4813109,Sheila Walsh,Amazing Grace
-SOAJGFS12AAF3B494C,http://previews.7digital.com/clip/5861746,The Black Seeds,Keep On Pushing (Son Sine's In Da In Mix)
-SOAJGIA12AB0186D28,http://previews.7digital.com/clip/33926687,Koop,Summer Sun (Carlito Remix)
-SOAJGKU12A58A77F08,http://previews.7digital.com/clip/3221166,Ricky Skaggs,Somebody's Prayin'
-SOAJGLS12A58A79AB7,http://previews.7digital.com/clip/34482549,Makem & Clancy,The Dutchman
-SOAJGLT12A6D4F9602,http://previews.7digital.com/clip/281049,Labi Siffre,Would You Dance?
-SOAJGPJ12A6D4F951D,http://previews.7digital.com/clip/319637,Bryan Ferry,Chain Reaction (1999 Digital Remaster)
-SOAJGPO12A8C13AD23,http://previews.7digital.com/clip/2318562,PlankEye,Remind
-SOAJGRE12A81C22794,http://previews.7digital.com/clip/3061219,Dan Hicks,Coast To Coast (Live (1971 Troubadour))
-SOAJGRF12A8AE47577,NA,Fruko y Sus Tesos,El Nuevo Caimán
-SOAJGSO12A58A7C602,http://previews.7digital.com/clip/2170984,Fred Neil,The Other Side Of This Life
-SOAJGSQ12A6701FA3A,http://previews.7digital.com/clip/123502,Bond,Sugarplum
-SOAJGTU12AAA8C5AD5,http://previews.7digital.com/clip/498590,"Crosby, Stills & Nash",Into The Darkness
-SOAJGUL12A8C137A80,NA,Def Jef,God Made Me Funky
-SOAJGUO12A8C142CE3,NA,Calexico,Inspiracion
-SOAJGXX12A8C13B06C,http://previews.7digital.com/clip/1633033,Leo Kottke,Side One Suite: My Double
-SOAJGZJ12A6D4F8CAD,http://previews.7digital.com/clip/31739730,Mahlathini and The Mahotella Queens,Nyamphemphe
-SOAJHBD12AB018403A,http://previews.7digital.com/clip/5051520,Sonny Rollins,Disco Monk
-SOAJHBR12AB018923A,NA,Banda Bassotti,All Are Equal for the Law
-SOAJHCC12A8C1372DE,http://previews.7digital.com/clip/22419591,Doug Stanhope,Intro
-SOAJHDE12AB0185F1A,http://previews.7digital.com/clip/13123206,Paul Taylor,Side Pocket
-SOAJHEV12A8C1330CC,http://previews.7digital.com/clip/3214353,Ray Barretto,Cocinando
-SOAJHEY12A6D4F5BF1,http://previews.7digital.com/clip/232598,Tom Cochrane,When I'm With You
-SOAJHHK12A67ADF44A,http://previews.7digital.com/clip/697947,Life in Your Way,Making Waves
-SOAJHKZ12A8C1457AA,http://previews.7digital.com/clip/6829890,DJ Sneak,Some more
-SOAJHNN12A6D4F8194,http://previews.7digital.com/clip/34301416,Zola,Mdlwembe
-SOAJHPS12AB017F6D6,http://previews.7digital.com/clip/6891416,Doe Maar,Dansmuziek
-SOAJHSY12A8C1441D6,http://previews.7digital.com/clip/3603603,Kokolo,Democracy (Bonus Track)
-SOAJHTK12A6310E13D,http://previews.7digital.com/clip/273165,Bentley Rhythm Ace,A Lot Of Stick (But Not Much Carrot)
-SOAJHZM12A8C146F9A,http://previews.7digital.com/clip/3614340,Glashaus,Solange
-SOAJIAY12AB017EAB8,http://previews.7digital.com/clip/7021042,Cloak/Dagger,Runways
-SOAJIBJ12AAF3B35BA,http://previews.7digital.com/clip/3635007,Eliane Elias,Superwoman
-SOAJIDU12A679AE5BA,http://previews.7digital.com/clip/166363,Monster Magnet,Temple Of Your Dreams
-SOAJIFX12A58A78445,http://previews.7digital.com/clip/11677727,Busdriver,Avantcore (D-Styles Remix)
-SOAJIGS12A8C14506B,http://previews.7digital.com/clip/3603510,The New Mastersounds,YOUVE HAD IT ALL
-SOAJIGU12A8C13F8B9,http://previews.7digital.com/clip/8704785,Dennis Ferrer,Sinfonia Della Notte (John Dahlbäck Remix)
-SOAJIIO12AF72A64E1,http://previews.7digital.com/clip/164006,Rob Zombie,Transylvanian Transmissions Pt. 1
-SOAJIOV12A6D4FB3EF,http://previews.7digital.com/clip/496604,Eastmountainsouth,On Your Way
-SOAJIRD12A8C13B725,http://previews.7digital.com/clip/1674520,Ace Troubleshooter,My Way
-SOAJIUB12A8C133929,http://previews.7digital.com/clip/15772168,Warzone,Wound Up
-SOAJIVL12A6D4FA7CD,http://previews.7digital.com/clip/570714,Trick Daddy,Breaka Breaka [Explicit Album Version]
-SOAJIWO12A8C13FB5C,http://previews.7digital.com/clip/35979556,Adrienne Pierce,One Perfect Day
-SOAJIXC12AB0183243,http://previews.7digital.com/clip/1819369,Jim Sturgess,Girl
-SOAJIXF12AB017E58A,http://previews.7digital.com/clip/4424225,Stephen Lynch,Dear Diary 1
-SOAJIYS12AB0182B71,http://previews.7digital.com/clip/4707847,Alex Gopher,The shell
-SOAJJBD12A8C133D78,http://previews.7digital.com/clip/32214437,Venetian Snares,Banana Seat Girl
-SOAJJBP12A6701E6EC,http://previews.7digital.com/clip/24443,Nelly,Paradise
-SOAJJFM12A6701E3D0,http://previews.7digital.com/clip/79089,Static-X,I Am (Demo Version)
-SOAJJJG12AB017F375,http://previews.7digital.com/clip/5880033,Meg & Dia,Agree To Disagree
-SOAJJJT12A3F1EBC34,http://previews.7digital.com/clip/3845194,Randy Crawford,Blue Flame
-SOAJJLA12A58A7C97F,http://previews.7digital.com/clip/6839424,George Duke,C'est La Vie
-SOAJJMD12A8C13E1DE,http://previews.7digital.com/clip/3430409,Joaquín Sabina,Cuando Era Mas Joven
-SOAJJOW12AB0183275,http://previews.7digital.com/clip/4551677,Ana Carolina,Trancado
-SOAJJPC12AB017D63F,http://previews.7digital.com/clip/7846353,Nasty Nate,The Aftermath Feat: The Game
-SOAJJRC12A58A77CD6,http://previews.7digital.com/clip/19572691,Blur,Movin' On
-SOAJJRO12AB0182B3A,http://previews.7digital.com/clip/15458478,The Smiths,The Queen Is Dead / Take Me Back To Dear Old Blighty [Medley]
-SOAJJSC12A6701F70B,http://previews.7digital.com/clip/87493,Orgy,Blue Monday (Optical Vocal Mix)
-SOAJJSR12A8AE478A6,http://previews.7digital.com/clip/1429681,Fear Factory,Pisschrist (Concrete Version)
-SOAJJTE12A8C13206C,http://previews.7digital.com/clip/1494411,Peabo Bryson,Don't Give Your Heart
-SOAJJVJ12AB018368D,http://previews.7digital.com/clip/3695295,Despistaos,Resucito (version acustica)
-SOAJKAG12AB017D899,http://previews.7digital.com/clip/29106019,El Barrio,Y No Lo Puedo Soportar
-SOAJKBB12A6310E8F4,http://previews.7digital.com/clip/284645,Marc Almond,King Of The Fools
-SOAJKEM12A8C13E567,http://previews.7digital.com/clip/2387368,Black Moth Super Rainbow,Caterpillar House
-SOAJKEP12A6D4F6F42,http://previews.7digital.com/clip/266155,Richie Sambora,The Answer
-SOAJKFN12A58A7FB78,http://previews.7digital.com/clip/1321879,Joseph Arthur,Star Song
-SOAJKJL12AB01855E6,http://previews.7digital.com/clip/37767103,Dan Deacon,Paddling Ghost
-SOAJKLG12A81C21CCE,http://previews.7digital.com/clip/3071958,James Newton Howard,Five Miles Back
-SOAJKRD12AC3DF49CC,NA,Los Visitantes,Sopa Yanqui
-SOAJKTB12A6D4F7ECF,http://previews.7digital.com/clip/317494,Roudoudou,Funky monkey
-SOAJLAI12A8C142D2D,http://previews.7digital.com/clip/3591273,Murs,Think You Know Me
-SOAJLFI12AB018A345,http://previews.7digital.com/clip/7810675,Mad Flava,Raw Interlude
-SOAJLIC12A8C13ADF9,http://previews.7digital.com/clip/1668788,Dżem,Detox (2003 Digital Remaster;)
-SOAJLJU12AB0187DBE,http://previews.7digital.com/clip/8469823,Airwave,Escape From Nowhere (Original Mix)
-SOAJLLN12AB0184718,http://previews.7digital.com/clip/17856799,Super700,The Other Side
-SOAJLLV12AB0185656,http://previews.7digital.com/clip/8417053,Oliver P,Lost Without You
-SOAJLPR12AB017DC28,http://previews.7digital.com/clip/4286568,The Infamous Stringdusters,You Can't Handle The Truth
-SOAJLRL12A81C23F31,http://previews.7digital.com/clip/6127650,Mistress,Godless Drunken Wreck
-SOAJLSA12AB0188376,http://previews.7digital.com/clip/11673461,TTC,Leguman
-SOAJLUJ12A6D4F7E8F,http://previews.7digital.com/clip/382169,Peer Günt,Wanna Shake Your Boomboom
-SOAJLUX12AB0188F4D,http://previews.7digital.com/clip/8485179,Cher,You Take It All
-SOAJLWA12A6D4FCF25,NA,The Wildhearts,Thye Revolution Will Be Televised
-SOAJLXH12AB0189EB8,http://previews.7digital.com/clip/4064934,Richard Marx,Have Mercy
-SOAJLXT12AB018DFBB,http://previews.7digital.com/clip/6536347,Eugenio Finardi,La Paura Del Domani
-SOAJLXY12AB018AC34,NA,Erland & The Carnival,Was You Ever See
-SOAJLYJ12AB0187442,http://previews.7digital.com/clip/4732662,Havana Black,Speed Up The Time (2009 Digital Remaster)
-SOAJLZP12AAF3B294F,http://previews.7digital.com/clip/8055373,Mouth of the Architect,Hate And Heartache
-SOAJMBB12A8C144C7A,http://previews.7digital.com/clip/4349826,Gasolin',Sjagge
-SOAJMBV12AC46878DA,http://previews.7digital.com/clip/7633501,John O'Callaghan,Broken - Bryan Kearney Remix
-SOAJMDV12A6310DFEE,http://previews.7digital.com/clip/9101,My Life Story,Strumpet
-SOAJMED12A8C13A467,http://previews.7digital.com/clip/3958625,Raised Fist,Envy Is Dangerous
-SOAJMFD12A8C137012,http://previews.7digital.com/clip/12931886,Sam Cooke,"Jesus, I'll Never Forget"
-SOAJMHL12A8C13BBB4,http://previews.7digital.com/clip/6779713,Pennywise,Try
-SOAJMIX12A6D4FCF9F,http://previews.7digital.com/clip/2841105,HammerFall,Man On The Silver Mountain
-SOAJMJL12AB018355F,http://previews.7digital.com/clip/16741087,Carla Bozulich,Pissing
-SOAJMKL12A58A7E8CE,http://previews.7digital.com/clip/14749562,Halifax,Giant In The Ring
-SOAJMMG12A8C135155,http://previews.7digital.com/clip/961162,Orquesta El Arranque,La guitarrera
-SOAJMMN12B34F1EE1A,http://previews.7digital.com/clip/20587413,Threshold,Segue
-SOAJMRT12A8C13D647,http://previews.7digital.com/clip/13287933,Kasse Mady Diabate,Namanike
-SOAJMSD12AB018E70F,http://previews.7digital.com/clip/6563816,Manassas,Panhandle Rag
-SOAJMWR12A8C135A9B,http://previews.7digital.com/clip/1565054,Andrei Gavrilov,"Suite No. 7 in G Minor, HWV 432 (1996 - Remaster): V. Gigue (Vivo)"
-SOAJNEC12A8C13FDD6,http://previews.7digital.com/clip/3466345,Lorie,Santiago de Cuba
-SOAJNHM12A6D4F8D2A,http://previews.7digital.com/clip/449439,The Lemonheads,Hannah And Gabi
-SOAJNHU12AB017B5D2,http://previews.7digital.com/clip/4276368,Kristian Meurman,Lapin kesä
-SOAJNMN12A8C1363DA,NA,Richard Hawley,Darlin'
-SOAJNNL12A670215F0,http://previews.7digital.com/clip/80568,The Sun,Justice (Album Version)
-SOAJNOK12AB017FBDD,http://previews.7digital.com/clip/4392472,Max Morath,Maple Leaf Rag
-SOAJNOM12A6BD546F3,http://previews.7digital.com/clip/758037,Björn Skifs,Välkommen Till Mitt Liv
-SOAJNOZ12AB01816C7,http://previews.7digital.com/clip/4572381,Daryl Coley,He'll Never Let You Down
-SOAJNQB12A8C137EC2,http://previews.7digital.com/clip/8190339,Hellhammer,Death Fiend
-SOAJNQP12AB0184557,http://previews.7digital.com/clip/8137612,Nightrage,In My Heart
-SOAJNSN12A8AE4945A,http://previews.7digital.com/clip/3136731,"Harry Connick, Jr.",Charade
-SOAJNUL12A8C14036C,http://previews.7digital.com/clip/14859503,The Red Chord,Mouthful Of Precious Stones
-SOAJNYK12AF729F33B,http://previews.7digital.com/clip/255462,Amos Lee,"Keep It Loose, Keep It Tight"
-SOAJNZA12AB01830D0,NA,Marco V,A Journey into Sound
-SOAJNZL12AB01832FF,http://previews.7digital.com/clip/4308920,Holly Golightly,Listen
-SOAJOAV12A6310E147,http://previews.7digital.com/clip/13677,Derek and Clive,Hello Colin
-SOAJOBM12A8C136FD3,http://previews.7digital.com/clip/11271352,Oxford Collapse,For The Winter Coats
-SOAJOCQ12AF72AA7E7,http://previews.7digital.com/clip/33942654,Bad Manners,Hokey Cokey
-SOAJODS12A8C138A23,http://previews.7digital.com/clip/2203231,Whiskeytown,Inn Town
-SOAJODZ12AB018458F,http://previews.7digital.com/clip/4127712,Burzum,Erblicket die Tochter des Firmaments
-SOAJOEZ12AB018AECE,http://previews.7digital.com/clip/7487372,Florence Valentin,Hopplös
-SOAJOHY12A8C1335FE,http://previews.7digital.com/clip/5738926,Lightspeed Champion,Xanadu
-SOAJONZ12A8C137E4C,http://previews.7digital.com/clip/2268629,Brandy,Where You Wanna Be
-SOAJOQJ12AB017D98A,http://previews.7digital.com/clip/32441152,Kero One,On and On
-SOAJORE12A6701E3DA,http://previews.7digital.com/clip/126355,The Soundtrack of Our Lives,Bendover Babies
-SOAJORS12A58A7A9FB,http://previews.7digital.com/clip/6822743,Talking Heads,Making Flippy Floppy (Live)
-SOAJOSA12AB0186E41,http://previews.7digital.com/clip/5532426,The Kingsmen,I Will Rise Up From My Grave
-SOAJOVF12A6D4F4794,http://previews.7digital.com/clip/285642,Charly García,Happy And Real
-SOAJOWP12AC90716C9,http://previews.7digital.com/clip/35819825,Enam,Arinya
-SOAJOXD12B34F32B26,http://previews.7digital.com/clip/7710948,Beardfish,Abigails Questions (in An Infinite Universe)
-SOAJOYP12A8C14102E,http://previews.7digital.com/clip/9630983,Alexia Bomtempo,Cromologia (mix)
-SOAJOZD12A58A7E74B,http://previews.7digital.com/clip/3282475,The Manhattan Transfer,Goodnight
-SOAJPCY12A6D4F6955,http://previews.7digital.com/clip/530584,Zebda,Y'A Pas D'Arrangement
-SOAJPDI12A6D4F80F2,http://previews.7digital.com/clip/322923,Shampoo,Boys Are Us
-SOAJPEH12AB0185E66,http://previews.7digital.com/clip/15681736,The Autumn Offering,Light of Day
-SOAJPFO12A8AE45C68,http://previews.7digital.com/clip/19268210,Necro,Katsumi Skit
-SOAJPGC12AC468E1D8,http://previews.7digital.com/clip/34188258,Papa Charlie Jackson,"You Put It In, I'll Take It Out"
-SOAJPGO12A58A7E8F5,http://previews.7digital.com/clip/2225920,Agnostic Front,"Today, Tomorrow, Forever"
-SOAJPHC12A8C13936E,http://previews.7digital.com/clip/15993041,Helge Schneider,Der berühmte Beethoven
-SOAJPKX12A8C13B15E,http://previews.7digital.com/clip/2304266,Luar na Lubre,Danzando nos confins
-SOAJPOR12A8C141001,http://previews.7digital.com/clip/1787395,CRASHDÏET,Falling Rain
-SOAJPPH12AB0183076,http://previews.7digital.com/clip/5943208,Showbread,Out Of My Mind
-SOAJPPT12A58A7DD78,http://previews.7digital.com/clip/6041499,REO Speedwagon,You Won't See Me
-SOAJPQA12AB01818F5,http://previews.7digital.com/clip/7030787,Sutton Foster,Flight
-SOAJPUI12A8C1338D6,http://previews.7digital.com/clip/16157360,Josh Ritter,Real Long Distance
-SOAJPVA12A8C132EAB,http://previews.7digital.com/clip/3168389,Console,Pigeon Party
-SOAJPVO12A6D4F9D16,http://previews.7digital.com/clip/172933,Kevin Ayers,Oleh Oleh Bandu Bandong (2003 - Remaster)
-SOAJPXU12A670207AD,http://previews.7digital.com/clip/112280,Ryan Adams,Sweet Illusions
-SOAJPYM12AB0180791,http://previews.7digital.com/clip/3821950,BAP,Ewije Affhängerei
-SOAJQAQ12A8C135D0F,http://previews.7digital.com/clip/23101372,Tom Brosseau,My Heart Belongs to the Sea
-SOAJQAY12A8C1381BA,NA,Richard Hawley,Can You Hear The Rain Love
-SOAJQBC12A81C1FE9E,http://previews.7digital.com/clip/34627383,Four Bitchin' Babes,My Father (Megon & Co.)
-SOAJQBG12A67ADA6B8,http://previews.7digital.com/clip/718727,Sonic Youth,Sweet Shine
-SOAJQCL12A58A79581,http://previews.7digital.com/clip/10562807,John Mayer,Good Love Is On The Way (Live at the Nokia Theatre)
-SOAJQDK12A8AE48245,http://previews.7digital.com/clip/3127043,CSS,Jager Yoga
-SOAJQKX12AB0182ECB,http://previews.7digital.com/clip/7702454,Demolition Hammer,Infectious Hospital Waste (live)
-SOAJQNY12AB017F370,http://previews.7digital.com/clip/4023580,Souad Massi,Ilham
-SOAJQQR12A8C137683,http://previews.7digital.com/clip/1649952,Jore Marjaranta,Miten Pelko Lähtee
-SOAJQRI12A6D4F6E27,http://previews.7digital.com/clip/262170,Rui Veloso,Golden Days
-SOAJQSJ12AB01823F2,http://previews.7digital.com/clip/34558941,Brian Keane,Shenandoah
-SOAJQVU12A6D4F6FBE,http://previews.7digital.com/clip/270833,Paloalto,Always Running Home
-SOAJQWM12A8C139379,http://previews.7digital.com/clip/13781737,Chris Spedding,Motor Bikin'
-SOAJRAJ12AC3DFB02F,http://previews.7digital.com/clip/6581379,Hybrid,Formula Of Fear (Armchair Instrumental)
-SOAJRFJ12A8C13CD39,NA,Amiina,Sogg
-SOAJRHM12A8C14047D,http://previews.7digital.com/clip/6155596,Shriekback,Il Mystera Del Tempo
-SOAJRJS12AB0186B2E,http://previews.7digital.com/clip/8515150,William Orbit,Piece In The Old Style I
-SOAJRLM12AB01836C8,http://previews.7digital.com/clip/4706260,Tepr,My friend Guo Ran
-SOAJRLP12A58A7AB24,http://previews.7digital.com/clip/2999377,Cryptic Slaughter,American Heroes
-SOAJROU12A8C13A666,http://previews.7digital.com/clip/1660380,Paulinho da Viola,Batuqueiro
-SOAJROX12AC468B762,NA,Jill Barber,Nothing On Me
-SOAJRRG12A6D4F7C93,http://previews.7digital.com/clip/240345,Culture,The International Herb
-SOAJRRV12A8C1422DF,http://previews.7digital.com/clip/36180993,Hanne Hukkelberg,No One But Yourself
-SOAJRRZ12A8C132F18,http://previews.7digital.com/clip/5718777,Left Lane Cruiser,Amy's In the Kitchen
-SOAJRSH12A8C137499,NA,Rockabye Baby!,Dazed and Confused
-SOAJSAF12A8C140963,http://previews.7digital.com/clip/1270826,Legião Urbana,Metropole
-SOAJSCA12A58A7AD0E,http://previews.7digital.com/clip/2353769,Starfield,The Loveliest Sound
-SOAJSCK12A6D4FA272,http://previews.7digital.com/clip/439471,El Sueño de Morfeo,Rendida a tus pies
-SOAJSDB12A8C141B0B,NA,MC Devvo & Shady Piez,Crystal Meffin
-SOAJSDI12A58A7E165,http://previews.7digital.com/clip/34481810,Phil Perry,Shower The People
-SOAJSDT12A6D4F9E76,http://previews.7digital.com/clip/481198,Maria de Barros,Oh Menel
-SOAJSFW12A6D4FA519,http://previews.7digital.com/clip/20199851,De Mens,Sex Verandert Alles
-SOAJSLR12B35055CCE,http://previews.7digital.com/clip/13802315,Six Feet Under,Waiting for Decay
-SOAJSMN12AB0186908,http://previews.7digital.com/clip/7998988,Beanfield,Catalpa
-SOAJSOM12A8C142EE3,http://previews.7digital.com/clip/2463727,Noe Venable,Climb
-SOAJSRN12A6D4F6EAB,http://previews.7digital.com/clip/299835,Alphonse Mouzon,Some Of The Things People Do
-SOAJSSJ12AB018A6A4,http://previews.7digital.com/clip/7817494,Banda Eva,"Eu Vou No Eva (Live At Riocentro, Rio de Janeiro (RJ), Brazil/2005)"
-SOAJSSP12A8C1313E9,http://previews.7digital.com/clip/3156771,Phoebe Snow,There's A Boat That's Leavin' Soon For New York
-SOAJSUN12A8C13FC6E,http://previews.7digital.com/clip/2417000,Jamie Cullum,Pointless Nostalgic
-SOAJSUT12A6D4F7AA9,http://previews.7digital.com/clip/1153513,Nick Glennie-Smith,A Taste of Something
-SOAJSWN12AB017B01B,http://previews.7digital.com/clip/5393663,Tom Salta,Secure Those Nukes!
-SOAJSXH12A58A7A1C0,http://previews.7digital.com/clip/370107,Brownsville Station,I'm The Leader Of The Gang
-SOAJSZE12AB018869C,http://previews.7digital.com/clip/5215277,Depth Affect,Street Level
-SOAJSZI12A6D4F8137,http://previews.7digital.com/clip/255936,MxPx,Sick Boy (Let It Happen Album Version)
-SOAJSZL12A58A79D4A,http://previews.7digital.com/clip/961164,Orquesta El Arranque,Redención
-SOAJTBN12AC468BB75,http://previews.7digital.com/clip/13142190,Jimmy Yancey,Jimmy's Stuff
-SOAJTCD12AF72A2F1C,http://previews.7digital.com/clip/15401022,Gary Go,Heart And Soul
-SOAJTCF12AC960DE22,http://previews.7digital.com/clip/32921569,Maps,Without You
-SOAJTDO12AB0184CE8,http://previews.7digital.com/clip/11674489,TTC,De Pauvres Riches
-SOAJTEN12AB01867E5,http://previews.7digital.com/clip/8835534,The Pointer Sisters,(She's Got) The Fever
-SOAJTFA12AB01809A1,http://previews.7digital.com/clip/3687011,Marvin Sease,Candy Licker 2
-SOAJTHN12A67021D07,http://previews.7digital.com/clip/161871,Alien Ant Farm,Flesh and Bone
-SOAJTIR12A81C22901,http://previews.7digital.com/clip/1377886,Fear,Disconnected
-SOAJTMZ12AB01816E9,NA,Allen Toussaint,Me and You
-SOAJTNM12A8C1354B2,http://previews.7digital.com/clip/1564385,El Arrebato,No Se Entera De Ná
-SOAJTPQ12A8C13B35A,NA,Sugar Minott,Going Back To Mother Land
-SOAJTPX12A58A78F13,http://previews.7digital.com/clip/4094163,Heideroosjes,We're All Fucked Up!
-SOAJTQB12A8C13F29F,http://previews.7digital.com/clip/29622404,JJ Grey & Mofro,Country Ghetto
-SOAJTQF12A8C13DB0E,NA,Samy Deluxe,Geh wo Du wohnst
-SOAJTQI12A8C13B847,http://previews.7digital.com/clip/2355958,Luis Alberto Spinetta,Flecha Zen
-SOAJTSM12AAF3B1BF8,http://previews.7digital.com/clip/3565284,The Bangles,Dover Beach
-SOAJTUT12A8C13FCB3,http://previews.7digital.com/clip/9045073,Downchild,Scars
-SOAJUDA12A67ADE647,http://previews.7digital.com/clip/197752,Jaime Urrutia,Maribel
-SOAJUDF12A8C145BD0,NA,Andrew Spencer,Here Without You (Alex M. Vs. Marc Van Damme Bigroom Edit)
-SOAJUEF12A8C141B00,http://previews.7digital.com/clip/3546177,Daisy Chainsaw,Mosquito
-SOAJUFT12AB017FDC7,NA,Zebrahead,Death By Disco
-SOAJUGL12AB018B827,http://previews.7digital.com/clip/7969987,Sunday Driver,Down By the Den
-SOAJUHB12A6310EE95,http://previews.7digital.com/clip/508298,Athlete,Out Of Nowhere
-SOAJUHS12AB01843B3,http://previews.7digital.com/clip/7665430,Bolt Thrower,Realm Of Chaos
-SOAJUJO12AC4688861,http://previews.7digital.com/clip/7593342,Strike Anywhere,S.S.T.
-SOAJULY12A8C133C72,http://previews.7digital.com/clip/21666394,Carpathian Forest,Cold Murderous Music
-SOAJUPN12AB018AE45,http://previews.7digital.com/clip/7888136,Rally,Jag Kan Inte Säga 'R'
-SOAJUQD12A670203E4,http://previews.7digital.com/clip/3635399,The 101ers,Shake Your Hips (Live)
-SOAJURC12A8C138D60,NA,Peter Sarstedt,margueritte
-SOAJUSW12A6D4FD06F,http://previews.7digital.com/clip/16362948,Frau Doktor,The sound of the suburbs
-SOAJUSY12A6D4F8BBF,http://previews.7digital.com/clip/378751,Bitch Alert,If You Were Mine
-SOAJUTM12A81C2053D,http://previews.7digital.com/clip/2555468,Jeff Mills,Time Machine (Blue Potential Version)
-SOAJUWA12A6D4F9B38,http://previews.7digital.com/clip/670372,Erin O'Donnell,Thank You (Get It Right) (Wide Wide World Album Version)
-SOAJUXM12A58A7D8D8,http://previews.7digital.com/clip/630905,LoveHateHero,Theatre of Robots
-SOAJUYL12A6D4FA7DB,http://previews.7digital.com/clip/620524,Mr. Review,Prejudice
-SOAJUYS12AB0189726,NA,DoomSword,Death of Ferdia
-SOAJUZG12AB0186B74,http://previews.7digital.com/clip/12018228,Pedro Laurenz,Alma de Bohemio
-SOAJVAQ12A8C13C926,http://previews.7digital.com/clip/2354698,Merche,Necesito Libertad
-SOAJVBL12AB018ABD8,http://previews.7digital.com/clip/8069274,Scraps of Tape,Wright Is Rong
-SOAJVCC12A6D4FAA76,http://previews.7digital.com/clip/578731,Corinne Bailey Rae,Since I've Been Loving You (iTunes Session)
-SOAJVCD12A6701D947,http://previews.7digital.com/clip/386196,Dashboard Confessional,Rapid Hope Loss
-SOAJVCL12A6D4F5697,http://previews.7digital.com/clip/17106902,No-Man,The Break Up For Real (Drum Mix)
-SOAJVDE12AB018CA29,http://previews.7digital.com/clip/7338766,Dan Zanes and Friends,Let's Shake
-SOAJVDQ12A6D4FA38B,http://previews.7digital.com/clip/34927098,Casiotone for the Painfully Alone,Attic Room
-SOAJVDU12A6310E32C,http://previews.7digital.com/clip/18406,U2,Are You Gonna Wait Forever?
-SOAJVEI12A6D4FA8A0,http://previews.7digital.com/clip/6828029,The Crystals,Parade of the Wooden Soldiers
-SOAJVGJ12A8C13A54B,http://previews.7digital.com/clip/2305923,Theory of a Deadman,Any Other Way
-SOAJVGO12AB017EB8E,http://previews.7digital.com/clip/5389210,Bong-Ra,Slaytronic
-SOAJVGS12A8C13D042,http://previews.7digital.com/clip/1748444,Howard Carpendale,I Was A Stranger
-SOAJVIM12AB0182A96,http://previews.7digital.com/clip/7184165,Abdoulaye Diabaté,Xam-Xam
-SOAJVJT12AB0186F75,http://previews.7digital.com/clip/5654909,Japandroids,Crazy/Forever
-SOAJVJX12A6D4FB839,http://previews.7digital.com/clip/1278999,Christine Anu,Monkey & The Turtle
-SOAJVKW12A8C136E12,NA,The Lightning Seeds,All The Things
-SOAJVKX12A8C13D8FE,http://previews.7digital.com/clip/14491239,Lifehouse,Learn You Inside Out
-SOAJVKZ12AB0185DFA,http://previews.7digital.com/clip/1760657,Jay-Z,Pray
-SOAJVLQ12AB018A28D,http://previews.7digital.com/clip/33975954,Emily Jane White,Stairs
-SOAJVML12AB018B1F3,http://previews.7digital.com/clip/6291764,Boom Bip & Doseone,Ho's
-SOAJVOP12AB0183F1D,http://previews.7digital.com/clip/3739164,Genesis,The Colony Of Slippermen (The Arrival/A Visit To The Doktor/Raven) (2008 Digital Remaster)
-SOAJVPM12A8C133B83,http://previews.7digital.com/clip/301710,Elis Regina,Nova Estação
-SOAJVPT12A67ADD466,http://previews.7digital.com/clip/183597,Los Secretos,Contando estrellas
-SOAJWAC12AB018350F,NA,Backstreet Boys,Unsuspecting Sunday Afternoon (Main Version)
-SOAJWAH12AF72AD548,http://previews.7digital.com/clip/4942561,Train,Heavy
-SOAJWBU12A8C136FE9,http://previews.7digital.com/clip/3326654,Minotaur Shock,Beekeeper
-SOAJWHP12AB017F9A4,NA,Engelbert Humperdinck,Wonderland By Night
-SOAJWHQ12A58A80412,http://previews.7digital.com/clip/8042228,Minipop,Generator
-SOAJWMO12A6D4F8747,http://previews.7digital.com/clip/347782,Rocco Deluca and the Burden,How Fast
-SOAJWNE12AF72A6BB3,http://previews.7digital.com/clip/5680367,Fabolous,Pachanga
-SOAJWNV12A6D4F86E9,http://previews.7digital.com/clip/1545119,Ulf Lundell,Gå Ut Och Var Glad
-SOAJWOH12A6D4F66A3,NA,The Blind Boys of Alabama,Many Rivers To Cross
-SOAJWTT12A8C13F9DE,http://previews.7digital.com/clip/2956897,The Ragga Twins,The Homeless Problem
-SOAJWUL12A6D4F7ADB,http://previews.7digital.com/clip/2764613,Between the Buried and Me,What We Have Become
-SOAJWVX12A6D4F63EE,http://previews.7digital.com/clip/278959,Geri Halliwell,Shake Your Bootie Cutie
-SOAJXBF12AB018A1A2,http://previews.7digital.com/clip/8528081,Natalie MacMaster,Hey Johnny Cope (March And Reels Medley)
-SOAJXBS12A58A7AEBC,http://previews.7digital.com/clip/698078,Cliff Richard,Do You Remember (2007 Digital Remaster)
-SOAJXBT12AB018A234,http://previews.7digital.com/clip/7903293,Windir,Destroy
-SOAJXDF12AB0185D5A,http://previews.7digital.com/clip/13799742,Evergreen Terrace,The Letdown
-SOAJXFD12A8C13B71E,http://previews.7digital.com/clip/3860559,Delroy Wilson,Sun Is Shining
-SOAJXFG12A6D4F4A92,http://previews.7digital.com/clip/824746,Sonya Kitchell,Too Beautiful
-SOAJXGU12A8C13921E,http://previews.7digital.com/clip/1103581,St. Vincent,The Apocalypse Song
-SOAJXGV12AB0185AF0,http://previews.7digital.com/clip/7953035,Jaheim,Another Round
-SOAJXHH12AB0184199,http://previews.7digital.com/clip/5483250,Angels of Light & Akron/Family,One For Hope
-SOAJXHY12AB0185CDB,http://previews.7digital.com/clip/8350663,Mr. Vegas,Thank You Girl
-SOAJXIJ12AB018810B,http://previews.7digital.com/clip/7830358,Go Betty Go,Unreal
-SOAJXIT12A58A7AB55,http://previews.7digital.com/clip/269560,Kurt Elling,Oh My God (Live)
-SOAJXJU12A6D228293,http://previews.7digital.com/clip/563292,Love of Diagrams,Pace Or The Patience
-SOAJXMN12A8C13AC0A,http://previews.7digital.com/clip/1733648,Da Weasel,Joaninha (Bem Vinda!)
-SOAJXMT12AB0187BFC,http://previews.7digital.com/clip/7268150,Giannis Aggelakas,I Ekdikisi Tis Giannoulas
-SOAJXNU12AC468CF01,http://previews.7digital.com/clip/7631074,Esmée Denters,Just Can't Have It
-SOAJXOH12AB0187863,http://previews.7digital.com/clip/30436559,Erasure,Fingers and Thumbs (Cold Summer's Day) [Sound Factory Remix Radop Edit]
-SOAJXPI12AB0182F02,http://previews.7digital.com/clip/7714634,Spiritual Beggars,Blind Mountain (live)
-SOAJXPK12AB01844B7,http://previews.7digital.com/clip/8311116,Airbourne,Bottom Of The Well
-SOAJXPO12AB018C77E,http://previews.7digital.com/clip/8985107,Jawbreaker,Busy
-SOAJXRY12A670211E8,http://previews.7digital.com/clip/123288,Gyllene Tider,Speciell
-SOAJXRY12A6D4F91B1,http://previews.7digital.com/clip/606013,Böhse Onkelz,Keine Amnestie für MTV
-SOAJXSK12AAF3B4246,http://previews.7digital.com/clip/4244121,Rupert Holmes,Morning Man
-SOAJXYU12A8C13C022,http://previews.7digital.com/clip/3388643,Gareth Gates,Anyone Of Us (Stupid Mistake)
-SOAJYBD12AB018D6C5,http://previews.7digital.com/clip/8524544,Floor,Who Are You
-SOAJYCD12A8AE4826F,http://previews.7digital.com/clip/5995842,Blues Explosion,Burn It Off
-SOAJYDW12A58A7BE47,http://previews.7digital.com/clip/2384735,Lifesavas,Night Out + Scene 5 - Connects
-SOAJYFQ12AB0189784,http://previews.7digital.com/clip/4054512,Artesia,L'appel des esprits
-SOAJYHV12A58A7DF89,NA,Sonny Clark,Love Walked In
-SOAJYIK12A8AE487D8,http://previews.7digital.com/clip/2576911,Lil Wayne,The Heat
-SOAJYIK12A8C13B56B,http://previews.7digital.com/clip/6970968,Government Issue,Melancholy Miss
-SOAJYLI12AB01831B8,http://previews.7digital.com/clip/10220368,Deer Tick,Dirty Dishes
-SOAJYNP12A67AE20EA,NA,Crazy Frog,Nellie The Elefant
-SOAJYOF12AB018D2BE,http://previews.7digital.com/clip/8911044,Fernando Samalea,Plaza de Mayo-Primera Junta
-SOAJYON12AB0186057,http://previews.7digital.com/clip/6118036,Greg Brown,Beyond the Sunset
-SOAJYOX12A8C13BCD9,http://previews.7digital.com/clip/2360149,Nearly God,"Bubbles featuring Tricky, Terry Hall"
-SOAJYWQ12A67ADA57B,http://previews.7digital.com/clip/202999,Boyz II Men,Lovely
-SOAJYXI12A81C23941,http://previews.7digital.com/clip/1569808,Onar,Na 'Se Kala
-SOAJYZF12A8C1331C2,http://previews.7digital.com/clip/13711294,Matia Bazar,Cuore irlandese (1997 - Remaster)
-SOAJZAY12A6D4F88C3,http://previews.7digital.com/clip/364297,Herbert Vianna,O Rio Severino
-SOAJZCG12AB017CD41,http://previews.7digital.com/clip/32076265,Richard H. Kirk,Infantile
-SOAJZCY12A6D4FCB55,NA,Tokyo Police Club,Listen to the Math (The Good Life Remix)
-SOAJZEP12A8C14379B,http://previews.7digital.com/clip/5798218,Shakira,Dia de Enero
-SOAJZES12AB0189D4B,http://previews.7digital.com/clip/8478607,Wide Mouth Mason,King Of Poison
-SOAJZHC12A67020325,http://previews.7digital.com/clip/69926,Across the Sky,Not So You Will Love Me
-SOAJZIO12AB0185FD3,http://previews.7digital.com/clip/6395087,Irigy Hónaljmirigy,Kanbuli
-SOAJZJM12AB0181E10,http://previews.7digital.com/clip/4016268,Rush of Fools,O Come All Ye Faithful
-SOAJZJQ12AB01839F1,http://previews.7digital.com/clip/5714809,Mikromusic,Cisza Przed Burza
-SOAJZLE12A6D4F8169,http://previews.7digital.com/clip/255998,The Juliana Theory,"Closest Thing, The"
-SOAJZLL12A8C1409E7,http://previews.7digital.com/clip/7276749,Anthony David,Spittin' Game
-SOAJZUM12A8C13FB3B,http://previews.7digital.com/clip/3818075,Sister Sledge,He's Just A Runaway (A Tribute To Bob Marley) (Reggae Version)
-SOAJZYA12A6701F603,http://previews.7digital.com/clip/146616,Black Grape,Yeah Yeah Brother
-SOAJZYT12AB018AE46,http://previews.7digital.com/clip/6316657,Sidewalk Prophets,You Love Me Anyway
-SOAJZYX12A8C1382FE,http://previews.7digital.com/clip/1323531,Grayskul,Is It Me
-SOAKAAL12A8C13CD22,NA,The Lovetones,A Place For Us
-SOAKAAY12A6D4FB85A,http://previews.7digital.com/clip/526466,Neil Finn,Turn And Run
-SOAKAID12A6D4F8A40,http://previews.7digital.com/clip/409363,GNR,Ciclones
-SOAKALF12A6D4FBAF3,http://previews.7digital.com/clip/23101464,Ten Kens,Refined
-SOAKALM12A81C2169F,http://previews.7digital.com/clip/10977087,Meshell Ndegeocello,Shirk
-SOAKANG12A8AE48029,NA,Paffendorf,Lalala Girl (Real Booty Babes Remix)
-SOAKAOW12AB0182AA5,http://previews.7digital.com/clip/5967553,Los Straitjackets,Hornet's Nest
-SOAKAQN12AB0185A6F,http://previews.7digital.com/clip/7442824,Zao,Reinna
-SOAKASI12AB0187BC9,http://previews.7digital.com/clip/13802191,Six Feet Under,Feasting on the Blood of the Insane
-SOAKATT12AB018415A,http://previews.7digital.com/clip/6051388,Love Affair,Handbags & Gladrags
-SOAKATZ12A8C1377A4,http://previews.7digital.com/clip/3280521,Gipsy Kings,Hermanos
-SOAKAUJ12A8C13A06F,http://previews.7digital.com/clip/1693168,Ernst Rolf,Ensam På En Krog I Hamburg
-SOAKAUN12A8C1393E6,http://previews.7digital.com/clip/35656703,Belong,Beeside
-SOAKAUX12AB017E0BC,http://previews.7digital.com/clip/3795574,Dynamo Productions,Three Dimensional
-SOAKAVQ12A3F1EBC18,NA,Denise LaSalle,Trapped By A Thing Called Love
-SOAKAWW12AC468E16F,NA,Dritte Wahl,Zeit bleib stehen!
-SOAKAYO12A6D4FD08D,http://previews.7digital.com/clip/1323800,Dead Kennedys,Where Do ya Draw the Line
-SOAKBES12A6D4FDCAE,http://previews.7digital.com/clip/15811292,Bayside,Talking of Michaelangelo
-SOAKBIF12AC3DFA77B,http://previews.7digital.com/clip/8095399,Windir,Sognariket Sine Krigarar
-SOAKBJM12AB018661C,http://previews.7digital.com/clip/8440016,Texas Tornados,Clinging To You
-SOAKBKX12AB01896A0,http://previews.7digital.com/clip/7162352,The Cute Lepers,Thanks For Not Showing Up
-SOAKBNU12A6D4FBE43,http://previews.7digital.com/clip/2504151,Wiley,Wearing My Rolex [Pirate Soundsystem Bassline Mix]
-SOAKBOB12A6D4F716F,http://previews.7digital.com/clip/219512,Royal Philharmonic Orchestra,Lieutenant Kije (Troika)
-SOAKBUJ12A8C136B64,http://previews.7digital.com/clip/11061709,iiO,Poetica (feat.Nadia Ali)
-SOAKBUO12A8C130DD0,http://previews.7digital.com/clip/3182988,Chico Hamilton,Thoughts
-SOAKBVK12A58A7A991,http://previews.7digital.com/clip/5098918,The Procession,Don't Let It Go
-SOAKBVY12AB0188DF1,http://previews.7digital.com/clip/5155500,Airiel,RI
-SOAKBYA12A6310E2AF,http://previews.7digital.com/clip/304578,Beastie Boys,Flute Loop (2009 Digital Remaster)
-SOAKBZR12AC468D1DD,http://previews.7digital.com/clip/8720252,Frank T,Mejor pensar o no
-SOAKBZX12AB017C912,http://previews.7digital.com/clip/7002709,Smile Empty Soul,Proud To Be
-SOAKCBD12A8C13D34C,http://previews.7digital.com/clip/2358742,Jorge González,Todos Me Lo Dicen
-SOAKCBH12AB0188FC4,NA,La Costa Brava,Jesus Etc Etc
-SOAKCEG12A8C13A2F9,NA,Milton Nascimento,Saidas E Bandeiras
-SOAKCEH12AB017EB13,http://previews.7digital.com/clip/3837291,Chet Baker,All Blues
-SOAKCET12A58A7EA5C,http://previews.7digital.com/clip/6957056,Tegan and Sara,Night Watch
-SOAKCFH12A58A7B530,http://previews.7digital.com/clip/218394,Mitch Hedberg,This CD Is In Stores
-SOAKCFL12A6D4F9CC5,http://previews.7digital.com/clip/3320,Coldplay,See You Soon
-SOAKCJQ12A8AE464C4,http://previews.7digital.com/clip/3111972,Sugar Minott,Oh Mr DC
-SOAKCPT12A8C13D541,http://previews.7digital.com/clip/2356205,Forever the Sickest Kids,"I Don't Know About You, But I Came To Dance"
-SOAKCTQ12AB017E8EC,http://previews.7digital.com/clip/3794579,Japanther,Claudia's Symptoms
-SOAKCUL12A8C1332FB,http://previews.7digital.com/clip/1525685,Big Youth,Run Come Look Inna Mi Bible
-SOAKCUP12AB018423E,http://previews.7digital.com/clip/17271562,Terminal Choice,We Are Back (Electronic Body Mix)
-SOAKCWK12A58A7BFF9,http://previews.7digital.com/clip/3505192,Method Man,A Special Joint (Intro)
-SOAKCWQ12A8C137D00,http://previews.7digital.com/clip/3328819,New Bomb Turks,Turning Tricks
-SOAKCYS12A8C131A4F,http://previews.7digital.com/clip/17731419,Hot 8 Brass Band,Skeet Skeet
-SOAKCZG12A6D4FB3FE,http://previews.7digital.com/clip/1898109,Vonda Shepard,Clean Rain
-SOAKDAT12A8C13560C,http://previews.7digital.com/clip/3245808,Monkey,The White Skeleton Demon
-SOAKDBI12A8C135176,http://previews.7digital.com/clip/1572356,Ninety Pound Wuss,Spiritual Small Guy
-SOAKDEN12AB0187509,http://previews.7digital.com/clip/30758031,The Kissaway Trail,Beat Your Heartbeat
-SOAKDGA12AB0180593,http://previews.7digital.com/clip/7192077,Neri per Caso,Oh Happy Day
-SOAKDHD12A6310F1AE,http://previews.7digital.com/clip/6501,Daft Punk,Face To Face (Cosmo VItelli Remix)
-SOAKDMH12AB01831B8,NA,Agonoize,die for blood
-SOAKDOF12A6D4FB440,http://previews.7digital.com/clip/496710,Face to Face,14 Hours
-SOAKDQH12A8C13C161,http://previews.7digital.com/clip/1723293,Felipe Dylon,Em Outra Direcao
-SOAKDRL12AB017D68D,http://previews.7digital.com/clip/5489818,Maura O'Connell,Ain'T No Good Day For Dying
-SOAKDVV12AC3DF7F31,http://previews.7digital.com/clip/8087145,Pocket Full of Rocks,Jesus Died My Soul To Save
-SOAKDYF12AB018CE3E,http://previews.7digital.com/clip/7352867,Alicia Keys,Put It In A Love Song
-SOAKDYG12A8C134C64,http://previews.7digital.com/clip/3231690,Kassav',Medley Jacob (Live)
-SOAKEAC12A8C1395AE,http://previews.7digital.com/clip/2225209,The Slackers,Knowing
-SOAKEDD12A8AE452CB,http://previews.7digital.com/clip/3098275,Fallacy,Stay Blessed
-SOAKEDD12A8C131F8E,http://previews.7digital.com/clip/3682408,Jason Mraz,Love For A Child [From The Casa Nova Sessions]
-SOAKEDH12AB0185DBF,http://previews.7digital.com/clip/8351014,Nic Jones,The Humpback Whale
-SOAKEKF12AB017EF2A,http://previews.7digital.com/clip/3750162,Clint Eastwood,We Killed Some Kids
-SOAKEKV12A6D4FA512,http://previews.7digital.com/clip/511591,Ryan Adams,Shallow
-SOAKEMU12A58A7BCD3,http://previews.7digital.com/clip/409569,Golden Smog,If I Only Had A Car
-SOAKEPT12A6D4F8390,http://previews.7digital.com/clip/31055420,Aterciopelados,Cruz De Sal
-SOAKEQG12A6D4FE69E,http://previews.7digital.com/clip/17917839,Ben Lee,Get Gotten
-SOAKERK12A8C134839,http://previews.7digital.com/clip/2060728,Roe-Deer,Melancholy
-SOAKEYK12AB0183E83,http://previews.7digital.com/clip/6079678,Tommy Keene,Texas Tower #4
-SOAKEYS12AB018105B,http://previews.7digital.com/clip/6127832,The Gaslamp Killer,Track One
-SOAKEYZ12A6D4FC3BC,http://previews.7digital.com/clip/1152214,Irwin Goodman,Romeo ilman Juliaa
-SOAKEZR12A8AE45941,http://previews.7digital.com/clip/1393520,Thirsty Merc,Like Snow
-SOAKFBX12A6D4F82A0,http://previews.7digital.com/clip/274052,Andrew Hill,Blue Spark
-SOAKFCE12A8C138B8E,http://previews.7digital.com/clip/3326712,Woody Allen,Hear Me Talkin' To Ya
-SOAKFCN12A8AE4850E,http://previews.7digital.com/clip/1431743,Air Traffic,No More Running Away (Alternative Version)
-SOAKFFE12A6D4F43BA,http://previews.7digital.com/clip/311560,Sam Butera & The Witnesses,Dig That Crazy Chick
-SOAKFFM12A6D4FC857,NA,Bardo Pond,Yellow Turban
-SOAKFHE12A8C138716,http://previews.7digital.com/clip/14419071,Vinícius de Moraes,Samba Da Benção
-SOAKFHK12A58A7E71B,http://previews.7digital.com/clip/8313927,Artist Vs Poet,Adorable
-SOAKFJA12A6D4F6B8A,http://previews.7digital.com/clip/244492,Bill Monroe,I'm So Lonesome I Could Cry
-SOAKFJT12AB0184569,http://previews.7digital.com/clip/7157303,The Fort Mudge Memorial Dump,The Seventh Is Death
-SOAKFOP12A58A7F376,http://previews.7digital.com/clip/3161709,Angélique Kidjo,Ominira
-SOAKFPR12A8C1361FC,NA,The Clancy Brothers & Tommy Makem,As I Roved Out - (With Bobby)
-SOAKFRD12A6D4F7A07,http://previews.7digital.com/clip/381368,Jewel,Last Dance Rodeo
-SOAKFXJ12A8C135C33,http://previews.7digital.com/clip/3264285,The Bird and the Bee,Tonight You Belong To Me
-SOAKFXX12A58A7DA01,http://previews.7digital.com/clip/1560952,Richard Souther,Native Shores
-SOAKGCG12A8C13F820,NA,The Concretes,A Whale's Heart
-SOAKGEZ12A8C13ECB4,http://previews.7digital.com/clip/3506171,Screeching Weasel,Achtung
-SOAKGGN12A6D4F7CA5,http://previews.7digital.com/clip/173311,Richard Hawley,Darlin' Wait For Me
-SOAKGHE12A8C13ECB3,http://previews.7digital.com/clip/33234966,Dopamine,Call To Arms
-SOAKGJD12A58A7CBEF,http://previews.7digital.com/clip/15812109,Tonight Is Glory,Calotype
-SOAKGJR12A67020EA3,http://previews.7digital.com/clip/161491,Bryan Adams,Wastin' Time
-SOAKGLB12AB0187CBC,http://previews.7digital.com/clip/32634668,Pipilotti Rist,Herz Aufwühlen Herz Ausspülen
-SOAKGML12AB0185DE0,http://previews.7digital.com/clip/4693225,Les fragments de la nuit,Solitude
-SOAKGNN12A8C143857,NA,Frisco Kid,Right Stuff
-SOAKGOX12A6D4FB847,http://previews.7digital.com/clip/16244843,Stéphane Grappelli,I Saw Stars
-SOAKGXZ12A6D4F79D9,http://previews.7digital.com/clip/323892,The Power Station,Life Forces
-SOAKGYN12A6D4F9751,http://previews.7digital.com/clip/497390,Matt Nathanson,Sad Songs
-SOAKGZW12AB0181C8E,http://previews.7digital.com/clip/36201398,Vincent Vallières,Y fait beau
-SOAKGZW12AB0187D88,http://previews.7digital.com/clip/8517949,Los Del Río,Sevillanas De La Suegra
-SOAKHEV12A8AE48FD5,http://previews.7digital.com/clip/3124299,Duran Duran,Last Man Standing
-SOAKHFU12A8AE486F4,http://previews.7digital.com/clip/2015976,La buena vida,Ayer Te Ví
-SOAKHGO12AB0185592,NA,The Cribs,What About Me
-SOAKHGR12A6D4F6066,NA,K-Klass,Burnin'
-SOAKHKE12AB0187985,http://previews.7digital.com/clip/8339506,Boyzone,One More Song
-SOAKHLE12A6D4F99B5,http://previews.7digital.com/clip/305014,Charlie Hunter,Greasy Granny
-SOAKHMB12A8C143981,http://previews.7digital.com/clip/7422130,Newton Faulkner,Feels Like Home (New Version)
-SOAKHOF12A8C13C72A,http://previews.7digital.com/clip/2352108,Man Man,Poor Jackie
-SOAKHOX12A6D4F896C,http://previews.7digital.com/clip/399998,Leila Pinheiro,Amor Certinho
-SOAKHQL12AB0182BAD,http://previews.7digital.com/clip/3874379,Nik & Jay,Du Gør Mig Høj
-SOAKHTT12AB017D627,http://previews.7digital.com/clip/4286099,Allison Moorer,Louise Is In The Blue Moon
-SOAKHWT12A8C13BBA5,NA,Psychic TV,Tune In (Greedy Beat Syndicate Remix)
-SOAKHYS12A8C139EC1,http://previews.7digital.com/clip/1137615,Mickie Krause,Oh Wie Ist Das Schön (Live Im RIU Palace Mallorca)
-SOAKHZF12AB0186DC9,http://previews.7digital.com/clip/8562449,Tilly and the Wall,I Always Knew
-SOAKIBN12A6D4F76D8,http://previews.7digital.com/clip/886981,Sólo Los Solo,Algo más
-SOAKIEB12AF72ACC24,http://previews.7digital.com/clip/16813041,Quantic,Meaning
-SOAKIGL12AF729D0DF,http://previews.7digital.com/clip/8110802,Nevermore,What Tomorrow Knows
-SOAKIGX12AB0181EA7,http://previews.7digital.com/clip/5483228,Angels of Light & Akron/Family,The Provider
-SOAKIJR12A8C13F436,http://previews.7digital.com/clip/1763584,Dead Can Dance,Ariadne
-SOAKIME12A8C13600B,NA,Ass Ponys,Butterfly
-SOAKIMP12A8C130995,http://previews.7digital.com/clip/2093263,Jack Johnson,The Cove
-SOAKIPO12A67AE0D03,http://previews.7digital.com/clip/202732,Ashlee Simpson,Kicking and Screaming (Non-LP Version)
-SOAKITG12A6D4F61DE,http://previews.7digital.com/clip/562655,The Rubettes,Under One Roof
-SOAKIUO12AAF3B353F,http://previews.7digital.com/clip/6860650,OK Go,Shooting The Moon
-SOAKIWW12AB0185842,http://previews.7digital.com/clip/17503268,Ochre,Beneath Fleeting Visions
-SOAKIXJ12AC3DF7152,http://previews.7digital.com/clip/8586102,Kristine W,The Wonder of It All (Mig 'N' Brett Club Mix)
-SOAKIXW12A6D4F79CB,http://previews.7digital.com/clip/226507,Go West,That's What Love Can Do
-SOAKIZD12A8C14448B,http://previews.7digital.com/clip/5147459,The Shangri-Las,The Sweet Sounds Of Summer
-SOAKIZU12A6D4FA9C8,http://previews.7digital.com/clip/581574,Marcos Valle,"She Told Me, She Told Me"
-SOAKJCG12A6D4FAA20,http://previews.7digital.com/clip/123239,Van der Graaf Generator,La Rossa (2005 Digital Remaster)
-SOAKJDL12AF72A5584,http://previews.7digital.com/clip/19572997,Blur,London Loves
-SOAKJEB12AC9097360,http://previews.7digital.com/clip/8171560,Joan Manuel Serrat,Las Abarcas Desiertas
-SOAKJFQ12A8C13FF1F,http://previews.7digital.com/clip/6975080,Common Rider,Time Wont Take Away
-SOAKJFZ12A6D4FBBB3,http://previews.7digital.com/clip/37699697,Holly Throsby,And Then We're Gone
-SOAKJGG12AB018AABB,http://previews.7digital.com/clip/4711990,Lhasa de Sela,Fool's gold
-SOAKJIM12AB018423B,http://previews.7digital.com/clip/7175059,Bobby Hutcherson,Color Scheme
-SOAKJJU12A58A79C85,http://previews.7digital.com/clip/2511233,Alias & Tarsier,Anon
-SOAKJKQ12AC9071B1F,http://previews.7digital.com/clip/8201332,Kurt Nilsen,Crazy Crazy Nights
-SOAKJLK12A6D4FD01B,http://previews.7digital.com/clip/2507399,Yoskar Sarante,Si Te Llego A Perder
-SOAKJPH12A8C13E402,http://previews.7digital.com/clip/1171908,Gatsby's American Dream,The Guilt Engine
-SOAKJPV12AB01851EA,http://previews.7digital.com/clip/8372348,Sheek Louch,Freestyle 3
-SOAKJRI12AB0189010,http://previews.7digital.com/clip/7163010,As Tall as Lions,You Can't Take It With You
-SOAKJRV12A8C13C371,NA,Woods,Kid's Got Heart
-SOAKJRX12AC3DF6166,http://previews.7digital.com/clip/8603239,Tuscadero,Mt. Pleasant
-SOAKKBE12A58A79475,http://previews.7digital.com/clip/352075,Damon Albarn,Nabintou Diakite (Live)
-SOAKKCF12A8C1364F7,http://previews.7digital.com/clip/3267475,Crystal Gayle,Miss The Mississippi And You
-SOAKKGC12A67ADD435,http://previews.7digital.com/clip/1153611,Les Humphries Singers,Old Man Moses
-SOAKKSH12AB01847D8,http://previews.7digital.com/clip/6047863,Doleful Lions,Slip Inside This Gateway
-SOAKKVC12AC3DF6C58,http://previews.7digital.com/clip/7707358,Wayne Wonder,The Best feat. Bounty Killer
-SOAKKVE12A8C1355CB,http://previews.7digital.com/clip/3245786,Monkey,Monkey Travels
-SOAKKVY12AB017EF7E,http://previews.7digital.com/clip/5938395,Rebirth Brass Band,Tubaluba
-SOAKKXW12AB0185A03,http://previews.7digital.com/clip/13447038,Béla Fleck,Perplexed
-SOAKKYF12AF72AA829,http://previews.7digital.com/clip/1566490,Black Flag,I Don't Care
-SOAKLAE12A6701FD7B,http://previews.7digital.com/clip/29111699,Charles Mingus,Oh Lord Don't Let Them Drop That Atomic Bomb On Me
-SOAKLAU12A6D4F7602,http://previews.7digital.com/clip/249459,Russ Ballard,Voices
-SOAKLFR12A8C1434B8,http://previews.7digital.com/clip/6802441,Rockabye Baby!,Who Made Who
-SOAKLGI12A8C13E754,http://previews.7digital.com/clip/2937832,The Tyde,Memorable Moments
-SOAKLHW12A8AE47BF0,http://previews.7digital.com/clip/3105488,Cradle of Filth,Thirteen Autumns And A Widow
-SOAKLIC12A6D4F9285,http://previews.7digital.com/clip/598542,Jan De Wilde,"Dag, Meneer De Wilde"
-SOAKLIS12AB0186EB6,http://previews.7digital.com/clip/7764310,The Constructus Corporation,Go to the arcade
-SOAKLMS12A8C1310AF,NA,Alice in Chains,So Close
-SOAKLQF12AB018ADD6,http://previews.7digital.com/clip/30902076,Madlib,New Bombay
-SOAKLQJ12AB017C781,http://previews.7digital.com/clip/5894244,Marc Perrone,Le Thé D'ania
-SOAKLQQ12A8C142D04,http://previews.7digital.com/clip/4464540,Femi Kuti,One Two
-SOAKLRW12AB017E0FB,http://previews.7digital.com/clip/4458284,Ojos de Brujo,Perico y Juliana
-SOAKLWC12A6D4F4BD6,http://previews.7digital.com/clip/317770,Tin Tin Out,All I Wanna Do (KLM Old Fashioned Love Song Mix)
-SOAKLXQ12AB0187507,http://previews.7digital.com/clip/6376092,The Black Crowes,The Last Place That Love Lives
-SOAKLXU12A8C143F6C,http://previews.7digital.com/clip/33452899,Mindless Self Indulgence,Get It Up
-SOAKLYD12A6D4F9DAF,http://previews.7digital.com/clip/3666776,Wencke Myhre,Er steht im Tor
-SOAKMCW12AB0180645,http://previews.7digital.com/clip/7176626,Jay Tee,Savage Grind
-SOAKMCY12A58A7CF95,http://previews.7digital.com/clip/8830,Richard Ashcroft,Crazy World
-SOAKMFY12A58A7DC21,http://previews.7digital.com/clip/4857584,Green Day,Horseshoes And Handgrenades
-SOAKMHM12AB0186291,http://previews.7digital.com/clip/6467080,Ben Nevile,Van (Original Mix)
-SOAKMJO12AC3DF438A,http://previews.7digital.com/clip/8098018,Tony Sly,The Shortest Pier
-SOAKMJV12AB018A585,http://previews.7digital.com/clip/4682228,Admiral Bailey,A No Nutten (Part 2)
-SOAKMNK12AB017CB65,http://previews.7digital.com/clip/4434630,Kostia,Carol Of The Bells
-SOAKMOR12AC4688C1C,http://previews.7digital.com/clip/7759190,Twin Tigers,Everyday
-SOAKMPK12A67ADA698,http://previews.7digital.com/clip/863691,Elton John,Just Like Belgium
-SOAKMPW12A8AE49381,http://previews.7digital.com/clip/5824910,Willie Nelson,My Love For The Rose
-SOAKMRC12A6310DF20,http://previews.7digital.com/clip/1111,UNKLE,Getting Ahead In The Lucrative Field Of Artist Management
-SOAKMSE12AB018952D,http://previews.7digital.com/clip/6323489,Theory of a Deadman,Above This (Album Varsion)
-SOAKMSM12AB0186FA5,http://previews.7digital.com/clip/7241532,Gangster Fun,You're So Lame
-SOAKMWY12A8C145C71,http://previews.7digital.com/clip/6822495,Joshua Redman,Mischief
-SOAKMYN12A8C1316C5,http://previews.7digital.com/clip/2630676,Bon Jovi,Any Other Day
-SOAKNFA12AB018FDBD,http://previews.7digital.com/clip/8538421,Clear Convictions,Words
-SOAKNFM12AC9074F3B,http://previews.7digital.com/clip/6666001,Béla Fleck and The Flecktones,Shanti
-SOAKNGY12AB017CCF9,NA,Matinée Club,Discotheque Français (Hoxton Whores Vocal Remix)
-SOAKNKY12A58A7DC94,http://previews.7digital.com/clip/164394,The Wallflowers,Pleasantville
-SOAKNLV12A6D4FA6D1,http://previews.7digital.com/clip/579913,Larry Carlton,Reflection Of A Guitar Player
-SOAKNPP12A8C13019B,http://previews.7digital.com/clip/3155167,Paul Thorn,Lovers Vacation
-SOAKNQO12A8C13789E,NA,MU330,Hot Cheese
-SOAKNTD12A8C139406,http://previews.7digital.com/clip/3295159,Danny Elfman,The Return (Instrumental)
-SOAKNUA12A6D4F46C1,http://previews.7digital.com/clip/14063751,Human Eye,Episode People
-SOAKNYG12A8C13BB94,http://previews.7digital.com/clip/2285266,Refused,Racial Liberation
-SOAKNYJ12A6701C7A6,http://previews.7digital.com/clip/148070,No Doubt,Get On The Ball
-SOAKNZC12AB017F274,http://previews.7digital.com/clip/4445343,The London Metropolitan Orchestra,"Go To England, Make Her Smile (Albert's Theme)"
-SOAKNZI12A58A79CAC,http://previews.7digital.com/clip/6136090,Anjulie,Crazy That Way
-SOAKNZL12AB0181E89,http://previews.7digital.com/clip/2989688,Sonny Criss,Steve's Blues
-SOAKOBA12A8C13E374,http://previews.7digital.com/clip/6975240,Fifteen,Definition
-SOAKODG12A8C13CDE0,NA,Watermelon Slim,Drinking & Driving
-SOAKOEA12AB018848B,NA,No te va Gustar,Como Brillaba tu Alma
-SOAKOEN12A8151CDC3,http://previews.7digital.com/clip/1345338,Blue Rodeo,Beverley Street
-SOAKOEV12AC4689B7F,http://previews.7digital.com/clip/7723968,Eddie Henderson,Kudu
-SOAKOGF12A8C1397CD,http://previews.7digital.com/clip/1675916,Pocket Dwellers,Play This Music!
-SOAKOGK12AB0187DCE,http://previews.7digital.com/clip/5676313,Vicente Fernández,Esclavo Y Amo
-SOAKOGQ12AB0185345,http://previews.7digital.com/clip/8380026,Smokie Norful,Chapter 3: Desperation Breeds Disobedience
-SOAKOGZ12AB0180A82,NA,Stonewall Jackson,Fraulein
-SOAKOHD12A58A7C6E1,http://previews.7digital.com/clip/150471,Midtown,You Should Know
-SOAKOIG12AB018378E,http://previews.7digital.com/clip/6629379,Demi Lovato,So Far So Great
-SOAKOJP12AB018205E,NA,Asteroid,The Great Unknown
-SOAKOLK12AF72A72AF,http://previews.7digital.com/clip/17846186,North Mississippi Allstars,Psychedelic Sex Machine
-SOAKOMC12AC9075271,http://previews.7digital.com/clip/7676824,Cell,Second Shape part I
-SOAKOPJ12AAF3B3189,http://previews.7digital.com/clip/3631765,Kaiser Chiefs,Always Happens Like That
-SOAKOPO12AB018AE0B,http://previews.7digital.com/clip/7846670,Ghreg on Earth,The Midnigth Fire
-SOAKOTK12A8C13F4BB,http://previews.7digital.com/clip/2401512,Stephen Lynch,What If That Guy From Smashing Pumpkins Lost His Car Keys?
-SOAKOUI12AAF3B380C,http://previews.7digital.com/clip/6869910,Albin de la Simone,Ton Pommier
-SOAKOXV12A6D4F681E,http://previews.7digital.com/clip/259557,The Swinging Blue Jeans,It Isn't There
-SOAKOYZ12A6D4F6ACC,http://previews.7digital.com/clip/7075877,Jay Reatard,Fading All Away
-SOAKPAG12A8C134C9C,http://previews.7digital.com/clip/35298690,The Byrds,Yesterday's Train
-SOAKPAU12A6701E9AA,http://previews.7digital.com/clip/128676,Ry Cooder & Manuel Galbán,Maria la O
-SOAKPCQ12AC3DFA61F,http://previews.7digital.com/clip/17018517,B-Complex,Three Dots
-SOAKPDE12A8C135BD2,http://previews.7digital.com/clip/2645972,Iván Ferreiro,Cancion humeda
-SOAKPEL12A6D4FC126,NA,Line Renaud,En écoutant mon coeur chanter
-SOAKPEQ12A8C1350C3,NA,Sharon Jones and the Dap-Kings,Cut That Line
-SOAKPFH12A8C13BA4A,http://previews.7digital.com/clip/1196661,Secret Service,Ye Si Ca
-SOAKPHY12AB0182FB0,http://previews.7digital.com/clip/5714942,Mikromusic,Brak Mi Juz Slow
-SOAKPLO12AB01824C5,http://previews.7digital.com/clip/6977981,Boat Club,Warmer Climes
-SOAKPLR12AB018AD26,NA,Gamma Ray,Time To Live
-SOAKPNF12A67020052,http://previews.7digital.com/clip/172798,Milt Jackson,Don't Get Around Much Anymore (Alternate Take)
-SOAKPOM12AB018A522,NA,The Rakes,Binary Love
-SOAKPQI12A6310E007,http://previews.7digital.com/clip/9149,Kenickie,In Your Car
-SOAKPQJ12A8C13D812,http://previews.7digital.com/clip/3463958,Pereza,Lo Que Tengo Yo Adentro
-SOAKPQN12A8C141C79,http://previews.7digital.com/clip/6791139,Eric Bibb,Water Works Fine
-SOAKPRK12A8C140BF9,http://previews.7digital.com/clip/2435966,Harry Gregson-Williams,Rescue!
-SOAKPTY12A6D4F87D4,http://previews.7digital.com/clip/384812,Ice Cube,Pockets Stay Fat (edited version)
-SOAKPUG12AB0186951,http://previews.7digital.com/clip/8754958,Akesson,Sunchaser (Original Mix)
-SOAKPWO12A67ADC279,http://previews.7digital.com/clip/716523,Cornelius,Wataridori
-SOAKPYJ12AB018B339,http://previews.7digital.com/clip/7677134,Vibrasphere,Erosion (Glenn Morrison & Bruce Aisher remix)
-SOAKPYY12AB0184B09,http://previews.7digital.com/clip/14919479,Riot,This Is What I Get
-SOAKPZK12A58A7B7FF,http://previews.7digital.com/clip/35750150,Pelle Carlberg,Summer Of '69
-SOAKQAJ12AC468AD19,http://previews.7digital.com/clip/8754098,Susana Seivane,Alala De Vilalba
-SOAKQAS12A6D4F8AE6,http://previews.7digital.com/clip/16090651,Murder by Death,Those Who Stayed
-SOAKQBT12AB01803CB,http://previews.7digital.com/clip/37418143,Bikini Kill,Sugar
-SOAKQCC12A8C137842,http://previews.7digital.com/clip/18751638,Charlie Musselwhite,Town To Town
-SOAKQDZ12AB0183B4E,NA,Hocico,Change
-SOAKQGZ12AF72A1846,http://previews.7digital.com/clip/143854,Cat Stevens,Fill My Eyes
-SOAKQKE12A6D4FA224,http://previews.7digital.com/clip/550121,Wilki,Slowa
-SOAKQKX12A8C13B27B,http://previews.7digital.com/clip/2241967,Empty Trash,Instead I Close My Eyes
-SOAKQME12A6D4F64E9,http://previews.7digital.com/clip/309593,Devo,That's Good
-SOAKQNO12AB0181ECB,NA,Sopor Aeternus & The Ensemble of Shadows,The Dreadful Mirror
-SOAKQOS12A58A797E2,http://previews.7digital.com/clip/772215,Klaus Lage Band,Nie Wieder Kind
-SOAKQPM12A8C137BB1,http://previews.7digital.com/clip/2178875,Teenage Fanclub,Every Picture I Paint
-SOAKQUF12AB017E97F,http://previews.7digital.com/clip/5887217,Squarepusher,Conc 2 Symmetriac
-SOAKQUM12A8C139D8A,http://previews.7digital.com/clip/2226283,Pulley,Fuel
-SOAKQUV12A8C134DE0,http://previews.7digital.com/clip/21719370,Jungle Rot,Humans Shall Pay
-SOAKQVE12A8AE47C82,http://previews.7digital.com/clip/3109142,Sly & The Family Stone,Bad Risk (single master)
-SOAKQXI12AF72A71DE,http://previews.7digital.com/clip/22498419,Royal Crown Revue,Hey Pachuco!
-SOAKQXT12A8AE448CB,http://previews.7digital.com/clip/1393491,Thirsty Merc,Undivided Love
-SOAKQYS12A58A7CE57,http://previews.7digital.com/clip/17908248,Gaudi,Othe Mera Yar Wasda
-SOAKQYS12AB018E19F,http://previews.7digital.com/clip/7459291,Eric Benét,Love Of My Own
-SOAKQZH12AB0189E39,http://previews.7digital.com/clip/16742408,Silver Mt. Zion,Collapse Traditional (For Darling)
-SOAKQZP12AB01842B2,http://previews.7digital.com/clip/8347676,Keller Williams,No Hablo Espanol
-SOAKQZR12AF72AD460,http://previews.7digital.com/clip/3166075,Dokken,Shadows Of Life
-SOAKRAI12A8C139751,http://previews.7digital.com/clip/2246480,Braintax,Magnum On Crack
-SOAKRAP12A6D4F6061,http://previews.7digital.com/clip/260888,Edyta Górniak,The Day I Get Over You
-SOAKREM12A8C13AB93,http://previews.7digital.com/clip/2285394,No Fun At All,Don't Know Nothing
-SOAKREY12AB0183947,http://previews.7digital.com/clip/5974804,The Tokens,Little Hot Rod Suzie
-SOAKRLD12A58A7C651,http://previews.7digital.com/clip/1371987,Thornley,The Going Rate (My Fix)
-SOAKRLV12AB018C0E1,http://previews.7digital.com/clip/7921145,Martin Jondo,Caught In A Ghetto
-SOAKRLW12A6D4F77AE,http://previews.7digital.com/clip/232273,Lil Romeo,Intro (Lil' Romeo)
-SOAKRPM12A6D4F9787,http://previews.7digital.com/clip/771638,The Proclaimers,Lady Luck
-SOAKRQK12A8C133C8E,http://previews.7digital.com/clip/906648,Les Baxter,Borodin - Polevitzian Dance
-SOAKRQT12A6310E0F1,http://previews.7digital.com/clip/20961116,The Beach Boys,"Hold On, Dear Brother"
-SOAKRTF12AB018A408,http://previews.7digital.com/clip/8546392,Slagsmålsklubben,BIB
-SOAKRTU12AB01834D6,http://previews.7digital.com/clip/8797857,Roky Erickson,Ain't Blues Too Sad
-SOAKRUM12AC468F6E2,NA,Spor,Knock You Down (Eskmo Remix)
-SOAKRVE12A58A7909F,http://previews.7digital.com/clip/258055,Cockney Rebel,Psychomodo
-SOAKRXY12AB0182E91,http://previews.7digital.com/clip/5386465,Nueva Vulcano,Urgencias
-SOAKRYI12A58A7CAF9,http://previews.7digital.com/clip/4391528,Ramsay Midwood,Mohawk River
-SOAKRYJ12AB018286E,http://previews.7digital.com/clip/4532341,Shazam,Pool Party 2008
-SOAKSBZ12AB018CFE1,http://previews.7digital.com/clip/12550160,The Radio Dept.,The Idle Urban Contemporaries
-SOAKSEO12A58A7DDD7,http://previews.7digital.com/clip/34621304,De Dannan,Captain Jack
-SOAKSFU12A8C138614,http://previews.7digital.com/clip/2226535,Jolie Holland,Catalpa Waltz
-SOAKSIJ12A8C13AC04,http://previews.7digital.com/clip/2257135,Sergio Cammariere,Le Note Blu
-SOAKSKH12A6701D455,http://previews.7digital.com/clip/118096,Lene Marlin,My Lucky Day
-SOAKSLN12AB018CDB1,http://previews.7digital.com/clip/9077800,Alan Parsons,Apollo
-SOAKSPQ12AB0180B97,http://previews.7digital.com/clip/7688619,Roine Stolt,Dog With A Million Bones
-SOAKSQW12AB0187617,http://previews.7digital.com/clip/3994928,Shrimp Boat,Limerick
-SOAKSTJ12AB0187188,http://previews.7digital.com/clip/6048753,gossip,Bones
-SOAKSUK12AC3DF9D5D,http://previews.7digital.com/clip/7707594,Wizzy Noise,Seven Deadly Sins
-SOAKSVC12AC3DF5A5E,http://previews.7digital.com/clip/9083387,Jannes,Kom Blijf De Hele Nacht Bij Mij
-SOAKSYG12A58A7CE93,http://previews.7digital.com/clip/18195384,Krizz Kaliko,The Ride (Skit)
-SOAKSZE12AC3DF6C93,http://previews.7digital.com/clip/7706356,Wayne Wonder & Baby Cham,Joyride
-SOAKTCE12AB017FBBE,http://previews.7digital.com/clip/4553311,Robert Hood,Minus
-SOAKTEG12A8C13B388,http://previews.7digital.com/clip/22429133,Wreckless Eric,Personal Hygiene
-SOAKTEH12A8C1343B3,http://previews.7digital.com/clip/1501448,Rufus Wainwright,The Motion Waltz (Emotional Commotion)
-SOAKTHK12AB0180C30,http://previews.7digital.com/clip/5640987,DJ Shah,Sunset Road (Chillout Mix)
-SOAKTIP12A8C13FA1A,NA,Vital Information,Ray Of Hope
-SOAKTIS12AB018536B,http://previews.7digital.com/clip/8380045,Smokie Norful,Chapter 7: Every Round With God Goes Higher
-SOAKTJR12A67ADA71C,http://previews.7digital.com/clip/1958928,Tord Gustavsen Trio,Curtains Aside
-SOAKTNQ12AB018CE07,http://previews.7digital.com/clip/8967322,Falsalarma,Nada Cambia (Remix)
-SOAKTOO12A8C13612F,http://previews.7digital.com/clip/2042661,Elin Ruth Sigvardsson,Antidote
-SOAKTPD12A58A78B8F,http://previews.7digital.com/clip/32783291,Koushik,Pretty Soon
-SOAKTQO12A6D4F631B,http://previews.7digital.com/clip/233098,Charlelie Couture,Tu joues toujours
-SOAKTRN12AAF3B4D89,NA,La Numero 1 Banda Jerez De Marco A. Flores,Mira Nomas
-SOAKTSA12A8C13B2E8,http://previews.7digital.com/clip/3430592,Les Wampas,Paolo
-SOAKTSY12A6D4FB711,http://previews.7digital.com/clip/4093300,Lone Justice,"Sweet, Sweet Baby (I'm Falling)"
-SOAKTVH12A8C1446D8,http://previews.7digital.com/clip/6786914,Mando Diao,Duel Of The Dynamite
-SOAKTXK12A8C13ECA8,http://previews.7digital.com/clip/2909510,Would-Be-Goods,Marvellous Boy
-SOAKTXT12A8C138574,NA,Malajube,Elton D'Aout (Remix Maman)
-SOAKTYO12A8C1426B1,http://previews.7digital.com/clip/6817600,Benjamin Biolay,Night shop
-SOAKUDC12A81C21656,http://previews.7digital.com/clip/1351912,Timbaland & Magoo,Sex Beat (Interlude)
-SOAKUDV12A8C144B81,http://previews.7digital.com/clip/5815946,Oldelaf et Monsieur D.,Jean michel Jarre
-SOAKUEC12AF72A7E1A,http://previews.7digital.com/clip/249469,Beastie Boys,The Sounds Of Science (2009 Digital Remaster)
-SOAKUFJ12AB018D04E,http://previews.7digital.com/clip/7999166,Trüby Trio,Galicia (Zero dB Remix)
-SOAKUHX12A8C1421F0,http://previews.7digital.com/clip/3543146,Cassidy,Damn I Miss The Game
-SOAKUII12A8C13DF4F,NA,The Receiving End of Sirens,The Crop And The Pest
-SOAKUKQ12AB0189EEB,http://previews.7digital.com/clip/7623636,Cex,Cut Wrists
-SOAKULP12A6D4F75BD,http://previews.7digital.com/clip/246639,The Kooks,Time Awaits (Live @ Abbey Road) (Acoustic)
-SOAKUMR12A8AE47C2D,http://previews.7digital.com/clip/3125033,Unashamed,This Dividing Wall
-SOAKUNC12AB0181A70,http://previews.7digital.com/clip/4961207,Little Boots,New In Town [The Death Set Remix] (Remix)
-SOAKUNU12AF72AA2AB,http://previews.7digital.com/clip/5633442,Matt Nathanson,Bulletproof Weeks
-SOAKUPG12A8C1399EF,http://previews.7digital.com/clip/2201777,Poverty Stinks,The Waltz
-SOAKUPW12AB018346F,http://previews.7digital.com/clip/11271437,Obits,Widow of My Dreams
-SOAKUPZ12AB0180239,http://previews.7digital.com/clip/11430709,Barrington Levy,You Are The Chosen One
-SOAKURS12AF72A3F72,http://previews.7digital.com/clip/214397,Midtown,Let Go
-SOAKUTA12A8C13BE71,http://previews.7digital.com/clip/4290244,Sparta,Erase It Again
-SOAKUTH12A8C135B29,http://previews.7digital.com/clip/9897554,Jaco Pastorius,"Come On, Come Over"
-SOAKUVC12A8C135F22,http://previews.7digital.com/clip/980776,Absynthe Minded,I Wanna Forget
-SOAKUXE12A8C137A37,http://previews.7digital.com/clip/6828063,Porter Wagoner & Dolly Parton,Just Someone I Used To Know
-SOAKVBD12A8C13EFD4,http://previews.7digital.com/clip/2936594,"Albert Hammond, Jr.",Holiday
-SOAKVBP12A6D4F7658,http://previews.7digital.com/clip/319898,Ramsey Lewis Trio,Light Along The Path
-SOAKVCE12A8AE459FB,http://previews.7digital.com/clip/3096801,Jello Biafra & The Melvins,Enchanted Thoughtfist
-SOAKVFK12AB0182B27,http://previews.7digital.com/clip/6094246,Earlimart,Broke The Furniture
-SOAKVFU12A8C13C518,http://previews.7digital.com/clip/1099726,Per Gessle,Jag skulle vilja tänka en underbar tanke
-SOAKVGF12A8C13356B,http://previews.7digital.com/clip/3273613,Charlotte Church,Winter Wonderland
-SOAKVGK12AAF3B562A,http://previews.7digital.com/clip/5352309,Kristy Lee Cook,Plant The Seed
-SOAKVHE12A58A7D268,http://previews.7digital.com/clip/8218801,Fay-Ann Lyons,Thinking of Something
-SOAKVHE12A8C134904,http://previews.7digital.com/clip/2184779,Jack Nitzsche,Jingle Bells
-SOAKVHR12A8C13A667,http://previews.7digital.com/clip/1053042,Ed Bruce,Truth Is I'm A Liar
-SOAKVMB12A8C1401E2,http://previews.7digital.com/clip/3472812,El Canto del Loco,El Pescao
-SOAKVNM12A8C13BD1D,http://previews.7digital.com/clip/1108224,Glass Tiger,The Tragedy (Of Love) (B-Side) (2004 Digital Remaster)
-SOAKVPT12AB01845F9,http://previews.7digital.com/clip/31420068,Brainstorm,Innocent Until Caught (Remastered)
-SOAKVQO12A58A7A9CF,NA,Mark Heard,Mystery Mind
-SOAKVRX12A58A79F8D,http://previews.7digital.com/clip/2403943,Steve Stevens,Memory Crash
-SOAKVSH12AAA8C4F4E,http://previews.7digital.com/clip/6846687,Los Miserables,Falta de Razon
-SOAKVTF12AB0184E77,http://previews.7digital.com/clip/5643825,Jorge Celedón,El Amor Es Así
-SOAKVVM12AC3DF9F8F,http://previews.7digital.com/clip/6580055,Way Out West,Northern Lights
-SOAKVWR12A8C13CAD4,http://previews.7digital.com/clip/3359394,Joan Manuel Serrat,El Gessami I La Rosa
-SOAKVZT12A6310E216,http://previews.7digital.com/clip/1351779,The Commitments,Take Me To The River
-SOAKWAY12A6D4F9E7B,http://previews.7digital.com/clip/481205,Maria de Barros,Nos Tradicon
-SOAKWBS12A8C13E286,http://previews.7digital.com/clip/34753741,Chandeen,Teenage Poetry
-SOAKWCG12A8C144FED,http://previews.7digital.com/clip/4480212,Big Brovaz,Don't Watch That
-SOAKWCK12A8C139F81,http://previews.7digital.com/clip/1655356,Litzy,Mientras Vivas
-SOAKWCZ12A6D4F7F65,http://previews.7digital.com/clip/260153,The Paramounts,Don't Ya Like Ma Love? (1998 Digital Remaster)
-SOAKWEL12AC4689ACE,http://previews.7digital.com/clip/30188954,Manta Ray,A Traición
-SOAKWFL12AB0182308,http://previews.7digital.com/clip/18475493,DoomSword,My Name Will Live On
-SOAKWFZ12A8C1389E7,http://previews.7digital.com/clip/1572509,Velour 100,Clouds (Of Color Bright Album Version)
-SOAKWGH12A6D4F7928,http://previews.7digital.com/clip/238973,Pops Staples,Pray
-SOAKWHM12A67ADBF01,http://previews.7digital.com/clip/488434,Álex Ubago,Instantes
-SOAKWHP12AB018A3F8,http://previews.7digital.com/clip/10329319,Bonobo,The Shark
-SOAKWJE12AB01837E4,http://previews.7digital.com/clip/3900904,Zion I,TakeOver
-SOAKWJS12A8C13BDD5,http://previews.7digital.com/clip/1160467,Nine Black Alps,Burn Faster
-SOAKWKC12AB0184436,http://previews.7digital.com/clip/21658382,Eths,Ailleurs c'est ici
-SOAKWKJ12AF72A1011,http://previews.7digital.com/clip/23013172,Fashawn,Breathe
-SOAKWNF12A8C132B46,http://previews.7digital.com/clip/34628114,Sue Foley,Baby Where Are You
-SOAKWPE12AB01841A6,NA,Calexico,Gypsy's Curse
-SOAKWPO12A8C144A65,http://previews.7digital.com/clip/5326419,Hopeton Lewis,This Is What Heaven Means To Me
-SOAKWQU12A8C13D765,http://previews.7digital.com/clip/1692456,Reinhard Mey,Sommerende
-SOAKWTX12AF729DD70,http://previews.7digital.com/clip/254868,Huey Lewis & The News,Whole Lotta Lovin'
-SOAKWUM12A8C13F8E7,http://previews.7digital.com/clip/4677448,Leif Ove Andsnes/Bergen Philharmonic Orchestra/Dmitri Kitayenko,Piano Concerto in A minor Op. 16: II. Adagio
-SOAKXAG12A6D4F9117,NA,Aqua,Cuba Libre
-SOAKXBF12A8C13975C,http://previews.7digital.com/clip/1643684,Schweisser,Ich Sehe Deine Wunde
-SOAKXCF12A58A76984,http://previews.7digital.com/clip/514205,Moderatto,Si Mi Delito Es Rockear
-SOAKXDG12A6D4F69BB,NA,Iarla Ó Lionáird,Aililiu Na Gamhna (Calling Home The Calves)
-SOAKXHX12AB01867CF,http://previews.7digital.com/clip/8041684,Eprom,Donkey Nap
-SOAKXIB12AC468C8F7,http://previews.7digital.com/clip/7737514,The Groundhogs,S'one Song
-SOAKXIX12A58A7CDC8,http://previews.7digital.com/clip/3117744,One Day as a Lion,Last Letter
-SOAKXMF12A8AE461DB,http://previews.7digital.com/clip/2018109,Beres Hammond,All I Need
-SOAKXML12A8C13B97C,http://previews.7digital.com/clip/2277750,Ferras,Take My Lips
-SOAKXOL12A8C13B724,http://previews.7digital.com/clip/1642705,Slim Dusty,Recycled Ringer
-SOAKXSM12A6D4FBDE0,http://previews.7digital.com/clip/575994,"Clarence ""Gatemouth"" Brown",Grape Jelly
-SOAKXWV12A6D4F415A,http://previews.7digital.com/clip/250420,Huey Lewis & The News,Best Of Me
-SOAKXZW12A81C1FDBE,NA,Swell,The Price
-SOAKYAL12AB01848C8,http://previews.7digital.com/clip/8680748,Riva Starr,Dance Me (Jesse Rose 'Made in St. Lucia' Instrumental)
-SOAKYBR12AB0185EE8,http://previews.7digital.com/clip/5633448,Matt Nathanson,All We Are
-SOAKYCA12AB0186152,http://previews.7digital.com/clip/3925175,Sister Double Happiness,Exposed To You
-SOAKYDO12A6D4F7E4F,http://previews.7digital.com/clip/432414,Clara Nunes,Contentamento (2003 - Remaster)
-SOAKYFN12A58A7B81F,http://previews.7digital.com/clip/34627399,Four Bitchin' Babes,When I Wake Up From This Night (Sally & Co.)
-SOAKYKB12AB0181F8B,NA,Bad Astronaut,Disarm
-SOAKYNX12A8AE48C31,http://previews.7digital.com/clip/3556455,Shirley Bassey,Big Spender
-SOAKYRM12A6701E75A,http://previews.7digital.com/clip/167234,The Incredible String Band,Banks Of Sweet Italy
-SOAKYVE12A8C1415FA,http://previews.7digital.com/clip/4756314,Silvain Vanot,La Vie Qu'on Aime (Nouvelle Version)
-SOAKYVY12AB01881A8,http://previews.7digital.com/clip/7403417,Ursula Rucker,TRON
-SOAKZAG12A8C136CD8,http://previews.7digital.com/clip/1543095,Fritz Wunderlich,"Leb' wohl, Mignon (Adieu Mignon, courage) (Mignon: Wilhelm Meister, 2.Akt) (1990 Digital Remaster)"
-SOAKZBT12A8C13790C,http://previews.7digital.com/clip/2241669,Susan Tedeschi,Soul Of A Man
-SOAKZHG12A8AE47669,http://previews.7digital.com/clip/2014913,Cindy Morgan,I Love You
-SOAKZKQ12A8C144DAA,NA,Ace of Base,He Decides
-SOAKZNK12A81C235F3,http://previews.7digital.com/clip/1956150,JT Money,On Da Grind (Edited)
-SOAKZPO12AB0188A79,http://previews.7digital.com/clip/7405716,Buddy Miles,Sleigh Ride
-SOAKZQA12A6D4F80C1,http://previews.7digital.com/clip/498847,Confederate Railroad,Summer In Dixie (Remastered Album Version)
-SOAKZRR12AB01843C6,http://previews.7digital.com/clip/8699427,Jah Cure,Hanging Slowly
-SOAKZTI12AB0187B20,http://previews.7digital.com/clip/21956118,Mannheim Steamroller,The Great Gate of Kiev
-SOAKZXH12A6D4F92C1,http://previews.7digital.com/clip/573451,Michael Brecker,Everything Happens When You're Gone
-SOAKZZS12AB018B67B,NA,Finger Eleven,Thousand Mile Wish
-SOALAGX12AB0183297,http://previews.7digital.com/clip/4706060,Biréli Lagrène,Lolita
-SOALAIF12A58A7E224,http://previews.7digital.com/clip/242465,China Crisis,Animalistic
-SOALALM12A8AE4638B,http://previews.7digital.com/clip/3113564,Manolo García,A San Fernando Un Ratito A Pie Y Otro Caminando
-SOALAMD12AB01862CC,http://previews.7digital.com/clip/7801277,Kuba,A Shoe String (Spaff Mix feat. Shaky)
-SOALANC12AB01843A0,http://previews.7digital.com/clip/8801065,The Infamous Stringdusters,In God's Country
-SOALAOO12A6D4F7619,http://previews.7digital.com/clip/901336,fIREHOSE,Hear Me
-SOALAQS12A8C13C3F6,http://previews.7digital.com/clip/1136986,ASD,Outro Featuring Brooke Russell
-SOALARU12A8C131632,http://previews.7digital.com/clip/37700320,Neil Diamond,Brooklyn On A Saturday Night
-SOALASQ12AB01893ED,http://previews.7digital.com/clip/8440478,Color Me Badd,Let's Start With Forever
-SOALAWJ12AB01811A4,http://previews.7digital.com/clip/3780313,Randy Newman,The Unkindest Cut (CD Audio - Seabiscuit Original Motion Picture Soundtrack)
-SOALBBW12A6D4FA9F6,http://previews.7digital.com/clip/10963230,Alice Donut,Loteria (I)
-SOALBEC12AB0183C3F,http://previews.7digital.com/clip/7710759,The Flower Kings,In The Eyes Of The World
-SOALBFA12A8C141640,http://previews.7digital.com/clip/4762283,Bushido,Vendetta (Live)
-SOALBFN12AC4689397,http://previews.7digital.com/clip/8714442,Édith Piaf,La vie en rose
-SOALBHE12A58A7B538,NA,Alice in Videoland,Mf
-SOALBHJ12A6D4FAB2D,NA,Leo Sayer,Let Me Know
-SOALBIR12AB017F0EE,http://previews.7digital.com/clip/4519783,Jimmy Witherspoon,Good Rockin' Tonight
-SOALBLD12AB0181C2A,http://previews.7digital.com/clip/14831478,X-Cops,Third Leg
-SOALBNG12A8C13AE9B,http://previews.7digital.com/clip/32755575,Wanda Jackson,Silver Threads and Golden Needles
-SOALBRB12A6D4FC541,http://previews.7digital.com/clip/29405962,Phosphorescent,Endless Pt. 2
-SOALBSB12A58A814C0,http://previews.7digital.com/clip/7341531,The Smiths,Stop Me If You Think You've Heard This One Before
-SOALBSI12A8AE46A60,http://previews.7digital.com/clip/1395828,Paul Kalkbrenner,Dockyard
-SOALBSQ12A8C1393C8,http://previews.7digital.com/clip/19015067,Alter Ego,Why Not?! (Tim Deluxe Remix)
-SOALBTW12A8C13D81A,http://previews.7digital.com/clip/2422878,Juliet Roberts,Free Love (Original 7'')
-SOALBVK12AB0186453,http://previews.7digital.com/clip/6686104,Holly Cole Trio,Spring Can Really Hang You Up The Most
-SOALBZQ12A8AE4788B,http://previews.7digital.com/clip/1410831,Ariel Rot,Vicios Caros
-SOALCAB12AC392A84E,http://previews.7digital.com/clip/9075032,Ragheb Alama,Haiart Albi Weyak
-SOALCAE12AB017EB8C,NA,Sylvain Chauveau,Suber
-SOALCAV12A8C135A1E,NA,Slick Idiot,Blast
-SOALCBD12A8C139884,http://previews.7digital.com/clip/2316007,ZZ Top,Enjoy And Get It On
-SOALCCO12A8C139D2B,NA,Peter Sarstedt,walk down real streets
-SOALCDP12AC3DF678D,http://previews.7digital.com/clip/16944480,Babylonia,Better Days
-SOALCDY12AB018AE73,http://previews.7digital.com/clip/8664054,The Who,I Can't Explain (Live at San Francisco Civic Auditorium 1971)
-SOALCGL12AB018BA67,http://previews.7digital.com/clip/7894375,Beardfish,A Good Excuse
-SOALCGP12A6D4FA1B4,http://previews.7digital.com/clip/505520,Yello,Fat Cry
-SOALCJP12AB01862A9,http://previews.7digital.com/clip/7871322,Diva Destruction,Snake
-SOALCJX12AB0189EA9,http://previews.7digital.com/clip/8423352,Leon Redbone,Winin' Boy Blues
-SOALCKW12A8C13886D,http://previews.7digital.com/clip/22876892,The Last Poets,Black People What Y'all Gon' Do
-SOALCLG12A6702028C,http://previews.7digital.com/clip/30143315,P.O.D.,Change The World
-SOALCOJ12AB0189FAB,http://previews.7digital.com/clip/8439917,Soul Coughing,Super Bon Bon
-SOALCPW12A8C144B0B,http://previews.7digital.com/clip/6832993,Mahala Raï Banda,Am Plecat De Jos
-SOALCTP12A8C136C36,NA,Worm Is Green,Electron John
-SOALCUT12A8C143363,http://previews.7digital.com/clip/3546202,Kitchens of Distinction,One of Those Sometimes Is Now
-SOALCVG12A8C13EA0B,http://previews.7digital.com/clip/3410918,Reel Big Fish,Why Do All Girls Think They're Fat
-SOALDCR12A8C13FFC8,http://previews.7digital.com/clip/11423764,Hugh Mundell,Jah Music
-SOALDDG12A6BD4F00B,http://previews.7digital.com/clip/1557697,José Mercé,Confí De Fuá (Canción por Bulería;Explicit)
-SOALDFG12A8C13969D,http://previews.7digital.com/clip/2284378,Refused,Poetry Written In Gasoline
-SOALDFI12A8C13A3A8,http://previews.7digital.com/clip/3341481,Steve Erquiaga,The 23rd Psalm
-SOALDGE12A8C1444B5,http://previews.7digital.com/clip/3549395,Lucybell,Besaré Tu Piel
-SOALDGV12AB0183B7E,http://previews.7digital.com/clip/33956996,Spok Frevo Orquestra,Ponta De Lança
-SOALDHG12AB0186895,http://previews.7digital.com/clip/7231759,Andrew Gold,Hypothetically
-SOALDHH12A8C134B63,http://previews.7digital.com/clip/10331918,Gui Boratto,Atol (Hardfloor Remix)
-SOALDHX12A58A7CE7D,http://previews.7digital.com/clip/3565618,Electric Light Orchestra,Calling America
-SOALDHY12A8C13D341,http://previews.7digital.com/clip/1753591,Daniel Landa,Kralicek Azurit
-SOALDIY12AB0181684,http://previews.7digital.com/clip/17141688,Ashbury Heights,Corsair
-SOALDJS12A6D4FACC5,NA,Panzer AG,Filth God
-SOALDKL12AB0184873,http://previews.7digital.com/clip/6110387,Matt Mays & El Torpedo,St. George's Lane
-SOALDLN12AB018007F,http://previews.7digital.com/clip/6955596,Holy Terror,Evil's Rising
-SOALDOE12A8C13CCE1,http://previews.7digital.com/clip/1199070,Bob Wills,Spanish Two-Step
-SOALDOU12A6D4FD7EB,http://previews.7digital.com/clip/7698820,The Greencards,Time
-SOALDPF12A8C13E649,http://previews.7digital.com/clip/13093153,José Malhoa,Até a barraca abana
-SOALDRE12B34F1EDC6,http://previews.7digital.com/clip/195433,Anoushka Shankar,Introduction
-SOALDRX12AB01863E8,http://previews.7digital.com/clip/14917990,Anacrusis,Still Black
-SOALDSF12A81C20392,http://previews.7digital.com/clip/1384613,Annihilator,Reduced To Ash
-SOALDTE12A8C143778,http://previews.7digital.com/clip/6783830,Audible Mainframe,Anybody Else
-SOALDTX12AB0186506,NA,Lusine,The Stop
-SOALDVH12AC4687FB9,NA,Morodo,In da party
-SOALDZK12AB018B455,http://previews.7digital.com/clip/6403999,A Sunny Day in Glasgow,Failure
-SOALEEP12A5891FF3C,NA,The Saint Alvia Cartel,Gimme Til The Morning
-SOALEHA12A8C13ECB3,http://previews.7digital.com/clip/3464353,Martina McBride,Thanks A Lot
-SOALEKV12A8C143DCC,http://previews.7digital.com/clip/6278170,The Homemade Jamz Blues Band,King Snake
-SOALELR12A6D4F9E5F,http://previews.7digital.com/clip/33473713,Danielson,Can We Camp At Your Feet
-SOALELS12AB0183F9C,http://previews.7digital.com/clip/6372661,The Presidents of the United States of America,Japan
-SOALEON12AB0180589,http://previews.7digital.com/clip/7140224,Fat Bastard,Lets Ride (feat. NFL Boyz)
-SOALEQA12A58A77839,http://previews.7digital.com/clip/2351679,The Rolling Stones,"Jumping Jack Flash (Live At The Beacon Theatre, New York / 2006)"
-SOALESI12A8C13ACBE,NA,Liquido,Umbrella Song
-SOALESN12AB018C000,http://previews.7digital.com/clip/7566038,40 Glocc,Hundred Grand
-SOALEXC12AB018E59E,http://previews.7digital.com/clip/9059245,Ratatat,Alps
-SOALEZB12A8C134F67,http://previews.7digital.com/clip/5710271,Monica Zetterlund,Sweet Georgie Fame
-SOALFAL12A58A7C958,http://previews.7digital.com/clip/314925,The Monochrome Set,Tomorrow Will Be Too Long
-SOALFEH12AB018ACF9,http://previews.7digital.com/clip/7924674,Fler,Alles wird Gut feat. G-Hot
-SOALFNH12A8C133F74,http://previews.7digital.com/clip/669386,Scott Wesley Brown,Keep The Son In Your Eyes (Scott Wesley Brown Album Version)
-SOALFNO12A8C1335DA,http://previews.7digital.com/clip/2093772,Dead Meadow,Seven Seers
-SOALFNW12A6D4FB442,http://previews.7digital.com/clip/496712,Face to Face,The New Way
-SOALFQC12AB017E193,http://previews.7digital.com/clip/6029977,The Apples in Stereo,The Apples Theme Song
-SOALFQJ12A58A7C4E8,http://previews.7digital.com/clip/1580142,Eliades Ochoa,Estoy Como Nunca
-SOALFUC12A8C13BF03,http://previews.7digital.com/clip/1090047,Alf Robertson,Lasse och Marie (Jody And The Kid)
-SOALFVE12A8C133BC4,NA,Gal Costa,Jurei
-SOALFVM12A8C13C938,NA,Pastor Troy,Acid Rain
-SOALFVP12A6D4F9813,http://previews.7digital.com/clip/603971,Freddie Jackson,Love Is Just a Touch Away (2007 - Remaster)
-SOALFZR12AB018B1E3,http://previews.7digital.com/clip/6502039,Mr Jones Machine,Stjärnornas Musik
-SOALFZV12AF72A8750,http://previews.7digital.com/clip/32334591,Immortal Technique,Beef & Broccoli
-SOALGAV12AB017DDE3,http://previews.7digital.com/clip/10562907,Maxwell,Changed
-SOALGDH12AB018763D,http://previews.7digital.com/clip/6101568,Charon,Sorrowbringer
-SOALGDN12A8C13D777,http://previews.7digital.com/clip/3446494,Gruppo Sportivo,One Way Love
-SOALGFW12A67AE03F9,http://previews.7digital.com/clip/713836,David Bowie,Young Americans
-SOALGHQ12AC468947B,NA,Al Hirt,The First Thing You Know
-SOALGJW12A8C1371A7,http://previews.7digital.com/clip/3268166,Mass Hysteria,Aimable à souhait
-SOALGKE12AB0181AA1,http://previews.7digital.com/clip/7060099,Sydney Symphony Orchestra/John Lanchbery,La Bayadere: Entrance Of The Shades
-SOALGWG12AB017DE88,http://previews.7digital.com/clip/3835665,Milton Banana Trio,Só Tinha De Ser Com Você
-SOALGXJ12AB017ED8F,http://previews.7digital.com/clip/7710700,...And You Will Know Us by the Trail of Dead,Halcyon Days
-SOALHAC12A8C13837E,http://previews.7digital.com/clip/6600454,Lisa Lashes,Unbelievable
-SOALHAU12A6D4FA92B,http://previews.7digital.com/clip/564671,Marco Parente,Karma Parente
-SOALHDJ12AB0182055,http://previews.7digital.com/clip/3474811,YoungBloodZ,It's Good Featuring T-Boz
-SOALHDT12AC4686D76,http://previews.7digital.com/clip/6625031,Blodwyn Pig,Meanie Mornay (2006 Digital Remaster)
-SOALHDV12A6D4F98DD,http://previews.7digital.com/clip/354671,Red Hot Chili Peppers,Hey
-SOALHEI12AB01831BA,http://previews.7digital.com/clip/4904167,Dim Mak,Knives Of Ice
-SOALHFM12A8C141486,http://previews.7digital.com/clip/3000147,The Ronettes,I Want a Boy
-SOALHHM12A8C13984B,http://previews.7digital.com/clip/1623010,Akhenaton,L'Américano
-SOALHIB12A6D4FA000,http://previews.7digital.com/clip/30155557,Carlos Baute,Te regalo
-SOALHLA12A8C13A0BF,http://previews.7digital.com/clip/233563,Grant Green,Just A Closer Walk With Thee
-SOALHMA12A6701E7B5,http://previews.7digital.com/clip/634438,LCD Soundsystem,Yeah (Crass Version)
-SOALHPM12AB0182241,http://previews.7digital.com/clip/4494929,Camera Obscura,James
-SOALHQR12A6D4F76C6,http://previews.7digital.com/clip/352372,Tuomari Nurmio,Kappale kauneinta luontoa
-SOALHRU12A6D4F77B3,http://previews.7digital.com/clip/232280,Lil Romeo,My First (Remix) (Feat. 6 Piece)
-SOALHZZ12AC468AD96,http://previews.7digital.com/clip/6755112,Hardcore Superstar,Spreadin' The News
-SOALIAH12A6D4F98EA,http://previews.7digital.com/clip/6837304,Shawn Colvin,Words
-SOALICQ12AB018439C,http://previews.7digital.com/clip/3818645,Robin Trower,Ev'ry Body's Watching You Now
-SOALIEE12A8C13F74C,http://previews.7digital.com/clip/2405486,Story of the Year,Welcome To Our New War
-SOALIFC12AC90979FD,http://previews.7digital.com/clip/8185137,Les Claypool,Primed by 29
-SOALIJQ12A8C138A91,http://previews.7digital.com/clip/3343201,George Winston,Rainsong
-SOALILP12AB0181390,http://previews.7digital.com/clip/7566533,Candiria,Down
-SOALILU12A8C132B07,http://previews.7digital.com/clip/3490177,Peter Tosh,Jah Guide
-SOALIOI12A8C13C36A,http://previews.7digital.com/clip/1152569,Extrechinato y tú,Eterno Viajero
-SOALIRK12A8C14236D,NA,Rosenstolz,Viel zu kalt (Toms Lieblingsmix)
-SOALISA12A8C144D36,http://previews.7digital.com/clip/5286642,Tarmac,Volar
-SOALITF12A6310DFCD,http://previews.7digital.com/clip/9500,Radiohead,Just
-SOALIUK12AC468A6A5,http://previews.7digital.com/clip/7633089,The Gants,Summertime Blues
-SOALIWB12AB0184CB3,http://previews.7digital.com/clip/4389051,New Grass Revival,Reach
-SOALIWW12A58A7B2C6,http://previews.7digital.com/clip/34630215,Wayne Toups,Night Train To New Orleans
-SOALIXX12AF72ACA61,http://previews.7digital.com/clip/328320,Dilated Peoples,20/20
-SOALIYZ12A6D4FB18C,http://previews.7digital.com/clip/541376,Ron White,Eskimos & Grizzlies
-SOALIYZ12A6D4FCE08,NA,John Michael Talbot,Psalm 131 (Troubadour For The Lord 20 Yrs Album Version)
-SOALJAU12A8C13AF09,http://previews.7digital.com/clip/1136685,Karl Denson,Who Are You?
-SOALJAW12AB017FC90,http://previews.7digital.com/clip/6110051,Cory Branan,Tall Green Grass
-SOALJBF12AB017F997,http://previews.7digital.com/clip/5080434,Elbow,I've Got Your Number
-SOALJBV12AB017FC3A,http://previews.7digital.com/clip/3662147,Taylor Swift,I'm Only Me When I'm With You
-SOALJBY12A8C13FDCF,NA,Yo La Tengo,From A Motel 6 # 2
-SOALJDG12AB01834A4,http://previews.7digital.com/clip/4285750,Doc Watson,Liberty
-SOALJDK12A8C14186C,NA,Our Broken Garden,Anchoring
-SOALJFL12AB0184FED,http://previews.7digital.com/clip/3972829,Antony and the Johnsons,Her Eyes Are Underneath The Ground
-SOALJGN12AF72A1A99,http://previews.7digital.com/clip/7714081,Poisonblack,The State
-SOALJHE12A6D4F981F,http://previews.7digital.com/clip/510042,Rickie Lee Jones,Jolie Jolie
-SOALJHX12AB0181B64,http://previews.7digital.com/clip/6146754,Robyn Hitchcock,The Leopard
-SOALJHY12A8AE489F3,http://previews.7digital.com/clip/3112942,Bow Wow Wow,"Love, Peace and Harmony"
-SOALJJC12A8C13A791,http://previews.7digital.com/clip/3416935,Armored Saint,Underdogs
-SOALJJP12A58A8071F,http://previews.7digital.com/clip/933975,Lee Michaels,Who Could Want More
-SOALJKQ12AB0180334,http://previews.7digital.com/clip/3764399,Laura Pausini,Más que ayer
-SOALJNI12A8C13931E,http://previews.7digital.com/clip/1650453,Slim Dusty,The Cunnin' Roo Shooter
-SOALJOM12A8AE4822F,http://previews.7digital.com/clip/2000825,Dave Weckl Band,Transition Jam
-SOALJOX12AB018554A,http://previews.7digital.com/clip/7872469,sToa,Alone
-SOALJPR12A58A7BF8E,http://previews.7digital.com/clip/15898183,W.A.S.P.,Can't Die Tonight
-SOALJQZ12A8C135160,http://previews.7digital.com/clip/1536802,Mick Jagger,Blue
-SOALJRJ12AC3DF9CDB,http://previews.7digital.com/clip/23303076,Mariem Hassan,La Tumchu Anni
-SOALJTA12A8C13C288,http://previews.7digital.com/clip/1183782,Spice Girls,Ain't No Stopping Us Now (Feat. Luther Vandross)
-SOALJTF12A6310E8DA,http://previews.7digital.com/clip/6252,Radiohead,Sail To The Moon
-SOALJVR12A670203DF,http://previews.7digital.com/clip/3635393,The 101ers,Steamgauge 99
-SOALJYY12A6D4F7336,http://previews.7digital.com/clip/1723016,Ruoska,Mies Yli Laidan
-SOALKAK12A6D4F777A,http://previews.7digital.com/clip/35606896,The Impossible Shapes,Pixie Pride
-SOALKBI12A6D4F7E07,http://previews.7digital.com/clip/1652051,Julien Clerc,Fais moi une place (live)
-SOALKBN12A58A7D8A3,http://previews.7digital.com/clip/5912414,Inkubus Sukkubus,Samhain
-SOALKEM12AB0181B54,http://previews.7digital.com/clip/6029195,Robyn Hitchcock,Lady Waters & The Hooded One
-SOALKFM12A6D4FE186,http://previews.7digital.com/clip/3043549,Dream Theater,Erotomania [Instrumental] (2009 Remastered Album Version)
-SOALKFW12A8C13D892,http://previews.7digital.com/clip/3428082,Mecano,La Máquina de Vapor
-SOALKFZ12A8C140AAA,http://previews.7digital.com/clip/3462480,Joan Manuel Serrat,Canco Per a la Meva Mestra
-SOALKGI12A8C138650,NA,Matthew Good,Metal Airplanes
-SOALKHT12A8C13B059,http://previews.7digital.com/clip/1139175,Gyptian,My Fadah Seh
-SOALKIN12A6D4FC738,http://previews.7digital.com/clip/7795678,Brazilian Tropical Orchestra,Help!
-SOALKLN12A8C13ADB4,http://previews.7digital.com/clip/4045257,Better Than a Thousand,Self Worth
-SOALKLZ12AB01890B6,http://previews.7digital.com/clip/17020690,Extrawelt,Added Planet
-SOALKMX12A8C13A508,http://previews.7digital.com/clip/3343122,Máire Brennan,Heroes
-SOALKNB12AB018317B,http://previews.7digital.com/clip/5085673,The Mars Volta,Halo of Nembutals
-SOALKQC12AB0181713,http://previews.7digital.com/clip/5681757,Diomedes Diaz;Ivan Zuleta,Espejismo
-SOALKSX12AB018388F,http://previews.7digital.com/clip/7815850,California Sunshine,Oblivion
-SOALKSX12AB018B9C0,http://previews.7digital.com/clip/8412286,Lou Gramm,She's Got To Know
-SOALLAK12AAF3B4B7F,http://previews.7digital.com/clip/3633418,Amparanoia,Ella Baila Bembe
-SOALLAL12A8C137C65,http://previews.7digital.com/clip/1580691,Itzhak Perlman/Jim Hall/Shelly Manne/Red Mitchell/André Previn,Chocolate apricot
-SOALLAP12AB01810DD,http://previews.7digital.com/clip/3873393,Merle Travis,Pigmeat Stomp (Instrumental)
-SOALLBO12AB0185622,http://previews.7digital.com/clip/7166422,Beng Beng Cocktail,Intro
-SOALLBQ12AB0187081,http://previews.7digital.com/clip/16047634,Skitz,Slaves
-SOALLEI12AB0185BD7,http://previews.7digital.com/clip/6172695,Me First and the Gimme Gimmes,East Bound And Down
-SOALLEU12A8C138885,http://previews.7digital.com/clip/2754583,Tyrone Davis,Sure Wasn't Me
-SOALLFG12A58A7B5C8,http://previews.7digital.com/clip/17731732,Nostalgia 77,Four Whispers for Archies Chair
-SOALLGJ12A8C13C579,http://previews.7digital.com/clip/1100583,Nancy Wilson,This Mother's Daughter (Digitally Remastered 00)
-SOALLGN12A8AE46427,NA,Kathryn Williams,Hollow
-SOALLNH12A8C1429F4,http://previews.7digital.com/clip/6788789,UK Subs,Tomorrow's Girls
-SOALLOD12A58A788CE,http://previews.7digital.com/clip/17854977,Patty Griffin,Christina
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chapter1/introduction.tex
--- a/Report/chapter1/introduction.tex Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/chapter1/introduction.tex Tue Aug 11 10:50:36 2015 +0100
@@ -1,14 +1,15 @@
\chapter{Introduction}
+Music has accompanied social activities on our daily lives and has influenced the shape of the technology landscape that we have today, such as portable media players, mobile device management applications and music stream services.
-Recommender systems can be described as facilities that guide users to interesting objects in a huge space of information. In order to achieve high performance, there is the need of hybridization of two or more recommendation techniques.
+Recommender systems can be described as facilities that guide users to interesting objects in a huge space of information. In order to enhance performance, there is the motivations of hybridization of two or more recommendation techniques.
-This project is going to examine a different approach to develop a hybrid music recommender system in order to suggest new items that would be appealing and enjoyable to the users. This system will combine two recommendation techniques. The first technique is collaborative filtering to predict music preferences on the basis of users\' information from an online social network (OSN) such as Last.fm\footnote{http://last.fm/}, and the second technique is content-based filtering in which acoustical features from audio tracks are correlated to compute their similarities.
+This project is going to examine a different approach to develop a hybrid music recommender system in order to suggest new items that would be appealing and enjoyable to the users. This system will combine two recommendation techniques. The first technique is collaborative filtering to predict music preferences on the basis of users\' information from an online social network (OSN) such as Last.fm, and the second technique is content-based filtering in which acoustical features from audio tracks are correlated to compute their similarities.
-Users' information will be obtained from the complementary Taste Profile subset, which is a part of the Million Song Dataset\footnote{http://labrosa.ee.columbia.edu/millionsong/}. The music library will be consolidated by crawling songs' information via 7digital API\footnote{http://developer.7digital.com}.
+Users' information will be obtained from the complementary Taste Profile subset, which is a part of the Million Song Dataset. The music library will be consolidated by crawling songs' information via 7digital API.
A convolutional neural network (CNN), which is a deep learning model, will be employed for describing the audio files of the music library. Estimation of distribution algorithms (EDA), which are optimization methods in statistics and machine learning, will be investigated to model user profiles that will be comparable with the features of the audio files to predict ratings and produce new item recommendations.
-The evaluation of the hybrid recommender system will be assessed by comparing the results with a purely content-based system.
+The evaluation of the hybrid recommender system will be assessed by prediction accuracy and performance comparison with a typical content-based system.
\section{Outline of the thesis}
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chapter2/background.tex
--- a/Report/chapter2/background.tex Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/chapter2/background.tex Tue Aug 11 10:50:36 2015 +0100
@@ -1,24 +1,24 @@
-\chapter{Background}
+\chapter{Background research}
+Recommender systems set up opportunities and challenges for industry to understand consumption behaviour of users. In particular, for music industry, the develop of recommender systems could improve sales for artists and labels, and the discovery of new songs for listeners. However, regarding that music tastes vary from one person to another person, an advantageous music recommender system should be able to infer listeners needs through their historical listening preference information, similarities with another listeners, and audio signal features from their music collections.
-\section{Recommender Systems}
-
-Recommender systems are software or technical facilities to provide items suggestions or predict customer preferences. These systems play an important role in commercial applications to increase items sales and user satisfaction. Depending on the application, recommender systems can be categorised in the following groups: collaborative filtering, content-based methods and hybrid methods.
-
-\subsection{Collaborative filtering (CF)}
-In collaborative filtering (CF), recommendations are based on correlation between users' ratings or they can be predicted from historical user data. The strength of CF is that the recommendation process is independent from the item features. On the other hand, CF would not be suitable when the user-item matrix is sparse. \citep{Burke2002331}
-
-\subsection{Content-based methods}
-Content-based methods build user profiles by analysing the users' rated items. Each profile is then processed to be correlated with another item, which has not been rated, to compute the interest of the user on this object. \citep{Lops2011}
-
-\subsection{Hybrid methods}
-Hybrid recommendation is based on the combination of techniques mentioned above, by using the advantages of one system to compensate the disadvantages of the other system.
-
-In this project, CF, that provides song ratings, is integrated with a content-based method, that compare spectral features of song to achieve hybridisation.
-%is based on a three-way aspect model \citep{Yoshii2008435}. Real item ratings are obtained through Last.fm API and spectral information are represented by convolutional deep belief networks (CDBN) features computed from items' spectrogram \citep{Lee20091096}.
+In the following sections, the importance of online social networks for retrieving user-item information among with previous work on music recommender systems are presented. Subsequently, a novel approach of an hybrid recommender system based on Estimation of Distribution Algorithm (EDA) is introduced and examined.
\section{Online Social Networks}
-Social network sites (SNSs) are “web-based services that allow individuals to (1) construct a public or semi-public profile within a bounded system, (2) articulate a list of other users with whom they share a connection, and (3) view and traverse their list of connections and those made by others within the system”. \citep{JCC4:JCC4393}
+\citet{JCC4:JCC4393} describe social network sites (SNSs) as: \begin{quote}``Web-based services that allow individuals to (1) construct a public or semi-public profile within a bounded system, (2) articulate a list of other users with whom they share a connection, and (3) view and traverse their list of connections and those made by others within the system.''\end{quote}
+During the last decade, online social networks have become the outstanding source of multimedia information.
+
+\subsection{Last.fm}
+Last.fm is a social network system that accumulate a list of played audio tracks from registered users through \emph{scrobbling} to provide to any user a detail about listening preference and taste similarites between connected friends in the network. Last.fm also uses scrobbling to feed its music recommendation service to help to users to discover new artists.
+
+Users' information such as recently played tracks, loved tracks, or top songs over a time period e.g. weeks, months, can be retrieved by using Last.fm API\footnote{http://www.last.fm/api} methods.
+
+\section{Music services platforms}
+
+\subsection{Echonest}
+\subsection{7Digital}
+
+Both Echo Nest and 7digital require to sign up to their API to get unique keys for OAuth authentication in order to retrieve desired information. As well, free account has limited number of calls, in the case of Echo Nest is limited to 20 request per minute and in the case of 7digital is limited to 4000 request per day.
%\subsection{APIs}
%The publicly available music related information can be collected from user profiles on social networks using Application Program Interface (API).
@@ -26,8 +26,42 @@
%Combination of multiple sources of information to obtain more relevant parameters is known as data fusion.
%In this study, a cooperative data fusion technique is considered to augment information provided from social network source to content-based system features. \citep{Castanedo2013}
-\section{Deep Learning}
+\section{Recommender Systems}
-\subsection{Convolutional Neural Networks (CNN)}
+Recommender systems are software or technical facilities to provide items suggestions or predict customer preferences. These systems play an important role in commercial applications to increase items sales and user satisfaction. In general, recommender systems can be categorised in the following groups: collaborative filtering and content-based methods.
-\section{Estimation of Distribution Algorithms (EDAs)}
\ No newline at end of file
+\subsection{Collaborative filtering}
+In collaborative filtering (CF), recommendations are based on correlation between users' ratings or they can be predicted from historical user data. The strength of CF is that the recommendation process is independent from the item features. On the other hand, CF would not be suitable if the user-item matrix is sparse. \citep{Burke2002331}
+
+\subsection{Content-based methods}
+Content-based methods build user profiles by analysing the users' rated items. Each profile is then processed to be correlated with another item, which has not been rated, to compute the interest of the user on this object. \citep{Lops2011}
+
+\section{Hybrid recommender methods}
+Hybrid recommendation is based on the combination of techniques mentioned above, by using the advantages of one system to compensate the disadvantages of the other system.
+
+In this project, CF, that provides song ratings, is integrated with a content-based method, that compare spectral features of song to achieve hybridisation.
+%is based on a three-way aspect model \citep{Yoshii2008435}. Real item ratings are obtained through Last.fm API and spectral information are represented by convolutional deep belief networks (CDBN) features computed from items' spectrogram \citep{Lee20091096}.
+
+
+\section{Music Information Retrieval}
+Music Information Retrieval (MIR) is an extend of audio signal processing for understanding the usefulness and applications of music data by using time-frequency representations or low-level features. Applications of MIR include artist identification, genre classification and music recommendation.
+\subsection{Musical genre classification}
+Music classification is one of the principal components for clustering audio tracks based on similarities between features of pieces of music. Automatic musical genre classification approach proposed by \citet{Tzanetakis2002293}, which uses GTZAN genre dataset\footnote{http://marsyas.info/downloads/datasets.html}, has been widely used in the past decade. Nonetheless, the GTZAN dataset has inaccuracies \citep{Sturm20127}, it still provides an useful baseline to compare musical genre classification systems.
+
+\subsection{Deep Learning}
+One of the aims of learning algorithms is to identify high-level features that help us make sense of an observed data., e.g. genre, mood or release time in a music library. However, it could be difficult to compute these abstract features directly from audio waveforms. Deep learning can solve the difficulty of extracting high-level representations by expressing them in terms of simpler features, e.g. spectrograms. Deep learning allows the computer to build complex concepts out of simpler concepts. \citep{Bengio-et-al-2015-Book}
+
+\citet{Sigtia20146959} examined and compared three implementations of deep neural networks to learn features for music genre classification, using Rectifier Linear Units (ReLUs), dropout regularisation and Hessian Free optimization.
+
+\subsection{Convolutional Neural Networks}
+Convolutional Neural Networks (CNNs) are type of neural networks that uses convolution operation instead of matrix multiplication for processing data that has grid-like topology \citep{Bengio-et-al-2015-Book} such as images collection.
+
+\citet{NIPS2013_5004} used a convolutional network approach to predict latent factors from music audio in a content-based recommendation system.
+
+\section{Estimation of Distribution Algorithms}
+Estimation of distribution algorithms (EDAs) \citep{pelikan2015estimation} are optimisation techniques by constructing a probabilistic model from a sample of solutions, generating a new population and leading to an optimal solution \citep{Santana:Bielza:Larrañaga:Lozano:Echegoyen:Mendiburu:Armañanzas:Shakya:2009:JSSOBK:v35i07}.
+
+\citet{Liang2014781} exploited an EDA to model user profiles by using weighted featured vectors of keywords from a set of items that the user had rated above a threshold.
+\\
+\\
+In this chapter, previous work on recommender systems has been reviewed and novelty techniques for representing acoustical features and for modelling user profiles has been presented. The next step is to implement the algorithms to collect the dataset by crawling online social information, to extract the acoustical features of a collection of songs for representing them as vectors, to model the user profiles by an EDA, and therefore, to return predicted recommendations.
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chapter3/ch3.tex
--- a/Report/chapter3/ch3.tex Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/chapter3/ch3.tex Tue Aug 11 10:50:36 2015 +0100
@@ -1,15 +1,41 @@
\chapter{Methodology}
+The methodology used to develop the hybrid music recommender consists of three main stages. First, the collection of real users' data corresponding to the number of playings of specific songs and the retrieval of audio samples of the identified songs in the users' data. Secondly, the implementation of the deep learning algorithm to represent the songs as vectors and the EDA to model the user profiles
\section{Data collection}
-\subsection{Taste profile subset filtering}
+The Million Song Dataset \citep{Bertin-Mahieux2011} is a collection of audio features and metadata for a million contemporary popular music tracks which purpose in MIR is to provide a ground truth for evaluation research. This collection is also complemented by the Taste Profie subset \footnote{http://labrosa.ee.columbia.edu/millionsong/tasteprofile} which provides 48,373,586 triplets that consists of Last.fm user ID, Echo Nest song ID and play count of the song.
+
+\subsection{Taste Profile subset cleaning}
+Due to potential mismatches between song IDs and track IDs on the Echo Nest database, it is required to filter out the wrong matches in the Taste Profile subset. A Python script is implemented to discard the triplets that contain the song ID values from the mismatches list available also on the Million Song Dataset webpage. The resulting triplets are stored in a new CSV file.
+%count resulting number of triplets
+
+
%At this stage, similarities between users is calculated to form a neighbourhood and predict user rating based on combination of the ratings of selected users in the neighbourhood.
-\subsection{Audio samples collection}
+
+\subsection{Audio clips retrieval}
+The list of songs IDs from the triplets obtained in the last step are used to retrieve the track IDs through a Python script that includes the Pyechonest \footnote{http://echonest.github.io/pyechonest/} package which allow us to acquire track ID with \emph{get\_tracks} method through Echo Nest API\footnote{http://developer.echonest.com} requests. The reason behind obtaining track IDs is because for each ID we can retrieve a 30-60 seconds preview audio clips through 7digital API\footnote{http://developer.7digital.com}.
+
+Additionally, the Python script accumulates the song ID, the URL, artist and song metadata of each track available in a text file. If the track for a song ID is not available, the script skips to the next song ID to retrieve information of it. The generated text file can be used to reduce more the triplets dataset from the last section.
+
+%include number of tracks available
+
%Classifier creates a model for each user based on the acoustic features of the tracks that user has liked.
-\subsection{Log-mel spectrograms}
+\subsection{Intermediate time-frequency representation for audio signals}
+For representing audio waveforms of the song collection obtained through 7digital API, a similar procedure suggested by \citet{NIPS2013_5004} is followed:
+\begin{itemize}
+ \item Read 3 seconds of each song at a sampling rate of 22050 Hz and mono channel.
+ \item Compute log-mel spectrograms with 128 components from windows of 1024 frames and a hop size of 512 samples.
+\end{itemize}
+
+The Python script for feature extraction implemented by \citet{Sigtia20146959} is modified to return the log-mel spectrograms by using the LibROSA\footnote{https://bmcfee.github.io/librosa/index.html} package.
+
+``Representations of music directly from the temporal or spectral domain can be very sensitive to small time and frequency deformations''. \citep{zhang2014deep}
\section{Algorithms}
-\subsection{CNN implementation}
+\subsection{CNN architecture}
+The input of the CNN consist of the 128-component spectrograms obtained in feature extraction. The batch size considered is 20 frames.
+Each convolutional layer consists of 10 kernels and ReLUs activation units. In the first convolutional layer the pooling size is 4 and in the second layer the pooling size is 2. The filters analyses the frames along the frequency axis to consider every Mel components with a hop size of 4 frames in the time axis. Additionally, there is a hidden multi perceptron layer with 513 units.
%Deep belief network is a probabilistic model that has one observed layer and several hidden layers.
\subsubsection{Genre classification}
+The classification of genre for each frame is returned by negative log likelihood estimation of a logistic stochastic gradient descent (SGD) layer.
+\subsection{Continuous Bayesian EDA}
+\subsection{EDA-based hybrid recommender}
-\subsection{Continuous Bayesian EDA}
-\subsection{EDA-based hybrid recommender}
\ No newline at end of file
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chapter4/evaluation.tex
--- a/Report/chapter4/evaluation.tex Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/chapter4/evaluation.tex Tue Aug 11 10:50:36 2015 +0100
@@ -1,4 +1,11 @@
\chapter{Experiments}
+
+In order to evaluate the performance of a recommender system, there are several scenarios to be considered depending on the structure of the dataset and the prediction accuracy. It is therefore necessary to determine a suitable experiment for evaluation of the proposed hybrid music recommendation system that employs an user-item matrix and vector representation for songs as inputs to predict ratings of items that an user has not previously listened to. In addition, the performance of the hybrid approach is compared with a pure content-based recommender algorithm.
+
+%\section{Experiment aims}
+%deviation between the actual and predicted ratings is measured
+%the prediction ratings are compared with a model-based collaborative filtering.
+
\section{Evaluation for recommender systems}
\subsection{Types of experiments}
@@ -8,18 +15,22 @@
\item \textbf{User studies:} where test subjects interact with the recommendation system and its behaviour is recorded giving a large sets of quantitative measurements. One disadvantage of this type of experiment is to recruit subjects that represent the population of the users of the real recommendation system.
\item \textbf{Online evaluation:} where the designer of the recommender application expect to influence the users' behaviour. Usually, this type of evaluation are run after extensive offline studies.
\end{itemize}
-Also, evaluation for recommender systems can be classified \citep{1242} in:
+
+Besides, evaluation of recommender systems can be classified \citep{1242} in:
\begin{itemize}
-\item \textbf{System-centric evaluation:} The accuracy is based only on users' dataset.
-\item \textbf{Network-centric evaluation:} Other components of the recommendation system such as diversity of recommendations are measured as a complement of the metrics of system-centric evaluation.
-\item \textbf{User-centric evaluation:} The perceived quality and usefulness of recommendations for the users are measured via provided feedback.
+\item \textbf{System-centric} process has been extensively exploited in CF systems. The accuracy of recommendations is based exclusively on users' dataset.
+\item \textbf{Network-centric} process examines other components of the recommendation system, such as diversity of recommendations, and they are measured as a complement of the metrics of system-centric evaluation.
+\item \textbf{User-centric:} The perceived quality and usefulness of recommendations for the users are measured via provided feedback.
\end{itemize}
-\section{Evaluation settings}
-The hybrid recommender system of this project is evaluated with an offline experiment and system-centric metrics.
-\subsection{Dataset}
-For the purpose of evaluation of the hybrid recommender system, a part from the Taste Profile subset is used because the data format includes user-item ratings and it is publicly available. A 10-fold cross validation is performed which splits the data set in 90\% for training and 10\% for testing.
+
+\section{Evaluation method}
+The hybrid music recommender system proposed in this project is evaluated through an offline experiment and the results are presented with system-centric metrics.
+
+\subsection{Dataset description}
+For the purpose of evaluation of the hybrid recommender system, a sample from the Taste Profile subset is used because the data format includes user-item ratings and it is publicly available. A 10-fold cross validation is performed which splits the data set in 90\% for training and 10\% for testing.
\subsection{Evaluation measures}
-Because the data set does not include explicit ratings, hence, the number of plays of tracks are used as users' behaviours, decision-based metrics are considered.
-\subsection{Experimentation aims}
-In order to evaluate the performance of the hybrid recommender, the prediction ratings are compared with a model-based collaborative filtering.
\ No newline at end of file
+Because the dataset does not include explicit ratings, hence, the number of plays of tracks are considered as users' behaviours,
+
+decision-based metrics are considered.
+
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chiliguano_msc_finalproject.blg
--- a/Report/chiliguano_msc_finalproject.blg Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/chiliguano_msc_finalproject.blg Tue Aug 11 10:50:36 2015 +0100
@@ -1,7 +1,6 @@
This is BibTeX, Version 0.99d (TeX Live 2015)
Capacity: max_strings=35307, hash_size=35307, hash_prime=30011
The top-level auxiliary file: chiliguano_msc_finalproject.aux
-A level-1 auxiliary file: abstract/abstract.aux
A level-1 auxiliary file: chapter1/introduction.aux
A level-1 auxiliary file: chapter2/background.aux
A level-1 auxiliary file: chapter3/ch3.aux
@@ -11,45 +10,47 @@
The style file: agsm.bst
Database file #1: references.bib
Warning--empty institution in export:115396
-You've used 5 entries,
+Warning--empty booktitle in Sigtia20146959
+Warning--empty booktitle in Sturm20127
+You've used 15 entries,
2909 wiz_defined-function locations,
- 689 strings with 6072 characters,
-and the built_in function-call counts, 15635 in all, are:
-= -- 2478
-> -- 225
+ 765 strings with 9134 characters,
+and the built_in function-call counts, 73392 in all, are:
+= -- 11955
+> -- 1038
< -- 1
-+ -- 1137
-- -- 67
-* -- 1316
-:= -- 3247
-add.period$ -- 6
-call.type$ -- 5
-change.case$ -- 69
-chr.to.int$ -- 5
-cite$ -- 6
-duplicate$ -- 79
-empty$ -- 162
-format.name$ -- 86
-if$ -- 2796
++ -- 5753
+- -- 317
+* -- 6401
+:= -- 14530
+add.period$ -- 21
+call.type$ -- 15
+change.case$ -- 209
+chr.to.int$ -- 15
+cite$ -- 18
+duplicate$ -- 280
+empty$ -- 553
+format.name$ -- 371
+if$ -- 13265
int.to.chr$ -- 5
int.to.str$ -- 0
-missing$ -- 3
-newline$ -- 24
-num.names$ -- 53
-pop$ -- 20
+missing$ -- 12
+newline$ -- 66
+num.names$ -- 162
+pop$ -- 70
preamble$ -- 1
-purify$ -- 75
+purify$ -- 225
quote$ -- 0
-skip$ -- 64
+skip$ -- 241
stack$ -- 0
-substring$ -- 3413
-swap$ -- 14
-text.length$ -- 71
+substring$ -- 16955
+swap$ -- 69
+text.length$ -- 211
text.prefix$ -- 0
top$ -- 0
-type$ -- 20
-warning$ -- 1
-while$ -- 111
+type$ -- 60
+warning$ -- 3
+while$ -- 339
width$ -- 0
-write$ -- 75
-(There was 1 warning)
+write$ -- 231
+(There were 3 warnings)
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chiliguano_msc_finalproject.pdf
Binary file Report/chiliguano_msc_finalproject.pdf has changed
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chiliguano_msc_finalproject.synctex.gz
Binary file Report/chiliguano_msc_finalproject.synctex.gz has changed
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chiliguano_msc_finalproject.tex
--- a/Report/chiliguano_msc_finalproject.tex Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/chiliguano_msc_finalproject.tex Tue Aug 11 10:50:36 2015 +0100
@@ -2,7 +2,7 @@
% Final MSc project report using qmwphd.cls
% \usepackage{moreverb} % This defines \verbatiminput.
-\documentclass[a4paper,12pt,draft]{report}
+\documentclass[a4paper,12pt,draft,times]{report}
%PhD Thesis Template for the School of Electronic Engineering and Computer Science, Queen Mary University of London. Stripped from Dan Stowell's PhD.
%BEFORE SUBMISSION DO THESE:
@@ -48,13 +48,14 @@
\title{Hybrid music recommender using content-based and social information}
\author{Paulo Esteban Chiliguano Torres \\
\\
- Project report 2015\\
+ Project Report 2015\\
+ MSc Sound and Music Computing\\
\\
School of Electronic Engineering and Computer Science\\
Queen Mary University of London
}
-\date{2015}
+\date{August 2015}
% \frontmatter
% \author{Paulo Esteban Chiliguano Torres}
@@ -66,15 +67,13 @@
% \begin{summary}
% \end{summary}
-\include{abstract/abstract}
+%\include{abstract/abstract}
\setcounter{page}{3}
\tableofcontents
-
-\listoffigures
-
-\listoftables
+%\listoffigures
+%\listoftables
% could also have a \listoftables, but this example doesn't include any
diff -r 1dbd24575d44 -r e68dbee1f6db Report/chiliguano_msc_finalproject.toc
--- a/Report/chiliguano_msc_finalproject.toc Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/chiliguano_msc_finalproject.toc Tue Aug 11 10:50:36 2015 +0100
@@ -1,31 +1,36 @@
-\contentsline {chapter}{\numberline {1}Introduction}{7}{chapter.1}
-\contentsline {section}{\numberline {1.1}Outline of the thesis}{8}{section.1.1}
-\contentsline {chapter}{\numberline {2}Background}{9}{chapter.2}
-\contentsline {section}{\numberline {2.1}Recommender Systems}{9}{section.2.1}
-\contentsline {subsection}{\numberline {2.1.1}Collaborative filtering (CF)}{9}{subsection.2.1.1}
-\contentsline {subsection}{\numberline {2.1.2}Content-based methods}{10}{subsection.2.1.2}
-\contentsline {subsection}{\numberline {2.1.3}Hybrid methods}{10}{subsection.2.1.3}
-\contentsline {section}{\numberline {2.2}Online Social Networks}{10}{section.2.2}
-\contentsline {section}{\numberline {2.3}Deep Learning}{11}{section.2.3}
-\contentsline {subsection}{\numberline {2.3.1}Convolutional Neural Networks (CNN)}{11}{subsection.2.3.1}
-\contentsline {section}{\numberline {2.4}Estimation of Distribution Algorithms (EDAs)}{11}{section.2.4}
-\contentsline {chapter}{\numberline {3}Methodology}{12}{chapter.3}
-\contentsline {section}{\numberline {3.1}Data collection}{12}{section.3.1}
-\contentsline {subsection}{\numberline {3.1.1}Taste profile subset filtering}{12}{subsection.3.1.1}
-\contentsline {subsection}{\numberline {3.1.2}Audio samples collection}{12}{subsection.3.1.2}
-\contentsline {subsection}{\numberline {3.1.3}Log-mel spectrograms}{12}{subsection.3.1.3}
-\contentsline {section}{\numberline {3.2}Algorithms}{12}{section.3.2}
-\contentsline {subsection}{\numberline {3.2.1}CNN implementation}{12}{subsection.3.2.1}
-\contentsline {subsubsection}{Genre classification}{12}{section*.4}
-\contentsline {subsection}{\numberline {3.2.2}Continuous Bayesian EDA}{12}{subsection.3.2.2}
-\contentsline {subsection}{\numberline {3.2.3}EDA-based hybrid recommender}{12}{subsection.3.2.3}
-\contentsline {chapter}{\numberline {4}Experiments}{13}{chapter.4}
-\contentsline {section}{\numberline {4.1}Evaluation for recommender systems}{13}{section.4.1}
-\contentsline {subsection}{\numberline {4.1.1}Types of experiments}{13}{subsection.4.1.1}
-\contentsline {section}{\numberline {4.2}Evaluation settings}{14}{section.4.2}
-\contentsline {subsection}{\numberline {4.2.1}Dataset}{14}{subsection.4.2.1}
-\contentsline {subsection}{\numberline {4.2.2}Evaluation measures}{15}{subsection.4.2.2}
-\contentsline {subsection}{\numberline {4.2.3}Experimentation aims}{15}{subsection.4.2.3}
-\contentsline {chapter}{\numberline {5}Results}{16}{chapter.5}
-\contentsline {chapter}{\numberline {6}Conclusion}{17}{chapter.6}
-\contentsline {section}{\numberline {6.1}Future work}{17}{section.6.1}
+\contentsline {chapter}{\numberline {1}Introduction}{5}{chapter.1}
+\contentsline {section}{\numberline {1.1}Outline of the thesis}{6}{section.1.1}
+\contentsline {chapter}{\numberline {2}Background research}{8}{chapter.2}
+\contentsline {section}{\numberline {2.1}Online Social Networks}{9}{section.2.1}
+\contentsline {subsection}{\numberline {2.1.1}Last.fm}{9}{subsection.2.1.1}
+\contentsline {section}{\numberline {2.2}Music services platforms}{10}{section.2.2}
+\contentsline {subsection}{\numberline {2.2.1}Echonest}{10}{subsection.2.2.1}
+\contentsline {subsection}{\numberline {2.2.2}7Digital}{10}{subsection.2.2.2}
+\contentsline {section}{\numberline {2.3}Recommender Systems}{10}{section.2.3}
+\contentsline {subsection}{\numberline {2.3.1}Collaborative filtering}{10}{subsection.2.3.1}
+\contentsline {subsection}{\numberline {2.3.2}Content-based methods}{11}{subsection.2.3.2}
+\contentsline {section}{\numberline {2.4}Hybrid recommender methods}{11}{section.2.4}
+\contentsline {section}{\numberline {2.5}Music Information Retrieval}{11}{section.2.5}
+\contentsline {subsection}{\numberline {2.5.1}Musical genre classification}{11}{subsection.2.5.1}
+\contentsline {subsection}{\numberline {2.5.2}Deep Learning}{12}{subsection.2.5.2}
+\contentsline {subsection}{\numberline {2.5.3}Convolutional Neural Networks}{12}{subsection.2.5.3}
+\contentsline {section}{\numberline {2.6}Estimation of Distribution Algorithms}{13}{section.2.6}
+\contentsline {chapter}{\numberline {3}Methodology}{14}{chapter.3}
+\contentsline {section}{\numberline {3.1}Data collection}{14}{section.3.1}
+\contentsline {subsection}{\numberline {3.1.1}Taste Profile subset cleaning}{15}{subsection.3.1.1}
+\contentsline {subsection}{\numberline {3.1.2}Audio clips retrieval}{15}{subsection.3.1.2}
+\contentsline {subsection}{\numberline {3.1.3}Intermediate time-frequency representation for audio signals}{16}{subsection.3.1.3}
+\contentsline {section}{\numberline {3.2}Algorithms}{16}{section.3.2}
+\contentsline {subsection}{\numberline {3.2.1}CNN architecture}{16}{subsection.3.2.1}
+\contentsline {subsubsection}{Genre classification}{17}{section*.2}
+\contentsline {subsection}{\numberline {3.2.2}Continuous Bayesian EDA}{17}{subsection.3.2.2}
+\contentsline {subsection}{\numberline {3.2.3}EDA-based hybrid recommender}{17}{subsection.3.2.3}
+\contentsline {chapter}{\numberline {4}Experiments}{18}{chapter.4}
+\contentsline {section}{\numberline {4.1}Evaluation for recommender systems}{18}{section.4.1}
+\contentsline {subsection}{\numberline {4.1.1}Types of experiments}{18}{subsection.4.1.1}
+\contentsline {section}{\numberline {4.2}Evaluation method}{20}{section.4.2}
+\contentsline {subsection}{\numberline {4.2.1}Dataset description}{20}{subsection.4.2.1}
+\contentsline {subsection}{\numberline {4.2.2}Evaluation measures}{20}{subsection.4.2.2}
+\contentsline {chapter}{\numberline {5}Results}{21}{chapter.5}
+\contentsline {chapter}{\numberline {6}Conclusion}{22}{chapter.6}
+\contentsline {section}{\numberline {6.1}Future work}{22}{section.6.1}
diff -r 1dbd24575d44 -r e68dbee1f6db Report/references.bib
--- a/Report/references.bib Tue Aug 04 12:13:47 2015 +0100
+++ b/Report/references.bib Tue Aug 11 10:50:36 2015 +0100
@@ -163,3 +163,136 @@
url = {http://mtg.upf.edu/static/media/PhD\_ocelma.pdf},
author = {Celma, \{`O}.},
}
+
+@inproceedings{pachet2001musical,
+ title={Musical data mining for electronic music distribution},
+ author={Pachet, Fran{\c{c}}ois and Westermann, Gert and Laigre, Damien},
+ booktitle={Web Delivering of Music, 2001. Proceedings. First International Conference on},
+ pages={101--106},
+ year={2001},
+ organization={IEEE}
+}
+
+@ARTICLE{Tzanetakis2002293,
+ author={Tzanetakis, G. and Cook, P.},
+ title={Musical genre classification of audio signals},
+ journal={IEEE Transactions on Speech and Audio Processing},
+ year={2002},
+ volume={10},
+ number={5},
+ pages={293-302},
+ doi={10.1109/TSA.2002.800560},
+ note={cited By 976},
+ url={http://www.scopus.com/inward/record.url?eid=2-s2.0-0036648502\&partnerID=40\&md5=72d2fee186b42c9998f13415cbb79eea},
+ document_type={Article},
+ source={Scopus},
+}
+
+@CONFERENCE{Sturm20127,
+ author={Sturm, B.L.},
+ title={An analysis of the GTZAN music genre dataset},
+ journal={MIRUM 2012 - Proceedings of the 2nd International ACM Workshop on Music Information Retrieval with User-Centered and Multimodal Strategies, Co-located with ACM Multimedia 2012},
+ year={2012},
+ pages={7-12},
+ doi={10.1145/2390848.2390851},
+ note={cited By 0},
+ url={http://www.scopus.com/inward/record.url?eid=2-s2.0-84870497334\&partnerID=40\&md5=40a48c1c9d787308dd315694b54b64ec},
+ document_type={Conference Paper},
+ source={Scopus},
+}
+
+@unpublished{Bengio-et-al-2015-Book,
+ title={Deep Learning},
+ author={Yoshua Bengio and Ian J. Goodfellow and Aaron Courville},
+ note={Book in preparation for MIT Press},
+ url={http://www.iro.umontreal.ca/~bengioy/dlbook},
+ year={2015}
+}
+
+@CONFERENCE{Sigtia20146959,
+ author={Sigtia, S. and Dixon, S.},
+ title={Improved music feature learning with deep neural networks},
+ journal={ICASSP, IEEE International Conference on Acoustics, Speech and Signal Processing - Proceedings},
+ year={2014},
+ pages={6959-6963},
+ doi={10.1109/ICASSP.2014.6854949},
+ art_number={6854949},
+ note={cited By 0},
+ url={http://www.scopus.com/inward/record.url?eid=2-s2.0-84905259152\&partnerID=40\&md5=3441dfa8c7998a8eb39f668d43efb8a1},
+ document_type={Conference Paper},
+ source={Scopus},
+}
+
+@incollection{NIPS2013_5004,
+ title = {Deep content-based music recommendation},
+ author = {van den Oord, Aaron and Dieleman, Sander and Schrauwen, Benjamin},
+ booktitle = {Advances in Neural Information Processing Systems 26},
+ editor = {C.J.C. Burges and L. Bottou and M. Welling and Z. Ghahramani and K.Q. Weinberger},
+ pages = {2643--2651},
+ year = {2013},
+ publisher = {Curran Associates, Inc.},
+ url = {http://papers.nips.cc/paper/5004-deep-content-based-music-recommendation.pdf}
+}
+
+@incollection{pelikan2015estimation,
+ title={Estimation of Distribution Algorithms},
+ author={Pelikan, Martin and Hauschild, Mark W and Lobo, Fernando G},
+ booktitle={Springer Handbook of Computational Intelligence},
+ pages={899--928},
+ year={2015},
+ publisher={Springer}
+}
+
+@article{Santana:Bielza:Larrañaga:Lozano:Echegoyen:Mendiburu:Armañanzas:Shakya:2009:JSSOBK:v35i07,
+ author = "Roberto Santana and Concha Bielza and Pedro Larrañaga and Jose A. Lozano and Carlos Echegoyen and Alexander Mendiburu and Rubén Armañanzas and Siddartha Shakya",
+ title = "Mateda-2.0: A MATLAB Package for the Implementation and Analysis of Estimation of Distribution Algorithms",
+ journal = "Journal of Statistical Software",
+ volume = "35",
+ number = "7",
+ pages = "1--30",
+ day = "26",
+ month = "7",
+ year = "2010",
+ CODEN = "JSSOBK",
+ ISSN = "1548-7660",
+ bibdate = "2009-12-17",
+ URL = "http://www.jstatsoft.org/v35/i07",
+ accepted = "2009-12-17",
+ acknowledgement = "",
+ keywords = "",
+ submitted = "2009-04-15",
+}
+
+@ARTICLE{Liang2014781,
+ author={Liang, T. and Liang, Y. and Fan, J. and Zhao, J.},
+ title={A hybrid recommendation model based on estimation of distribution algorithms},
+ journal={Journal of Computational Information Systems},
+ year={2014},
+ volume={10},
+ number={2},
+ pages={781-788},
+ doi={10.12733/jcis9623},
+ note={cited By 0},
+ url={http://www.scopus.com/inward/record.url?eid=2-s2.0-84892865461\&partnerID=40\&md5=a2927d36b493e8ef4d1cdab3055fa68b},
+ document_type={Article},
+ source={Scopus},
+}
+
+@INPROCEEDINGS{Bertin-Mahieux2011,
+ author = {Thierry Bertin-Mahieux and Daniel P.W. Ellis and Brian Whitman and Paul Lamere},
+ title = {The Million Song Dataset},
+ booktitle = {{Proceedings of the 12th International Conference on Music Information
+ Retrieval ({ISMIR} 2011)}},
+ year = {2011},
+ owner = {thierry},
+ timestamp = {2010.03.07}
+}
+
+@inproceedings{zhang2014deep,
+ title={A deep representation for invariance and music classification},
+ author={Zhang, Chiyuan and Evangelopoulos, Georgios and Voinea, Stephen and Rosasco, Lorenzo and Poggio, Tomaso},
+ booktitle={Acoustics, Speech and Signal Processing (ICASSP), 2014 IEEE International Conference on},
+ pages={6984--6988},
+ year={2014},
+ organization={IEEE}
+}
\ No newline at end of file