वीडियो को मर्ज करने के लिए स्क्रिप्ट और फिर मौजूदा फ़ाइलों को हटा दें (गैर पुनरावर्ती)


7

मैं mkvmergeएक वीडियो फ़ाइल और उपशीर्षक को मर्ज करने के लिए उपयोग कर रहा हूं, मैं निम्नलिखित कमांड का उपयोग कर रहा हूं

mkvmerge -o output.mkv video.mp4 subtitles.srt

जो ठीक काम कर रहा है लेकिन जैसा कि आप शायद अनुमान लगा सकते हैं कि यह वास्तव में धीमा ऑपरेशन है

  • मुझे उन निर्देशिकाओं में से प्रत्येक में टर्मिनल खोलना है जहां फिल्में संग्रहीत की जाती हैं।
  • फिर मुझे कमांड में फाइलों के नाम कॉपी और पेस्ट करने हैं
  • फिर मुझे आउटपुट फाइल का नाम बदलना है
  • फिर मूल फ़ाइलों को हटा दें जो मैंने उपयोग किया था

यह एक लंबी प्रक्रिया है।


आदर्श स्थिति जो मुझे चाहिए।

  • मैं उस फ़ोल्डर में जाऊंगा जिसमें एक मूवी फ़ाइल और एक उपशीर्षक फ़ाइल होती है जिसमें समान नाम होता है।
  • मैं एक मूवी फ़ाइल और एक उपशीर्षक फ़ाइल का चयन करता हूं, राइट क्लिक करें और उन पर एक नॉटिलस स्क्रिप्ट चलाएं।
  • उनका विलय हो जाता है
  • मूल फ़ाइल हटा दी जाती है।
  • mkvएक्सटेंशन के साथ ओरिजिनल फ़ाइल के नाम के साथ मर्ज की गई फ़ाइल का नाम बदलें

यह पुनरावर्ती होने की आवश्यकता नहीं है, मैं नहीं चाहता कि मेरे एचडीडी 100 और फ़ाइलों को हटा रहा है। मूवी फ़ाइलों और सबटाइटल फ़ाइलों का आम तौर पर एक ही नाम होता है, लेकिन कुछ बार "_en" पोस्ट को फ़ाइलों को उपशीर्षक करने के लिए निर्धारित किया जाता है। यदि आपके पास इसे करने का एक और तरीका है तो मैं उसके साथ भी हूँ।


1
नमस्ते, मैं कमांड से परिचित नहीं हूं और इसकी कार्यक्षमता कैसी है, लेकिन एक सवाल: आपको इस कमांड को प्रत्येक निर्देशिका में पुनरावृत्ति की आवश्यकता है और इस प्रारूप को सामान्य रूप से मर्ज करना है? mkvmerge -o movie_original_name_output.mkv movie_original_name.mp4 movie_original_name.srt? यदि हां, मैं इसके लिए एक स्क्रिप्ट लिख सकता हूं
αғsнιη

@AFSHIN वास्तव में पुनरावर्ती नहीं है, लेकिन स्क्रिप्ट को फिल्म फ़ाइल, उपशीर्षक फ़ाइल को पहचानना चाहिए, फिर उनसे जुड़ना चाहिए और फिर मूल को हटाना चाहिए।
सुमीत देशमुख

जवाबों:


5

