xbmc-sql 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +20 -0
  5. data/CHANGELOG.markdown +5 -0
  6. data/Gemfile +9 -0
  7. data/Guardfile +13 -0
  8. data/LICENSE +20 -0
  9. data/README.markdown +92 -0
  10. data/Rakefile +49 -0
  11. data/app/models/xbmc_sql/base.rb +45 -0
  12. data/app/models/xbmc_sql/file.rb +17 -0
  13. data/app/models/xbmc_sql/movie.rb +78 -0
  14. data/app/models/xbmc_sql/path.rb +33 -0
  15. data/app/models/xbmc_sql/set.rb +9 -0
  16. data/bin/rails +12 -0
  17. data/lib/tasks/xbmc_sql_tasks.rake +13 -0
  18. data/lib/xbmc_sql.rb +34 -0
  19. data/lib/xbmc_sql/engine.rb +13 -0
  20. data/lib/xbmc_sql/nfo_file.rb +76 -0
  21. data/lib/xbmc_sql/rating_updater.rb +36 -0
  22. data/lib/xbmc_sql/top_250_updater.rb +102 -0
  23. data/lib/xbmc_sql/version.rb +3 -0
  24. data/spec/factories/movie.rb +5 -0
  25. data/spec/factories/path.rb +5 -0
  26. data/spec/fixtures/movie.nfo +595 -0
  27. data/spec/fixtures/movie.nfo.bak +595 -0
  28. data/spec/fixtures/movie.tmp.nfo +595 -0
  29. data/spec/lib/xbmc_sql/nfo_file_spec.rb +62 -0
  30. data/spec/lib/xbmc_sql/rating_updater_spec.rb +48 -0
  31. data/spec/lib/xbmc_sql/top_250_updater_spec.rb +49 -0
  32. data/spec/lib/xbmc_sql_spec.rb +29 -0
  33. data/spec/models/xbmc_sql/base_spec.rb +7 -0
  34. data/spec/models/xbmc_sql/file_spec.rb +16 -0
  35. data/spec/models/xbmc_sql/movie_spec.rb +115 -0
  36. data/spec/models/xbmc_sql/path_spec.rb +49 -0
  37. data/spec/models/xbmc_sql/set_spec.rb +5 -0
  38. data/spec/spec_helper.rb +23 -0
  39. data/spec/test_app/Rakefile +6 -0
  40. data/spec/test_app/bin/bundle +3 -0
  41. data/spec/test_app/bin/rails +4 -0
  42. data/spec/test_app/bin/rake +4 -0
  43. data/spec/test_app/config.ru +4 -0
  44. data/spec/test_app/config/application.rb +16 -0
  45. data/spec/test_app/config/boot.rb +5 -0
  46. data/spec/test_app/config/database.yml +20 -0
  47. data/spec/test_app/config/environment.rb +5 -0
  48. data/spec/test_app/config/environments/development.rb +8 -0
  49. data/spec/test_app/config/environments/test.rb +7 -0
  50. data/spec/test_app/db/fresh_db.sqlite3 +0 -0
  51. data/spec/test_app/db/schema.rb +415 -0
  52. data/spec/test_app/log/.keep +0 -0
  53. data/xbmc_sql.gemspec +34 -0
  54. metadata +265 -0
