From 8e17359eadb2dfdb5203e21541efd3e8091095c8 Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 14:35:34 +0100 Subject: [PATCH 01/10] Refractored, fixed a message_header import by moving the content of ddex.ddex into ddex.__init__ Allowed for python 27 and python 3+ versions of tkinter to be imported Added an alternative method for mkdir -p 56 / 82 unit tests pass --- ddex/__init__.py | 45 ++++ ddex/ddex.py | 44 ---- ddex/ddex_builder.py | 6 +- ddex/message_header.py | 1 - ddex/party.py | 2 +- ddex/release.py | 230 +++++++++--------- ddex/release_builder.py | 2 +- ddex/resource.py | 6 +- ddex/tests/data.py | 10 +- ddex/tests/data_helper.py | 4 +- ddex/tests/test_batch_generator.py | 4 +- ddex/tests/test_ddex.py | 6 +- ddex/tests/test_ddex_builder.py | 4 +- ddex/tests/test_deal.py | 66 ++--- ddex/tests/test_file_parser.py | 92 +++---- ddex/tests/test_id_generators.py | 2 +- ddex/tests/test_message_header.py | 4 +- ddex/tests/test_party.py | 2 +- ddex/tests/test_party_repository.py | 5 +- ddex/tests/test_release.py | 216 ++++++++-------- ddex/tests/test_release_builder.py | 6 +- ddex/tests/test_release_id.py | 2 +- ddex/tests/test_resource.py | 216 ++++++++-------- ddex/tests/test_resource_manager.py | 18 +- ddex/tests/test_validate.py | 2 +- .../test_validates_against_ddex_schema.py | 22 +- .../batch_generator.py | 11 +- deal_window.py => ddexui/deal_window.py | 18 +- file_parser.py => ddexui/file_parser.py | 4 +- inputs.py => ddexui/inputs.py | 5 +- .../party_repository.py | 66 ++--- .../product_service.py | 2 +- release_window.py => ddexui/release_window.py | 33 ++- .../resource_manager.py | 4 +- tkinterutil.py => ddexui/tkinterutil.py | 8 +- metadata_form.py | 44 ++-- requirements.txt | 6 +- setup.py | 31 ++- 38 files changed, 649 insertions(+), 600 deletions(-) delete mode 100644 ddex/ddex.py rename batch_generator.py => ddexui/batch_generator.py (63%) rename deal_window.py => ddexui/deal_window.py (81%) rename file_parser.py => ddexui/file_parser.py (94%) rename inputs.py => ddexui/inputs.py (96%) rename party_repository.py => ddexui/party_repository.py (94%) rename product_service.py => ddexui/product_service.py (97%) rename release_window.py => ddexui/release_window.py (92%) rename resource_manager.py => ddexui/resource_manager.py (94%) rename tkinterutil.py => ddexui/tkinterutil.py (73%) diff --git a/ddex/__init__.py b/ddex/__init__.py index e69de29..49297bc 100644 --- a/ddex/__init__.py +++ b/ddex/__init__.py @@ -0,0 +1,45 @@ +import xml.etree.cElementTree as ET +import datetime +from ddex.message_header import MessageHeader +from ddex.release import ReleaseIdType + + +def generate_batch_id(now=datetime.datetime.now): + return now().strftime("%Y%m%d%H%M%S%f")[:-3] + +class DDEX: + + def __init__(self, sender, recipient, releases=[], resources=[], update=False): + self.update = update + self.releases = releases + self.resources = resources + self.sender = sender + self.recipient = recipient + + def write(self, file_name): + root = ET.Element("ernm:NewReleaseMessage", {'MessageSchemaVersionId': 'ern/341', 'LanguageAndScriptCode': 'en', 'xs:schemaLocation': 'http://ddex.net/xml/ern/341 http://ddex.net/xml/ern/341/release-notification.xsd', 'xmlns:ernm': 'http://ddex.net/xml/ern/341', 'xmlns:xs':'http://www.w3.org/2001/XMLSchema-instance'}) + header = self.__write_message_header(root) + root.append(header) + + update_indicator = ET.SubElement(root, "UpdateIndicator") + if(self.update): + update_indicator.text = "UpdateMessage" + else: + update_indicator.text = "OriginalMessage" + + resource_list = ET.SubElement(root, "ResourceList") + for resource in self.resources: + resource_list.append(resource.write()) + + release_list = ET.SubElement(root, "ReleaseList") + deal_list = ET.SubElement(root, "DealList") + + for release in self.releases: + release_list.append(release.write()) + deal_list.append(release.write_deals()) + + tree = ET.ElementTree(root) + tree.write(file_name) + + def __write_message_header(self, root): + return MessageHeader(self.sender, self.recipient).write(); diff --git a/ddex/ddex.py b/ddex/ddex.py deleted file mode 100644 index c64c75e..0000000 --- a/ddex/ddex.py +++ /dev/null @@ -1,44 +0,0 @@ -import xml.etree.cElementTree as ET -import datetime -from DDEXUI.ddex.message_header import MessageHeader -from DDEXUI.ddex.release import ReleaseIdType - -def generate_batch_id(now=datetime.datetime.now): - return now().strftime("%Y%m%d%H%M%S%f")[:-3] - -class DDEX: - - def __init__(self, sender, recipient, releases=[], resources=[], update=False): - self.update = update - self.releases = releases - self.resources = resources - self.sender = sender - self.recipient = recipient - - def write(self, file_name): - root = ET.Element("ernm:NewReleaseMessage", {'MessageSchemaVersionId': 'ern/341', 'LanguageAndScriptCode': 'en', 'xs:schemaLocation': 'http://ddex.net/xml/ern/341 http://ddex.net/xml/ern/341/release-notification.xsd', 'xmlns:ernm': 'http://ddex.net/xml/ern/341', 'xmlns:xs':'http://www.w3.org/2001/XMLSchema-instance'}) - header = self.__write_message_header(root) - root.append(header) - - update_indicator = ET.SubElement(root, "UpdateIndicator") - if(self.update): - update_indicator.text = "UpdateMessage" - else: - update_indicator.text = "OriginalMessage" - - resource_list = ET.SubElement(root, "ResourceList") - for resource in self.resources: - resource_list.append(resource.write()) - - release_list = ET.SubElement(root, "ReleaseList") - deal_list = ET.SubElement(root, "DealList") - - for release in self.releases: - release_list.append(release.write()) - deal_list.append(release.write_deals()) - - tree = ET.ElementTree(root) - tree.write(file_name) - - def __write_message_header(self, root): - return MessageHeader(self.sender, self.recipient).write(); diff --git a/ddex/ddex_builder.py b/ddex/ddex_builder.py index c432776..9229165 100644 --- a/ddex/ddex_builder.py +++ b/ddex/ddex_builder.py @@ -1,6 +1,6 @@ -from DDEXUI.ddex.ddex import DDEX -from DDEXUI.ddex.resource import Resource -from DDEXUI.ddex.release import ReleaseIdType +from ddex import DDEX +from ddex.resource import Resource +from ddex.release import ReleaseIdType class DDEXBuilder: def __init__(self): diff --git a/ddex/message_header.py b/ddex/message_header.py index 854df93..68df498 100644 --- a/ddex/message_header.py +++ b/ddex/message_header.py @@ -6,7 +6,6 @@ class MessageHeader: def __init__(self, sender, recipient): self.sender = sender self.recipient = recipient - def write(self): message_header = ET.Element('MessageHeader') diff --git a/ddex/party.py b/ddex/party.py index bd58d80..427162a 100644 --- a/ddex/party.py +++ b/ddex/party.py @@ -1,5 +1,5 @@ import xml.etree.cElementTree as ET -from DDEXUI.ddex.enum import enum +from ddex.enum import enum PartyType = enum(MessageSender=1, MessageRecipient=2) diff --git a/ddex/release.py b/ddex/release.py index a4d5aa4..916766c 100644 --- a/ddex/release.py +++ b/ddex/release.py @@ -1,115 +1,115 @@ -import xml.etree.cElementTree as ET -from DDEXUI.ddex.enum import enum - -ReleaseIdType = enum(Upc=1, Isrc=2) -ReleaseType = enum(Single=1) - -class ReleaseId: - def __init__(self, type, id): - self.type = type - self.id = id - - def write(self): - name = None - attrs = {} - if(self.type == ReleaseIdType.Upc): - name = "ICPN" - attrs = {"IsEan": "false"} - elif(self.type == ReleaseIdType.Isrc): - name = "ISRC" - element = ET.Element(name, attrs) - element.text = self.id - return element - -class Release: - def __init__(self, title, cline, pline, year, release_reference, release_id, release_type, artist, label, parental_warning): - self.release_type = release_type - self.release_id = release_id - self.genres = [] - self.pline = pline - self.release_reference = release_reference - self.cline = cline - self.year = str(year) - self.title = title - self.artist = artist - self.label = label - self.deals = [] - self.release_resource_references = [] - if(parental_warning): - self.parental_warning = "Explicit" - else: - self.parental_warning = "NotExplicit" - - def write(self): - release = ET.Element("Release") - releaseId = ET.SubElement(release, "ReleaseId") - releaseId.append(self.release_id.write()) - self.__add_element(release, "ReleaseReference", self.release_reference) - referenceTitle = ET.SubElement(release, "ReferenceTitle") - self.__add_element(referenceTitle, "TitleText", self.title) - resource_reference_list = ET.SubElement(release, "ReleaseResourceReferenceList") - - resource_group = ET.Element("ResourceGroup") - i = 0 - for ref, ref_type in self.release_resource_references: - self.__add_element(resource_reference_list, "ReleaseResourceReference", ref, {"ReleaseResourceType":ref_type}) - content_item = self.__add_element(resource_group, "ResourceGroupContentItem") - self.__add_element(content_item, "SequenceNumber", str(i + 1)) - self.__add_element(content_item, "ResourceType", "SoundRecording") - self.__add_element(content_item, "ReleaseResourceReference", ref) - i = i+1 - - self.__add_element(release, "ReleaseType", self.release_type) - release_details_by_territory = ET.SubElement(release, "ReleaseDetailsByTerritory") - ET.SubElement(release_details_by_territory, "TerritoryCode").text = "Worldwide" - self.__add_element(release_details_by_territory, "DisplayArtistName", self.artist) - self.__add_element(release_details_by_territory, "LabelName", self.label) - self.__write_titles(release, release_details_by_territory) - self.__write_genres(release_details_by_territory) - self.__write_artist(release_details_by_territory) - self.__add_element(release_details_by_territory, "ParentalWarningType", self.parental_warning) - release_details_by_territory.append(resource_group) - pline = ET.SubElement(release, "PLine") - self.__add_element(pline, "Year", self.year) - self.__add_element(pline, "PLineText", self.pline) - cline = ET.SubElement(release, "CLine") - self.__add_element(cline, "Year", self.year) - self.__add_element(cline, "CLineText", self.cline) - return release - - def __add_element(self, parent, name, text="", attrs={}): - element = ET.SubElement(parent, name, attrs) - element.text = text - return element - - def __write_artist(self, release_details_by_territory): - artist = ET.SubElement(release_details_by_territory, "DisplayArtist") - party_name = ET.SubElement(artist, "PartyName") - self.__add_element(party_name, "FullName", self.artist) - self.__add_element(artist, "ArtistRole", "MainArtist") - - def __write_genres(self, release_details_by_territory): - for genre in self.genres: - genreElement = ET.SubElement(release_details_by_territory, "Genre") - ET.SubElement(genreElement, "GenreText").text = genre - - def __write_titles(self, release, release_details_by_territory): - for type in ["FormalTitle", "DisplayTitle", "GroupingTitle"]: - self.__add_title(release_details_by_territory, type) - - def __add_title(self, release_details_by_territory, type): - title = ET.SubElement(release_details_by_territory, "Title", {"TitleType": type}) - self.__add_element(title, "TitleText", self.title) - - def add_deal(self, deal): - self.deals.append(deal) - - def add_resource_reference(self, reference, release_resource_type="PrimaryResource"): - self.release_resource_references.append((reference, release_resource_type)) - - def write_deals(self): - release_deal = ET.Element("ReleaseDeal") - self.__add_element(release_deal, "DealReleaseReference", self.release_reference) - for deal in self.deals: - release_deal.append(deal.write()) - return release_deal +import xml.etree.cElementTree as ET +from ddex.enum import enum + +ReleaseIdType = enum(Upc=1, Isrc=2) +ReleaseType = enum(Single=1) + +class ReleaseId: + def __init__(self, type, id): + self.type = type + self.id = id + + def write(self): + name = None + attrs = {} + if(self.type == ReleaseIdType.Upc): + name = "ICPN" + attrs = {"IsEan": "false"} + elif(self.type == ReleaseIdType.Isrc): + name = "ISRC" + element = ET.Element(name, attrs) + element.text = self.id + return element + +class Release: + def __init__(self, title, cline, pline, year, release_reference, release_id, release_type, artist, label, parental_warning): + self.release_type = release_type + self.release_id = release_id + self.genres = [] + self.pline = pline + self.release_reference = release_reference + self.cline = cline + self.year = str(year) + self.title = title + self.artist = artist + self.label = label + self.deals = [] + self.release_resource_references = [] + if(parental_warning): + self.parental_warning = "Explicit" + else: + self.parental_warning = "NotExplicit" + + def write(self): + release = ET.Element("Release") + releaseId = ET.SubElement(release, "ReleaseId") + releaseId.append(self.release_id.write()) + self.__add_element(release, "ReleaseReference", self.release_reference) + referenceTitle = ET.SubElement(release, "ReferenceTitle") + self.__add_element(referenceTitle, "TitleText", self.title) + resource_reference_list = ET.SubElement(release, "ReleaseResourceReferenceList") + + resource_group = ET.Element("ResourceGroup") + i = 0 + for ref, ref_type in self.release_resource_references: + self.__add_element(resource_reference_list, "ReleaseResourceReference", ref, {"ReleaseResourceType":ref_type}) + content_item = self.__add_element(resource_group, "ResourceGroupContentItem") + self.__add_element(content_item, "SequenceNumber", str(i + 1)) + self.__add_element(content_item, "ResourceType", "SoundRecording") + self.__add_element(content_item, "ReleaseResourceReference", ref) + i = i+1 + + self.__add_element(release, "ReleaseType", self.release_type) + release_details_by_territory = ET.SubElement(release, "ReleaseDetailsByTerritory") + ET.SubElement(release_details_by_territory, "TerritoryCode").text = "Worldwide" + self.__add_element(release_details_by_territory, "DisplayArtistName", self.artist) + self.__add_element(release_details_by_territory, "LabelName", self.label) + self.__write_titles(release, release_details_by_territory) + self.__write_genres(release_details_by_territory) + self.__write_artist(release_details_by_territory) + self.__add_element(release_details_by_territory, "ParentalWarningType", self.parental_warning) + release_details_by_territory.append(resource_group) + pline = ET.SubElement(release, "PLine") + self.__add_element(pline, "Year", self.year) + self.__add_element(pline, "PLineText", self.pline) + cline = ET.SubElement(release, "CLine") + self.__add_element(cline, "Year", self.year) + self.__add_element(cline, "CLineText", self.cline) + return release + + def __add_element(self, parent, name, text="", attrs={}): + element = ET.SubElement(parent, name, attrs) + element.text = text + return element + + def __write_artist(self, release_details_by_territory): + artist = ET.SubElement(release_details_by_territory, "DisplayArtist") + party_name = ET.SubElement(artist, "PartyName") + self.__add_element(party_name, "FullName", self.artist) + self.__add_element(artist, "ArtistRole", "MainArtist") + + def __write_genres(self, release_details_by_territory): + for genre in self.genres: + genreElement = ET.SubElement(release_details_by_territory, "Genre") + ET.SubElement(genreElement, "GenreText").text = genre + + def __write_titles(self, release, release_details_by_territory): + for type in ["FormalTitle", "DisplayTitle", "GroupingTitle"]: + self.__add_title(release_details_by_territory, type) + + def __add_title(self, release_details_by_territory, type): + title = ET.SubElement(release_details_by_territory, "Title", {"TitleType": type}) + self.__add_element(title, "TitleText", self.title) + + def add_deal(self, deal): + self.deals.append(deal) + + def add_resource_reference(self, reference, release_resource_type="PrimaryResource"): + self.release_resource_references.append((reference, release_resource_type)) + + def write_deals(self): + release_deal = ET.Element("ReleaseDeal") + self.__add_element(release_deal, "DealReleaseReference", self.release_reference) + for deal in self.deals: + release_deal.append(deal.write()) + return release_deal diff --git a/ddex/release_builder.py b/ddex/release_builder.py index 9b36318..eabd957 100644 --- a/ddex/release_builder.py +++ b/ddex/release_builder.py @@ -1,4 +1,4 @@ -from DDEXUI.ddex.release import * +from ddex.release import * class ReleaseBuilder: def __init__(self): diff --git a/ddex/resource.py b/ddex/resource.py index e64af0e..9f110f6 100644 --- a/ddex/resource.py +++ b/ddex/resource.py @@ -1,7 +1,11 @@ import xml.etree.cElementTree as ET from abc import ABCMeta, abstractmethod -class Resource(metaclass=ABCMeta): + +class Resource: + + __metaclass__ = ABCMeta + def __init__(self, technical_resource_details_reference, id_attrs={}): self._id_attrs = id_attrs self._technical_resource_details_reference = technical_resource_details_reference diff --git a/ddex/tests/data.py b/ddex/tests/data.py index 77afd0d..a8bcc9f 100644 --- a/ddex/tests/data.py +++ b/ddex/tests/data.py @@ -1,9 +1,9 @@ import random -from DDEXUI.ddex.ddex_builder import DDEXBuilder -from DDEXUI.ddex.release_builder import ReleaseBuilder -from DDEXUI.ddex.party import Party, PartyType -from DDEXUI.ddex.release import * -from DDEXUI.ddex.deal import * +from ddex.ddex_builder import DDEXBuilder +from ddex.release_builder import ReleaseBuilder +from ddex.party import Party, PartyType +from ddex.release import * +from ddex.deal import * from datetime import datetime diff --git a/ddex/tests/data_helper.py b/ddex/tests/data_helper.py index 6f43323..a2284f2 100644 --- a/ddex/tests/data_helper.py +++ b/ddex/tests/data_helper.py @@ -1,5 +1,5 @@ -from DDEXUI.ddex.release_builder import * -from DDEXUI.ddex.release import * +from ddex.release_builder import * +from ddex.release import * class TestData: @staticmethod diff --git a/ddex/tests/test_batch_generator.py b/ddex/tests/test_batch_generator.py index 67286d0..8d85be0 100644 --- a/ddex/tests/test_batch_generator.py +++ b/ddex/tests/test_batch_generator.py @@ -2,8 +2,8 @@ from os import path from tempfile import gettempdir from shutil import rmtree -import DDEXUI.ddex.tests.data as data -from DDEXUI.batch_generator import BatchGenerator +import ddex.tests.data as data +from ddexui.batch_generator import BatchGenerator class BatchGeneratorTests(unittest.TestCase): def test_should_generate_a_batch_containing_each_product(self): diff --git a/ddex/tests/test_ddex.py b/ddex/tests/test_ddex.py index 803ff06..3aa28d3 100644 --- a/ddex/tests/test_ddex.py +++ b/ddex/tests/test_ddex.py @@ -1,7 +1,7 @@ import unittest -from DDEXUI.ddex.ddex_builder import DDEXBuilder -from DDEXUI.ddex.release_builder import ReleaseBuilder -import DDEXUI.ddex.tests.data as data +from ddex.ddex_builder import DDEXBuilder +from ddex.release_builder import ReleaseBuilder +import ddex.tests.data as data class DDEXBuilderTests(unittest.TestCase): def test_should_get_the_release_id(self): diff --git a/ddex/tests/test_ddex_builder.py b/ddex/tests/test_ddex_builder.py index b67961c..d0ac013 100644 --- a/ddex/tests/test_ddex_builder.py +++ b/ddex/tests/test_ddex_builder.py @@ -1,6 +1,6 @@ import unittest -from DDEXUI.ddex.ddex_builder import DDEXBuilder -from DDEXUI.ddex.tests.data import valid_product_release, valid_track_release +from ddex.ddex_builder import DDEXBuilder +from ddex.tests.data import valid_product_release, valid_track_release class DDEXBuilderTests(unittest.TestCase): diff --git a/ddex/tests/test_deal.py b/ddex/tests/test_deal.py index 46b9e11..5ac93d8 100644 --- a/ddex/tests/test_deal.py +++ b/ddex/tests/test_deal.py @@ -1,33 +1,33 @@ -import unittest -import xml.etree.cElementTree as ET -from DDEXUI.ddex.deal import Deal -from datetime import date - -class DealTests(unittest.TestCase): - - def setUp(self): - self.use_type = "PermanentDownload" - self.territory = "BE" - self.start_date = date(1987,2,20) - self.preorder_date = date(1987,2,19) - self.preorder_preview_date = date(1987,2,18) - deal = Deal("PayAsYouGoModel", self.use_type, self.territory, self.start_date, self.preorder_date, self.preorder_preview_date) - self.element = deal.write() - - def test_should_have_commercial_model_type(self): - self.assertEqual(self.element.find("./DealTerms/CommercialModelType").text, "PayAsYouGoModel") - - def test_should_have_use_type(self): - self.assertEqual(self.element.find("./DealTerms/Usage/UseType").text, self.use_type) - - def test_should_have_territory_code(self): - self.assertEqual(self.element.find("./DealTerms/TerritoryCode").text, self.territory) - - def test_should_have_start_date(self): - self.assertEqual(self.element.find("./DealTerms/ValidityPeriod/StartDate").text, "1987-02-20") - - def test_should_have_preorder_date(self): - self.assertEqual(self.element.find("./DealTerms/PreorderReleaseDate").text, "1987-02-19") - - def test_should_have_preorder_preview_date(self): - self.assertEqual(self.element.find("./DealTerms/PreorderPreviewDate").text, "1987-02-18") +import unittest +import xml.etree.cElementTree as ET +from ddex.deal import Deal +from datetime import date + +class DealTests(unittest.TestCase): + + def setUp(self): + self.use_type = "PermanentDownload" + self.territory = "BE" + self.start_date = date(1987,2,20) + self.preorder_date = date(1987,2,19) + self.preorder_preview_date = date(1987,2,18) + deal = Deal("PayAsYouGoModel", self.use_type, self.territory, self.start_date, self.preorder_date, self.preorder_preview_date) + self.element = deal.write() + + def test_should_have_commercial_model_type(self): + self.assertEqual(self.element.find("./DealTerms/CommercialModelType").text, "PayAsYouGoModel") + + def test_should_have_use_type(self): + self.assertEqual(self.element.find("./DealTerms/Usage/UseType").text, self.use_type) + + def test_should_have_territory_code(self): + self.assertEqual(self.element.find("./DealTerms/TerritoryCode").text, self.territory) + + def test_should_have_start_date(self): + self.assertEqual(self.element.find("./DealTerms/ValidityPeriod/StartDate").text, "1987-02-20") + + def test_should_have_preorder_date(self): + self.assertEqual(self.element.find("./DealTerms/PreorderReleaseDate").text, "1987-02-19") + + def test_should_have_preorder_preview_date(self): + self.assertEqual(self.element.find("./DealTerms/PreorderPreviewDate").text, "1987-02-18") diff --git a/ddex/tests/test_file_parser.py b/ddex/tests/test_file_parser.py index 84d40b2..ef09ea3 100644 --- a/ddex/tests/test_file_parser.py +++ b/ddex/tests/test_file_parser.py @@ -1,44 +1,48 @@ -import unittest -from nose.tools import * -from DDEXUI.file_parser import FileParser - -def test_generator(): - cases = ([ ("ddex/tests/resources/test.mp3", "dff9465befeb68d97cd6fd103547c464", "test.mp3", "MP3"), - ("ddex/tests/resources/test.jpg", "55e031153f2c0d8c63e6bf7c9baa58ba", "test.jpg", "JPG")]) - for path, hash, name, extension in cases: - yield check_file, path, hash, name, extension - -def check_file(path, hash, name, extension): - file_metadata = FileParser().parse(path) - assert_equal(file_metadata.md5, hash) - assert_equal(file_metadata.name, name) - assert_equal(file_metadata.extension, extension) - -class FileParserTests(unittest.TestCase): - - def setUp(self): - self.subject = FileParser() - self.file_metadata = self.subject.parse("ddex/tests/resources/test.mp3") - - def test_should_have_duration(self): - self.assertEqual(self.file_metadata.duration, "PT0M4.000S") - - def test_should_have_bitrate(self): - self.assertEqual(self.file_metadata.bit_rate, 64) - - def test_should_have_codec(self): - self.assertEqual(self.file_metadata.codec, "MP3") - -class ImageFileParserTests(unittest.TestCase): - def setUp(self): - self.subject = FileParser() - self.file_metadata = self.subject.parse("ddex/tests/resources/test.jpg") - - def test_should_have_height(self): - self.assertEqual(self.file_metadata.height, 500) - - def test_should_have_width(self): - self.assertEqual(self.file_metadata.width, 463) - - def test_should_have_codec(self): - self.assertEqual(self.file_metadata.codec, "JPEG") +import os +import unittest + +from nose.tools import * + +from ddexui.file_parser import FileParser + + +def test_generator(): + cases = ([ (os.path.join(os.path.dirname(__file__), "resources", "test.mp3"), "dff9465befeb68d97cd6fd103547c464", "test.mp3", "MP3"), + (os.path.join(os.path.dirname(__file__), "resources", "test.jpg"), "55e031153f2c0d8c63e6bf7c9baa58ba", "test.jpg", "JPG")]) + for path, hash, name, extension in cases: + yield check_file, path, hash, name, extension + +def check_file(path, hash, name, extension): + file_metadata = FileParser().parse(path) + assert_equal(file_metadata.md5, hash) + assert_equal(file_metadata.name, name) + assert_equal(file_metadata.extension, extension) + +class FileParserTests(unittest.TestCase): + + def setUp(self): + self.subject = FileParser() + self.file_metadata = self.subject.parse(os.path.join(os.path.dirname(__file__), "resources", "test.mp3")) + + def test_should_have_duration(self): + self.assertEqual(self.file_metadata.duration, "PT0M4.000S") + + def test_should_have_bitrate(self): + self.assertEqual(self.file_metadata.bit_rate, 64) + + def test_should_have_codec(self): + self.assertEqual(self.file_metadata.codec, "MP3") + +class ImageFileParserTests(unittest.TestCase): + def setUp(self): + self.subject = FileParser() + self.file_metadata = self.subject.parse(os.path.join(os.path.dirname(__file__), "resources", "test.jpg")) + + def test_should_have_height(self): + self.assertEqual(self.file_metadata.height, 500) + + def test_should_have_width(self): + self.assertEqual(self.file_metadata.width, 463) + + def test_should_have_codec(self): + self.assertEqual(self.file_metadata.codec, "JPEG") diff --git a/ddex/tests/test_id_generators.py b/ddex/tests/test_id_generators.py index 1a93bc6..3114548 100644 --- a/ddex/tests/test_id_generators.py +++ b/ddex/tests/test_id_generators.py @@ -1,6 +1,6 @@ import unittest import datetime -from DDEXUI.ddex.ddex import generate_batch_id +from ddex import generate_batch_id class TestIdGenerators(unittest.TestCase): def test_batch_id_should_be_in_expected_format(self): diff --git a/ddex/tests/test_message_header.py b/ddex/tests/test_message_header.py index c2fccac..50ed75e 100644 --- a/ddex/tests/test_message_header.py +++ b/ddex/tests/test_message_header.py @@ -1,6 +1,6 @@ import unittest -from DDEXUI.ddex.party import * -from DDEXUI.ddex.message_header import MessageHeader +from ddex.party import * +from ddex.message_header import MessageHeader class MessageHeaderTests(unittest.TestCase): def setUp(self): diff --git a/ddex/tests/test_party.py b/ddex/tests/test_party.py index 2532f03..ddce99b 100644 --- a/ddex/tests/test_party.py +++ b/ddex/tests/test_party.py @@ -1,5 +1,5 @@ import unittest -from DDEXUI.ddex.party import * +from ddex.party import * class PartyTests(unittest.TestCase): def setUp(self): diff --git a/ddex/tests/test_party_repository.py b/ddex/tests/test_party_repository.py index 1032031..bf038ef 100644 --- a/ddex/tests/test_party_repository.py +++ b/ddex/tests/test_party_repository.py @@ -1,7 +1,6 @@ import unittest -import configparser -from DDEXUI.ddex.party import * -from DDEXUI.party_repository import * +from ddex.party import * +from ddexui.party_repository import * import sqlite3 diff --git a/ddex/tests/test_release.py b/ddex/tests/test_release.py index 6c1623a..002eff8 100644 --- a/ddex/tests/test_release.py +++ b/ddex/tests/test_release.py @@ -1,108 +1,108 @@ -import unittest -#todo figure out how to mock things -from DDEXUI.ddex.release import * -import xml.etree.cElementTree as ET - -class Test(unittest.TestCase): - def setUp(self): - self.name = "Bob" - self.upc = "0132384103241" - self.cline = "Copyright brillient music" - self.pline = "Published by brillient music" - self.year = 2013 - self.release_reference = "R0" - self.release_type = "Single" - self.artist_name = "Marty McFly and the hoverboards" - self.genres = ["Rock", "Pop"] - self.label = "Tru Thoughts" - self.explicit = True - self.release = (Release( - self.name, - self.cline, - self.pline, - self.year, - self.release_reference, - ReleaseId(1, self.upc), - self.release_type, - self.artist_name, - self.label, - self.explicit) - ) - self.release.genres = self.genres - - self.element = self.release.write() - - def test_all_genres_should_be_written(self): - genre_elements = self.element.findall("./ReleaseDetailsByTerritory/Genre/GenreText") - genres = list(map(lambda el: el.text, genre_elements)) - self.assertEqual(["Rock","Pop"], genres) - - def test_title_text_should_be_written(self): - self.assertEqual(self.name, self.element.find("./ReferenceTitle/TitleText").text) - self.assertEqual(self.name, self.element.find("./ReleaseDetailsByTerritory/Title[@TitleType='FormalTitle']/TitleText").text) - self.assertEqual(self.name, self.element.find("./ReleaseDetailsByTerritory/Title[@TitleType='GroupingTitle']/TitleText").text) - self.assertEqual(self.name, self.element.find("./ReleaseDetailsByTerritory/Title[@TitleType='DisplayTitle']/TitleText").text) - - def test_upc_should_be_written(self): - self.assertEqual(self.upc, self.element.find("./ReleaseId/ICPN").text) - - def test_release_reference_should_be_set(self): - self.assertEqual(self.release_reference, self.element.find("./ReleaseReference").text) - - def test_release_refernce_territory_code_should_be_worldwide(self): - self.assertEqual("Worldwide",self.element.find("./ReleaseDetailsByTerritory/TerritoryCode").text) - - def test_pline_should_be_written(self): - self.assertEqual(self.pline,self.element.find("./PLine/PLineText").text) - - def test_cline_should_be_written(self): - self.assertEqual(self.cline,self.element.find("./CLine/CLineText").text) - - def test_year_should_be_written(self): - self.assertEqual(str(2013), self.element.find("./CLine/Year").text) - self.assertEqual(str(2013), self.element.find("./PLine/Year").text) - - def test_release_type_should_be_written(self): - self.assertEqual(self.release_type, self.element.find("./ReleaseType").text) - - def test_label_should_be_written(self): - self.assertEqual(self.label, self.element.find("./ReleaseDetailsByTerritory/LabelName").text) - - def test_artist_name_should_be_written(self): - self.assertEqual(self.artist_name, self.element.find("./ReleaseDetailsByTerritory/DisplayArtistName").text) - self.assertEqual(self.artist_name, self.element.find("./ReleaseDetailsByTerritory/DisplayArtist/PartyName/FullName").text) - - def test_artist_role_should_be_written(self): - self.assertEqual("MainArtist", self.element.find("./ReleaseDetailsByTerritory/DisplayArtist/ArtistRole").text) - - def test_parental_warning_should_be_written_as_explicit(self): - path = "./ReleaseDetailsByTerritory/ParentalWarningType" - self.assertEqual("Explicit", self.element.find(path).text) - element = polite_release = Release("","","",1,"",ReleaseId(1,"000000000000"),"","","",False).write() - self.assertEqual("NotExplicit", element.find(path).text) - - def test_should_write_deals(self): - self.release.add_deal(MockDeal()) - self.release.add_deal(MockDeal()) - release_deal = self.release.write_deals() - self.assertEqual(release_deal.find("./DealReleaseReference").text, self.release_reference) - self.assertEqual(len(release_deal.findall("./Deal")), 2) - - def test_should_write_resource_references(self): - ref = "A0" - self.release.add_resource_reference(ref) - element = self.release.write() - resource_refs = element.findall("./ReleaseResourceReferenceList/ReleaseResourceReference") - - self.assertEqual(len(resource_refs), 1) - self.assertEqual(resource_refs[0].text, ref) - resource_group_content_items = element.findall("./ReleaseDetailsByTerritory/ResourceGroup/ResourceGroupContentItem") - self.assertEqual(len(resource_group_content_items), 1) - content_item = resource_group_content_items[0] - self.assertEqual(content_item.find("./SequenceNumber").text, "1") - self.assertEqual(content_item.find("./ResourceType").text, "SoundRecording") - self.assertEqual(content_item.find("./ReleaseResourceReference").text, ref) - -class MockDeal: - def write(self): - return ET.Element("Deal") +import unittest +#todo figure out how to mock things +from ddex.release import * +import xml.etree.cElementTree as ET + +class Test(unittest.TestCase): + def setUp(self): + self.name = "Bob" + self.upc = "0132384103241" + self.cline = "Copyright brillient music" + self.pline = "Published by brillient music" + self.year = 2013 + self.release_reference = "R0" + self.release_type = "Single" + self.artist_name = "Marty McFly and the hoverboards" + self.genres = ["Rock", "Pop"] + self.label = "Tru Thoughts" + self.explicit = True + self.release = (Release( + self.name, + self.cline, + self.pline, + self.year, + self.release_reference, + ReleaseId(1, self.upc), + self.release_type, + self.artist_name, + self.label, + self.explicit) + ) + self.release.genres = self.genres + + self.element = self.release.write() + + def test_all_genres_should_be_written(self): + genre_elements = self.element.findall("./ReleaseDetailsByTerritory/Genre/GenreText") + genres = list(map(lambda el: el.text, genre_elements)) + self.assertEqual(["Rock","Pop"], genres) + + def test_title_text_should_be_written(self): + self.assertEqual(self.name, self.element.find("./ReferenceTitle/TitleText").text) + self.assertEqual(self.name, self.element.find("./ReleaseDetailsByTerritory/Title[@TitleType='FormalTitle']/TitleText").text) + self.assertEqual(self.name, self.element.find("./ReleaseDetailsByTerritory/Title[@TitleType='GroupingTitle']/TitleText").text) + self.assertEqual(self.name, self.element.find("./ReleaseDetailsByTerritory/Title[@TitleType='DisplayTitle']/TitleText").text) + + def test_upc_should_be_written(self): + self.assertEqual(self.upc, self.element.find("./ReleaseId/ICPN").text) + + def test_release_reference_should_be_set(self): + self.assertEqual(self.release_reference, self.element.find("./ReleaseReference").text) + + def test_release_refernce_territory_code_should_be_worldwide(self): + self.assertEqual("Worldwide",self.element.find("./ReleaseDetailsByTerritory/TerritoryCode").text) + + def test_pline_should_be_written(self): + self.assertEqual(self.pline,self.element.find("./PLine/PLineText").text) + + def test_cline_should_be_written(self): + self.assertEqual(self.cline,self.element.find("./CLine/CLineText").text) + + def test_year_should_be_written(self): + self.assertEqual(str(2013), self.element.find("./CLine/Year").text) + self.assertEqual(str(2013), self.element.find("./PLine/Year").text) + + def test_release_type_should_be_written(self): + self.assertEqual(self.release_type, self.element.find("./ReleaseType").text) + + def test_label_should_be_written(self): + self.assertEqual(self.label, self.element.find("./ReleaseDetailsByTerritory/LabelName").text) + + def test_artist_name_should_be_written(self): + self.assertEqual(self.artist_name, self.element.find("./ReleaseDetailsByTerritory/DisplayArtistName").text) + self.assertEqual(self.artist_name, self.element.find("./ReleaseDetailsByTerritory/DisplayArtist/PartyName/FullName").text) + + def test_artist_role_should_be_written(self): + self.assertEqual("MainArtist", self.element.find("./ReleaseDetailsByTerritory/DisplayArtist/ArtistRole").text) + + def test_parental_warning_should_be_written_as_explicit(self): + path = "./ReleaseDetailsByTerritory/ParentalWarningType" + self.assertEqual("Explicit", self.element.find(path).text) + element = polite_release = Release("","","",1,"",ReleaseId(1,"000000000000"),"","","",False).write() + self.assertEqual("NotExplicit", element.find(path).text) + + def test_should_write_deals(self): + self.release.add_deal(MockDeal()) + self.release.add_deal(MockDeal()) + release_deal = self.release.write_deals() + self.assertEqual(release_deal.find("./DealReleaseReference").text, self.release_reference) + self.assertEqual(len(release_deal.findall("./Deal")), 2) + + def test_should_write_resource_references(self): + ref = "A0" + self.release.add_resource_reference(ref) + element = self.release.write() + resource_refs = element.findall("./ReleaseResourceReferenceList/ReleaseResourceReference") + + self.assertEqual(len(resource_refs), 1) + self.assertEqual(resource_refs[0].text, ref) + resource_group_content_items = element.findall("./ReleaseDetailsByTerritory/ResourceGroup/ResourceGroupContentItem") + self.assertEqual(len(resource_group_content_items), 1) + content_item = resource_group_content_items[0] + self.assertEqual(content_item.find("./SequenceNumber").text, "1") + self.assertEqual(content_item.find("./ResourceType").text, "SoundRecording") + self.assertEqual(content_item.find("./ReleaseResourceReference").text, ref) + +class MockDeal: + def write(self): + return ET.Element("Deal") diff --git a/ddex/tests/test_release_builder.py b/ddex/tests/test_release_builder.py index 1c8d8e6..8786122 100644 --- a/ddex/tests/test_release_builder.py +++ b/ddex/tests/test_release_builder.py @@ -1,7 +1,7 @@ import unittest -from DDEXUI.ddex.release import ReleaseIdType, Release -from DDEXUI.ddex.release_builder import ReleaseBuilder -from DDEXUI.ddex.tests.data_helper import TestData +from ddex.release import ReleaseIdType, Release +from ddex.release_builder import ReleaseBuilder +from ddex.tests.data_helper import TestData class ReleaseBuilderTests(unittest.TestCase): def test_can_build_valid_release(self): diff --git a/ddex/tests/test_release_id.py b/ddex/tests/test_release_id.py index 0f8007d..c1404fc 100644 --- a/ddex/tests/test_release_id.py +++ b/ddex/tests/test_release_id.py @@ -1,4 +1,4 @@ -from DDEXUI.ddex.release import ReleaseId +from ddex.release import ReleaseId import unittest class ReleaseIdTests(unittest.TestCase): diff --git a/ddex/tests/test_resource.py b/ddex/tests/test_resource.py index 1adee67..65a070e 100644 --- a/ddex/tests/test_resource.py +++ b/ddex/tests/test_resource.py @@ -1,108 +1,108 @@ -import unittest -import functools -import xml.etree.cElementTree as ET -from DDEXUI.ddex.file_metadata import AudioFileMetadata, ImageFileMetadata -from DDEXUI.ddex.resource import SoundRecording, Image -import os - -class SoundRecordingTests(unittest.TestCase): - - def setUp(self): - self.resource_reference = "A1" - self.title = "Some Title" - self.file_metadata = AudioFileMetadata("PT0H2M28.000S", 320,"dff9465befeb68d97cd6fd103547c464","test.mp3", "MP3") - self.technical_resource_details_reference = "T1" - self.res = SoundRecording(self.resource_reference, "abc", self.title, self.file_metadata, self.technical_resource_details_reference) - self.element = self.res.write() - - def test_resource_should_display_type(self): - self.assertEqual(self.element.tag, "SoundRecording") - - def test_resource_should_display_sound_recording_type(self): - self.assertEqual(self.element.find("./SoundRecordingType").text, "MusicalWorkSoundRecording") - - def test_resource_should_contain_isrc(self): - self.assertEqual(self.element.find("./SoundRecordingId/ISRC").text, "abc") - - def test_resource_should_contain_resource_reference(self): - self.assertEqual(self.element.find("./ResourceReference").text, self.resource_reference) - - def test_resource_should_contain_reference_title(self): - self.assertEqual(self.element.find("./ReferenceTitle/TitleText").text, self.title) - - def test_should_have_a_worldwide_territory(self): - self.assertEqual(self.element.find("./SoundRecordingDetailsByTerritory/TerritoryCode").text, "Worldwide") - - def test_should_have_audio_codec(self): - self.assertEqual(self.world_wide_territory().find("./TechnicalSoundRecordingDetails/AudioCodecType").text, "MP3") - - def test_should_have_file_name_and_path(self): - file_element = self.world_wide_territory().find("./TechnicalSoundRecordingDetails/File") - self.assertEqual(file_element.find("./FileName").text, "test.mp3") - hash_sum = file_element.find("./HashSum") - self.assertEqual(hash_sum.find("./HashSum").text, "dff9465befeb68d97cd6fd103547c464") - self.assertEqual(hash_sum.find("./HashSumAlgorithmType").text, "MD5") - - def test_should_have_duration(self): - self.assertEqual(self.element.find("./Duration").text, "PT0H2M28.000S") - - def test_should_have_technical_resource_details_reference(self): - self.assertEqual(self.world_wide_territory().find("./TechnicalSoundRecordingDetails/TechnicalResourceDetailsReference").text, self.technical_resource_details_reference) - - def test_should_store_technical_resource_details_reference(self): - self.assertEqual(self.res.technical_resource_details_reference, self.technical_resource_details_reference) - - def world_wide_territory(self): - return (list(filter(lambda x: x.find("./TerritoryCode").text == "Worldwide", self.element - .findall("./SoundRecordingDetailsByTerritory")))[0]) - -class ImageTests(unittest.TestCase): - - def setUp(self): - self.resource_reference = "A1" - self.title = "Some Title" - self.file_metadata = ImageFileMetadata("dff9465befeb68d97cd6fd103547c464","test.jpg", "JPG", 300, 400) - self.technical_resource_details_reference = "T1" - self.res = Image(self.resource_reference, "abc", self.file_metadata, self.technical_resource_details_reference) - self.element = self.res.write() - - def test_resource_should_display_type(self): - self.assertEqual(self.element.tag, "Image") - - def test_resource_should_display_image_type(self): - self.assertEqual(self.element.find("./ImageType").text, "FrontCoverImage") - - def test_resource_should_contain_id(self): - el = self.element.find("./ImageId/ProprietaryId") - self.assertEqual(el.text, "abc") - self.assertEqual(el.attrib["Namespace"], "DDEXUI") - - def test_resource_should_contain_resource_reference(self): - self.assertEqual(self.element.find("./ResourceReference").text, self.resource_reference) - - def test_should_have_a_worldwide_territory(self): - self.assertEqual(self.element.find("./ImageDetailsByTerritory/TerritoryCode").text, "Worldwide") - - def test_should_have_image_codec(self): - self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/ImageCodecType").text, "JPEG") - - def test_should_have_image_height_and_width(self): - self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/ImageWidth").text, str(self.file_metadata.width)) - self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/ImageHeight").text, str(self.file_metadata.height)) - - def test_should_have_file_name_and_path(self): - file_element = self.world_wide_territory().find("./TechnicalImageDetails/File") - self.assertEqual(file_element.find("./FileName").text, "test.jpg") - hash_sum = file_element.find("./HashSum") - self.assertEqual(hash_sum.find("./HashSum").text, "dff9465befeb68d97cd6fd103547c464") - self.assertEqual(hash_sum.find("./HashSumAlgorithmType").text, "MD5") - - def test_should_have_technical_resource_details_reference(self): - self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/TechnicalResourceDetailsReference").text, self.technical_resource_details_reference) - - def test_should_store_technical_resource_details_reference(self): - self.assertEqual(self.res.technical_resource_details_reference, self.technical_resource_details_reference) - - def world_wide_territory(self): - return (list(filter(lambda x: x.find("./TerritoryCode").text == "Worldwide", self.element - .findall("./ImageDetailsByTerritory")))[0]) +import unittest +import functools +import xml.etree.cElementTree as ET +from ddex.file_metadata import AudioFileMetadata, ImageFileMetadata +from ddex.resource import SoundRecording, Image +import os + +class SoundRecordingTests(unittest.TestCase): + + def setUp(self): + self.resource_reference = "A1" + self.title = "Some Title" + self.file_metadata = AudioFileMetadata("PT0H2M28.000S", 320,"dff9465befeb68d97cd6fd103547c464","test.mp3", "MP3") + self.technical_resource_details_reference = "T1" + self.res = SoundRecording(self.resource_reference, "abc", self.title, self.file_metadata, self.technical_resource_details_reference) + self.element = self.res.write() + + def test_resource_should_display_type(self): + self.assertEqual(self.element.tag, "SoundRecording") + + def test_resource_should_display_sound_recording_type(self): + self.assertEqual(self.element.find("./SoundRecordingType").text, "MusicalWorkSoundRecording") + + def test_resource_should_contain_isrc(self): + self.assertEqual(self.element.find("./SoundRecordingId/ISRC").text, "abc") + + def test_resource_should_contain_resource_reference(self): + self.assertEqual(self.element.find("./ResourceReference").text, self.resource_reference) + + def test_resource_should_contain_reference_title(self): + self.assertEqual(self.element.find("./ReferenceTitle/TitleText").text, self.title) + + def test_should_have_a_worldwide_territory(self): + self.assertEqual(self.element.find("./SoundRecordingDetailsByTerritory/TerritoryCode").text, "Worldwide") + + def test_should_have_audio_codec(self): + self.assertEqual(self.world_wide_territory().find("./TechnicalSoundRecordingDetails/AudioCodecType").text, "MP3") + + def test_should_have_file_name_and_path(self): + file_element = self.world_wide_territory().find("./TechnicalSoundRecordingDetails/File") + self.assertEqual(file_element.find("./FileName").text, "test.mp3") + hash_sum = file_element.find("./HashSum") + self.assertEqual(hash_sum.find("./HashSum").text, "dff9465befeb68d97cd6fd103547c464") + self.assertEqual(hash_sum.find("./HashSumAlgorithmType").text, "MD5") + + def test_should_have_duration(self): + self.assertEqual(self.element.find("./Duration").text, "PT0H2M28.000S") + + def test_should_have_technical_resource_details_reference(self): + self.assertEqual(self.world_wide_territory().find("./TechnicalSoundRecordingDetails/TechnicalResourceDetailsReference").text, self.technical_resource_details_reference) + + def test_should_store_technical_resource_details_reference(self): + self.assertEqual(self.res.technical_resource_details_reference, self.technical_resource_details_reference) + + def world_wide_territory(self): + return (list(filter(lambda x: x.find("./TerritoryCode").text == "Worldwide", self.element + .findall("./SoundRecordingDetailsByTerritory")))[0]) + +class ImageTests(unittest.TestCase): + + def setUp(self): + self.resource_reference = "A1" + self.title = "Some Title" + self.file_metadata = ImageFileMetadata("dff9465befeb68d97cd6fd103547c464","test.jpg", "JPG", 300, 400) + self.technical_resource_details_reference = "T1" + self.res = Image(self.resource_reference, "abc", self.file_metadata, self.technical_resource_details_reference) + self.element = self.res.write() + + def test_resource_should_display_type(self): + self.assertEqual(self.element.tag, "Image") + + def test_resource_should_display_image_type(self): + self.assertEqual(self.element.find("./ImageType").text, "FrontCoverImage") + + def test_resource_should_contain_id(self): + el = self.element.find("./ImageId/ProprietaryId") + self.assertEqual(el.text, "abc") + self.assertEqual(el.attrib["Namespace"], "DDEXUI") + + def test_resource_should_contain_resource_reference(self): + self.assertEqual(self.element.find("./ResourceReference").text, self.resource_reference) + + def test_should_have_a_worldwide_territory(self): + self.assertEqual(self.element.find("./ImageDetailsByTerritory/TerritoryCode").text, "Worldwide") + + def test_should_have_image_codec(self): + self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/ImageCodecType").text, "JPEG") + + def test_should_have_image_height_and_width(self): + self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/ImageWidth").text, str(self.file_metadata.width)) + self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/ImageHeight").text, str(self.file_metadata.height)) + + def test_should_have_file_name_and_path(self): + file_element = self.world_wide_territory().find("./TechnicalImageDetails/File") + self.assertEqual(file_element.find("./FileName").text, "test.jpg") + hash_sum = file_element.find("./HashSum") + self.assertEqual(hash_sum.find("./HashSum").text, "dff9465befeb68d97cd6fd103547c464") + self.assertEqual(hash_sum.find("./HashSumAlgorithmType").text, "MD5") + + def test_should_have_technical_resource_details_reference(self): + self.assertEqual(self.world_wide_territory().find("./TechnicalImageDetails/TechnicalResourceDetailsReference").text, self.technical_resource_details_reference) + + def test_should_store_technical_resource_details_reference(self): + self.assertEqual(self.res.technical_resource_details_reference, self.technical_resource_details_reference) + + def world_wide_territory(self): + return (list(filter(lambda x: x.find("./TerritoryCode").text == "Worldwide", self.element + .findall("./ImageDetailsByTerritory")))[0]) diff --git a/ddex/tests/test_resource_manager.py b/ddex/tests/test_resource_manager.py index d09be09..f6ac969 100644 --- a/ddex/tests/test_resource_manager.py +++ b/ddex/tests/test_resource_manager.py @@ -1,11 +1,14 @@ -import unittest -from shutil import rmtree from os import path +import os +from shutil import rmtree from tempfile import gettempdir +import unittest import uuid -from DDEXUI.file_parser import FileParser -from DDEXUI.ddex.resource import SoundRecording, Image -from DDEXUI.resource_manager import ResourceManager + +from ddex.resource import SoundRecording, Image +from ddexui.file_parser import FileParser +from ddexui.resource_manager import ResourceManager + class ResourceManagerSoundRecordingTests(unittest.TestCase): @classmethod @@ -16,7 +19,8 @@ def setUpClass(self): self.root_folder = gettempdir() self.batch_id = str(uuid.uuid4()) self.title = "the title" - file_path = path.join('ddex', 'tests', 'resources', 'test.mp3') + + file_path = path.join(os.path.dirname(__file__), 'resources', 'test.mp3') self.resource_reference = "A1" self.technical_resource_details_reference = "T1" @@ -55,7 +59,7 @@ def setUpClass(self): self.root_folder = gettempdir() self.batch_id = str(uuid.uuid4()) self.title = "the title" - file_path = path.join('ddex', 'tests', 'resources', 'test.jpg') + file_path = os.path.join(os.path.dirname(__file__), "resources", "test.jpg") self.resource_reference = "A2" self.technical_resource_details_reference = "T4" diff --git a/ddex/tests/test_validate.py b/ddex/tests/test_validate.py index afb60c5..900ebfe 100644 --- a/ddex/tests/test_validate.py +++ b/ddex/tests/test_validate.py @@ -1,4 +1,4 @@ -from DDEXUI.ddex.validate import Validate +from ddex.validate import Validate from datetime import datetime import unittest diff --git a/ddex/tests/test_validates_against_ddex_schema.py b/ddex/tests/test_validates_against_ddex_schema.py index 2d8cc64..5de05f3 100644 --- a/ddex/tests/test_validates_against_ddex_schema.py +++ b/ddex/tests/test_validates_against_ddex_schema.py @@ -1,14 +1,16 @@ -import lxml.etree as ET -from DDEXUI.ddex.ddex import DDEX -from DDEXUI.ddex.release import Release, ReleaseId -from DDEXUI.ddex.party import Party, PartyType -from DDEXUI.ddex.deal import Deal -from DDEXUI.ddex.resource import SoundRecording, Image -from DDEXUI.ddex.message_header import MessageHeader -from DDEXUI.file_parser import FileParser from datetime import date +import os import unittest +from ddex import DDEX +from ddex.deal import Deal +from ddex.party import Party, PartyType +from ddex.release import Release, ReleaseId +from ddex.resource import SoundRecording, Image +from ddexui.file_parser import FileParser +import lxml.etree as ET + + class DDEXSchemaValidation(unittest.TestCase): def test_created_ddex_files_validate_against_ddex_xsd(self): #helped by http://alex-sansom.info/content/validating-xml-against-xml-schema-python @@ -51,10 +53,10 @@ def create_product_release(self): def create_sound_recording(self): resource_reference = "A1" - resource = SoundRecording(resource_reference, "abc", "Bad", FileParser().parse("ddex/tests/resources/test.mp3"),"T1") + resource = SoundRecording(resource_reference, "abc", "Bad", FileParser().parse(os.path.join(os.path.dirname(__file__), "resources", "test.mp3")),"T1") return resource def create_image(self): image_resource_reference = "A2" - image_resource = Image(image_resource_reference, "abc", FileParser().parse("ddex/tests/resources/test.jpg"),"T2") + image_resource = Image(image_resource_reference, "abc", FileParser().parse(os.path.join(os.path.dirname(__file__), "resources", "test.jpg")),"T2") return image_resource diff --git a/batch_generator.py b/ddexui/batch_generator.py similarity index 63% rename from batch_generator.py rename to ddexui/batch_generator.py index 1298f63..ff4cd7e 100644 --- a/batch_generator.py +++ b/ddexui/batch_generator.py @@ -1,6 +1,6 @@ -from os import makedirs +import os from os import path -from DDEXUI.ddex.ddex import generate_batch_id +from ddex import generate_batch_id class BatchGenerator: def __init__(self, root_folder, batch_id): @@ -12,5 +12,10 @@ def generate(self, builders): for builder in builders: ddex = builder.build() product_path = path.join(batch_path, builder.get_upc()) - makedirs(product_path, exist_ok=True) + # Could use exist_ok in python 3+ but not available in 27 + try: + os.makedirs(product_path) + except OSError: + if not os.path.isdir(path): + raise ddex.write(path.join(product_path, builder.get_upc() + ".xml")) diff --git a/deal_window.py b/ddexui/deal_window.py similarity index 81% rename from deal_window.py rename to ddexui/deal_window.py index 483ad97..8f5e637 100644 --- a/deal_window.py +++ b/ddexui/deal_window.py @@ -1,11 +1,17 @@ -import DDEXUI.ddex.deal as deal -from DDEXUI.inputs import * -from DDEXUI.ddex.validate import Validate -from DDEXUI.tkinterutil import showerrorbox +import ddex.deal as deal +from ddexui.inputs import OptionInput, EntryInput +from ddex.validate import Validate +from tkinterutil import showerrorbox -class DealWindow(tk.tkinter.Toplevel): +try: + import ttk as tk + from Tkinter import Toplevel +except ImportError: + import tkinter.ttk as tk + +class DealWindow(Toplevel): def __init__(self, frame): - tk.tkinter.Toplevel.__init__(self, frame) + Toplevel.__init__(self, frame) self.title("Deal Editor") self.focus_set() self.fields = ([OptionInput(self, "Commercial Model", *deal.CommercialModals), diff --git a/file_parser.py b/ddexui/file_parser.py similarity index 94% rename from file_parser.py rename to ddexui/file_parser.py index f585d15..27cc706 100644 --- a/file_parser.py +++ b/ddexui/file_parser.py @@ -1,5 +1,5 @@ -from DDEXUI.ddex.file_metadata import * -from mutagenx.mp3 import MP3 +from ddex.file_metadata import * +from mutagen.mp3 import MP3 from PIL import Image import hashlib import os diff --git a/inputs.py b/ddexui/inputs.py similarity index 96% rename from inputs.py rename to ddexui/inputs.py index b9cdda4..b6a0caf 100644 --- a/inputs.py +++ b/ddexui/inputs.py @@ -1,4 +1,7 @@ -import tkinter.ttk as tk +try: + import ttk as tk +except ImportError: + import tkinter.ttk as tk class InputRow: def __init__(self, frame, title): diff --git a/party_repository.py b/ddexui/party_repository.py similarity index 94% rename from party_repository.py rename to ddexui/party_repository.py index 72abcef..5769eda 100644 --- a/party_repository.py +++ b/ddexui/party_repository.py @@ -1,33 +1,33 @@ -from DDEXUI.ddex.party import Party -import sqlite3 - -class PartyRepository: - def __init__(self): - self.__with_cursor(lambda cursor, connection: cursor.execute("CREATE TABLE IF NOT EXISTS party(name text, partyId text, partyType integer)")) - - def __get_connection(self): - return sqlite3.connect("ddexui") - - def get_party(self, party_type): - connection = self.__get_connection() - cursor = connection.cursor() - cursor.execute("SELECT partyId, name, partyType FROM party WHERE partyType=?", (party_type,)) - party = cursor.fetchone() - connection.close() - if(party == None): - return None - return Party(party[0], party[1], party[2]) - - def write_party(self, party): - self.__with_cursor(lambda cursor, connection: self.__write_party(cursor, connection, party)) - - def __write_party(self, cursor, connection, party): - cursor.execute("INSERT INTO party(name, partyId, partyType) VALUES(?,?,?)", (party.name, party.party_id, party.party_type,)) - connection.commit() - connection.close() - - def __with_cursor(self, action): - connection = self.__get_connection() - cur = connection.cursor() - action(cur, connection) - connection.close() +from ddex.party import Party +import sqlite3 + +class PartyRepository: + def __init__(self): + self.__with_cursor(lambda cursor, connection: cursor.execute("CREATE TABLE IF NOT EXISTS party(name text, partyId text, partyType integer)")) + + def __get_connection(self): + return sqlite3.connect("ddexui") + + def get_party(self, party_type): + connection = self.__get_connection() + cursor = connection.cursor() + cursor.execute("SELECT partyId, name, partyType FROM party WHERE partyType=?", (party_type,)) + party = cursor.fetchone() + connection.close() + if(party == None): + return None + return Party(party[0], party[1], party[2]) + + def write_party(self, party): + self.__with_cursor(lambda cursor, connection: self.__write_party(cursor, connection, party)) + + def __write_party(self, cursor, connection, party): + cursor.execute("INSERT INTO party(name, partyId, partyType) VALUES(?,?,?)", (party.name, party.party_id, party.party_type,)) + connection.commit() + connection.close() + + def __with_cursor(self, action): + connection = self.__get_connection() + cur = connection.cursor() + action(cur, connection) + connection.close() diff --git a/product_service.py b/ddexui/product_service.py similarity index 97% rename from product_service.py rename to ddexui/product_service.py index b544f69..f1f12c0 100644 --- a/product_service.py +++ b/ddexui/product_service.py @@ -1,4 +1,4 @@ -from DDEXUI.ddex.ddex_builder import DDEXBuilder +from ddex.ddex_builder import DDEXBuilder class ProductService: def __init__(self, product_release_builder, upc, coverart_path, track_builder_file_paths, is_update, resource_manager): diff --git a/release_window.py b/ddexui/release_window.py similarity index 92% rename from release_window.py rename to ddexui/release_window.py index fe9c1e2..175cedd 100644 --- a/release_window.py +++ b/ddexui/release_window.py @@ -1,17 +1,24 @@ -import tkinter.ttk as tk +try: + import ttk as tk + from Tkinter import Toplevel + from tkFileDialog import askopenfilename +except ImportError: + import tkinter.ttk as tk + from tk.tkinter import Toplevel + from tkinter.filedialog import askopenfilename from PIL import Image, ImageTk -from tkinter.filedialog import askopenfilename -from DDEXUI.ddex.release_builder import ReleaseBuilder -from DDEXUI.ddex.validate import Validate -from DDEXUI.inputs import * -from DDEXUI.ddex.release import * -from DDEXUI.deal_window import DealWindow -from DDEXUI.file_parser import FileParser -from DDEXUI.tkinterutil import showerrorbox -from DDEXUI.resource_manager import ResourceManager -from DDEXUI.product_service import ProductService - -class ReleaseWindow(tk.tkinter.Toplevel): +from ddex.release_builder import ReleaseBuilder +from ddex.validate import Validate +from inputs import * +from ddex.release import * +from deal_window import DealWindow +from file_parser import FileParser +from tkinterutil import showerrorbox +from resource_manager import ResourceManager +from product_service import ProductService + + +class ReleaseWindow(Toplevel): def __init__(self, frame): tk.tkinter.Toplevel.__init__(self, frame) self._release_builder = ReleaseBuilder() diff --git a/resource_manager.py b/ddexui/resource_manager.py similarity index 94% rename from resource_manager.py rename to ddexui/resource_manager.py index 8ebcaf7..e4a0074 100644 --- a/resource_manager.py +++ b/ddexui/resource_manager.py @@ -1,7 +1,7 @@ from shutil import copyfile -from DDEXUI.file_parser import FileParser +from file_parser import FileParser from os import path, makedirs -from DDEXUI.ddex.resource import SoundRecording, Image +from ddex.resource import SoundRecording, Image class ResourceManager: def __init__(self, file_parser, batch_id, root_folder='.'): diff --git a/tkinterutil.py b/ddexui/tkinterutil.py similarity index 73% rename from tkinterutil.py rename to ddexui/tkinterutil.py index 9fe46d1..d26f881 100644 --- a/tkinterutil.py +++ b/ddexui/tkinterutil.py @@ -1,5 +1,9 @@ -import tkinter.ttk as tk -import tkinter.messagebox as mb +try: + import ttk as tk + import tkMessageBox as mb +except ImportError: + import tkinter.ttk as tk + import tkinter.messagebox as mb #thanks to http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/ #and http://stackoverflow.com/questions/6666882/tkinter-python-catching-exceptions diff --git a/metadata_form.py b/metadata_form.py index 0e5c7dd..555f47d 100755 --- a/metadata_form.py +++ b/metadata_form.py @@ -1,19 +1,29 @@ #!/usr/bin/python3.3 -import tkinter.ttk as tk -import tkinter.messagebox as mb -from DDEXUI.ddex.ddex_builder import DDEXBuilder -from DDEXUI.ddex.party import * -from DDEXUI.ddex.validate import Validate -from DDEXUI.party_repository import PartyRepository -from DDEXUI.inputs import * -from DDEXUI.release_window import ProductReleaseWindow -from DDEXUI.batch_generator import BatchGenerator -from DDEXUI.ddex.ddex import generate_batch_id -from DDEXUI.tkinterutil import showerrorbox -import sys +from Tkinter import Toplevel import os +import sys + +from ddex import generate_batch_id +from ddex.party import PartyType, Party +from ddex.validate import Validate +from ddexui.batch_generator import BatchGenerator +from ddexui.inputs import EntryInput +from ddexui.party_repository import PartyRepository +from ddexui.release_window import ProductReleaseWindow +from ddexui.tkinterutil import showerrorbox + + +try: + import Tkinter as tkinter + import ttk as tk + import tkMessageBox as mb +except ImportError as e: + print "IMPORT ERROR" + str(e) + import tkinter + import tkinter.ttk as tk + import tkinter.messagebox as mb -class PartyWindow(tk.tkinter.Toplevel): +class PartyWindow(Toplevel): def __init__(self, frame, party_type): #http://tkinter.unpythonic.net/wiki/ModalWindow self.party_repository = PartyRepository() @@ -44,12 +54,12 @@ class Program: def __init__(self): self.party_repository = PartyRepository() self._ddex_builders = [] - self.frame = tk.tkinter.Tk() + self.frame = tkinter.Tk() self.frame.geometry("600x300") - icon = tk.tkinter.PhotoImage(file=self.get_icon()) + icon = tkinter.PhotoImage(file=self.get_icon()) self.frame.tk.call("wm", "iconphoto", self.frame._w, icon) self.frame.title("Metadata Editor") - self.product_list = tk.tkinter.Listbox(self.frame) + self.product_list = tkinter.Listbox(self.frame) self.product_list.bind('', lambda x: self.remove_product()) self._root_folder = "out" self.add_release_button = tk.Button(self.frame, text="Add Product", command=self.create_ddex) @@ -82,7 +92,7 @@ def create_ddex(self): release_window.wait_window() ddex_builder = release_window.create_ddex() self._ddex_builders.append(ddex_builder) - self.product_list.insert(tk.tkinter.END, ddex_builder.get_upc()) + self.product_list.insert(tkinter.END, ddex_builder.get_upc()) self.remove_button['state'] = 'enabled' @showerrorbox diff --git a/requirements.txt b/requirements.txt index 2735c4c..7973cdd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,6 @@ -mutagenx>=1.21 +mutagen>=1.21 nose==1.3.0 pillow==2.2.1 -lxml==3.2.0 +lxml==3.4.1 +enum34==1.0.4 +cx_Freeze==4.3.4 \ No newline at end of file diff --git a/setup.py b/setup.py index 0178108..eb8c607 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,15 @@ -from cx_Freeze import setup, Executable -from os import path - -executables = [ - Executable('metadata_form.py') -] - -includes = [path.join('res', 'favicon.gif')] -print(includes) - -setup(name='DDEXUI', - version='0.1', - description='A user interface for distributing ddex deliveries', - executables=executables, - options = {'build_exe': {'include_files': includes}} - ) +from cx_Freeze import setup, Executable +from os import path + +executables = [ + Executable('metadata_form.py') +] + +includes = [path.join('res', 'favicon.gif')] + +setup(name='DDEXUI', + version='0.1', + description='A user interface for distributing ddex deliveries', + executables=executables, + options = {'build_exe': {'include_files': includes}} + ) From bc0d1675140ce6b76820fd2168368474a78bca2a Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 14:47:30 +0100 Subject: [PATCH 02/10] Modified classes errors. unit tests 86/87 --- ddex/file_metadata.py | 2 +- ddex/resource.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ddex/file_metadata.py b/ddex/file_metadata.py index 8abbb6d..8f90020 100644 --- a/ddex/file_metadata.py +++ b/ddex/file_metadata.py @@ -4,7 +4,7 @@ def __init__(self, md5, name, extension): self.name = name self.extension = extension -class ImageFileMetadata: +class ImageFileMetadata(FileMetadata): def __init__(self, md5, name, extension, width, height): FileMetadata.__init__(self, md5, name, extension) self.width = width diff --git a/ddex/resource.py b/ddex/resource.py index 9f110f6..53d3444 100644 --- a/ddex/resource.py +++ b/ddex/resource.py @@ -77,12 +77,12 @@ def __init__(self, resource_reference, id_value, file_metadata, technical_resour self.file_metadata = file_metadata def write(self): - resource = super().write() + resource = super(Image, self).write() self._append_technical_details(resource) return resource def _append_technical_details(self, resource): - technical_details = super()._append_technical_details(resource, self._technical_resource_details_reference) + technical_details = super(Image, self)._append_technical_details(resource, self._technical_resource_details_reference) self._append_element_with_text(technical_details, "ImageCodecType", self.file_metadata.codec) self._append_element_with_text(technical_details, "ImageHeight", str(self.file_metadata.height)) self._append_element_with_text(technical_details, "ImageWidth", str(self.file_metadata.width)) @@ -112,7 +112,7 @@ def __init__(self, resource_reference, isrc, title, file_metadata, technical_res self.file_metadata = file_metadata def write(self): - sound_recording = super().write() + sound_recording = super(SoundRecording, self).write() title = self._append_element_with_text(sound_recording, "ReferenceTitle") self._append_element_with_text(title, "TitleText", self.title) @@ -122,7 +122,7 @@ def write(self): return sound_recording def _append_technical_details(self, resource): - technical_details = super()._append_technical_details(resource, self._technical_resource_details_reference) + technical_details = super(SoundRecording, self)._append_technical_details(resource, self._technical_resource_details_reference) self._append_element_with_text(technical_details, "AudioCodecType", self.file_metadata.codec) self._append_file(technical_details, self.file_metadata) From 106af6af277fcab2769e8513a3e904a2a09109e3 Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 14:53:27 +0100 Subject: [PATCH 03/10] All tests pass --- ddex/tests/test_validates_against_ddex_schema.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ddex/tests/test_validates_against_ddex_schema.py b/ddex/tests/test_validates_against_ddex_schema.py index 5de05f3..523b6d9 100644 --- a/ddex/tests/test_validates_against_ddex_schema.py +++ b/ddex/tests/test_validates_against_ddex_schema.py @@ -1,5 +1,6 @@ from datetime import date import os +import errno import unittest from ddex import DDEX @@ -14,7 +15,14 @@ class DDEXSchemaValidation(unittest.TestCase): def test_created_ddex_files_validate_against_ddex_xsd(self): #helped by http://alex-sansom.info/content/validating-xml-against-xml-schema-python - output_file = "/tmp/file.xml" + output_file = os.path.join(os.path.dirname(__file__), "tmp", "file.xml") + try: + os.makedirs(os.path.dirname(output_file)) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(os.path.dirname(output_file)): + pass + else: + raise release = self.create_product_release() @@ -30,7 +38,7 @@ def test_created_ddex_files_validate_against_ddex_xsd(self): tree = ET.parse(output_file) #original schema at http://ddex.net/xml/ern/341/release-notification.xsd - schema = ET.XMLSchema(file="ddex/tests/resources/xsds/release-notification.xsd") + schema = ET.XMLSchema(file=os.path.join(os.path.dirname(__file__), "resources", "xsds", "release-notification.xsd")) schema.assertValid(tree) def create_product_release(self): From 6af03917b0b125e55f84a3cfedb5743b559d3717 Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 15:15:09 +0100 Subject: [PATCH 04/10] Improved indentation --- ddex/ddex_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddex/ddex_builder.py b/ddex/ddex_builder.py index 9229165..ca70562 100644 --- a/ddex/ddex_builder.py +++ b/ddex/ddex_builder.py @@ -39,7 +39,7 @@ def build(self): def get_upc(self): try: - return list(filter(lambda release: release.release_id.type == ReleaseIdType.Upc, self._releases))[0].release_id.id + return list(filter(lambda release: release.release_id.type == ReleaseIdType.Upc, self._releases))[0].release_id.id except Exception as e: print("No product release!") raise e From ff04643d79f99bfc02ee2b403b3f3918b6a97f21 Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 15:23:51 +0100 Subject: [PATCH 05/10] Formatting improvement --- .gitignore | 7 ++++--- ddex/tests/test_party.py | 2 -- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 6eeaa59..8072fd6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -__pycache__ -*.swp -ddexui +__pycache__ +*.swp +ddexui *.swn *.swo out @@ -8,3 +8,4 @@ PIL build EGG-INFO eggs.pth +/wheelhouse/ diff --git a/ddex/tests/test_party.py b/ddex/tests/test_party.py index ddce99b..7e0c1c1 100644 --- a/ddex/tests/test_party.py +++ b/ddex/tests/test_party.py @@ -10,5 +10,3 @@ def test_should_serialise_correctly(self): party_element = self.party.write() self.assertEqual(party_element.find('./PartyId').text, 'gdfg42jkdz') self.assertEqual(party_element.find('./PartyName/FullName').text, 'Sony') - - From 9a81f97a8f1bca6153fcdf9125d656f476f58824 Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 15:45:17 +0100 Subject: [PATCH 06/10] Fixed some tkinter issues --- ddexui/deal_window.py | 2 +- ddexui/inputs.py | 10 ++++++---- ddexui/party_repository.py | 8 ++++++-- ddexui/release_window.py | 20 ++++++++++---------- ddexui/tkinterutil.py | 4 ++++ metadata_form.py | 7 ++++--- 6 files changed, 31 insertions(+), 20 deletions(-) diff --git a/ddexui/deal_window.py b/ddexui/deal_window.py index 8f5e637..7ec6f3e 100644 --- a/ddexui/deal_window.py +++ b/ddexui/deal_window.py @@ -39,7 +39,7 @@ def create_deal(self): #todo: remove duplication of these 2 methods def value_of(self, title): - row = next(filter(lambda x: x.title == title,self.fields)) + row = next(iter(filter(lambda x: x.title == title,self.fields))) return row.value() def all_release_fields_valid(self): diff --git a/ddexui/inputs.py b/ddexui/inputs.py index b6a0caf..bf1814c 100644 --- a/ddexui/inputs.py +++ b/ddexui/inputs.py @@ -1,13 +1,15 @@ try: import ttk as tk + from Tkinter import Label, StringVar, BooleanVar, W except ImportError: import tkinter.ttk as tk + from tkinter import Label, StringVar, BooleanVar, W class InputRow: def __init__(self, frame, title): self.frame = frame - self.error_label = tk.tkinter.Label(self.frame, fg="red", width=50) - self.v = tk.tkinter.StringVar() + self.error_label = Label(self.frame, fg="red", width=50) + self.v = StringVar() self.title = title self.input = None @@ -35,7 +37,7 @@ def draw(self,row): class CheckboxInput(InputRow): def __init__(self, frame, title): InputRow.__init__(self, frame, title) - self.v = tk.tkinter.BooleanVar() + self.v = BooleanVar() self.v.set(False) self.input = tk.Checkbutton(self.frame, variable=self.v, text=title) @@ -62,7 +64,7 @@ def value(self): def draw(self,row): InputRow.draw(self, row) - self.label.grid(row=row, column=0,sticky=tk.tkinter.W) + self.label.grid(row=row, column=0,sticky=W) def on_invalidate(self, message): self.error_label["text"] = message diff --git a/ddexui/party_repository.py b/ddexui/party_repository.py index 5769eda..a7422d2 100644 --- a/ddexui/party_repository.py +++ b/ddexui/party_repository.py @@ -1,12 +1,16 @@ -from ddex.party import Party +import os import sqlite3 +from ddex.party import Party + + class PartyRepository: def __init__(self): self.__with_cursor(lambda cursor, connection: cursor.execute("CREATE TABLE IF NOT EXISTS party(name text, partyId text, partyType integer)")) def __get_connection(self): - return sqlite3.connect("ddexui") + print "opening" + os.path.join(os.path.dirname(os.path.dirname(__file__)), "ddexui.db") + return sqlite3.connect(os.path.join(os.path.dirname(os.path.dirname(__file__)), "ddexui.db")) def get_party(self, party_type): connection = self.__get_connection() diff --git a/ddexui/release_window.py b/ddexui/release_window.py index 175cedd..02a7ffe 100644 --- a/ddexui/release_window.py +++ b/ddexui/release_window.py @@ -1,26 +1,26 @@ try: import ttk as tk - from Tkinter import Toplevel + from Tkinter import Toplevel, Listbox, Label from tkFileDialog import askopenfilename except ImportError: import tkinter.ttk as tk - from tk.tkinter import Toplevel + from tk.tkinter import Toplevel, Listbox, Label from tkinter.filedialog import askopenfilename from PIL import Image, ImageTk from ddex.release_builder import ReleaseBuilder from ddex.validate import Validate -from inputs import * +from ddexui.inputs import * from ddex.release import * from deal_window import DealWindow -from file_parser import FileParser -from tkinterutil import showerrorbox -from resource_manager import ResourceManager -from product_service import ProductService +from ddexui.file_parser import FileParser +from ddexui.tkinterutil import showerrorbox +from ddexui.resource_manager import ResourceManager +from ddexui.product_service import ProductService class ReleaseWindow(Toplevel): def __init__(self, frame): - tk.tkinter.Toplevel.__init__(self, frame) + Toplevel.__init__(self, frame) self._release_builder = ReleaseBuilder() self.fields = ([ EntryInput(self, "Title", Validate().not_empty), @@ -62,12 +62,12 @@ def __init__(self, frame, root_folder, batch_id): self.delete_track_button.grid(row=self.new_row(), column=0) self.add_img_button = tk.Button(self, text="Album Artwork", command=self.add_image).grid(row=self.new_row(), column=0) self.button = tk.Button(self, text="OK", command=self.__destroy_if_valid).grid(row=self.new_row(), column=0) - self.track_list = tk.tkinter.Listbox(self) + self.track_list = Listbox(self) self.track_list.bind('', lambda x: self.remove_track()) track_list_row = self.new_row() self.track_list.grid(row=track_list_row, column=0) - self.artwork = tk.tkinter.Label(self) + self.artwork = Label(self) self.artwork.grid(row=track_list_row, column=1) self.draw_tracks() diff --git a/ddexui/tkinterutil.py b/ddexui/tkinterutil.py index d26f881..8d22fd9 100644 --- a/ddexui/tkinterutil.py +++ b/ddexui/tkinterutil.py @@ -1,3 +1,6 @@ +import traceback + + try: import ttk as tk import tkMessageBox as mb @@ -13,6 +16,7 @@ def run(*args, **kwargs): func(*args, **kwargs) except Exception as e: print(e) + traceback.print_exc() mb.showerror("Error", e) raise e return run diff --git a/metadata_form.py b/metadata_form.py index 555f47d..6a04cc5 100755 --- a/metadata_form.py +++ b/metadata_form.py @@ -1,5 +1,4 @@ #!/usr/bin/python3.3 -from Tkinter import Toplevel import os import sys @@ -15,11 +14,13 @@ try: import Tkinter as tkinter + from Tkinter import Toplevel, Label import ttk as tk import tkMessageBox as mb except ImportError as e: print "IMPORT ERROR" + str(e) import tkinter + from tkinter import Toplevel, Label import tkinter.ttk as tk import tkinter.messagebox as mb @@ -28,13 +29,13 @@ def __init__(self, frame, party_type): #http://tkinter.unpythonic.net/wiki/ModalWindow self.party_repository = PartyRepository() self.party_type = party_type - tk.tkinter.Toplevel.__init__(self, frame) + Toplevel.__init__(self, frame) # self.geometry("400x300") self.transient(frame) self.focus_set() #self.grab_set() message = "Please enter your " + PartyType.reverse_mapping[self.party_type] + " ddex party details. You can apply for a ddex Party id for free at: http://ddex.net/content/implementation-licence-application-form" - text = tk.tkinter.Label(self, height=5, text=message, wraplength=400) + text = Label(self, height=5, text=message, wraplength=400) text.grid(row=0, column=0,columnspan=3) self.party_id = EntryInput(self, "Party Id", Validate().not_empty) self.party_name = EntryInput(self, "Party Name", Validate().not_empty) From 968cd5c8b7a87642cf5898615551ecd07ae7e400 Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 16:13:48 +0100 Subject: [PATCH 07/10] Removed init in root dir renamed database from ddexui to ddexui.db (conflict with directory name) --- __init__.py | 0 ddex/tests/test_party_repository.py | 2 +- ddexui/party_repository.py | 3 +-- 3 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 __init__.py diff --git a/__init__.py b/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ddex/tests/test_party_repository.py b/ddex/tests/test_party_repository.py index bf038ef..3ad0a51 100644 --- a/ddex/tests/test_party_repository.py +++ b/ddex/tests/test_party_repository.py @@ -13,7 +13,7 @@ def setUp(self): self.party = Party('IDIDIDO', 'Some Label Name', PartyType.MessageSender) def __get_connection(self): - return sqlite3.connect("ddexui") + return sqlite3.connect("ddexui.db") def tearDown(self): c = self.__get_connection() diff --git a/ddexui/party_repository.py b/ddexui/party_repository.py index a7422d2..c000fbd 100644 --- a/ddexui/party_repository.py +++ b/ddexui/party_repository.py @@ -9,8 +9,7 @@ def __init__(self): self.__with_cursor(lambda cursor, connection: cursor.execute("CREATE TABLE IF NOT EXISTS party(name text, partyId text, partyType integer)")) def __get_connection(self): - print "opening" + os.path.join(os.path.dirname(os.path.dirname(__file__)), "ddexui.db") - return sqlite3.connect(os.path.join(os.path.dirname(os.path.dirname(__file__)), "ddexui.db")) + return sqlite3.connect("ddexui.db") def get_party(self, party_type): connection = self.__get_connection() From f2057d5a82d55d796655a86ec7a22a0d5a021a33 Mon Sep 17 00:00:00 2001 From: Flavian Date: Sun, 18 Jan 2015 16:20:23 +0100 Subject: [PATCH 08/10] Fixed some imports errors --- ddexui/batch_generator.py | 2 +- ddexui/deal_window.py | 2 +- ddexui/file_parser.py | 2 +- ddexui/party_repository.py | 1 - ddexui/release_window.py | 2 +- ddexui/resource_manager.py | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ddexui/batch_generator.py b/ddexui/batch_generator.py index ff4cd7e..a583c09 100644 --- a/ddexui/batch_generator.py +++ b/ddexui/batch_generator.py @@ -1,6 +1,6 @@ import os from os import path -from ddex import generate_batch_id + class BatchGenerator: def __init__(self, root_folder, batch_id): diff --git a/ddexui/deal_window.py b/ddexui/deal_window.py index 7ec6f3e..d4aec9b 100644 --- a/ddexui/deal_window.py +++ b/ddexui/deal_window.py @@ -1,7 +1,7 @@ import ddex.deal as deal from ddexui.inputs import OptionInput, EntryInput from ddex.validate import Validate -from tkinterutil import showerrorbox +from ddexui.tkinterutil import showerrorbox try: import ttk as tk diff --git a/ddexui/file_parser.py b/ddexui/file_parser.py index 27cc706..6f2878f 100644 --- a/ddexui/file_parser.py +++ b/ddexui/file_parser.py @@ -1,4 +1,4 @@ -from ddex.file_metadata import * +from ddex.file_metadata import AudioFileMetadata, ImageFileMetadata from mutagen.mp3 import MP3 from PIL import Image import hashlib diff --git a/ddexui/party_repository.py b/ddexui/party_repository.py index c000fbd..c6001ea 100644 --- a/ddexui/party_repository.py +++ b/ddexui/party_repository.py @@ -1,4 +1,3 @@ -import os import sqlite3 from ddex.party import Party diff --git a/ddexui/release_window.py b/ddexui/release_window.py index 02a7ffe..f3fe851 100644 --- a/ddexui/release_window.py +++ b/ddexui/release_window.py @@ -11,7 +11,7 @@ from ddex.validate import Validate from ddexui.inputs import * from ddex.release import * -from deal_window import DealWindow +from ddexui.deal_window import DealWindow from ddexui.file_parser import FileParser from ddexui.tkinterutil import showerrorbox from ddexui.resource_manager import ResourceManager diff --git a/ddexui/resource_manager.py b/ddexui/resource_manager.py index e4a0074..92f816b 100644 --- a/ddexui/resource_manager.py +++ b/ddexui/resource_manager.py @@ -1,5 +1,5 @@ from shutil import copyfile -from file_parser import FileParser +from ddexui.file_parser import FileParser from os import path, makedirs from ddex.resource import SoundRecording, Image From 588dd3af36113de59ade4ea41c2f206ed8e5f4eb Mon Sep 17 00:00:00 2001 From: Flavian Date: Mon, 19 Jan 2015 00:17:55 +0100 Subject: [PATCH 09/10] Fixes line endings --- ddex/tests/resources/ddex-sample.xml | 6059 +++++++++++++++++++++++++- unpackEgg.py | 50 +- 2 files changed, 6083 insertions(+), 26 deletions(-) diff --git a/ddex/tests/resources/ddex-sample.xml b/ddex/tests/resources/ddex-sample.xml index bffadc1..1549930 100644 --- a/ddex/tests/resources/ddex-sample.xml +++ b/ddex/tests/resources/ddex-sample.xml @@ -1 +1,6058 @@ - MyMessageThreadId MyMessageId MyPartyId ICanHaz Music Group MyPartyId ICanHaz Music Group 2140 2140-IMadeUA-MP3 2012-06-08T04:00:31Z TestMessage UpdateMessage MusicalWorkSoundRecording US82M0754801 A1 Destination PT5M7.000S Worldwide <TitleText>Destination</TitleText> <TitleText>Destination</TitleText> Messages 448566 MainArtist Me Iz Label IR A Majr 2007 2007 The Me Iz Label Alternative Rock NoAdviceAvailable T1 MP3 256 2 44.1 false 93 PT0H2M28.000S Informative myfile1.mp3 /resources 4c342562837456fff325434e325a24cf MD5 MusicalWorkSoundRecording ISRC_Woot A2 TitleGoesHere PT6M6.000S Worldwide <TitleText>TitleGoesHere</TitleText> <TitleText>TitleGoesHere</TitleText> Messages 448566 MainArtist Me Iz Label IR A Majr 2007 2007 The Me Iz Label Alternative Rock NoAdviceAvailable FrontCoverImage ICPN_VALUE.jpg A3 Worldwide T2 JPEG 480 640 ICPN_VALUE.jpg /resources e2h23d23e32a65463245634ff27364cc MD5 GRID_NUMBER ICPN_VALUE R0 Album Title? A1 A2 A3 Single Worldwide Messages Me Iz Label IR A Majr <TitleText>Album Title?</TitleText> <TitleText>Album Title?</TitleText> <TitleText>Album Title?</TitleText> Messages 448566 MainArtist NoAdviceAvailable 1 1 SoundRecording A1 2 SoundRecording A2 Image A3 Alternative Rock 2007-08-28 Messages Album Title? Alternative Rock 2007 2007 The Me Iz Label 2007 2007 The Me Iz Label A10302B00004247715 US82M0754801 R1 Destination A1 TrackRelease Worldwide Messages Me Iz Label IR A Majr <TitleText>Destination</TitleText> <TitleText>Destination</TitleText> Messages 448566 MainArtist 1 1 SoundRecording A1 Alternative Rock Messages Destination Alternative Rock 2007 2007 The Me Iz Label A10302B00004247723 ISRC_Woot R2 TitleGoesHere A2 TrackRelease Worldwide Messages Me Iz Label IR A Majr <TitleText>TitleGoesHere</TitleText> <TitleText>TitleGoesHere</TitleText> Messages 448566 MainArtist 1 1 SoundRecording A2 Alternative Rock Messages TitleGoesHere Alternative Rock 2007 2007 The Me Iz Label R0 AdvertisementSupportedModel NonInteractiveStream OnDemandStream AT 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload AT 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload AT Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream AU 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload AU 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload AU Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream BE 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload BE 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload BE Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream BG 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload BG 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload BG Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CA 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CA 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload CA Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CH 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CH 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload CH Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CY 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CY 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload CY Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CZ 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CZ 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload CZ Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream DE 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload DE 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload DE Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream DK 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload DK 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload DK Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream EE 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload EE 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload EE Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream ES 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload ES 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload ES Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream FI 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload FI 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload FI Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream FR 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload FR 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload FR Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream GB 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload GB 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload GB Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream GR 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload GR 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload GR Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream HU 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload HU 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload HU Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream ID 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload ID 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload ID Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IE 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IE 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload IE Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IS 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IS 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload IS Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IT 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IT 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload IT Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LI 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LI 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload LI Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LT 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LT 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload LT Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LU 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LU 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload LU Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LV 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LV 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload LV Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream MT 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload MT 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload MT Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream MY 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload MY 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload MY Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NL 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NL 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload NL Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NO 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NO 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload NO Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NZ 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NZ 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload NZ Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream PL 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload PL 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload PL Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream PT 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload PT 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload PT Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream RO 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload RO 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload RO Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SE 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SE 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload SE Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SG 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SG 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload SG Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SI 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SI 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload SI Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SK 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SK 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload SK Q5 A08 2007-08-28 2007-08-14 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream TH 2007-08-28 2007-08-14 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload TH 2007-08-28 2007-08-14 2007-08-28 PayAsYouGoModel PermanentDownload TH Q5 A08 2007-08-28 2007-08-14 2007-08-28 true US 2012-06-08 R1 AdvertisementSupportedModel NonInteractiveStream OnDemandStream AT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload AT 2007-08-28 PayAsYouGoModel PermanentDownload AT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream AU 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload AU 2007-08-28 PayAsYouGoModel PermanentDownload AU Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream BE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload BE 2007-08-28 PayAsYouGoModel PermanentDownload BE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream BG 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload BG 2007-08-28 PayAsYouGoModel PermanentDownload BG Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CA 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CA 2007-08-28 PayAsYouGoModel PermanentDownload CA Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CH 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CH 2007-08-28 PayAsYouGoModel PermanentDownload CH Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CY 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CY 2007-08-28 PayAsYouGoModel PermanentDownload CY Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CZ 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CZ 2007-08-28 PayAsYouGoModel PermanentDownload CZ Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream DE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload DE 2007-08-28 PayAsYouGoModel PermanentDownload DE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream DK 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload DK 2007-08-28 PayAsYouGoModel PermanentDownload DK Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream EE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload EE 2007-08-28 PayAsYouGoModel PermanentDownload EE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream ES 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload ES 2007-08-28 PayAsYouGoModel PermanentDownload ES Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream FI 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload FI 2007-08-28 PayAsYouGoModel PermanentDownload FI Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream FR 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload FR 2007-08-28 PayAsYouGoModel PermanentDownload FR Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream GB 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload GB 2007-08-28 PayAsYouGoModel PermanentDownload GB Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream GR 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload GR 2007-08-28 PayAsYouGoModel PermanentDownload GR Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream HU 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload HU 2007-08-28 PayAsYouGoModel PermanentDownload HU Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream ID 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload ID 2007-08-28 PayAsYouGoModel PermanentDownload ID Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IE 2007-08-28 PayAsYouGoModel PermanentDownload IE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IS 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IS 2007-08-28 PayAsYouGoModel PermanentDownload IS Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IT 2007-08-28 PayAsYouGoModel PermanentDownload IT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LI 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LI 2007-08-28 PayAsYouGoModel PermanentDownload LI Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LT 2007-08-28 PayAsYouGoModel PermanentDownload LT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LU 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LU 2007-08-28 PayAsYouGoModel PermanentDownload LU Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LV 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LV 2007-08-28 PayAsYouGoModel PermanentDownload LV Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream MT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload MT 2007-08-28 PayAsYouGoModel PermanentDownload MT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream MY 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload MY 2007-08-28 PayAsYouGoModel PermanentDownload MY Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NL 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NL 2007-08-28 PayAsYouGoModel PermanentDownload NL Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NO 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NO 2007-08-28 PayAsYouGoModel PermanentDownload NO Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NZ 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NZ 2007-08-28 PayAsYouGoModel PermanentDownload NZ Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream PL 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload PL 2007-08-28 PayAsYouGoModel PermanentDownload PL Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream PT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload PT 2007-08-28 PayAsYouGoModel PermanentDownload PT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream RO 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload RO 2007-08-28 PayAsYouGoModel PermanentDownload RO Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SE 2007-08-28 PayAsYouGoModel PermanentDownload SE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SG 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SG 2007-08-28 PayAsYouGoModel PermanentDownload SG Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SI 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SI 2007-08-28 PayAsYouGoModel PermanentDownload SI Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SK 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SK 2007-08-28 PayAsYouGoModel PermanentDownload SK Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream TH 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload TH 2007-08-28 PayAsYouGoModel PermanentDownload TH Q5 S02 2007-08-28 true US 2012-06-08 R2 AdvertisementSupportedModel NonInteractiveStream OnDemandStream AT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload AT 2007-08-28 PayAsYouGoModel PermanentDownload AT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream AU 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload AU 2007-08-28 PayAsYouGoModel PermanentDownload AU Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream BE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload BE 2007-08-28 PayAsYouGoModel PermanentDownload BE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream BG 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload BG 2007-08-28 PayAsYouGoModel PermanentDownload BG Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CA 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CA 2007-08-28 PayAsYouGoModel PermanentDownload CA Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CH 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CH 2007-08-28 PayAsYouGoModel PermanentDownload CH Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CY 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CY 2007-08-28 PayAsYouGoModel PermanentDownload CY Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream CZ 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload CZ 2007-08-28 PayAsYouGoModel PermanentDownload CZ Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream DE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload DE 2007-08-28 PayAsYouGoModel PermanentDownload DE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream DK 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload DK 2007-08-28 PayAsYouGoModel PermanentDownload DK Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream EE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload EE 2007-08-28 PayAsYouGoModel PermanentDownload EE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream ES 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload ES 2007-08-28 PayAsYouGoModel PermanentDownload ES Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream FI 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload FI 2007-08-28 PayAsYouGoModel PermanentDownload FI Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream FR 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload FR 2007-08-28 PayAsYouGoModel PermanentDownload FR Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream GB 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload GB 2007-08-28 PayAsYouGoModel PermanentDownload GB Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream GR 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload GR 2007-08-28 PayAsYouGoModel PermanentDownload GR Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream HU 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload HU 2007-08-28 PayAsYouGoModel PermanentDownload HU Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream ID 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload ID 2007-08-28 PayAsYouGoModel PermanentDownload ID Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IE 2007-08-28 PayAsYouGoModel PermanentDownload IE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IS 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IS 2007-08-28 PayAsYouGoModel PermanentDownload IS Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream IT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload IT 2007-08-28 PayAsYouGoModel PermanentDownload IT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LI 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LI 2007-08-28 PayAsYouGoModel PermanentDownload LI Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LT 2007-08-28 PayAsYouGoModel PermanentDownload LT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LU 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LU 2007-08-28 PayAsYouGoModel PermanentDownload LU Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream LV 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload LV 2007-08-28 PayAsYouGoModel PermanentDownload LV Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream MT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload MT 2007-08-28 PayAsYouGoModel PermanentDownload MT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream MY 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload MY 2007-08-28 PayAsYouGoModel PermanentDownload MY Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NL 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NL 2007-08-28 PayAsYouGoModel PermanentDownload NL Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NO 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NO 2007-08-28 PayAsYouGoModel PermanentDownload NO Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream NZ 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload NZ 2007-08-28 PayAsYouGoModel PermanentDownload NZ Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream PL 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload PL 2007-08-28 PayAsYouGoModel PermanentDownload PL Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream PT 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload PT 2007-08-28 PayAsYouGoModel PermanentDownload PT Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream RO 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload RO 2007-08-28 PayAsYouGoModel PermanentDownload RO Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SE 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SE 2007-08-28 PayAsYouGoModel PermanentDownload SE Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SG 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SG 2007-08-28 PayAsYouGoModel PermanentDownload SG Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SI 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SI 2007-08-28 PayAsYouGoModel PermanentDownload SI Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream SK 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload SK 2007-08-28 PayAsYouGoModel PermanentDownload SK Q5 S02 2007-08-28 AdvertisementSupportedModel NonInteractiveStream OnDemandStream TH 2007-08-28 SubscriptionModel NonInteractiveStream OnDemandStream ConditionalDownload TH 2007-08-28 PayAsYouGoModel PermanentDownload TH Q5 S02 2007-08-28 true US 2012-06-08 \ No newline at end of file + + + + MyMessageThreadId + MyMessageId + + MyPartyId + + ICanHaz Music Group + + + + MyPartyId + + ICanHaz Music Group + + + + 2140 + + 2140-IMadeUA-MP3 + + + 2012-06-08T04:00:31Z + TestMessage + + UpdateMessage + + + MusicalWorkSoundRecording + + US82M0754801 + + A1 + + Destination + + PT5M7.000S + + Worldwide + + <TitleText>Destination</TitleText> + + + <TitleText>Destination</TitleText> + + + + Messages + + 448566 + MainArtist + + Me Iz Label + IR A Majr + + 2007 + 2007 The Me Iz Label + + + Alternative Rock + + NoAdviceAvailable + + T1 + MP3 + 256 + 2 + 44.1 + false + + 93 + PT0H2M28.000S + Informative + + + myfile1.mp3 + /resources + + 4c342562837456fff325434e325a24cf + MD5 + + + + + + + MusicalWorkSoundRecording + + ISRC_Woot + + A2 + + TitleGoesHere + + PT6M6.000S + + Worldwide + + <TitleText>TitleGoesHere</TitleText> + + + <TitleText>TitleGoesHere</TitleText> + + + + Messages + + 448566 + MainArtist + + Me Iz Label + IR A Majr + + 2007 + 2007 The Me Iz Label + + + Alternative Rock + + NoAdviceAvailable + + + + FrontCoverImage + + ICPN_VALUE.jpg + + A3 + + Worldwide + + T2 + JPEG + 480 + 640 + + ICPN_VALUE.jpg + /resources + + e2h23d23e32a65463245634ff27364cc + MD5 + + + + + + + + + + GRID_NUMBER + ICPN_VALUE + + R0 + + Album Title? + + + A1 + A2 + A3 + + Single + + Worldwide + Messages + Me Iz Label + IR A Majr + + <TitleText>Album Title?</TitleText> + + + <TitleText>Album Title?</TitleText> + + + <TitleText>Album Title?</TitleText> + + + + Messages + + 448566 + MainArtist + + NoAdviceAvailable + + + 1 + + 1 + SoundRecording + A1 + + + 2 + SoundRecording + A2 + + + + Image + A3 + + + + Alternative Rock + + 2007-08-28 + Messages Album Title? Alternative Rock + + + 2007 + 2007 The Me Iz Label + + + 2007 + 2007 The Me Iz Label + + + + + A10302B00004247715 + US82M0754801 + + R1 + + Destination + + + A1 + + TrackRelease + + Worldwide + Messages + Me Iz Label + IR A Majr + + <TitleText>Destination</TitleText> + + + <TitleText>Destination</TitleText> + + + + Messages + + 448566 + MainArtist + + + 1 + + 1 + SoundRecording + A1 + + + + Alternative Rock + + Messages Destination Alternative Rock + + + 2007 + 2007 The Me Iz Label + + + + + A10302B00004247723 + ISRC_Woot + + R2 + + TitleGoesHere + + + A2 + + TrackRelease + + Worldwide + Messages + Me Iz Label + IR A Majr + + <TitleText>TitleGoesHere</TitleText> + + + <TitleText>TitleGoesHere</TitleText> + + + + Messages + + 448566 + MainArtist + + + 1 + + 1 + SoundRecording + A2 + + + + Alternative Rock + + Messages TitleGoesHere Alternative Rock + + + 2007 + 2007 The Me Iz Label + + + + + + R0 + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + AT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + AT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + AT + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + AU + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + AU + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + AU + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + BE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + BE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + BE + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + BG + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + BG + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + BG + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CA + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CA + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + CA + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CH + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CH + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + CH + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CY + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CY + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + CY + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CZ + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CZ + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + CZ + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + DE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + DE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + DE + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + DK + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + DK + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + DK + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + EE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + EE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + EE + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + ES + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + ES + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + ES + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + FI + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + FI + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + FI + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + FR + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + FR + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + FR + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + GB + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + GB + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + GB + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + GR + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + GR + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + GR + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + HU + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + HU + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + HU + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + ID + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + ID + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + ID + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + IE + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IS + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IS + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + IS + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + IT + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LI + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LI + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + LI + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + LT + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LU + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LU + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + LU + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LV + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LV + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + LV + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + MT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + MT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + MT + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + MY + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + MY + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + MY + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NL + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NL + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + NL + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NO + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NO + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + NO + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NZ + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NZ + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + NZ + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + PL + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + PL + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + PL + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + PT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + PT + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + PT + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + RO + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + RO + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + RO + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SE + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + SE + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SG + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SG + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + SG + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SI + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SI + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + SI + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SK + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SK + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + SK + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + TH + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + TH + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + PayAsYouGoModel + + PermanentDownload + + TH + + Q5 + A08 + + + 2007-08-28 + + 2007-08-14 + 2007-08-28 + + + + + + + true + US + + 2012-06-08 + + + + + + R1 + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + AT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + AT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + AT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + AU + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + AU + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + AU + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + BE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + BE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + BE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + BG + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + BG + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + BG + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CA + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CA + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CA + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CH + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CH + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CH + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CY + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CY + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CY + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CZ + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CZ + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CZ + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + DE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + DE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + DE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + DK + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + DK + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + DK + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + EE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + EE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + EE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + ES + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + ES + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + ES + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + FI + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + FI + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + FI + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + FR + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + FR + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + FR + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + GB + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + GB + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + GB + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + GR + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + GR + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + GR + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + HU + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + HU + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + HU + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + ID + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + ID + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + ID + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + IE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IS + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IS + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + IS + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + IT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LI + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LI + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LI + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LU + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LU + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LU + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LV + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LV + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LV + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + MT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + MT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + MT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + MY + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + MY + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + MY + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NL + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NL + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + NL + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NO + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NO + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + NO + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NZ + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NZ + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + NZ + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + PL + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + PL + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + PL + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + PT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + PT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + PT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + RO + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + RO + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + RO + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SG + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SG + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SG + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SI + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SI + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SI + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SK + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SK + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SK + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + TH + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + TH + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + TH + + Q5 + S02 + + + 2007-08-28 + + + + + + + + true + US + + 2012-06-08 + + + + + + R2 + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + AT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + AT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + AT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + AU + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + AU + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + AU + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + BE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + BE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + BE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + BG + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + BG + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + BG + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CA + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CA + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CA + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CH + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CH + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CH + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CY + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CY + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CY + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + CZ + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + CZ + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + CZ + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + DE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + DE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + DE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + DK + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + DK + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + DK + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + EE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + EE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + EE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + ES + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + ES + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + ES + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + FI + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + FI + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + FI + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + FR + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + FR + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + FR + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + GB + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + GB + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + GB + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + GR + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + GR + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + GR + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + HU + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + HU + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + HU + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + ID + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + ID + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + ID + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + IE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IS + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IS + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + IS + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + IT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + IT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + IT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LI + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LI + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LI + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LU + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LU + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LU + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + LV + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + LV + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + LV + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + MT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + MT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + MT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + MY + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + MY + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + MY + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NL + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NL + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + NL + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NO + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NO + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + NO + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + NZ + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + NZ + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + NZ + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + PL + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + PL + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + PL + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + PT + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + PT + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + PT + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + RO + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + RO + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + RO + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SE + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SE + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SE + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SG + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SG + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SG + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SI + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SI + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SI + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + SK + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + SK + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + SK + + Q5 + S02 + + + 2007-08-28 + + + + + + + + + AdvertisementSupportedModel + + NonInteractiveStream + OnDemandStream + + TH + + 2007-08-28 + + + + + + + SubscriptionModel + + NonInteractiveStream + OnDemandStream + ConditionalDownload + + TH + + 2007-08-28 + + + + + + + PayAsYouGoModel + + PermanentDownload + + TH + + Q5 + S02 + + + 2007-08-28 + + + + + + + + true + US + + 2012-06-08 + + + + + + \ No newline at end of file diff --git a/unpackEgg.py b/unpackEgg.py index cec5e58..21612ba 100644 --- a/unpackEgg.py +++ b/unpackEgg.py @@ -1,25 +1,25 @@ -import os -import pkg_resources -import sys -from setuptools.archive_util import unpack_archive - -def unpackEgg(modulo): - eggs = pkg_resources.require(modulo) - for egg in eggs: - if os.path.isdir(egg.location): - sys.path.insert(0, egg.location) - continue - unpack_archive(egg.location, ".") - eggpacks = set() - eggspth = open("./eggs.pth", "w") - for egg in eggs: - eggspth.write(os.path.basename(egg.location)) - eggspth.write("\n") - eggpacks.update(egg.get_metadata_lines("top_level.txt")) - eggspth.close() - - eggpacks.clear() - -if __name__ == '__main__': - unpackEgg(sys.argv[1]) - +import os +import pkg_resources +import sys +from setuptools.archive_util import unpack_archive + +def unpackEgg(modulo): + eggs = pkg_resources.require(modulo) + for egg in eggs: + if os.path.isdir(egg.location): + sys.path.insert(0, egg.location) + continue + unpack_archive(egg.location, ".") + eggpacks = set() + eggspth = open("./eggs.pth", "w") + for egg in eggs: + eggspth.write(os.path.basename(egg.location)) + eggspth.write("\n") + eggpacks.update(egg.get_metadata_lines("top_level.txt")) + eggspth.close() + + eggpacks.clear() + +if __name__ == '__main__': + unpackEgg(sys.argv[1]) + From 54dc2c9a313cfaf100c73a48e0aefa0f4a74c596 Mon Sep 17 00:00:00 2001 From: Flavian Date: Mon, 19 Jan 2015 17:16:28 +0100 Subject: [PATCH 10/10] Fixes ignored init --- ddexui/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ddexui/__init__.py diff --git a/ddexui/__init__.py b/ddexui/__init__.py new file mode 100644 index 0000000..e69de29