मैंने बैश के साथ कुछ अनुभव हासिल करने का फैसला किया है और नीचे की स्क्रिप्ट लिखी है, जिसमें अगली विशेषताएं हैं:

  • यह वर्तमान निर्देशिका में रखी गई सभी फाइलों और फ़ोल्डरों को संभाल सकता है।
  • यदि एक से अधिक उपशीर्षक या वीडियो फ़ाइल (नमूना फ़ाइलों को छोड़कर) हैं, तो स्क्रिप्ट मैन्युअल इंटरैक्शन के लिए पूछेंगी।
  • अन्य सभी मामलों में स्क्रिप्ट स्वचालित रूप से सभी फ़ाइलों और फ़ोल्डरों को एक बैकअप निर्देशिका में ले जाएगी ( सावधान रहें कि आप इसे कहां चलाते हैं! ), जिसे हटाए जाने के बजाय उपयोगकर्ता के ट्रैश फ़ोल्डर में ले जाया जाएगा।
  • यह कई प्रकार के वीडियो और उपशीर्षक एक्सटेंशन को संभाल सकता है।
  • यह mkvmergeउपशीर्षक फ़ाइलों के साथ वीडियो को मर्ज करने के लिए उपयोग करता notify-sendहै जो GUI में कुछ संदेश दिखाने के लिए भी उपयोग करता है। यह भी gvfs-trashउपयोगकर्ता के कचरा फ़ोल्डर में फ़ाइलों को स्थानांतरित करने के लिए उपयोग करता है।
  • इसका उपयोग Nautilus स्क्रिप्ट या नियमित शेल स्क्रिप्ट के रूप में किया जा सकता है लेकिन GIU वातावरण की आवश्यकता होती है, जबकि notify-sendकमांड स्क्रिप्ट के शरीर में मौजूद होती है।
  • आउटपुट फ़ाइल का नाम निर्देशिका नाम (डिफ़ॉल्ट) या स्रोत वीडियो फ़ाइल के नाम पर आधारित हो सकता है।
  • इसके अतिरिक्त जब केवल दो फ़ाइलों ( एक वीडियो और एक उपशीर्षक फ़ाइल ) का चयन किया जाता है, तो उन्हें विलय कर दिया जाएगा और फ़ोल्डर की सामग्री के बाकी हिस्से को बरकरार रखा जाएगा। आउटपुट फ़ाइल का नाम स्रोत वीडियो फ़ाइल के नाम पर होगा। यह विकल्प केवल तभी उपलब्ध होता है जब स्क्रिप्ट का उपयोग Nautilus स्क्रिप्ट के रूप में किया जाता है।

लिपी:

#!/bin/bash -e

# Check if all tools are available
[ -x /usr/bin/notify-send ] || (echo "Please, install 'notify-send'"; exit 1)
[ -x /usr/bin/mkvmerge ] || (echo "Please, install 'mkvmerge'"; exit 1)

# Allowed video and subtitle file extensions
EXT_VIDEO=("mp4 avi mpg mov mkv wmv")
EXT_SUB=("sub str srt vtt")

# Files, which names contains some of next strings will be removed in auto mode
FILTER=("sample Sample SAMPLE")

# Log file
MERGE_LOG="/tmp/merge-video-sub.log" 
echo > "$MERGE_LOG"

#
# Functions
#

