はてなキーワード: ダウンローダとは
この発想はありだとは思うけど、やはり正攻法しかないのではないかと。
これじゃロマンシングがやった詐欺とあんま変わらない気がする。その点で、「ウィルスとかスパイウェア的扱い」されてもおかしくはないと思う。ちなみに、割れ界隈はそういった仕組みを除去したり、回避する手法を併記してリリースしてる。
「偽ソフトを放流する為の専用の会社」が流すファイルの入手・インストールが違法行為ならば、その専用の会社が放流する行為をどう捉えるかが問題。偽ソフトであろうと正規に配信されているのであれば、その入手やインストールは違法行為に当たらないのでは?
ちなみに、冒頭のスイミー的なやり方だとコンテンツ・ソフト協同組合(CSA)というところが近いかと。AVメーカーが多いけど、エロゲメーカーもいくつか加盟している団体で、海賊版対策なども進めているみたい。
http://www.contents-soft.or.jp/kaizoku.html
今年初めに、AVの著作権侵害で刑事告訴していたりもするし、エロゲでも同様の取り組みがあってもよいのかもしれない。また、こうした団体がWinny上での著作権侵害コンテンツ共有者への警告メールキャンペーンなどに参加できるようになることも必要。
http://internet.watch.impress.co.jp/docs/news/20100610_373278.html
それと、http://anond.hatelabo.jp/20100829211014
著作権侵害に関して大手ゲームメーカーの実質的なロビー団体はACCSというかたちで存在していると思う(任天堂もソニーも正会員だよ)。
購入しているユーザーがバカを見つづけるだけではないのか。
すごく素直な感情だと思うし、同じような気持ちは持っているけど、そうした感情を持つことで、解決方法だと思っているものが実際には「懲らしめ」るための方向を向いてしまっているようにも思えるよ。
メーカー側だってもっと「懲らしめ」が必要だとは思っているだろうけど、現実問題としてリソースが足りなすぎる。ユーザがもっとやれと一方的に期待しても限界があると思う。
でも、何のために「懲らしめ」が必要かっていえば、海賊流通を抑制して、正規流通へとユーザを向ける、または引き戻すためであって、「懲らしめ」それ自体が目的なわけじゃない。それに「懲らしめ」による抑制効果を狙うとしても、実際に行動を起こせるのはメーカーだけなんだよね。メーカーだって馬鹿じゃないんだから、それくらいは考えている。だから、「懲らしめ」に関してはメーカーに任せるしかないんだと思う。
それでも、ユーザにできることはまだあると思うよ。不正ダウンローダーに働きかけて、彼らを変えること、つまり正規流通に促すってこと。そのためには、感情にまかせて敵意を向けるのではなく、どうやったら彼らを変えることができるか、どうやったら声を届けることができるのか、を真剣に考える必要がある。「何で割れ厨ごときのためにそんなこと(ry」と思われても仕方ないけど、「海賊流通を抑制して、正規流通へとユーザを向ける、または引き戻す」ことが第一にあるんじゃないのかな。たとえ自分に非があるとして、いきなり言葉のつぶてを投げつけるような人たちの話を聞いてもらえるとは思いにくいんだ。
せっかく書いたから匿名でのせてみるよ
使い方は
必要なものを gem で取ってくるにはこうすればいいよ
長すぎてelispが消えたから続きがあるよ
@echo off setlocal set WD=%~dp0 cd /d %WD% ruby get_movies.rb ruby get_images.rb ruby create_m3u.rb
user: ユーザID password: パスワード ids_file: ids.txt done_file: ids_done.txt movies_dir: movies log4r_config: pre_config: global: INFO loggers: - name: app type: Log4r::Logger level: INFO outputters: - STDOUT - FILE outputters: - name: STDOUT type: Log4r::StdoutOutputter formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%H:%M:%S" - name: FILE type: Log4r::FileOutputter filename: "#{LOGDIR}/sangels.log" formatter: type: Log4r::PatternFormatter pattern: "%d [%l] %C - %M" date_pattern: "%Y-%m-%d %H:%M:%S"
require 'fileutils' require 'logger' require 'mechanize' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_movies") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log class IDFile def initialize(file) @file = file unless File.exist?(@file) Fileutils.touch(@file) end end def ids(contains_comment = nil) File.open(@file) {|io| io.to_a.map {|x| x.chomp }.select {|x| if x.empty? nil elsif contains_comment true else not /^\s*\#/ =~ x end } } end def add(id) ids = ids(true) unless ids.any? {|x| x == id} write(ids + [id]) end end def delete(id) ids = ids(true) if ids.any? {|x| x == id} write(ids - [id]) end end def write(ids) File.open(@file, "w") {|io| ids.each {|x| io.puts x} } end end $log.info("BEGIN #{$0} ================") exit_code = 0 begin ids_file = IDFile.new($config.ids_file) done_file = IDFile.new($config.done_file) movies_dir = $config.movies_dir wget = WGet.new sangels = SAngels.new sangels.login($config.user, $config.password) ids_file.ids.each {|id| begin movies = sangels.movies(id) rescue SAngels::Movies::InvalidMoviesError $log.warn("invalid movie id: #{id}") next end dir = File.expand_path(id, movies_dir) movies.each {|link| wget.retrieve(link.href, dir) } expected = movies.movie_links.map{|x| File.basename(x.href)} actual = Dir.glob("#{dir}/*").map {|x| File.basename(x)} if (expected - actual).empty? done_file.add(id) ids_file.delete(id) end } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
require 'fileutils' require 'logger' require 'mechanize' require 'ostruct' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" require "#{BASEDIR}/sangels" $config = load_config(BASEDIR) prepare_logger(BASEDIR) $log = new_logger("get_images") WWW::Mechanize.log = new_logger("mechanize") WGet.log = $log $log.info("BEGIN #{$0} ================") exit_code = 0 begin movies_dir = $config.movies_dir sangels = SAngels.new sangels.login($config.user, $config.password) thumbnails = sangels.thumbnails Dir.glob("#{movies_dir}/*").each {|dir| next unless File.directory? dir id = File.basename(dir) url = thumbnails.url(id) unless url $log.warn("#{id} is not found") next end path = File.expand_path("00_thumbnail#{File.extname(url)}", dir) next if File.exist? path $log.info("retrieving #{url}") thumbnail = thumbnails.get_file(id) File.open(path, "wb") {|io| io.write(thumbnail)} } rescue => e $log.error(e) exit_code = 1 end $log.info("END #{$0} (#{exit_code}) ================") exit exit_code
BASEDIR = File.dirname($0) require "#{BASEDIR}/util" $config = load_config(BASEDIR) movies_dir = $config.movies_dir Dir.glob("#{movies_dir}/*") {|dir| next unless File.directory? dir name = File.basename(dir) files = Dir.glob("#{dir}/*.wmv").sort File.open("#{movies_dir}/#{name}.m3u", "w") {|io| files.each {|file| io.puts "#{name}/#{File.basename(file)}" } } File.open("#{dir}/00_movies.m3u", "w") {|io| files.each {|file| io.puts "#{File.basename(file)}" } } }
require 'mechanize' require 'hpricot' BASEDIR = File.dirname($0) require "#{BASEDIR}/util" class SAngels HOST = "real2.s-angels.com" LOGIN_URL = "http://#{HOST}/member/" INFO_URL = "http://#{HOST}/teigaku/item.php" THUMBNAILS_URL = "http://#{HOST}/teigaku/" THUMBNAIL_URL = "http://#{HOST}/images/default/thumb/" def initialize() @agent = WWW::Mechanize.new end def login(user, password) login_form = @agent.get(LOGIN_URL).forms.find {|form| form.fields.any? {|field| field.name == "frmLoginid"} } login_form.frmLoginid = user login_form.frmPw = password @agent.submit(login_form) end def movies(id, no_validate = nil) Movies.new(@agent, id, !no_validate) end def thumbnails Thumbnails.new(@agent) end class Thumbnails def initialize(agent) @agent = agent doc = Hpricot(@agent.get_file(THUMBNAILS_URL)) elems = doc.search("div[@class=realthum]/a") @links = Hash( elems.map {|elem| href = elem["href"] id = $1 if /ID=(.+)/ =~ href url = elem.search("img")[0]["src"] [id, url] }) end def get_file(id) @agent.get_file(url(id)) end def url(id) @links[id] end def exist?(id) url(id) end end class Movies class InvalidMoviesError < StandardError end def initialize(agent, id, no_validate) @agent = agent @id = id if !no_validate && !valid? raise InvalidMoviesError end end def info_page_url "#{INFO_URL}?ID=#{@id}" end def info_page @agent.get(info_page_url) end def movies_page @agent.click(info_page.links.find {|link| /P=10/ =~ link.href}) end def movie_links movies_page.links.select {|link| /wmv$/ =~ link.href }.sort {|a, b| File.basename(a.href) <=> File.basename(b.href) } end def valid? info_page.uri.to_s == info_page_url end def each(&block) orig_links = movie_links orig_links.each {|orig_link| link = movie_links.find {|l| File.basename(l.href) == File.basename(orig_link.href)} block.call(link) } end end end
require 'log4r' require 'log4r/yamlconfigurator' require 'singleton' require 'fileutils' require 'ostruct' def Hash(a) Hash[*a.flatten] end def load_config(basedir) OpenStruct.new(File.open("#{basedir}/config.yaml") {|io| YAML.load(io)}) end def new_logger(name) Log4r::Logger.new("app::#{name}") end def prepare_logger(basedir, logdir = nil) logdir ||= basedir Log4r::YamlConfigurator["LOGDIR"] = logdir Log4r::YamlConfigurator.load_yaml_file("#{basedir}/config.yaml") end class NullObject include Singleton def method_missing(message, *arg) NullObject.singleton end end class WGet class << self attr_accessor :log def initialize super @log = NullObject.singleton end end def log self.class.log end def retrieve(url, dir) FileUtils.mkdir_p(dir) file = File.expand_path(File.basename(url), dir) if File.exist?(file) log.info("already retrieved #{url}") return true end tmp = "#{file}.part" log.info("retrieving #{url}") ret = system("wget", "-c", "-O", tmp, url) if ret log.info("retrieving succeeded #{url}") File.rename(tmp, file) else if $? == 0x020000 # Ctrl-C exit($?) else log.error("retrieving failure #{url} (#{$?})") end end return ret end end
発売元はフリーのダウンローダがあることに全く気づくことなくい開発してたんじゃないか。
で、作ってみたところ発売する意味ねーことに気づいた。だからやーめたと。
よくわからんがダウンロードしてまで見たいのか見たいのか。悶々と。
ニコニコ動画が訴えられた場合、削除しましたで逃げ切れるが、DLソフトの存在を公式に認めてしまってはコンテンツのばら撒きに加担したことになってしまう。
法律を誤魔化し誤魔化しなんとかかいくぐってるのが現状。
ニワンゴと関係ない会社が出せばネットで公開されているものをDLするだけだから問題ない。DL違法化反対っていってるぐらいなわけで。ほぼ不特定多数に公開しつつ「法律を誤魔化しなんとかかいくぐってる」のはニワンゴであって外部のツール屋は無関係でしょ。
つうか関係が無いからひろゆきは筋を通せって言ってるのに公式化するとヤバイってどういうこと?
追記:フリーのツールは今もあるしこれからもあり続けるだろ。ダウンローダーの存在がサービスの違法性を補強するなら既に十分のはずなんだが。
http://anond.hatelabo.jp/20071019085856
まずニコニコなんとかで無関係の会社から商品が出るって事は商標とって無いんだろ。その時点で何やってんだと思うし、その程度の仕事しかしてないなら権利なんか主張すんなよと思うのだが。
この状態で圧力をかけるには2つの方法があると思われる。
前者は効果が高いが他のダウンローダーにも影響するし、そもそもソフトの存在自体は否定できないので修正パッチとのいたちごっこになって泥沼になる。
後者は「ひろゆきが敵認定した」「タダ乗りのずるい会社」と自分の立場を利用した一方的なアナウンスで社会通念を超えた不利益を相手に与えることができることを利用した恫喝。特にリソースに余裕のない小規模な企業には効果が高い。
なんのことはない、暴力団が「ワシらに挨拶もないんか、どないなっても知らんぞ」といってるのと同じ。
どう見てもひろゆきがクズだろ。