@@ -0,0 +1,13 @@
1
+ namespace :xbmc_sql do
2
+ namespace :update do
3
+ desc "Update the top 250 movies"
4
+ task top_250: :environment do
5
+ Top250Updater.go!
6
+ end
7
+
8
+ desc "Update all imdb ratings/votes"
9
+ task ratings: :environment do
10
+ RatingUpdater.go!
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,34 @@
1
+ require "xbmc_sql/engine"
2
+ require "xbmc_sql/rating_updater"
3
+ require "xbmc_sql/top_250_updater"
4
+ require "xbmc_sql/nfo_file"
5
+
6
+ module XbmcSql
7
+
8
+ def self.setup
9
+ yield self
10
+ end
11
+
12
+ ##
13
+ # Write .nfo files?
14
+
15
+ mattr_writer :write_nfo_files
16
+ @@write_nfo_files = false
17
+ def self.write_nfo_files?
18
+ @@write_nfo_files
19
+ end
20
+
21
+ ##
22
+ # Path mappings
23
+
24
+ mattr_accessor :path_mappings
25
+
26
+ @@path_mappings = Hash.new
27
+ def self.register_path_mapping(original, change)
28
+ @@path_mappings[original] = change
29
+ end
30
+
31
+ def self.use_path_mappings?
32
+ path_mappings.keys.count > 0
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ module XbmcSql
2
+
3
+ DATABASE = "xbmc_#{Rails.env}".to_sym
4
+
5
+ class Engine < ::Rails::Engine
6
+ isolate_namespace XbmcSql
7
+
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ g.fixture_replacement :factory_girl, dir: 'spec/factories'
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,76 @@
1
+ require 'xmlsimple'
2
+
3
+ class XbmcSql::NfoFile
4
+
5
+ attr_accessor :raw_file
6
+
7
+ def initialize(raw_file)
8
+ @raw_file = raw_file
9
+ end
10
+
11
+ def save!
12
+ File.open(raw_file, 'w+') { |f| f.write new_doc }
13
+ end
14
+
15
+ def doc
16
+ @doc ||= XmlSimple.xml_in(File.read(@raw_file))
17
+ end
18
+
19
+ def new_doc
20
+ out = XmlSimple.xml_out doc,
21
+ xmldeclaration: '<?xml version="1.0" encoding="utf-8"?>',
22
+ rootname: 'movie',
23
+ noescape: true
24
+ out.gsub /<([^>]+)>\s*<\/\1>/, '<\1 />'
25
+ end
26
+
27
+ SIMPLE_ATTRIBUTES = %w{
28
+ id title originaltitle sorttitle year releasedate top250 rating
29
+ votes mpaa certification studio outline plot runtime playcount
30
+ }
31
+
32
+ PLURAL_ATTRIBUTES = {
33
+ countries: 'country',
34
+ genres: 'genre',
35
+ directors: 'director',
36
+ credits: 'credits',
37
+ actors: 'actor',
38
+ thumbs: 'thumb',
39
+ fanart: 'fanart'
40
+ }
41
+
42
+ SIMPLE_ATTRIBUTES.each do |attr|
43
+ define_method(attr) { doc[attr][0] }
44
+ define_method("#{attr}=") { |new_val| doc[attr][0] = new_val }
45
+ end
46
+
47
+ PLURAL_ATTRIBUTES.each do |k, v|
48
+ define_method(k) { doc[v] }
49
+ define_method("#{k}=") { |new_val| doc[v] = new_val }
50
+ end
51
+
52
+ ##
53
+ # File info
54
+
55
+ def video_streams
56
+ streams['video']
57
+ end
58
+
59
+ def audio_streams
60
+ streams['audio']
61
+ end
62
+
63
+ def sub_streams
64
+ streams['sub']
65
+ end
66
+
67
+ def video_stream
68
+ video_streams[0]
69
+ end
70
+
71
+ private
72
+
73
+ def streams
74
+ doc['fileinfo'][0]['streamdetails'][0]
75
+ end
76
+ end
@@ -0,0 +1,36 @@
1
+ require 'httparty'
2
+
3
+ class XbmcSql::RatingUpdater
4
+
5
+ def self.go!
6
+ XbmcSql::Movie.find_each { |movie| XbmcSql::RatingUpdater.new(movie).scrape! }
7
+ end
8
+
9
+ attr_accessor :movie
10
+
11
+ def initialize(movie)
12
+ @movie = movie
13
+ end
14
+
15
+ def scrape!
16
+ return unless has_imdb?
17
+
18
+ response = HTTParty.get "http://www.omdbapi.com/?i=#{movie.imdb_id}"
19
+ if json_response = JSON.parse(response.body)
20
+ if json_response['imdbRating'].present?
21
+ puts "Updating #{movie.title} from #{movie.rating} to #{json_response['imdbRating']}"
22
+ movie.update_attributes! rating: json_response['imdbRating'], rating_votes: json_response['imdbVotes']
23
+ else
24
+ puts "json_response = #{json_response}"
25
+ end
26
+ end
27
+ rescue => e
28
+ puts e
29
+ end
30
+
31
+ private
32
+
33
+ def has_imdb?
34
+ movie.imdb_id.present?
35
+ end
36
+ end
@@ -0,0 +1,102 @@
1
+ module XbmcSql
2
+ class Top250Updater
3
+
4
+ def self.go!
5
+ self.new.tap do |updater|
6
+ updater.scrape
7
+ updater.update_current
8
+ updater.remove_old
9
+ updater.note_missing
10
+ end
11
+ true
12
+ rescue => e
13
+ puts e
14
+ false
15
+ end
16
+
17
+ attr_accessor :rows, :missing
18
+
19
+ def initialize
20
+ @rows = {}
21
+ @missing = {}
22
+ end
23
+
24
+ ID_PARSER = /(tt\d*)\//
25
+
26
+ def scrape
27
+ table.each do |row|
28
+ position = row.at_xpath('td[2]/span[1]/text()').to_s.gsub('.', '')
29
+ title = row.at_xpath('td[2]/a/text()').to_s
30
+ tt = ID_PARSER.match(row.at_xpath('td[2]/a/@href').to_s)[1]
31
+
32
+ rows[position] = {title: title, imdb_id: tt }
33
+ end
34
+ end
35
+
36
+ def update_current
37
+ puts "----------------------- updating current... -----------------------------"
38
+
39
+ rows.each do |position, values|
40
+ movies = XbmcSql::Movie.with_imdb_id values[:imdb_id]
41
+
42
+ if movies.present?
43
+ movies.each { |movie| update_movie! movie, position }
44
+ else
45
+ puts "##{position}: #{values[:title]} IS MISSING"
46
+ missing[position] = values
47
+ end
48
+ end
49
+ end
50
+
51
+ def remove_old
52
+ puts "----------------------- Removing old. -----------------------------"
53
+ XbmcSql::Movie.in_top_250.each do |movie|
54
+ if movie.imdb_250 != simple_list[movie.imdb_id]
55
+ puts "Removing #{movie.title} - previously was ##{movie.imdb_250}, now is not in the list."
56
+ movie.update_attributes! imdb_250: nil
57
+ end
58
+ end
59
+ puts "------------------------------------------------------------------"
60
+ end
61
+
62
+ def note_missing
63
+ missing.each do |position, values|
64
+ puts "YOU ARE MISSING ##{position}: #{values[:title]}"
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ def update_movie!(movie, position)
71
+ if movie.imdb_250.blank?
72
+ puts "##{position}: #{movie.title} entered the list"
73
+ elsif movie.imdb_250 == position
74
+ puts "##{position}: #{movie.title} stayed at ##{movie.imdb_250}"
75
+ elsif movie.imdb_250.to_i < position.to_i
76
+ puts "##{position}: #{movie.title} raised up from ##{movie.imdb_250}"
77
+ movie.update_attributes! imdb_250: position
78
+ else
79
+ puts "##{position}: #{movie.title} fell from ##{movie.imdb_250}"
80
+ movie.update_attributes! imdb_250: position
81
+ end
82
+ end
83
+
84
+ def table
85
+ @table ||= page.xpath('//table/tbody[@class="lister-list"]/tr')
86
+ end
87
+
88
+ def page
89
+ @page ||= begin
90
+ response = HTTParty.get('http://www.imdb.com/chart/top')
91
+ Nokogiri::HTML response.body
92
+ end
93
+ end
94
+
95
+ def simple_list
96
+ rows.inject({}) do |result, (position, values)|
97
+ result[values[:imdb_id]] = position
98
+ result
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,3 @@
1
+ module XbmcSql
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :movie, class: XbmcSql::Movie do
3
+ title "some movie"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :path, class: XbmcSql::Path do
3
+ path "file://foo/bar.ext"
4
+ end
5
+ end
@@ -0,0 +1,595 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <movie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3
+ <id>tt2278388</id>
4
+ <title>The Grand Budapest Hotel</title>
5
+ <originaltitle>The Grand Budapest Hotel</originaltitle>
6
+ <sorttitle>Grand Budapest Hotel</sorttitle>
7
+ <year>2014</year>
8
+ <releasedate>6/27/2014</releasedate>
9
+ <top250>138</top250>
10
+ <country>USA</country>
11
+ <country>Germany</country>
12
+ <rating>8.3</rating>
13
+ <votes>103,763</votes>
14
+ <mpaa>Rated R for language, some sexual content and violence</mpaa>
15
+ <certification>USA:R / UK:15 / Switzerland:10 / Sweden:11 / South Korea:18 / Singapore:M18 / Portugal:M/12 / Philippines:R-16 / New Zealand:M / Netherlands:6 / Netherlands:12 / Mexico:B15 / Japan:G / Italy:T / Ireland:15A / Hungary:16 / Hong Kong:IIB / Germany:12 / France:U / Finland:K-12 / Czech Republic:12 / Chile:TE / Canada:G / Canada:14A / Australia:M / Argentina:13</certification>
16
+ <genre>Comedy</genre>
17
+ <genre>Drama</genre>
18
+ <studio>Fox Searchlight Pictures</studio>
19
+ <director>Wes Anderson</director>
20
+ <credits>Stefan Zweig</credits>
21
+ <credits>Wes Anderson</credits>
22
+ <outline>The adventures of Gustave H, a legendary concierge at a famous European hotel between the wars, and Zero Moustafa, the lobby boy who becomes his most trusted friend.</outline>
23
+ <plot>GRAND BUDAPEST HOTEL recounts the adventures of Gustave H, a legendary concierge at a famous European hotel between the wars, and Zero Moustafa, the lobby boy who becomes his most trusted friend. The story involves the theft and recovery of a priceless Renaissance painting and the battle for an enormous family fortune -- all against the back-drop of a suddenly and dramatically changing Continent.</plot>
24
+ <runtime>99</runtime>
25
+ <playcount>1</playcount>
26
+ <actor>
27
+ <name>Ralph Fiennes</name>
28
+ <role>M. Gustave</role>
29
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMzc5MjE1NDgyN15BMl5BanBnXkFtZTcwNzg2ODgwNA@@._V1._SY275_SX400_.jpg</thumb>
30
+ </actor>
31
+ <actor>
32
+ <name>F. Murray Abraham</name>
33
+ <role>Mr. Moustafa</role>
34
+ <thumb>http://ia.media-imdb.com/images/M/MV5BNDQ2MzQ2ODYxM15BMl5BanBnXkFtZTcwODY3NTIxNw@@._V1._SY275_SX400_.jpg</thumb>
35
+ </actor>
36
+ <actor>
37
+ <name>Mathieu Amalric</name>
38
+ <role>Serge X.</role>
39
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTgzMjIzMTMyM15BMl5BanBnXkFtZTcwMjI2NzM1OQ@@._V1._SY275_SX400_.jpg</thumb>
40
+ </actor>
41
+ <actor>
42
+ <name>Adrien Brody</name>
43
+ <role>Dmitri</role>
44
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjI3ODkxMjU3OF5BMl5BanBnXkFtZTgwMTk2Njk3MTE@._V1._SY275_SX400_.jpg</thumb>
45
+ </actor>
46
+ <actor>
47
+ <name>Willem Dafoe</name>
48
+ <role>Jopling</role>
49
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTkwMjg4NzQ4NV5BMl5BanBnXkFtZTcwOTQ1ODQ3MQ@@._V1._SY275_SX400_.jpg</thumb>
50
+ </actor>
51
+ <actor>
52
+ <name>Jeff Goldblum</name>
53
+ <role>Deputy Kovacs</role>
54
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTE5NzkyODg1Nl5BMl5BanBnXkFtZTYwMTY2OTE0._V1._SY275_SX400_.jpg</thumb>
55
+ </actor>
56
+ <actor>
57
+ <name>Harvey Keitel</name>
58
+ <role>Ludwig</role>
59
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTcxMDcxMjgxOV5BMl5BanBnXkFtZTcwODc2NTk2MQ@@._V1._SY275_SX400_.jpg</thumb>
60
+ </actor>
61
+ <actor>
62
+ <name>Jude Law</name>
63
+ <role>Young Writer</role>
64
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTMwOTg5NTQ3NV5BMl5BanBnXkFtZTcwNzM3MDAzNQ@@._V1._SY275_SX400_.jpg</thumb>
65
+ </actor>
66
+ <actor>
67
+ <name>Bill Murray</name>
68
+ <role>M. Ivan</role>
69
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTQ1OTM0MjEwOF5BMl5BanBnXkFtZTYwNTQwNzI1._V1._SY275_SX400_.jpg</thumb>
70
+ </actor>
71
+ <actor>
72
+ <name>Edward Norton</name>
73
+ <role>Henckels</role>
74
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTYwNjQ5MTI1NF5BMl5BanBnXkFtZTcwMzU5MTI2Mw@@._V1._SY275_SX400_.jpg</thumb>
75
+ </actor>
76
+ <actor>
77
+ <name>Saoirse Ronan</name>
78
+ <role>Agatha</role>
79
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjExNTM5NDE4NV5BMl5BanBnXkFtZTcwNzczMzEzOQ@@._V1._SY275_SX400_.jpg</thumb>
80
+ </actor>
81
+ <actor>
82
+ <name>Jason Schwartzman</name>
83
+ <role>M. Jean</role>
84
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjAyNjY0NTgzNF5BMl5BanBnXkFtZTcwOTQ0ODk2Mw@@._V1._SY275_SX400_.jpg</thumb>
85
+ </actor>
86
+ <actor>
87
+ <name>Léa Seydoux</name>
88
+ <role>Clotilde</role>
89
+ <thumb>http://ia.media-imdb.com/images/M/MV5BODI2MTk5NjIxOV5BMl5BanBnXkFtZTcwMTYzMDc0Mw@@._V1._SY275_SX400_.jpg</thumb>
90
+ </actor>
91
+ <actor>
92
+ <name>Tilda Swinton</name>
93
+ <role>Madame D.</role>
94
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTM4NzMzMTkwNV5BMl5BanBnXkFtZTcwMzU4MDg1Mw@@._V1._SY275_SX400_.jpg</thumb>
95
+ </actor>
96
+ <actor>
97
+ <name>Tom Wilkinson</name>
98
+ <role>Author</role>
99
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTcxNzc0NzQyN15BMl5BanBnXkFtZTcwNjI1NDA2MQ@@._V1._SY275_SX400_.jpg</thumb>
100
+ </actor>
101
+ <actor>
102
+ <name>Owen Wilson</name>
103
+ <role>M. Chuck</role>
104
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTgwMzQ4ODYxMV5BMl5BanBnXkFtZTcwNDAwMTc2NQ@@._V1._SY275_SX400_.jpg</thumb>
105
+ </actor>
106
+ <actor>
107
+ <name>Tony Revolori</name>
108
+ <role>Zero</role>
109
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjM2NDEyMTE0NV5BMl5BanBnXkFtZTgwODI1Mzc5MTE@._V1._SY275_SX400_.jpg</thumb>
110
+ </actor>
111
+ <actor>
112
+ <name>Larry Pine</name>
113
+ <role>Mr. Mosher</role>
114
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTI2NzY3MzE4MF5BMl5BanBnXkFtZTYwMjI1MDE0._V1._SY275_SX400_.jpg</thumb>
115
+ </actor>
116
+ <actor>
117
+ <name>Giselda Volodi</name>
118
+ <role>Serge's Sister</role>
119
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTIwMjYwOTY0Ml5BMl5BanBnXkFtZTcwNDYxOTUyMQ@@._V1._SY275_SX400_.jpg</thumb>
120
+ </actor>
121
+ <actor>
122
+ <name>Florian Lukas</name>
123
+ <role>Pinky</role>
124
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjIyMTIyNjQxOV5BMl5BanBnXkFtZTgwMjMzMTcwMDE@._V1._SY275_SX400_.jpg</thumb>
125
+ </actor>
126
+ <actor>
127
+ <name>Karl Markovics</name>
128
+ <role>Wolf</role>
129
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTc4Mzc4MTU4N15BMl5BanBnXkFtZTYwMjUzNzI3._V1._SY275_SX400_.jpg</thumb>
130
+ </actor>
131
+ <actor>
132
+ <name>Volker Michalowski</name>
133
+ <role>Gunther (as Volker 'Zack' Michalowski)</role>
134
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTM4MjIxODc4NF5BMl5BanBnXkFtZTcwNTA0OTY3Mg@@._V1._SY275_SX400_.jpg</thumb>
135
+ </actor>
136
+ <actor>
137
+ <name>Neal Huff</name>
138
+ <role>Lieutenant</role>
139
+ <thumb>http://ia.media-imdb.com/images/M/MV5BODI1OTYyMDgyNV5BMl5BanBnXkFtZTcwOTI2MDA1NA@@._V1._SY275_SX400_.jpg</thumb>
140
+ </actor>
141
+ <actor>
142
+ <name>Bob Balaban</name>
143
+ <role>M. Martin</role>
144
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTI4ODkzNTMxNF5BMl5BanBnXkFtZTcwNzk5ODk4Mw@@._V1._SY275_SX400_.jpg</thumb>
145
+ </actor>
146
+ <actor>
147
+ <name>Fisher Stevens</name>
148
+ <role>M. Robin</role>
149
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjA4MTE2NTMxM15BMl5BanBnXkFtZTYwNjkwMDM0._V1._SY275_SX400_.jpg</thumb>
150
+ </actor>
151
+ <actor>
152
+ <name>Wallace Wolodarsky</name>
153
+ <role>M. Georges (as Wally Wolodarsky)</role>
154
+ <thumb>http://ia.media-imdb.com/images/M/MV5BNjk3MzE5MDc3NV5BMl5BanBnXkFtZTYwNTUyMTc2._V1._SY275_SX400_.jpg</thumb>
155
+ </actor>
156
+ <actor>
157
+ <name>Waris Ahluwalia</name>
158
+ <role>M. Dino</role>
159
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTc3NDY4OTUyM15BMl5BanBnXkFtZTcwOTU4MDg1Mw@@._V1._SY275_SX400_.jpg</thumb>
160
+ </actor>
161
+ <actor>
162
+ <name>Jella Niemann</name>
163
+ <role>Student</role>
164
+ <thumb />
165
+ </actor>
166
+ <actor>
167
+ <name>Marcel Mazur</name>
168
+ <role>Author's Grandson</role>
169
+ <thumb />
170
+ </actor>
171
+ <actor>
172
+ <name>Robert Bienas</name>
173
+ <role>Alpine Hiker</role>
174
+ <thumb />
175
+ </actor>
176
+ <actor>
177
+ <name>Manfred Lindner</name>
178
+ <role>Front Desk (1968)</role>
179
+ <thumb />
180
+ </actor>
181
+ <actor>
182
+ <name>Oliver Claridge</name>
183
+ <role>Composer</role>
184
+ <thumb />
185
+ </actor>
186
+ <actor>
187
+ <name>Bernhard Kremser</name>
188
+ <role>Businessman</role>
189
+ <thumb />
190
+ </actor>
191
+ <actor>
192
+ <name>Kunichi Nomura</name>
193
+ <role>Actor</role>
194
+ <thumb />
195
+ </actor>
196
+ <actor>
197
+ <name>Sister Anna Rademacher</name>
198
+ <role>Nun</role>
199
+ <thumb />
200
+ </actor>
201
+ <actor>
202
+ <name>Heinz-Werner Jeschkowski</name>
203
+ <role>Bather</role>
204
+ <thumb />
205
+ </actor>
206
+ <actor>
207
+ <name>Steffen Scheumann</name>
208
+ <role>Head Waiter (1968)</role>
209
+ <thumb />
210
+ </actor>
211
+ <actor>
212
+ <name>Sabine Euler</name>
213
+ <role>Schoolteacher</role>
214
+ <thumb />
215
+ </actor>
216
+ <actor>
217
+ <name>Renate Klein</name>
218
+ <role>Widow</role>
219
+ <thumb />
220
+ </actor>
221
+ <actor>
222
+ <name>Uwe Holoubek</name>
223
+ <role>Second Waiter (1968)</role>
224
+ <thumb />
225
+ </actor>
226
+ <actor>
227
+ <name>Francesco Zippel</name>
228
+ <role>Footman (1932)</role>
229
+ <thumb />
230
+ </actor>
231
+ <actor>
232
+ <name>Enrico Hoffmann</name>
233
+ <role>Footman (1932)</role>
234
+ <thumb />
235
+ </actor>
236
+ <actor>
237
+ <name>Daniel Steiner</name>
238
+ <role>Anatole</role>
239
+ <thumb />
240
+ </actor>
241
+ <actor>
242
+ <name>Marie Goyette</name>
243
+ <role>Housekeeper (1932)</role>
244
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTY3NTkxMDgyMF5BMl5BanBnXkFtZTgwMTE3MjA0MTE@._V1._SY275_SX400_.jpg</thumb>
245
+ </actor>
246
+ <actor>
247
+ <name>Hendrik von Bültzingslöwen</name>
248
+ <role>Ernst</role>
249
+ <thumb />
250
+ </actor>
251
+ <actor>
252
+ <name>Paul Schlase</name>
253
+ <role>Igor</role>
254
+ <thumb />
255
+ </actor>
256
+ <actor>
257
+ <name>Jeno Orosz</name>
258
+ <role>Doorman (1932)</role>
259
+ <thumb />
260
+ </actor>
261
+ <actor>
262
+ <name>Gyula Lukacs</name>
263
+ <role>Doorman (1932)</role>
264
+ <thumb />
265
+ </actor>
266
+ <actor>
267
+ <name>Darin Damjanow</name>
268
+ <role>Chauffeur</role>
269
+ <thumb />
270
+ </actor>
271
+ <actor>
272
+ <name>Dar Ronge</name>
273
+ <role>Crippled Shoeshine Boy</role>
274
+ <thumb />
275
+ </actor>
276
+ <actor>
277
+ <name>Georg Rittmannsperger</name>
278
+ <role>Front Desk (1932)</role>
279
+ <thumb />
280
+ </actor>
281
+ <actor>
282
+ <name>Dirk Bossmann</name>
283
+ <role>Front Desk (1932)</role>
284
+ <thumb />
285
+ </actor>
286
+ <actor>
287
+ <name>Arwin Lobedann</name>
288
+ <role>Front Desk (1932)</role>
289
+ <thumb />
290
+ </actor>
291
+ <actor>
292
+ <name>Robin Hurlstone</name>
293
+ <role>Herr Schneider</role>
294
+ <thumb />
295
+ </actor>
296
+ <actor>
297
+ <name>Jutta Westphal</name>
298
+ <role>Frau Liebling</role>
299
+ <thumb />
300
+ </actor>
301
+ <actor>
302
+ <name>Matthias Holfert</name>
303
+ <role>Chef (1932)</role>
304
+ <thumb />
305
+ </actor>
306
+ <actor>
307
+ <name>Lisa Kreuzer</name>
308
+ <role>Grande Dame</role>
309
+ <thumb />
310
+ </actor>
311
+ <actor>
312
+ <name>Gisela Bech</name>
313
+ <role>Grande Dame</role>
314
+ <thumb />
315
+ </actor>
316
+ <actor>
317
+ <name>Birgit Müller</name>
318
+ <role>Grande Dame</role>
319
+ <thumb />
320
+ </actor>
321
+ <actor>
322
+ <name>Ursula Kuhnt</name>
323
+ <role>Grande Dame</role>
324
+ <thumb />
325
+ </actor>
326
+ <actor>
327
+ <name>Monika Krüger</name>
328
+ <role>Grande Dame</role>
329
+ <thumb />
330
+ </actor>
331
+ <actor>
332
+ <name>Wolfram Nielacny</name>
333
+ <role>Herr Becker</role>
334
+ <thumb />
335
+ </actor>
336
+ <actor>
337
+ <name>Reinhold Hegelow</name>
338
+ <role>Head Waiter (1932)</role>
339
+ <thumb />
340
+ </actor>
341
+ <actor>
342
+ <name>Steffen Nixdorf</name>
343
+ <role>Second Waiter (1932)</role>
344
+ <thumb />
345
+ </actor>
346
+ <actor>
347
+ <name>Rainer Reiners</name>
348
+ <role>Herr Mendl</role>
349
+ <thumb />
350
+ </actor>
351
+ <actor>
352
+ <name>Milton Welsh</name>
353
+ <role>Franz</role>
354
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjE3MjUzMDI0MF5BMl5BanBnXkFtZTcwNTU4MjYzOA@@._V1._SY275_SX400_.jpg</thumb>
355
+ </actor>
356
+ <actor>
357
+ <name>Piet Paes</name>
358
+ <role>Taxi Driver</role>
359
+ <thumb />
360
+ </actor>
361
+ <actor>
362
+ <name>Michaela Caspar</name>
363
+ <role>Marguerite</role>
364
+ <thumb>http://ia.media-imdb.com/images/M/MV5BNjUxOTU1NDY5MV5BMl5BanBnXkFtZTgwMTA5MzQ1MDE@._V1._SY275_SX400_.jpg</thumb>
365
+ </actor>
366
+ <actor>
367
+ <name>Sabine Urig</name>
368
+ <role>Laetizia</role>
369
+ <thumb />
370
+ </actor>
371
+ <actor>
372
+ <name>Heike Hanold-Lynch</name>
373
+ <role>Carolina</role>
374
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjA2NTU5OTM1NV5BMl5BanBnXkFtZTcwNDg4MDY2OQ@@._V1._SY275_SX400_.jpg</thumb>
375
+ </actor>
376
+ <actor>
377
+ <name>Roy Macready</name>
378
+ <role>Old Man</role>
379
+ <thumb />
380
+ </actor>
381
+ <actor>
382
+ <name>John Peet</name>
383
+ <role>Young Man</role>
384
+ <thumb />
385
+ </actor>
386
+ <actor>
387
+ <name>Carl Sprague</name>
388
+ <role>Distant Relation</role>
389
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjAzNjU5MDU5NF5BMl5BanBnXkFtZTcwNTkwNzk1Mg@@._V1._SY275_SX400_.jpg</thumb>
390
+ </actor>
391
+ <actor>
392
+ <name>Golo Euler</name>
393
+ <role>Lutz Police Militia</role>
394
+ <thumb />
395
+ </actor>
396
+ <actor>
397
+ <name>Jürgen Schwämmle</name>
398
+ <role>Lutz Police Militia</role>
399
+ <thumb />
400
+ </actor>
401
+ <actor>
402
+ <name>Frank Jacob</name>
403
+ <role>Giant Convict</role>
404
+ <thumb />
405
+ </actor>
406
+ <actor>
407
+ <name>Claudia Jung</name>
408
+ <role>Usherette</role>
409
+ <thumb />
410
+ </actor>
411
+ <actor>
412
+ <name>Roman Berger</name>
413
+ <role>Parcel Inspector</role>
414
+ <thumb />
415
+ </actor>
416
+ <actor>
417
+ <name>Michael Benthin</name>
418
+ <role>Snitch</role>
419
+ <thumb />
420
+ </actor>
421
+ <actor>
422
+ <name>Matthias Matschke</name>
423
+ <role>Prison Guard</role>
424
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTcwMzQwMTk3OV5BMl5BanBnXkFtZTgwNDk5ODc0MDE@._V1._SY275_SX400_.jpg</thumb>
425
+ </actor>
426
+ <actor>
427
+ <name>Lennart Meyer</name>
428
+ <role>Lobby Boy</role>
429
+ <thumb />
430
+ </actor>
431
+ <actor>
432
+ <name>Alfred Hänel</name>
433
+ <role>Lobby Boy</role>
434
+ <thumb />
435
+ </actor>
436
+ <actor>
437
+ <name>Manpreet Gerlach</name>
438
+ <role>Lobby Boy</role>
439
+ <thumb />
440
+ </actor>
441
+ <actor>
442
+ <name>David Adamik</name>
443
+ <role>Lobby Boy</role>
444
+ <thumb />
445
+ </actor>
446
+ <actor>
447
+ <name>Moritz Hepper</name>
448
+ <role>Lobby Boy</role>
449
+ <thumb />
450
+ </actor>
451
+ <actor>
452
+ <name>David Cioffi</name>
453
+ <role>Cook</role>
454
+ <thumb />
455
+ </actor>
456
+ <actor>
457
+ <name>Lucas Hedges</name>
458
+ <role>Pump Attendant</role>
459
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMjE0MDA4OTQ1N15BMl5BanBnXkFtZTcwMzg2NTU4Nw@@._V1._SY275_SX400_.jpg</thumb>
460
+ </actor>
461
+ <actor>
462
+ <name>Wolfgang Ceczor</name>
463
+ <role>Monk</role>
464
+ <thumb />
465
+ </actor>
466
+ <actor>
467
+ <name>Philipp Sonntag</name>
468
+ <role>Monk</role>
469
+ <thumb />
470
+ </actor>
471
+ <actor>
472
+ <name>Hans Martin Stier</name>
473
+ <role>Monk</role>
474
+ <thumb />
475
+ </actor>
476
+ <actor>
477
+ <name>Georg Tryphon</name>
478
+ <role>Monk</role>
479
+ <thumb />
480
+ </actor>
481
+ <actor>
482
+ <name>Gabriel Rush</name>
483
+ <role>Otto</role>
484
+ <thumb>http://ia.media-imdb.com/images/M/MV5BNzI4OTUxMjY5Nl5BMl5BanBnXkFtZTgwMzY3NTg2MTE@._V1._SY275_SX400_.jpg</thumb>
485
+ </actor>
486
+ <actor>
487
+ <name>Hannes Wegener</name>
488
+ <role>Soldier</role>
489
+ <thumb />
490
+ </actor>
491
+ <actor>
492
+ <name>Gerald Sullivan</name>
493
+ <role>Soldier</role>
494
+ <thumb />
495
+ </actor>
496
+ <actor>
497
+ <name>Oliver Hazell</name>
498
+ <role>Soldier</role>
499
+ <thumb />
500
+ </actor>
501
+ <actor>
502
+ <name>Ben Howard</name>
503
+ <role>Soldier</role>
504
+ <thumb />
505
+ </actor>
506
+ <actor>
507
+ <name>Bohumil Váchal</name>
508
+ <role>Judge</role>
509
+ <thumb />
510
+ </actor>
511
+ <actor>
512
+ <name>Marko Dyrlich</name>
513
+ <role>Zig-Zag</role>
514
+ <thumb />
515
+ </actor>
516
+ <actor>
517
+ <name>Ed Munro</name>
518
+ <role>'Boy with Apple' (model) (as Edel Muro)</role>
519
+ <thumb>http://ia.media-imdb.com/images/M/MV5BMTYzMjQ1NzI3N15BMl5BanBnXkFtZTgwNjk5ODc5MTE@._V1._SY275_SX400_.jpg</thumb>
520
+ </actor>
521
+ <actor>
522
+ <name>Mario Rohn</name>
523
+ <role>Portier #2 (uncredited)</role>
524
+ <thumb />
525
+ </actor>
526
+ <thumb>http://image.tmdb.org/t/p/w185/nX5XotM9yprCKarRH4fzOq1VM1J.jpg</thumb>
527
+ <thumb>http://image.tmdb.org/t/p/w185/sdYWR8uqXYbPaXEvaAnWKXIdREa.jpg</thumb>
528
+ <thumb>http://image.tmdb.org/t/p/w185/rl2tMrqrwJ9vhBjgXM1G5XWmWsH.jpg</thumb>
529
+ <thumb>http://image.tmdb.org/t/p/w185/wTOcbfuDMc8DGTShgeHmf3migmj.jpg</thumb>
530
+ <thumb>http://image.tmdb.org/t/p/w185/qLb9XMDNPqA29HXTYoh4ojmygr9.jpg</thumb>
531
+ <thumb>http://image.tmdb.org/t/p/w185/3nbUe0LVv2ZYL67jAJy1KKuG1FZ.jpg</thumb>
532
+ <thumb>http://image.tmdb.org/t/p/w185/eufa4CEa3uRFxKFeYXkRxVJ576g.jpg</thumb>
533
+ <thumb>http://image.tmdb.org/t/p/w185/gPZ6dO8cKCahCjJJvk5UhUBTJ9N.jpg</thumb>
534
+ <thumb>http://image.tmdb.org/t/p/w185/5dI79SbfpcxMQcLkTroWrbYuCrk.jpg</thumb>
535
+ <thumb>http://image.tmdb.org/t/p/w185/5iDTvSlFx8LOHznl7Ohr9GJX5K9.jpg</thumb>
536
+ <thumb>http://image.tmdb.org/t/p/w185/yplDT9SSlGxOUovDZc7iLlKcKh.jpg</thumb>
537
+ <thumb>http://image.tmdb.org/t/p/w185/tFEDiOt5sqmZSXpVImPwxB3ZBkV.jpg</thumb>
538
+ <thumb>http://image.tmdb.org/t/p/w185/a1tGdEVyoEBDPwshvXkxeb3vUY5.jpg</thumb>
539
+ <thumb>http://image.tmdb.org/t/p/w185/r2Z4CzkPjbRqkEAy5jvGojJfwNR.jpg</thumb>
540
+ <thumb>http://image.tmdb.org/t/p/w185/uBL0ShTCNKo699Y3cXAGvbcGSty.jpg</thumb>
541
+ <thumb>http://image.tmdb.org/t/p/w185/74sfsc9agA39J0GeF4cruQi2uQy.jpg</thumb>
542
+ <thumb>http://image.tmdb.org/t/p/w185/xMvrH7LHSAo0l4EAzIOeCp4nu7V.jpg</thumb>
543
+ <thumb>http://image.tmdb.org/t/p/w185/vdSLbtifrUak7GlxSqNL3Gci8eQ.jpg</thumb>
544
+ <fanart url="http://image.tmdb.org">
545
+ <thumb preview="/t/p/w300/n0wbp66glvDXp7aZLHcu2r97MFl.jpg">http://image.tmdb.org/t/p/w300/n0wbp66glvDXp7aZLHcu2r97MFl.jpg</thumb>
546
+ <thumb preview="/t/p/w300/3AZX2KB73kSza76h9O4bzdNeIac.jpg">http://image.tmdb.org/t/p/w300/3AZX2KB73kSza76h9O4bzdNeIac.jpg</thumb>
547
+ <thumb preview="/t/p/w300/qFRZg21DfiERIl7P7aVuJJHUWjt.jpg">http://image.tmdb.org/t/p/w300/qFRZg21DfiERIl7P7aVuJJHUWjt.jpg</thumb>
548
+ <thumb preview="/t/p/w300/e2be3mlTmNdYmAjinH02L1XVpS0.jpg">http://image.tmdb.org/t/p/w300/e2be3mlTmNdYmAjinH02L1XVpS0.jpg</thumb>
549
+ <thumb preview="/t/p/w300/cuzr3foKhwEmTbpjX00pjI1Rhvm.jpg">http://image.tmdb.org/t/p/w300/cuzr3foKhwEmTbpjX00pjI1Rhvm.jpg</thumb>
550
+ <thumb preview="/t/p/w300/pT8xPomKELMB0bxU5oywQ1dlonT.jpg">http://image.tmdb.org/t/p/w300/pT8xPomKELMB0bxU5oywQ1dlonT.jpg</thumb>
551
+ <thumb preview="/t/p/w300/ks4LdRwLPL282uL3rhrfPtUMd7v.jpg">http://image.tmdb.org/t/p/w300/ks4LdRwLPL282uL3rhrfPtUMd7v.jpg</thumb>
552
+ <thumb preview="/t/p/w300/jeaVeCr6uHQHQvd3ZGFzzhBresL.jpg">http://image.tmdb.org/t/p/w300/jeaVeCr6uHQHQvd3ZGFzzhBresL.jpg</thumb>
553
+ <thumb preview="/t/p/w300/zgNSNClvtI9gWV6aLE9KmU2CtP4.jpg">http://image.tmdb.org/t/p/w300/zgNSNClvtI9gWV6aLE9KmU2CtP4.jpg</thumb>
554
+ <thumb preview="/t/p/w300/bxGLGeo2LFFHr86xAaHSUwNB7dW.jpg">http://image.tmdb.org/t/p/w300/bxGLGeo2LFFHr86xAaHSUwNB7dW.jpg</thumb>
555
+ <thumb preview="/t/p/w300/6xIykubREqNSjbhRov12i1liBiH.jpg">http://image.tmdb.org/t/p/w300/6xIykubREqNSjbhRov12i1liBiH.jpg</thumb>
556
+ <thumb preview="/t/p/w300/x5X14fl677xQ8r2R6mwApDKUWkr.jpg">http://image.tmdb.org/t/p/w300/x5X14fl677xQ8r2R6mwApDKUWkr.jpg</thumb>
557
+ <thumb preview="/t/p/w300/7eDPMlMeNM1pMpBuGjAjRXRe38E.jpg">http://image.tmdb.org/t/p/w300/7eDPMlMeNM1pMpBuGjAjRXRe38E.jpg</thumb>
558
+ </fanart>
559
+ <fileinfo>
560
+ <streamdetails>
561
+ <audio>
562
+ <channels>6</channels>
563
+ <codec>dca</codec>
564
+ <language>eng</language>
565
+ <longlanguage>English</longlanguage>
566
+ <bitrate>1509</bitrate>
567
+ </audio>
568
+ <subtitle>
569
+ <language>eng</language>
570
+ <longlanguage>English</longlanguage>
571
+ </subtitle>
572
+ <subtitle>
573
+ <language>eng</language>
574
+ <longlanguage>English</longlanguage>
575
+ </subtitle>
576
+ <subtitle>
577
+ <language>eng</language>
578
+ <longlanguage>English</longlanguage>
579
+ </subtitle>
580
+ <video>
581
+ <aspect>1.860</aspect>
582
+ <codec>h264</codec>
583
+ <durationinseconds>5995</durationinseconds>
584
+ <height>688</height>
585
+ <language>eng</language>
586
+ <longlanguage>English</longlanguage>
587
+ <scantype>Progressive</scantype>
588
+ <width>1280</width>
589
+ <bitrate>4758</bitrate>
590
+ <multiView_Count />
591
+ <encodedSettings>cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=8 / lookahead_threads=1 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=2 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=50 / rc=2pass / mbtree=1 / bitrate=4758 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / cplxblur=20.0 / qblur=0.5 / ip_ratio=1.40 / aq=1:1.00</encodedSettings>
592
+ </video>
593
+ </streamdetails>
594
+ </fileinfo>
595
+ </movie>