function get-video-and-sub-file-names {
    # Get the names of the video and subtitle files and move the rest of the files into the Backup directory
    for ((i=0; i<${#FILE_LIST[@]}; i++)); do
        FILE_NAME="${FILE_LIST[$i]%.*}"
        FILE_EXT="${FILE_LIST[$i]##*.}"

        if   [[ "${EXT_SUB[@]}" == *"$FILE_EXT"* ]]; then
            SUB_FULL_FILE_NAME="${FILE_LIST[$i]}"
            SUB_FILE_NAME="${FILE_NAME}"
            SUB_FILE_EXT="${FILE_EXT}"
        elif [[ "${EXT_VIDEO[@]}" == *"$FILE_EXT"* ]]; then
            VIDEO_FULL_FILE_NAME="${FILE_LIST[$i]}"
            VIDEO_FILE_NAME="${FILE_NAME}"
            VIDEO_FILE_EXT="${FILE_EXT}"
        else
            # We need 'find' to manipulate only with files, because "$BACKUP_DIR" is in the queue
            find ./* -maxdepth 0 -type f -name "${FILE_LIST[$i]}" -exec mv "{}" "$BACKUP_DIR" \; -exec echo -e "The file {} was REMOVED.\n" >> "$MERGE_LOG" \;
        fi
    done
}

function get-the-content-of-the-current-directory {
    # Get the content of the current directory
    shopt -s nullglob
    FILE_LIST=(*)
    shopt -u nullglob
}

function mkvmerge-video-and-sub-files {
    # Create merged file
    mkvmerge -o "$OUTPUT_FILE" "$VIDEO_FULL_FILE_NAME" "$SUB_FULL_FILE_NAME"
    sleep 3
}

#
# Scenario 1: If exactly two files are selected in Nautilus! Then check if they are 1 video and 1 subtitle files, if yes - merge and remove them
# Scenario 2: Else run the standard procedure
#

# Get the files, selected in Nautilus as file list. Use next command to check the result: notify-send "MESSAGE" "`echo -e "${#FILE_LIST[@]}"; printf '%s\n' "${FILE_LIST[@]}"`"
IFS_BAK=$IFS
IFS=$'\t\n'
FILE_LIST=($NAUTILUS_SCRIPT_SELECTED_FILE_PATHS)
IFS=$IFS_BAK


if [ "${#FILE_LIST[@]}" -eq "2" ]
then # Scenario 1

    # Get the names of the video and subtitle files
    get-video-and-sub-file-names

    if   [[ "${EXT_SUB[@]}" == *" $SUB_FILE_EXT "* ]] && [[ "${EXT_VIDEO[@]}" == *" $VIDEO_FILE_EXT "* ]]
    then
        notify-send "OK" "`echo -e "The following files will be MERGED and MOVED to trash:"; printf '\t-\ %s\n' "${FILE_LIST[@]##*/}"`"

        # Construct the name of the merged file. 
        OUTPUT_FILE="${VIDEO_FILE_NAME}.sub.mkv"

        # Merge the files
        mkvmerge-video-and-sub-files        

        # Move video and subtitle files into user's trash directory and create trash infofile
        if [ -f "$OUTPUT_FILE" ]
        then
            gvfs-trash "$VIDEO_FULL_FILE_NAME"
            gvfs-trash "$SUB_FULL_FILE_NAME"            
            notify-send "OK" "`echo -e "THE NAME OF THE NEW MERGED FILE IS:\n${OUTPUT_FILE##*/}"`"
        else
            notify-send "ERROR 1" "`echo "Something went wrong!"`"
        fi
    else
        notify-send "ERROR" "`echo -e "\n\t\nTo use this function, please select exactly:\n\t- 1 video file and\n\t- 1 subtitle file!\n\t\nYou are selected these files:"; printf '\t-\ %s\n' "${FILE_LIST[@]##*/}"`"
    fi

else # Scenario 2

    # Get the current directory name
    DIR_NAME="${PWD##*/}"

    # Create Backup sub-directory 
    BACKUP_DIR="${DIR_NAME}.backup"
    [ -d "${BACKUP_DIR}" ] || mkdir "$BACKUP_DIR" && echo "The directory $BACKUP_DIR was CREATED.\n" > "$MERGE_LOG"

    # Move all sub-directories into the Backup directory
    shopt -s dotglob
    find ./* -maxdepth 0 -type d ! -name "*$BACKUP_DIR*" -prune -exec mv "{}" "$BACKUP_DIR" \; -exec echo "The directory {} was REMOVED.\n" >> "$MERGE_LOG" \;
    shopt -u dotglob

    # Move all files and folders, whose names contains a string, that exists in $FILTER[@]
    for f in $FILTER; do
        shopt -s dotglob
        find ./* -maxdepth 0 ! -name "*$BACKUP_DIR*" -type f -name "*$f*" -exec mv "{}" "$BACKUP_DIR" \; -exec echo "The file {} was REMOVED.\n" >> "$MERGE_LOG" \;
        shopt -u dotglob
    done

    # Get the entire content of the current directory
    get-the-content-of-the-current-directory

    # Get the names of the video and subtitle files and move the rest of the files into the Backup directory
    get-video-and-sub-file-names

    # Construct the name of the merged file. It could be based on the parent directory or on the video file name Make your choice and comment/uncomment next lines
    #OUTPUT_FILE="${VIDEO_FILE_NAME}.sub.mkv"
    OUTPUT_FILE="${DIR_NAME}.sub.mkv"

    # Get the entire content of the current directory after the filtering
    get-the-content-of-the-current-directory

    echo -e "$(cat $MERGE_LOG)" && notify-send "OK" "`echo -e "$(cat $MERGE_LOG)"`" && echo > "$MERGE_LOG"

    # Check the current structure of the directory
    if [ "${#FILE_LIST[@]}" -ne "3" ]; then
        echo "The content structure must consists of next 3 items:" > "$MERGE_LOG"
        echo "\t- 1 movie file,\n\t- 1 subtitle file and\n\t- 1 backup directory." >> "$MERGE_LOG"
        echo "\n\t\nThe current number of contained items is ${#FILE_LIST[@]}." >> "$MERGE_LOG" && echo >> "$MERGE_LOG"
        echo "\n\t\nPLEASE RESOLVE THIS MANUALLY!" >> "$MERGE_LOG"
        echo -e "$(cat $MERGE_LOG)" && notify-send "ERROR" "`echo -e "$(cat $MERGE_LOG)"`"
    else
        echo "The directory structure looks good, is contains ${#FILE_LIST[@]} items." > "$MERGE_LOG"
        echo " - The source VIDEO file is: ${VIDEO_FULL_FILE_NAME::21}... .${VIDEO_FULL_FILE_NAME##*.}" >> "$MERGE_LOG"
        echo " - The source SUB file is: ${SUB_FULL_FILE_NAME::25}... .${SUB_FULL_FILE_NAME##*.}" >> "$MERGE_LOG"
        echo "They has been merged and removed!" | tr /a-z/ /A-Z/ >> "$MERGE_LOG"

        # Merge the files
        mkvmerge-video-and-sub-files

        # Move video and subtitle files into the Backup directory
        mv "$VIDEO_FULL_FILE_NAME" "$BACKUP_DIR" 
        mv "$SUB_FULL_FILE_NAME" "$BACKUP_DIR" 

        # Move the Backup directory to trash and create trash infofile
        if [ -f "$OUTPUT_FILE" ]; then
            gvfs-trash "$BACKUP_DIR" 

            echo "\n\t\nThe Backup directory has been MOVED to Trash!\n\t\n" >> "$MERGE_LOG"
            echo "The name of the new merged file is:"  | tr /a-z/ /A-Z/ >> "$MERGE_LOG"
            echo "${OUTPUT_FILE##*/}" >> "$MERGE_LOG"
            echo -e "$(cat $MERGE_LOG)" && notify-send "OK" "`echo -e "$(cat $MERGE_LOG)"`"
        else
            echo "Something went wrong!" && notify-send "ERROR 2" "`echo "Something went wrong!"`"
        fi

    fi
fi

rm "$MERGE_LOG"
exit 1

सेट अप:

  • निष्पादन योग्य फ़ाइल बनाएं और उपरोक्त सामग्री को अंदर पेस्ट करें। आइए इस फाइल को कॉल करें merge-video-sub:

    touch merge-video-sub 
    chmod +x merge-video-sub
    nano merge-video-sub
  • वर्तमान उपयोगकर्ता के लिए ln -sयह फ़ाइल ~/.local/share/nautilus/scriptsNautilus स्क्रिप्ट के रूप में उपलब्ध कराने के लिए फ़ोल्डर में कॉपी (या ) करें।

  • फिलहाल मैं इसे Nautilus स्क्रिप्ट के रूप में सिस्टम को व्यापक रूप से उपलब्ध कराने का तरीका नहीं खोज सकता।

  • वर्तमान उपयोगकर्ता के लिए शेल कमांड के रूप में उपलब्ध कराने के लिए फ़ाइल को कॉपी करें ~/bin(और यदि आवश्यक हो तो export PATH=$PATH:~/binनीचे ~/.bashrcजोड़ें)।

  • /usr/local/binशेल कमांड सिस्टम के रूप में इसे उपलब्ध कराने के लिए फाइल को कॉपी करें ।

  • लघु तरीका है curlसे स्क्रिप्ट मेरे pastebin में सीधे nautilus/scriptsफ़ोल्डर:

    curl https://pastebin.com/raw/HrLTibuR | sed -e 's/\r$//' > $HOME/.local/share/nautilus/scripts/merge-video-sub
    chmod +x $HOME/.local/share/nautilus/scripts/merge-video-sub

डेमो:

यहां छवि विवरण दर्ज करें

अतिरिक्त संदर्भ:


1
यह सब कुछ एक चाहता है और अधिक हो सकता है! इसे स्वीकार किया
सुमीत देशमुख

1
नमस्ते, @SumeetDeshmukh, मैंने स्क्रिप्ट के कोड में दो छोटे बदलाव किए हैं। लेकिन सामान्य तौर पर वे इसके काम को प्रभावित नहीं करेंगे।
पा .4080

1
नमस्ते, @SumeetDeshmukh, नया संस्करण कॉपी करने के लिए अपना समय बर्बाद मत करो। मैं एक और कार्यक्षमता जोड़ूंगा और आपको फिर से पिंग करूंगा। स्क्रिप्ट जब फ़ोल्डर में आप के रूप में एक संग्रह है इन मामलों के लिए दो चयनित फ़ाइलों को मर्ज करने, सक्षम हो जाएगा part-1.mp4, part-1.sub, part-2.mp4, part-2.sub, आदि ... मैं अपने वीडियो को साफ़ रखने का फैसला किया और मैंने पाया इस समारोह के लिए आवश्यक है।
पा ०४० 29०

1
हां, टीवी शो के सीजन और इस तरह के अन्य सामान के लिए यह आवश्यक है
सुमीत देशमुख

1
@SumeetDeshmukh, यह विकल्प पहले से ही उपलब्ध है।
पा ०४० 30०

1

यहाँ, मैंने इसके लिए एक स्क्रिप्ट बनाई। बस सुनिश्चित करें कि आपके मूवी फ़ोल्डर में केवल दो फाइलें हैं, एक आपकी फिल्म है और दूसरा सबटाइटल है (उन्हें समान नाम की आवश्यकता नहीं है)।

mergeडेस्कटॉप पर कॉल की गई फ़ाइल बनाएँ और इस कोड को पेस्ट करें:

#!/usr/bin/env python

import subprocess, os, sys

def main():
    movieName = ""
    subtitleName = ""
    for name in os.listdir(os.getcwd()):
        if (name != sys.argv[0]):
            if ".srt" in name:
                subtitleName = name
            else:
                movieName = name

    start(movieName, subtitleName)

def start(movieName, subtitleName):
    if (subprocess.call(["mkvmerge", "-o", "merging", movieName, subtitleName]) == 0):
        subprocess.call(["rm", movieName, subtitleName])
        subprocess.call(["mv", "merging", movieName])
    else:
        for name in os.listdir(os.getcwd()):
            if name == "merging":
                subprocess.call("rm", "merging")
        print "Sorry, Something went wrong."

if __name__ == "__main__":
    main()

अब, निर्देशिका में एक टर्मिनल खोलें जहां आपने सहेजा है marge(डेस्कटॉप पर इस मामले में) और mv merge ~/.local/share/nautilus/scripts/mergeदर्ज करें और हिट करें।

अब डाल cd ~/.local/share/nautilus/scripts/और हिट दर्ज करें।

अब डाल chmod +x mergeऔर हिट दर्ज करें।

अब उस फोल्डर पर जाएं जहां मूवी और सबटाइटल है और किसी भी फाइल पर राइट क्लिक करें scripts > merge

किया हुआ।

अगर आपको कोई समस्या है, तो मुझे बताएं।

यहां छवि विवरण दर्ज करें


1
टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
थॉमस वार्ड

1

मैंने एक और स्क्रिप्ट बनाई जिसमें GUI है। यह फ़ोल्डर और उप-फ़ोल्डर में अपने संबंधित वीडियो (समान नाम की खोज) के साथ सभी उपशीर्षक फ़ाइलों को ढूंढ सकता है और उन्हें लोगों में मर्ज कर सकता है।

यहाँ स्क्रिप्ट के लिए GitHub लिंक दिया गया है: https://github.com/bhaktanishant/Total-Subtitle-Merger

यहां छवि विवरण दर्ज करें

यहाँ कोड है:

#!/usr/bin/env python

from Tkinter import Tk, Listbox, Button, Scrollbar, Canvas, Frame, Label
from subprocess import call
from threading import Thread
import os, tkMessageBox
from time import sleep

class MergeApp:

    def __init__(self, root):
        self.root = root
        self.title = "Subtitle Merger By - Nishant Bhakta"
        self.messageBoxTitle = "Message Box"
        self.cancelWarning = "The video which has been started to merge will be merge. Rest will be cancel."
        self.movieListBox = Listbox(self.root)
        self.scrollBar = Scrollbar(self.root)
        self.startButton = Button(self.root, text = "start", state = "disable", command = self.startMerging)
        self.cancelButton = Button(self.root, text = "Stop", state = "disable", command = self.stopMerging)
        self.finishButton = Button(self.root, text = "Exit", state = "normal", command = self.endApplication)
        self.loadingLabel = Label(self.root)
        self.processState = Label(self.root)
        self.movieMap = {}
        self.keyList = []
        self.loadingIcons = ["--", "\\", "|", "/"]
        self.wantToMerge = True
        self.loading = False
        self.warningMessageLoaded = False

    def start(self):
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()
        # calculate position x and y coordinates
        x = (screen_width/2) - (700/2)
        y = (screen_height/2) - (300/2)
        self.root.geometry('%dx%d+%d+%d' % (700, 300, x, y))

        self.root.title(self.title)
        self.movieListBox.config(width = 68, yscrollcommand = self.scrollBar.set)
        self.movieListBox.pack(side = "left", fill = "y")
        self.scrollBar.config(command = self.movieListBox.yview)
        self.scrollBar.pack(fill = "y", side = "left")
        self.startButton.pack(fill = "x")
        self.cancelButton.pack(fill = "x")
        self.finishButton.pack(fill = "x")
        self.processState.pack(fill = "x", side = "bottom")        
        self.loadingLabel.pack(fill = "x", side = "bottom")
        Thread(target = self.createMovieMap).start()
        self.mainThread = Thread(target = self.startMerge)
        self.root.protocol("WM_DELETE_WINDOW", self.ifCloseWindow)
        self.root.mainloop()

    def createMovieMap(self):
        #Looking for subtitle
        index = 0
        Thread(target = self.startLoading, args = (True, )).start()
        self.processState.config(text = "Searching Videos..")
        for oneWalk in os.walk(os.getcwd()):
            for fileName in oneWalk[2]:
                if ".srt" in fileName:
                    subtitleName = fileName
                    #Now looking for movie with the name of subtitle
                    for oneWalk in os.walk(os.getcwd()):
                        for fileName in oneWalk[2]:
                            if ".srt" not in fileName:
                                key = subtitleName.replace(".srt", "")
                                if key in fileName:
                                    movieName = fileName
                                    if key not in self.movieMap:
                                        self.movieMap[key] = dict([("subtitleUri", oneWalk[0] + "/" + subtitleName)
                                            , ("movieUri", oneWalk[0] + "/" + movieName)
                                            , ("moviePath", oneWalk[0])])
                                        self.movieListBox.insert(index, " Queued - " + key)
                                        self.keyList.append(key)
                                        index += 1
        self.startButton.config(state = "normal")
        self.processState.config(text = "Search Complete.")
        self.loading = False

    def startMerge(self):
        self.changeButtonState()
        for key, value in self.movieMap.iteritems():
            if self.wantToMerge:
                self.processState.config(text = "Merging Video..")
                Thread(target = self.startLoading, args = (True, )).start()
                index = self.keyList.index(key)
                self.movieListBox.delete(index)
                self.movieListBox.insert(index, " Merging - " + key)
                self.movieListBox.itemconfig(index, bg = "yellow")
                if (call(["mkvmerge", "-o", value['moviePath'] + "/merging", value['movieUri'], value['subtitleUri']]) == 0):
                    call(["rm", value['movieUri'], value['subtitleUri']])
                    call(["mv", value['moviePath'] + "/merging", value['moviePath'] + "/"+ key + ".mkv"])
                    self.movieListBox.delete(index)
                    self.movieListBox.insert(index, " Successful - " + key)
                    self.movieListBox.itemconfig(index, bg = "green")
                else:
                    for name in os.listdir(value['moviePath'] + "/"):
                        if name == "merging":
                            call(["rm", value['moviePath'] + "/merging"])
                    self.movieListBox.delete(index)
                    self.movieListBox.insert(index, " Failed - "+ key)
                    self.movieListBox.itemconfig(index, bg = "red", foreground = "white")
            else:
                break
        self.loading = False
        self.cancelButton.config(state = "disable")
        self.finishButton.config(state = "normal")
        if self.wantToMerge:
            self.processState.config(text = "Merge Complete.")

    def startLoading(self, loadOrNot):
        self.loading = loadOrNot
        while self.loading:
            for icon in self.loadingIcons:
                self.loadingLabel.config(text = icon)
                sleep(.2)

    def startMerging(self):
        self.mainThread.start()

    def changeButtonState(self):
        self.startButton.config(state = "disable")
        self.cancelButton.config(state = "normal")
        self.finishButton.config(state = "disable")  

    def stopMerging(self):
        self.wantToMerge = False
        self.startButton.config(state = "disable")
        self.cancelButton.config(state = "disable")
        self.finishButton.config(state = "normal")
        self.processState.config(text = "Merge Canceled.")
        if not self.warningMessageLoaded:
            tkMessageBox.showwarning(self.messageBoxTitle, self.cancelWarning)
            self.warningMessageLoaded = True

    def endApplication(self):
        self.root.destroy()

    def ifCloseWindow(self):
        if self.mainThread.is_alive():
            self.stopMerging()
        self.endApplication()

if __name__ == "__main__":
    tk = Tk()
    app = MergeApp(tk)
app.start()

इसे नॉटिलस स्क्रिप्ट के रूप में कैसे उपयोग किया जाए:

इस कोड को एक फ़ाइल में पेस्ट करें और इसे नाम दें merge

अब, डायरेक्टरी में एक टर्मिनल खोलें, जहाँ आपने फाइल सेव की है margeऔर mv merge ~/.local/share/nautilus/scripts/mergeएंटर करें और हिट करें।

अब डाल cd ~/.local/share/nautilus/scripts/और हिट दर्ज करें।

अब डाल chmod +x mergeऔर हिट दर्ज करें।

अब उस रूट फोल्डर पर जाएं जहां फिल्में और सबटाइटल हैं और किसी भी फाइल या फोल्डर पर राइट क्लिक करें scripts > merge

किया हुआ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.