一个幽灵在我的脑海里盘旋

Posted on June 28, 2020

更新:我在 reddit 上发了个贴,知道了这部电影是 Jacques Demy 导演的 Lola。我说的镜头是可以在这里看到。下面描述的有很多和事实对不上的地方。我搜索的方法也有一些问题。

大约是2014年看过一部电影,里面有一个男主角开车兜风的镜头,有一两分钟。

忘记了电影讲的是什么,忘记了男主角为什么要出去兜风,忘记了一个寻常的场景为什么要拍这么久。只记得其背景音乐是贝多芬某一交响曲。

心情低落的时候,这个耳朵虫就会爬出来。

尝试了一下寻找这个也许已经永远失去的记忆。

首先,我尝试了使用 Parsons codemusipedia 上找这到底是第几交响曲。输入了半天,总是错误的 Parsons code.

后来在 whosampled 确定了这是第七交响曲第二乐章。

250.took.nl 上所有电影在 imdb 上的 soundtrack 都爬下来,只有 Mr. Holland’s Opus 原声带中有贝多芬第七交响曲,我没看过这部电影。

知名的意大利电影爬下来也没有找到。我看的可能是 Federico Fellini 导演的,或者是 Marcello Mastroianni 主演的一部电影。试了一下,没找到。

imdb 可以搜索 soundtrack,但是结果太多了。改天再爬。

更新:又有了两次失败的尝试。我的记忆里这是一部意大利电影,并且应该是一部好电影。我的记忆应该不会有错,应该是 imdb 的 soundtrack 列表不全。

我把 movieo 上1950年到1980年的电影意大利弄了下来,我把 5000best moives 弄了下来, 使用下面的程序爬取了 imdb 的 soundtrack,最终发现了 10 多部含有贝多芬第七交响曲的电影,都不符合我的记忆。

package main

import (
        "encoding/json"
        "fmt"
        "io/ioutil"
        "os"
        "strings"
        "sync"

        "github.com/avast/retry-go"
        log "github.com/sirupsen/logrus"
        "github.com/stavia/imdbsoundtracks/pkg/scraping"
)

const (
        NUM_OF_WORKERS = 10
)

func main() {
        items := getItems(os.Args[1])
        c := make(chan string, len(items))
        var wg sync.WaitGroup
        wg.Add(NUM_OF_WORKERS)
        for i := 0; i < NUM_OF_WORKERS; i++ {
                go worker(i, c, &wg)
        }
        for _, item := range items {
                c <- item
        }
        close(c)
        wg.Wait()
}

func worker(i int, c chan string, wg *sync.WaitGroup) {
        for {
                if item, ok := <-c; ok {
                        retry.Do(
                                func() (err error) {
                                        defer func() {
                                                r := recover()
                                                if r != nil {
                                                        err = fmt.Errorf("Panicked while processing %v: %v", item, r)
                                                }
                                        }()
                                        process(item)
                                        return
                                },
                                retry.OnRetry(func(n uint, err error) {
                                        log.WithFields(log.Fields{
                                                "n":   n,
                                                "err": err,
                                        }).Warn("Retrying fetching data")
                                }),
                        )
                } else {
                        break
                }
        }
        wg.Done()
        log.WithFields(log.Fields{
                "i": i,
        }).Info("Worker has done its job")
}

func getItems(path string) []string {
        var bytes, err = ioutil.ReadFile(path)
        check(err)
        return strings.Split(string(bytes), "\n")
}

func process(item string) {
        scraper := new(scraping.Service)
        soundtracks := scraper.Soundtracks(item)
        bytes, err := json.MarshalIndent(soundtracks, "", "  ")
        check(err)
        log.WithField(
                "result", string(bytes),
        ).Debug("Obtained soundtrack data from imdb")
        err = ioutil.WriteFile(item+".json", bytes, 0644)
        check(err)
}

func check(e error) {
        if e != nil {
                log.WithField(
                        "err", e,
                ).Panic("Checking for error")
        }
}