hype 42.0.0

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 (4) hide show
  1. data/README +17 -0
  2. data/bin/hype.rb +165 -0
  3. data/gemspec.rb +28 -0
  4. metadata +49 -0
data/README ADDED
@@ -0,0 +1,17 @@
1
+ NAME
2
+
3
+ hype.rb
4
+
5
+ SYNOPSIS
6
+
7
+ if you can't figure it out you don't need to know
8
+
9
+ HISTORY
10
+
11
+ hack two:
12
+
13
+ bug fixes. thx marcel.
14
+
15
+ hack one:
16
+
17
+ initial crime
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems' rescue nil
4
+ require 'cgi'
5
+ require 'fileutils'
6
+ require 'thread'
7
+ require 'digest/md5'
8
+ #require 'sqlite'
9
+ #require 'arrayfields'
10
+
11
+ #
12
+ # opts/config
13
+ #
14
+ uris_only = ARGV.delete('--uris') || ARGV.delete('-u')
15
+ noop = ARGV.delete('--noop') || ARGV.delete('-n')
16
+ pcast_only = ARGV.delete('--pcast') || ARGV.delete('-p')
17
+
18
+ prefix = File.join(File.expand_path('~'), '.hype')
19
+
20
+ cache = File.join prefix, 'cache'
21
+ db = File.join prefix, 'db'
22
+
23
+ uris = []
24
+ #
25
+ # utils
26
+ #
27
+ def homogename path
28
+
29
+ new = "#{ path }"
30
+ new.gsub! %r{[^a-zA-Z0-9_/\.-]}, '_'
31
+ new.gsub! %r{__+}, '_'
32
+ new.gsub! %r{_+-_+}, '-'
33
+ new.gsub! %r{--+}, '-'
34
+ new.strip
35
+
36
+ end
37
+ def sync
38
+
39
+ (@mutex||=Mutex.new).synchronize{ yield }
40
+
41
+ end
42
+ #
43
+ # setup
44
+ #
45
+ FileUtils.mkdir_p prefix
46
+ FileUtils.mkdir_p cache
47
+ sync{ system "sqlite #{ db } 'create table mp3s( pathname, md5, primary key(md5) )' >/dev/null 2>&1" }
48
+
49
+ q = SizedQueue.new 10
50
+ reaper = Thread.new {
51
+ loop{
52
+ t = q.pop or Thread.current.exit
53
+ #puts t.value
54
+ t.value
55
+ }
56
+ }
57
+ #
58
+ # crawl
59
+ #
60
+ user_agent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4'
61
+ pcast_xml_uri = 'http://hype.non-standard.net/playlist/time/today/pcast/1/feed.pcast'
62
+
63
+ pcast_xml = `curl --location --silent --user-agent '#{ user_agent }' '#{ pcast_xml_uri }'`
64
+ if pcast_only
65
+ puts pcast_xml
66
+ exit
67
+ end
68
+
69
+ m = %r/href\s*=\s*["']?([^"'\s][^\s]+[^"'\s])["']?/.match pcast_xml
70
+ abort 'no feed!' unless m
71
+ feed_xml_uri = String m[1]
72
+ feed_xml = `curl --location --silent --user-agent '#{ user_agent }' '#{ feed_xml_uri }'`
73
+
74
+ #
75
+ # <enclosure
76
+ # url="http://hype.non-standard.net/serve/r/300/102400/02AndIWasABoyFromSchool-9688.mp3"
77
+ # length="3917090" type="audio/mpeg"/>
78
+ #
79
+ if uris.empty?
80
+ feed_xml.each do |line|
81
+ if line =~ %r/enclosure/
82
+ m = %r/length\s*=\s*["']?([^"'\s][^\s]+[^"'\s])["']?/.match line
83
+ next unless m
84
+ length = Integer m[1]
85
+
86
+ m = %r/url\s*=\s*["']?([^"'\s][^\s]+[^"'\s])["']?/.match line
87
+ next unless m
88
+ uri = String m[1]
89
+
90
+ uris << [uri, length]
91
+ end
92
+ end
93
+ end
94
+
95
+ if uris_only
96
+ puts uris.map{|pair| pair.first}
97
+ exit
98
+ end
99
+
100
+ Dir.chdir(cache) do
101
+ uris.sort_by{ rand }.each do |src, length|
102
+ basename = CGI.unescape(File.basename(src))
103
+ dst = homogename basename
104
+ dst << '.mp3' unless dst[%r/\.mp3$/]
105
+
106
+ # make sure output name is unique
107
+ i = 0
108
+ while test ?e, dst
109
+ print "#{ dst } -->> "
110
+ newdst = dst.gsub %r/\.mp3$/, "_#{ i += 1 }.mp3"
111
+ abort "#{ dst } == #{ newdst }" if dst == newdst
112
+ dst = newdst
113
+ puts dst
114
+ end
115
+
116
+ # grab stat - this should always be nil!
117
+ stat = File.stat(dst) rescue nil
118
+ abort "clobbering <#{ dst }>" if stat
119
+
120
+ unless stat and stat.size == length
121
+ q.push Thread.new{
122
+ t = Thread.current
123
+ t.abort_on_exception = true
124
+ cmd = "curl --location --silent --user-agent '#{ user_agent }' '#{ src }' > '#{ dst }'"
125
+
126
+ ret =
127
+ unless noop
128
+ puts cmd
129
+ begin
130
+ system cmd or raise
131
+ rescue
132
+ FileUtils.rm_f dst # kill partial downloads instantly
133
+ end
134
+ else
135
+ cmd
136
+ end
137
+
138
+ #system "stat #{ dst }"
139
+ File.stat(dst) rescue next
140
+
141
+ md5 = Digest::MD5.hexdigest(dst)
142
+
143
+ # try to update db, iff we fail it means we'd already downloaded this
144
+ # file
145
+ success = sync{ system %Q(sqlite #{ db } "insert into mp3s values('#{ dst }', '#{ md5 }')" >/dev/null 2>&1) }
146
+ unless success
147
+ pair = sync{ ` sqlite #{ db } " select * from mp3s where md5 = '#{ md5 }' " `.to_s.chomp }
148
+ #a,b= ( pair.split(%r/\|/,2) rescue [] )
149
+ a,b= pair.split(%r/\|/,2)
150
+ warn "rm -f '#{ dst }' (#{ a },#{ b })"
151
+ FileUtils.rm_f dst ## unless stat # rm unless it was pre-existing
152
+ end
153
+
154
+ ret
155
+ }
156
+ end
157
+ end
158
+
159
+ q.push nil
160
+ end
161
+
162
+ #
163
+ # wait for reaper
164
+ #
165
+ reaper.join
@@ -0,0 +1,28 @@
1
+
2
+ lib, version = File::basename(File::dirname(File::expand_path(__FILE__))).split %r/-/, 2
3
+
4
+ require 'rubygems'
5
+
6
+ Gem::Specification::new do |spec|
7
+ $VERBOSE = nil
8
+ spec.name = lib
9
+ spec.version = version
10
+ spec.platform = Gem::Platform::RUBY
11
+ spec.summary = lib
12
+
13
+ spec.files = Dir::glob "**/**"
14
+ spec.executables = Dir::glob("bin/*").map{|exe| File::basename exe}
15
+
16
+ spec.require_path = "lib"
17
+ spec.autorequire = lib
18
+
19
+ spec.has_rdoc = File::exist? "doc"
20
+ spec.test_suite_file = "test/#{ lib }.rb" if File::directory? "test"
21
+ #spec.add_dependency 'lib', '>= version'
22
+
23
+ spec.extensions << "extconf.rb" if File::exists? "extconf.rb"
24
+
25
+ spec.author = "Ara T. Howard"
26
+ spec.email = "ara.t.howard@gmail.com"
27
+ spec.homepage = "http://codeforpeople.com/lib/ruby/#{ lib }/"
28
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.2
3
+ specification_version: 1
4
+ name: hype
5
+ version: !ruby/object:Gem::Version
6
+ version: 42.0.0
7
+ date: 2007-07-11 00:00:00 -06:00
8
+ summary: hype
9
+ require_paths:
10
+ - lib
11
+ email: ara.t.howard@gmail.com
12
+ homepage: http://codeforpeople.com/lib/ruby/hype/
13
+ rubyforge_project:
14
+ description:
15
+ autorequire: hype
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Ara T. Howard
31
+ files:
32
+ - bin
33
+ - bin/hype.rb
34
+ - gemspec.rb
35
+ - README
36
+ test_files: []
37
+
38
+ rdoc_options: []
39
+
40
+ extra_rdoc_files: []
41
+
42
+ executables:
43
+ - hype.rb
44
+ extensions: []
45
+
46
+ requirements: []
47
+
48
+ dependencies: []
49
+